2009-02-19

Linux下转换视频文件Mencoder篇。续

  之前那篇已经太长了,再修改数据丢失的风险太大,所以就新开了一帖。如果有需要可以先看下旧的那篇

关于h.264编码
  去年底我曾经详细的通过实际压缩出来的结果对比研究和几个星期的x264编码的效果。但是可惜的是当时忙于项目,没有记录,现在要用时发现信息已经丢掉甚多,实为可惜。所以先整理一小部分还找的到的资料。
  h.264编码几乎是现在的一种国际标准了,连那个啥dobe的flash 都能够直接解码了,就这一点就比Silverlight强了很多。
  首先看一下编码参数:
mencoder test.avi -o /dev/null -oac copy -ovc x264 -x264encopts pass=1:turbo:me_range=16:qp_max=51:brdo:ratetol=1.0:bitrate=1000:me=umh:partitions=p8x8,b8x8,i8x8,i4x4:qp_min=10:bframes=1:qp_step=4:direct_pred=auto && mencoder test.avi -o testssdfsd.avi -oac lavc -lavcopts acodec=ac3:abitrate=96 -ovc deadzone_inter=21:pass=2:me_range=16:qcomp=0.6:qp_max=51:brdo:chroma_me:vbv_init=0.9:ratetol=1.0:bitrate=1000:me=umh:partitions=p8x8,b8x8,i8x8,i4x4:chroma_qp_offset=0:subq=5:pb_factor=1.3:deblock=0,0:qp_min=10:ip_factor=1.4:cabac:bframes=1:frameref=5:qp_step=4:b_adapt:b_bias=0:trellis=1:direct_pred=auto:nr=0:deadzone_intra=11:keyint_min=25:keyint=250

  这个是我研究出来看起来效果相对不错的编码参数,但是未必是最好的。码率的指定我没有研究,这里指定1000是为了做基准对比。
注:以上编码参数有漏掉,待我找到原来的再补上,你可以先在ovc后面加 x264enc -x264encopts
  首先可以确定的一点是2 pass的编码效果肯定比1 pass能强上一点,主要原因是2 pass在第一轮的对视频文件的测试中能够使第二轮真正编码的时候更加充分的利用码率,就是把码率用在刀刃上。
  参数解释:第一阶段的编码,文档的解释是收集视频上的统计信息,并将这些信息写入一个文件中。 除了那些默认为打开的选项,你可能想关闭一些消耗CPU的选项。这里我使用turbo能够加快速度,本来turbo有两个值可以选的turbo=1或turbo=2,1对最终编码质量没有影响,二有一点小影响,1最大能把速度加快到2倍,2就能4倍了,由于turbo选项会减小subq、frameref的值,所以我们就没必要在第一阶段设置这两个值了。
  第二阶段的编码就可以把要的全开开了。这里不重复说明了,以前的帖子里有解释,看这个

  最后,补充一下关于需要使用flash播放264编码的相关知识,首先,官方推荐方案是h.264+aac,封装可以使用flv或mp4,但是如果你在写flex的时候两种格式似乎在加载代码上有不同,可以参考这个帖子,flv的格式标准可以从这里下载。未免那个连接挂了,这里引用一句里面最精华的内容:

在FLEX中一般都用videoDisPlayer这个控件播放视频文件,通过使用source属性设置进行播放flv文件,如:rtmp://123.32.4.22:1935/fms/aa.flv.
但如果播放MP4格式文件如是aa.mp4,还可以使用videoDisPlayer,但不同的地方在source赋值,应该这么写:rtmp://123.32.4.22:1935/fms/MP4:aa
-----------------------------------------
关于封装:
  mencoder本生支持的封装格式有限,不过通过使用libavformat获得了很多封装格式的支持。
你可以使用
mencoder -of help
这个命令获得你的mencoder支持的封装格式。显然,这里相当少:
Available output formats:
avi - Microsoft Audio/Video Interleaved
mpeg - MPEG-1/2 system stream format
lavf - FFmpeg libavformat muxers
rawvideo - (video only, one stream only) raw stream, no muxing
rawaudio - (audio only, one stream only) raw stream, no muxing

但是,命运是能够改变的。当你使用lavf的时候,程序会根据你的扩展名自动判别封装格式,最新的官方文档有详细的说明:
libavformat container nameDescription
mpgMPEG-1 and MPEG-2 PS
asfAdvanced Streaming Format
aviAudio-Video Interleaved
wavWaveform Audio
swfMacromedia Flash
flvMacromedia Flash video
rmRealMedia
auSUN AU
nutNUT open container (experimental and not yet spec-compliant)
movQuickTime
mp4MPEG-4 format
dvSony Digital Video container
mkvMatroska open audio/video container

  所以呢,结果就是,你可以任意使用这些封装格式,只需要-of lavf即可。
/*-----------------------------------------------------*/
*原创文章,转载请保留指向本文的连接
/*-----------------------------------------------------*/

没有评论: