ffmpeg和mencoder做x264/h264高清编码笔记

 本文使用的ffmpeg和mencoder分别为ffmpeg SVN-r23004和mencoder SVN-r31144版,其他版本具体指令和操作方法可能不同。
 
    编码后的mp4文件,可在flash中播放,且测试支持Nginx +  H264 Streaming  Module for  Nginx (version 2)进行视频拖动播放。
 
    使用ffmpeg进行高清编码,使用如下命令参数:
    ffmpeg -y -i input.mp4 -acodec libfaac -ab 64k -ar 22050 -b 200k -vcodec libx264 -cqp 28 -coder 1 -refs 3 -deblockalpha 1 -deblockbeta -1 -me_method umh -subq 7 -me_range 32 -trellis 1 -chromaoffset -2 -nr 0 -bf 4 -b_strategy 1 -bframebias 0 -directpred 3 -g 250 -i_qfactor 1.3 -b_qfactor 1.4 -flags2 +bpyramid+wpred+mixed_refs+8x8dct -er 2 -threads 4 output.mp4
    其中相对重要以及对编码速度影响较大的参数有 -refs -me_method -bf -threads 等,具体涵义可另查。
 
    使用如上ffmpeg命令编码,出现的问题是生成的文件较大,码率相比-b的设置偏高不少,即使加上-maxrate也控制不住,还需继续关注如何改进。
 
    使用如下mencoder命令对视频进行高清编码:
    mencoder input.mp4 -of lavf -oac faac -faacopts mpeg=4:object=2:raw:br=32 -srate 22050 -ovc x264 -x264encopts global_header:cabac=1:ref=3:deblock=1:me=umh:frameref=5:mixed_refs=1:me_range=32:chroma_me=1: trellis=1:8x8dct:no-chroma-me=0:chroma_qp_offset=-2:nr=0:dct_decimate=1:bframes=4:b_pyramid=0: b_adapt=1:b_bias=0:direct=auto:keyint=250:keyint_min=25:scenecut=40:qp=18:bitrate=256:subq=7: threads=auto -lavdopts er=2 -lavfopts format=mp4 -sws 3 -vf harddup,scale=480:-3 -ofps 24 -idx -o output.mp4
    其中的重要参数与ffmpeg的类似。
 
    使用以上mencoder命令参数编码,-of lavf 不能少,发现 -srate 既不起作用也不影响执行,global_header也必须有。以上参数为较高质量的设置,编码时间长,差不多需要视频时长的2倍时间,但是相比ffmpeg码率控制的很好,与bitrate参数设置的很接近,最终文件较小,比同等编码的flv还小,在画质很不错的同时,每分钟视频仅有2MB多大小。
 
 
    原本计划用ffmpeg编码x264/AVC的同时添加透明水印,之后再用mencoder在压小文件大小的同时进行添加字幕或合并多视频的操作。结果每次使用mencoder想对使用上述ffmpeg编码命令生成的mp4文件进行编码时,总是报 dimensions not set 错误,编码失败,多处查询解决办法未果,看来要么ffmpeg生成的x264视频文件有问题,要么mencoder不认ffmpeg生成的视频。
 
    后采取折中的办法,想先用ffmpeg生成xvid编码的文件,再用mencoder压制x264/AVC,结果应该是又碰上了ffmpeg进行libxvid编码时的另一个bug,对有的视频文件报 Invalid pixel aspect ratio 错误。
 
    最终选择先用ffmpeg进行mpeg4编码,再用mencoder压制的步骤,这样,整个处理过程基本顺利,没有出现什么大问题了。

你可能感兴趣的:(视频,centos,ffmpeg,h264)