转换静态图像为视频

需要把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的播放都没问题。

转换AVCHD的m2ts文件到avi

Sony的硬盘录像机是好东西,高清晰、宽屏幕录像,大容量存储,可录的时候爽了,后期浏览和加工转换实在是不方便(这位仁兄也有同样感受: Jeff Cai的流水账 – Play with AVCHD,机型都是Sony HDR-SR1),无论想在哪台电脑上浏览录像,都要装一个Sony Handycam Application Software软件(安装盘仅400M),这个软件也相当霸道,不让选择安装位置、安装哪些组件,甚至不允许单独安装其中的某一个程序,安装完成后居然还提示要重启xp,当然不重启我试了也能使用。注册媒体库位置的时候不让选择网上邻居资源或者映射的网络驱动器。

如果这些都不是问题的话,录像文件拷出来能用其他工具浏览或加工也行啊,可偏偏他的录像格式m2ts(扩展名MTS)目前支持的工具还相当少,不过还是在网上找到了一些文章,能够用开源工具进行转换。Sony自带软件也能转换成通用格式,不过我的印象是会损失一些清晰度,用肉眼就能轻易的分辨出来的差异。参考文章:

基本思路都是这样的:

  • 用xporthdmv把m2ts转换为mpv和mpa格式
  • 用ldecod把mpv转换为yuv格式
  • 用yuv4mpeg把yuv转换为y4m格式
  • mpa直接当ac3格式的音频使用
  • 用ffmpeg合成视频和音频部分为avi格式(avi就是一个容器)

讨论中还有一些其他的提示:

  • ffmpeg可以用mencoder替代
  • ldecod生成的yuv文件大小可以达到4G/分钟,不过可以用命名管道(named pipe)来省去使用中间文件
  • 视频和音频的同步,pal格式录像可以设定fps为25,ntsc格式录像可以使用参数-r 29.97。

参考文章中的第一篇给了一个附件(我还在这里存了一份解压、编译好的版本),这个很好用,下载下来解包,里面的readme.txt和Makefile解释了使用方法,不过在ubuntu下使用的话,建议先作以下几步准备工作:

  • 安装svn客户端
  • 用apt安装x264-bin和ffmpeg以及mplayer
  • 在’src/JM/ldecod’目录下创建一个空的子目录’obj’
  • 脚本运行之后会自动转换samplevideo.avi,会用去一些时间,想省略的话把这个文件删除或改名即可
  • download文件中有一句set version=12.2,现在的jm版本已经是12.4了,更新之,不然下载不到(404错误)

然后就简单了:

  • ./download
  • ./compile
  • ./install

或者再用installasroot安装,你就可以使用m2tstoavi了:

$ m2tstoavi 
usage: /usr/local/bin/m2tstoavi filename.m2ts ...

我也转了一个自己录的文件,完成后发现视频、音频不同步,并且播放速度很慢,可能是一些设置参数的问题,转换方式肯定是没有问题的,并且好像是目前最好的方式了。(修改/usr/local/bin/m2tstoavi,注意上面说的pal和ntsc制式的区别)mplayer播放最终生成的avi文件,信息如下:

Playing samplevideo.avi.
AVI file format detected.
VIDEO:  [h264]  1440x1080  24bpp  29.970 fps  13323.1 kbps (1626.4 kbyte/s)
Clip info:
 Software: MEncoder 2:1.0~rc1-0ubuntu9.1
open: No such file or directory
[MGA] Couldn't open: /dev/mga_vid
open: No such file or directory
[MGA] Couldn't open: /dev/mga_vid
[VO_TDFXFB] Can't open /dev/fb0: No such file or directory.
[VO_3DFX] Unable to open /dev/3dfx.
It seems there is no Xvideo support for your video card available.
Run 'xvinfo' to verify its Xv support and read DOCS/HTML/en/video.html#xv!
See 'mplayer -vo help' for other (non-xv) video out drivers. Try -vo x11
Opening video filter: [screenshot]
==========================================================================
Opening video decoder: [ffmpeg] FFmpeg's libavcodec codec family
Selected video codec: [ffh264] vfm: ffmpeg (FFmpeg H.264)
==========================================================================
==========================================================================
Forced audio codec: mad
Opening audio decoder: [liba52] AC3 decoding with liba52
Using SSE optimized IMDCT transform
Using MMX optimized resampler
AUDIO: 48000 Hz, 2 ch, s16le, 448.0 kbit/29.17% (ratio: 56000->192000)
Selected audio codec: [a52] afm: liba52 (AC3-liba52)
==========================================================================
AO: [alsa] 48000Hz 2ch s16le (2 bytes per sample)
Starting playback...
VDec: vo config request - 1440 x 1080 (preferred colorspace: Planar YV12)
VDec: using Planar YV12 as output csp (no 0)
Movie-Aspect is 1.78:1 - prescaling to correct movie aspect.
SwScaler: reducing / aligning filtersize 5 -> 4
SwScaler: reducing / aligning filtersize 5 -> 4
SwScaler: reducing / aligning filtersize 1 -> 1
SwScaler: reducing / aligning filtersize 5 -> 4

