转换静态图像为视频

需要把100+张大小不一的图片,转换为视频,上网查了些资料,关键词一般用still images或者image sequence,结果用mencoder就能作:

mencoder mf://*.jpg -vf scale=800:600,harddup -ofps 25 -ovc xvid -xvidencopts bitrate=800 -o dbb.avi

结果出来的影片每秒25帧,也就是切换每秒切换25张图片,120多张一共耗时4秒,没法看。把fps调整为1或者0.1之类的数,mencoder运行就出错。没办法,我想了一笨办法。

按照每秒25帧算,那么如果一张图片想显示2秒,那么就把它复制(用ln更快,别傻傻的cp)2×25=50份,比如001.jpg.001, 001.jpg.002…按照这种方法把图片都整到一个目录中,然后再使用上面那个命令就能够正常转换了。

不过,当图片大小不一的时候,还是会出现错误,比如这个:

VDec: vo config request - 800 x 463 (preferred colorspace: Planar 444P)]
VDec: using Planar 444P as output csp (no 0)
Movie-Aspect is 1.33:1 - prescaling to correct movie aspect.
[CROP] Bad position/width/height - cropped area outside of the original!
FATAL: Cannot initialize video driver.

mencoder转变源尺寸的东西我不熟悉,试了一些参数都不行,刚想放弃,从这里发现有images2mpg这个好东西。

images2mpg是在kipi-plugins这个包里(属于kde桌面下的插件),需要安装imagemagic等包,如果提示:

Can't find ppmtoy4m, please install it or check -M parameter

这是缺少包mjpegtools,如果提示找不到ogg123,那是缺少包vorbis-tools。images2mpg就是利用这些包完成图片转换、压缩视频等工作的一个脚本。可以这样用:

images2mpg -o mzj.avi -t 4 -d 1 -S 420mpeg2 -M /usr/bin/ -i ???.jpg
  • -t 4是淡入淡出的效果,4对应的时间消耗在帮助里面,约1秒
  • -d 1是每张图片停留1秒,很遗憾这个参数不能用小数
  • -S 420mpeg2指定mpeg2压缩方式
  • -M /usr/bin/指定mjpegtools的可执行文件位置,不知怎地images2mpg自己不会到/usr/bin下找
  • -i ???.jpg是源文件,必须放在最后

转换结果很贴心,图片自动都按长、短边缩放到了视频大小,空白的地方是黑色,淡入淡出效果也还能接受,就是转换速度有些慢。

有了这个素材,再进行添加声音、分段设置间隔时间等操作就都能够很简单的用mencoder完成了。附上一个视频片段合并,并且引入外部声音的例子:

mencoder -audiofile mzj.mp3 -ovc xvid -xvidencopts bitrate=800 -vf harddup -idx -oac copy -o mzj.avi mzj_1.avi mzj_2.avi

不过这样声音在播放的时候会重复,如果合并完再加声音就没事了。

转换视频到DVD机上播放

最近注重家庭生活多一些,blog都快要荒废了,呵呵。买了个DVD机,淘汰了已经没法再用同时也是很久没有用了的N年前的山寨VCD,对于我来说主要用途是看电影,与在电脑上看不同,这样可以“霸占”电视,“强迫”家人与我一同欣赏。

好像现在市面上的DVD大多不支持rmvb,同时rmvb也是网上电影下载使用最多的格式,视频音频效果对我这个非发烧友来说都还过得去。在商场的时候倒是有一款“影王”能够直接播放rmvb,号称是全球第一款,播放效果还是不错的。但为了照顾喜欢唱歌的家人,还是买了重点在于学唱歌的“歌王”,支持“网络视频解码”(mpeg4家族,不支持rmvb),心想咱的电脑那么多计算力闲着也是闲着,就自己转换成支持的格式呗,结果还是小费了点工夫。

回家一试,倒是支持我最常用的XVID视频格式,但转了个样片发现播放的时候有强烈的抖动、回帧和马赛克现象,很费眼,没法看,遂逐一更换编码尝试:

  • 改用xvid 1-pass,照旧
  • 改用xvid 1-pass constant quantizer,照旧
  • 改用x264 1-pass、1-pass constant quantizer,结果不支持

无意中,看到有人介绍常用转码格式的时候,总是带上一个harddup的vf参数,查help一看,好像就是转码时提示

1 duplicate frame(s)!

的原因所在,而这个重复帧还有一定“校准”的功能,转个样片一试,问题都没有啦。

所以,我最终使用的转换方式如下(xvid 2-pass):

mencoder source.avi -ofps 29.970 -oac mp3lame -lameopts abr:br=128 -ovc xvid -xvidencopts vhq=4:pass=1:bitrate=$BITRATE -vf harddup -mc 0 -passlogfile "target.divx2pass.log" -o /dev/null;

mencoder source.avi -ofps 29.970 -oac mp3lame -lameopts abr:br=128 -ovc xvid -xvidencopts vhq=4:pass=2:bitrate=$BITRATE -vf harddup -mc 0 -passlogfile "target.divx2pass.log" -o target.avi

效果虽然好了,但占用空间体积也随之增大了,我的样片原本不带harddup的大小是17M,带上harddup转换的结果是20M,多占用约18%的空间,如果帧数降低一些,改为-ofps 23.976,那么转换出来是19M,只多占用12%的空间,其中利弊,各自取舍吧。

视频转换方面我只是略知皮毛,翻翻帮助学点够自己常用的就得,不知还有没有其它更好的转换方式。

参考

Update @ 2008-12-23

今天又转了一个正式的电影,结果出来以后比rmvb格式多用近60%的空间,比不带harddup多用23%的空间,有点汗哪。

Update @ 2008-12-26

又发现两个片子不能播放,提示:

video resolution not supported

一个分辨率是848×352,另外一个是1024×544,一般624×256的播放都没问题。