QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1543|回复: 2

制作预览式抓图的脚本

[复制链接]
发表于 2006-5-12 18:56:22 | 显示全部楼层 |阅读模式
原来的贴子看这里:

http://www.linuxfans.org/nuke/modules.php?name=Forums&file=viewtopic&t=154480&highlight=


直接使用mplayer的filter会有两个问题:一是抓下来的头两到三张图有可能是一模一样的;二是部分文件可能会抓出N张图来,需要手动^C。
针对第一个问题,我想干脆就不要用mplayer的filter了,多抓几张,掐头去尾再用imagemagick来拼。
针对第二个问题,有可能需要用到线程处理。启动一个子进程跑mplayer抓图,然后不停检查抓够了图没有,如果抓够了且mplayer还不退出就把mplayer的进程杀掉。

为此我写了一个初步的ruby脚本,尝试解决第一个问题。就我的测试来看问题不大,虽然比直接用mplayer的filter慢了很多,但总是解决了一部分问题。但我测试中发现,mplayer除了头几张有可能抓出一样的图,影片中间也有可能,希望大家帮忙测试一下。
使用方面把以下代码保存为一个文件如filmstrip,并且chmod +x filmstrip,然后直接filmstrip aaa.avi就可以了。需要安装得有mplayer和imagemagick。用的时候小心点,因为代码最后删除了当前目录下的所有png文件。不太搞得清楚状况的朋友还是慎用的好。

[code:1]#!/usr/bin/ruby

scale_width = 150
tile_x = 5
tile_y = 6

fn = ARGV[0]
info = `mplayer -quiet -vo null -nosound -frames 0 -identify \"#{fn}\"`

info =~ /ID_LENGTH=(\d+)/
sstep = Integer($~[1].to_i / (tile_x*tile_y + 3))

system("mplayer -quiet -vo png:z=9 -nosound -sstep #{sstep} \"#{fn}\"")

'00000003'.upto(sprintf('%08d',tile_x*tile_y + 2)) do |n|
  system("convert -resize #{scale_width} #{n}.png #{n}.png")
end

n = 3
cmd = ''
tile_y.times do |y|
  fs = ''
  tile_x.times do |x|
    fs += sprintf('%08d',n) + '.png '
    n += 1
  end
  system("convert -border 2x4 -bordercolor black #{fs} +append y#{y}.png")
  puts("convert -border 2x4 -bordercolor black #{fs} +append y#{y}.png")
  cmd += "y#{y}.png "
end
system("convert -border 2x4 -bordercolor black #{cmd} -append \"#{File.basename(fn)}.jpg\"")
puts("convert -border 2x4 -bordercolor black #{cmd} -append \"#{File.basename(fn)}.jpg\"")
system("rm *.png")[/code:1]
发表于 2006-8-5 12:48:34 | 显示全部楼层
可以看看效果吗`?~~?
回复

使用道具 举报

 楼主| 发表于 2006-8-7 19:13:57 | 显示全部楼层
你自己试试不就知道了,就一个脚本而已。
已经改用xine写了另外一个,这个不打算要了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-12-4 04:48 , Processed in 0.062142 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表