[ffmpeg]ffmpeg使用x264编码器参数完整对照
转帖:http://rhingheart.blogspot.com/2009/03/ffmpegx264-ffmpeg-x264.html
注:讲实话,有关这些使用的文章真的不错,我们在这谢谢"SV的边界"本来我自己还想总结一下的。看来没有必要了,呵呵,在次多谢"SV的边界".下面原文
使用ffmpeg进行.264编码的相关文章比较少,google了一下,特总结如下:
- qscale的取值可以是0.01-255但实际使用超过50就很糟糕了
- ffmpeg的cbr模式可以把码率控制的不错,但是vbr无法限制最高码率(虽然有max的设置,但是程序没有实现)
- x264标准的封装是x264+aac in flv或者x264+aac in MP4
接下来说明下ffmpeg命令行的语法规则(本块内容来自2009-03-02官方文档):
语法规则结构:
ffmpeg [[infile options][`-i' infile]]... {[outfile options] outfile}...
一个最简单的命令形式:
ffmpeg -i input.avi -b 64k output.avi
这个命令把视频以64k的码率重编码。
显然,输入文件前面要加一个-i选项下面介绍一些有用的全局参数:
- -formats 参数。会显示你机器当前支持的封装、编码、解码器的信息
- -y参数,会指示ffmpeg覆盖输出文件
- -t 指定视频流持续的时常,支持以秒为单位的数字或"时:分:秒[.毫秒]"
- -fs 指定输出文件大小的限制
- -ss 指定开始的时间,和-t的单位一样
- -target 直接设定你想要转成的目标格式,所有的相关设置都会采用内设值,当然也你也可以加上自己要修改的参数。可用的选择有:
"vcd", "svcd", "dvd", "dv", "dv50", "pal-vcd", "ntsc-svcd", …
这个例子把视频转换成vcd的格式ffmpeg -i myfile.avi -target vcd /tmp/vcd.mpg
接下来介绍视频选项:
- -b 指定码率注意单位是bit/s,所以我们一般要加k,比如 -b 1000k 就是1000kb/s
- -g 设置组的大小
- -vframes 指定要编码的帧数,比如-vframes 1 就是编码1帧,截图的时候就这样写.
- -r 指定帧率,默认是25
- -s 指定图像分辨率,用wxh的格式,比如320×240
- -aspect 指定宽高比 可以些16:9这种,也可以写小数比如1.3333
- -croptop 指定顶部裁减多少像素,类似的还有-cropleft -cropright -cropbuttom
- -bt 设置比特率容许的误差,默认4000k,在第一阶段时使用这个参数会告诉码率控制器能够偏移平均码率多远,这个选项和最大最小码率无关.设太小了不利于质量
- -maxrate 和-minrate 指定允许的最大和最小码率,一般如果要用cbr模式编码的话会用这个:
ffmpeg -i myfile.avi -b 4000k -minrate 4000k -maxrate 4000k -bufsize 1835k out.m2v
否则用处不大 - -vcodec 强制使用某种编码器
- -sameq 使用和源文件相同的质量,这个选项是动态码率的
- -pass 指定编码阶段,这个只有1和2,第一阶段的时候应该不处理音频,并且把输出导向空,比如:
ffmpeg -i foo.mov -vcodec libxvid -pass 1 -an -f rawvideo -y NULffmpeg -i foo.mov -vcodec libxvid -pass 1 -an -f rawvideo -y /dev/null
- -qscale 使用固定量化因子来量化视频这个是在vbr模式的,前面有提到,越小质量越好,不要超过50,相关的参数还有-qmin –qmax用来设定最大最小可使用的量化值
- -qdiff 指定固定量化器因子允许的最大偏差
- -qblur 指定量化器模糊系数,可用范围是0.0-1.0越大使得码率在时间上分配的越平均
- -qcomp 指定视频量化器压缩系数,默认0.5
- -me_method 指定运动估计方法(motion estimation method),可用的选择从垃圾到好排列如下:
zero (0向量)
phods
log
x1
hex
umh
epzs (默认)
full (完全搜索,很慢又好不到哪里去) - -mbd 设定宏模块决策,可用的值:
0 使用mb_cmp,不知道是什么东西,所以这些参数我参考一下mencoder里面的
1 选用需要比特最少的宏块模式
2 选用码率失真最优的宏块模式 - -4mv 使用宏块的4个运动向量,只支持mpeg4
- -part 使用数据划分,只支持mpeg4
- -ilme 强制允许交错的编码,只支持mpeg2和mpeg4,你可以选择用-deinterlace来去交错
音频部分:
- -ar 设置采样频率,默认44100hz
- -ab 设置比特率,默认64k
- -an 禁用音频录制
- -acodec 指定音频编码器
下面举几个x264编码的例子:
我使用mencoder调用x264编码一个psp用的视频:
x264+aac in mp4 (我修改过的,原作者的不能使用)
mencoder test_video.vob -oac lavc -lavcopts acodec=libfaac:abitrate=94 -ovc x264 -x264encopts
/
cabac=1:ref=1:deblock=1,0,0:analyse=0x1,0x111:me=hex:subme=6:psy_rd=1.0,0.0:mixed_refs=0:me_range=32:chroma_me=1:trellis=1:8x/
8dct=0:no-chroma-me=0:chroma_qp_offset=-/
2:nr=0:dct_decimate=1:bframes=3:b_pyramid=0:b_adapt=1:b_bias=0:direct=3:keyint=250:keyint_min=25:scenecut=40:qp=18:bitrate=80/
0 -lavdopts er=2 -of lavf -lavfopts format=mp4 -vf scale=720:480 -o men.mp4
对应的ffmpeg编码参数是:
ffmpeg
ffmpeg -i inputfile.avi -f psp -acodec libfaac -ab 94k -vcodec libx264 -cqp 28 -coder 1 -refs 3 -deblockalpha 1 -deblockbeta -1 -me_method umh -subq 9 -me_range 32 -trellis 2 -chromaoffset -2 -nr 0 -bf 2 -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 -s 480x320
需要注意的是,flags2里面那块,似乎要按照一定顺序才能正常工作,其他地方都差不多,详细情况可以从下面两篇文章得出:
第一篇是这个在网上被传了很多,但有些问题的对照表格,我修改了有问题的部分:
FFmpeg option | x264 option |
---|---|
-g <frames> | –keyint |
-b <bits per second> | –bitrate |
-bufsize <bits> | –vbv-bufsize |
-maxrate <bits> | –vbv-maxrate |
-pass <1,2,3> | –pass |
-crf <float> | –crf |
-cqp <int> | –qp |
-bf <int> | –bframes |
-coder <0,1> | –no-cabac |
-bframebias <int> | –b-bias |
-keyint_min <int> | –min-keyint |
-sc_threshold <int> | –scenecut |
-deblockalpha <int>-deblockbeta <int> | –deblock |
-qmin <int> | –qpmin |
-qmax <int> | –qpmax |
-qdiff <int> | –qpstep |
-qcomp <float> | –qcomp |
-qblur <float> | –qblur |
-complexityblur <float> | –cplxblur |
-refs <int> | –ref |
-directpred <int> | –direct |
-me_method <epzs,hex,umh,full> | –me |
-me_range <int> | –merange |
-subq <int> | –subme |
-bidir_refine <0,1> | –bime |
-trellis <0,1,2> | –trellis |
-nr <int> | –nr |
-level <int> | –level |
-bt <bits> | –ratetol = -bt / -b |
-rc_init_occupancy <bits> | –vbv-init = -rc_init_occupancy / -bufsize |
-i_qfactor <float> | –ipratio = 1 / -i_qfactor |
-b_qfactor <float> | –pbratio |
-chromaoffset <int> | –chroma-qp-offset |
-rc_eq <string> | –rc_eq |
-threads <int> | –threads |
-cmp <-chroma/+chroma> | –no-chroma-me |
-partitions | –partitions |
+parti8×8 | i8×8 |
+parti4×4 | i4×4 |
+partp8×8 | p8×8 |
+partp4×4 | p4×4 |
+partb8×8 | b8×8 |
-flags | |
-loop/+loop | –no-deblock/–deblock |
-psnr/+psnr | –no-psnr/nothing |
-flags2 | |
+bpyramid | –b-pyramid |
+wpred | –weightb |
+brdo | –b-rdo 我这里的ffmpeg已经不能用这个了 |
+mixed_refs | –mixed-refs |
+dct8×8 | –8×8dct |
-fastpskip/+fastpskip | –no-fast-pskip |
+aud | –aud |
热门文章推荐
- [FFmpeg]ffmpeg各类参数说明与使用示例
- [FFmpeg]ffmpeg命令参数详解(帮助说明)强大所有参数
- [ffmpeg]FFmpeg参数命令及用法整理(很全面详细)
- [FFmpeg]图文介绍windows下实现编译ffmpeg工程的详细步骤
- [ffmpeg]ffmpeg使用参数的中文说明
- [ffmpeg]如何使用ffmpeg下载分段并加密的m3u8视频流
- [FFmpeg]php下用ffmpeg扩展实现视频转换截图
- [FFmpeg]ffmpeg支持的格式全解析