SwScaler: BICUBIC scaler, from yuv420p to bgr24 using MMX2
SwScaler: using 4-tap MMX scaler for horizontal luminance scaling
SwScaler: using 4-tap MMX scaler for horizontal chrominance scaling
SwScaler: using n-tap MMX scaler for vertical scaling (BGR)
SwScaler: using MMX2 YV12->BGR24 Converter
SwScaler: 1440x1080 -> 1920x1080
VO: [x11] 1440x1080 => 1920x1080 Planar YV12 
A:4358.2 V:   2.9 A-V:4355.240 ct:  0.297  89/ 89 148%  0%  1.1% 37 0 

有时间了再仔细研究视频、音频不同步和播放速度很慢的问题。不过还是那句话,技术都是好东西,可对商业利益的无止境追求使他们变成了恶魔。

软件环境:Ubuntu 7.04 Feisty

Update @ 2008-02-14

发现视频、音频不同步的原因了,我的机器太慢!精度太高了,3.2双核都跑不动!对结果再此进行降频转换之后,播放还是很流畅的,但感觉人物动作略微有一点点快呢?帧率不对?

mencoder -oac copy -ovc xvid -xvidencopts bitrate=5000 $file.avi -o $output.avi

使用mencoder转换佳能数码相机录像文件的最佳参数

佳能数码相机深得用户喜爱,在市场上占有比较大的数额,当然说的是数码照相机了,不管是单反dslr还是低端的dc。同时和其他品牌的数码相机一样,虽然主要功能是照相,也都带有简单的录像功能,不过canon的录像功能弱了一点,不仅音频采样率只有11024Hz,连视频信息也只是简单的存为Motion jpeg格式,换句话说就是把每秒24张jpeg图片存到一个大文件中,播放的时候一张张显示而已。即使是1G的sd卡,大概也只能录8分钟左右,所以,我要用mencoder转换录像文件的格式,这样尺寸会小很多。

目前使用mencoder转视频文件,使用最多的两种视频格式应该是lavc和xvid了,我个人喜欢xvid,不过还是先把找到的lavc的参数列出来:

mencoder MVI_2145.AVI -o 20070101-make_huntun.avi -ovc lavc -lavcopts vcodec=mpeg4:vbitrate=800 -oac mp3lame -srate 11025 -channels 1 -af-adv force=1 -lameopts preset=medium -mc 0

如果使用xvid的话,参数为:

mencoder MVI_2145.AVI -o 20070101-make_huntun.avi -ovc xvid -xvidencopts bitrate=800 -oac mp3lame -srate 11025 -lameopts preset=medium -mc 0

上面两个例子是经过我的实验,综合效果最好的两种方式,如果想再把尺寸缩小一些,可以把采样率bitrate减少到600或更低。在相同bitrate的情况下,采用mpeg4编码的lavc和xvid压缩比大体相当。前面几个参数比较好理解,后面几个参数说明如下:

-srate 11025 canon相机录像音频的采样频率为11024,所以需要使用这个参数来把采样率固定到11025,为啥不用11024呢?我也不知道,反正用11024的话mencoder就不干活。

-lameopts preset=medium 这是使用系统内设的medium方式来指定音频mp3压缩方式,medium大概是最低的了,更高的还有standard和extreme,既然录音效果不佳,指定高参数也是无益。

-mc 0 这个参数主要是用来去除转换过程中的一些“Skipping frame!”、“1 duplicate frame(s)!”之类的提示,不仅如此,似乎还能使转换后的音频更流畅一些,并且如果没有这个参数和上面那个lameopts preset=medium,音频和视频有可能会不同步。

参考: [MEncoder-users] Compressing the photo camera Canon A610 video to mpeg4 at the best quality. Powershot SD700 IS — Major Problem

我的一段7分52秒的录像,canon相机存的原始大小为819.7M,使用xvid格式压缩完毕是46.8M,只是原来大小的5.7%,可以吧?大家还有什么压缩经验,拿出来一起分享哦。