FFmpeg X264编码参数
目录
- 码率控制 1
- X264的preset和tune 2
- 编码延时建议 2
- ffmpeg编码参数和x264参数对照 3
- x264参数说明 5
2.码率控制
X264提供三种码率控制的方式:bitrate, qp, crf。这三种方式是互斥的,使用时设置其中之一即可。
(1)bitrate
x264会尝试把给定的位元率作为整体平均值来编码。这意味着最终编码文件的大小是已知的,但最终的品质未知。此选项通常与-pass(两阶段编码)一起使用。
注意,ffmpeg中设置bitrate的具体参数为bit_rate,单位是bits/s(x264里面对应参数i_bitrate的单位则是kbits/s, 1kbits为1000bits而非1024bits).
(2)qp
使用qp选项时,表示P帧的量化值为qp。I帧和B帧的量化值则是从--ipratio和--pbratio中取得。可使用默认参数,也可自己设定。使用qp模式,即固定量化值,意味着停用弹性量化(aq_mode)。
当qp为0时,为无损编码。
3.X264的preset和tune
鉴于x264的参数众多,各种参数的配合复杂,为了使用者方便,x264建议如无特别需要可使用preset和tune设置。这套开发者推荐的参数较为合理,可在此基础上在调整一些具体参数以符合自己需要,手动设定的参数会覆盖preset和tune里的参数。
--preset的参数主要调节编码速度和质量的平衡,有ultrafast、superfast、veryfast、faster、fast、medium、slow、slower、veryslow、placebo这10个选项,从快到慢。
--tune的参数主要配合视频类型和视觉优化的参数,或特别的情况。如果视频的内容符合其中一个可用的调整值又或者有其中需要,则可以使用此选项,否则建议不使用(如tune grain是为高比特率的编码而设计的)。tune的值有:
film: 电影、真人类型;
animation: 动画;
grain: 需要保留大量的grain时用;
stillimage: 静态图像编码时使用;
psnr: 为提高psnr做了优化的参数;
ssim: 为提高ssim做了优化的参数;
fastdecode: 可以快速解码的参数;
zerolatency:零延迟,用在需要非常低的延迟的情况下,比如电视电话会议的编码。
4.一些编码建议
编码延时
降低x264的延时是可能的,但是会降低质量。若需零延时,设置--tune zerolatency。若你可以接受一点儿小延时(如小于1秒),最好还是允许延时。下列步骤可以降低延迟,当延迟足够小时,就别再进行后续步骤了:
1.从初始值开始
2.关闭sync-lookahead(设置用于线程预测的帧缓存大小。最大值是250.在第二遍及更多遍编码或基于分片线程时自动关闭)
3.降低rc-lookahead,但别小于10(设定mb-tree位元率控制和vbv-lookahead使用的帧数)
4.降低threads(比如从12降到6)
5.使用切片线程(sliced threads)
6.禁用rc-lookahead
7.禁用b-frames
8.实在不行,就用--tune zerolatency
param->rc.i_lookahead = 0;param->i_sync_lookahead = 0; param->i_bframe = 0; param->b_sliced_threads = 1; param->b_vfr_input = 0;param->rc.b_mb_tree = 0;(使用宏块树位元率控制会改善整体压缩率)
x264线程
x264起多少个线程比较好 ?
建议线程数:
1、2、4、8
测试结论:
1、更多的线程会消耗更多总CPU时间片,因此在长期满载的机器上不宜使用多线程。
2、获得的时间收益随线程增多呈递减趋势,8线程以后尤为明显。
3、PNSR下降随线程数增加呈抛物递增趋势,16线程增加到24线程PSNR时下降了0.6之巨。
4、设置threads=auto时,线程数为逻辑CPU个数的1.5倍。
x264各类型帧的大小及编码耗时
注:作参考,未必属实。
I帧、B帧、P帧都极大地受编码参数的影响。
通常情况下:
h264编码的帧由大到小依次为:
I > P > B
(互相之间约有5倍的差距)
x264的编码耗时由长到短依次为:
P > B > I
通常而言,较小的帧因为帧内压缩计算量(deblock、cabac等)小,所以耗时相对短。
P帧的编码耗时长是因为帧间压缩(宏块寻找、运动补偿等)耗时长所以提高了总体耗时。
另外:可以修改x264中的x264_slices_write函数来测量不同类型帧的编码耗时。
5.ffmpeg编码参数和x264参数对照
下面表中涉及的参数直接在AVCodecContext结构中设置:
FFmpeg option x264 option
Code Console Console Code
gop_size -g <frames> –keyint i_keyint_max
bit_rate -b <bits per second> –bitrate rc.i_bitrate
rc_buffer_size -bufsize <bits> –vbv-bufsize rc.i_vbv_buffer_size
rc_max_rate -maxrate <bits> –vbv-maxrate rc.i_vbv_max_bitrate
max_b_frames -bf <int> –bframes i_bframe
keyint_min -keyint_min <int> –min-keyint i_keyint_min
scenechange_threshold -sc_threshold <int> –scenecut i_scenecut_threshold
qmin -qmin <int> –qpmin rc.i_qp_min
qmax -qmax <int> –qpmax rc.i_qp_max
max_qdiff -qdiff <int> –qpstep rc.i_qp_step
qcompress -qcomp <float> –qcomp rc.f_qcompress
qblur -qblur <float> –qblur rc.f_qblur
Refs -refs <int> –ref i_frame_reference
me_method -me_method <epzs,hex,umh,full> –me analyse.i_me_method
merange -me_range <int> –merange analyse.i_me_range
me_subpel_quality -subq <int> –subme analyse.i_subpel_refine
trellis -trellis <0,1,2> –trellis analyse.i_trellis
noise_reduction -nr <int> –nr analyse.i_noise_reduction
level -level <int> –level i_level_idc
bit_rate_tolerance
-bt <bits> –ratetol = -bt / -b rc.f_rate_tolerance
rc_initial_buffer_occupancy -rc_init_occupancy <bits> –vbv-init = -rc_init_occupancy / -bufsize rc.f_vbv_buffer_init
b_quant_factor -b_qfactor <float> –pbratio rc.f_pb_factor
chromaoffset -chromaoffset <int> –chroma-qp-offset analyse.i_chroma_qp_offset
thread_count -threads <int> –threads i_threads
me_cmp -cmp <-chroma/+chroma> chroma-me analyse.b_chroma_me
thread_type thread_type sliced_threads b_sliced_threads
AVCodecContext结构中priv_data可设置的参数见下表:
priv_data(即X264Context option)
preset
tune
profile
fastfirstpass
level
stats
wpredp
x264opts
crf
crf_max
cqp
aq_mode
aq_strength
psy
psy_rd
rc_lookahead
weightb
weightp
ssim
intra_refresh
b_bias
b_pyramid
mixed_refs
dct8x8
fast_pskip
aud
mbtree
deblock
cplxblur
partitions
direct_pred
slice_max_size
stats
nal_hrd
x264_params
其余x264参数设置,见下面格式,多个参数用冒号(:)隔开:
av_opt_set(AVCodecContext->priv_data, "x264opts", "sync-lookahead=0: sliced-threads", 0);
6.x264参数说明
注:下面说明不是最新版本,最新版本请参考x264 --fullhelp
预设
为了减少使用者花费时间和精力在命令列上而设计的一套系统。这些设定切换了什么选项可以从x264 --fullhelp的说明里得知。
profile
预设值:无
限制输出资料流的profile。如果指定了profile,它会覆写所有其他的设定。所以如果指定了profile,将会保证得到一个相容的资料流。如果设了此选项,将会无法使用无失真(lossless)编码(--qp 0或--crf 0)。
如果播放装置仅支援某个profile,则应该设此选项。大多数解码器都支援High profile,所以没有设定的必要。
可用的值:baseline, main, high
preset
预设值:medium
变更选项,以权衡压缩效率和编码速度。如果指定了预设,变更的选项将会在套用所有其他的参数之前套用。
通常应该将此设为所能忍受的最慢一个选项。
可用的值:ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow, placebo
ultrafast
--no-8x8dct --aq-mode 0 --b-adapt 0
--bframes 0 --no-cabac --no-deblock
--no-mbtree --me dia --no-mixed-refs
--partitions none --rc-lookahead 0 --ref 1
--scenecut 0 --subme 0 --trellis 0
--no-weightb --weightp 0
Superfast
--no-mbtree --me dia --no-mixed-refs
--partitions i8x8,i4x4 --rc-lookahead 0 --ref 1
--subme 1 --trellis 0 --weightp 1
param->analyse.inter = X264_ANALYSE_I8x8|X264_ANALYSE_I4x4;
param->analyse.i_me_method = X264_ME_DIA;
param->analyse.i_subpel_refine = 1;
param->i_frame_reference = 1;
param->analyse.b_mixed_references = 0;
param->analyse.i_trellis = 0;
param->rc.b_mb_tree = 0;
param->analyse.i_weighted_pred = X264_WEIGHTP_SIMPLE;
param->rc.i_lookahead = 0;
tune
预设值:无
调整选项,以进一步最佳化为视讯的内容。如果指定了tune,变更的选项将会在--preset之后,但所有其他的参数之前套用。
如果视讯的内容符合其中一个可用的调整值,则可以使用此选项,否则不要使用。
可用的值:film, animation, grain, stillimage, psnr, ssim, fastdecode, zerolatency
slow-firstpass
预设值:无
使用--pass 1会在解析命令列的最后套用以下设定:
--ref 1
--no-8x8dct
--partitions i4x4 (如果最初有启用,否则为无)
--me dia
--subme MIN(2, subme)
--trellis 0
可以使用--slow-firstpass来停用此功能。注意,使用--preset placebo也会启用slow-firstpass。
参阅:--pass
输入/输出
output
预设值:无
指定输出档名。指定的副档名决定视讯的输出格式。如果副档名无法辨识,则预设输出格式是原始格式(raw)视讯资料流(通常储存为.264副档名)。
特殊位置NUL(Windows)或/dev/null(Unix)指明输出应该被丢弃。这在使用--pass 1时特别有用,因为唯一在乎的输出是--stats。
muxer
预设值:auto
指定要输出什么格式。
可用的值:auto, raw, mkv, flv, mp4
auto选项会根据提供的输出档名挑选一个多工器(muxer)。
建议:预设值
参阅:--output
demuxer
预设值:auto
设定x264使用什么解多工器(demuxer)和解码器来剖析输入视讯。
可用的值:auto, raw, y4m, avs, lavf, ffms
如果输入档案有raw、y4m或avs的副档名,则x264会使用相关解多工器来读取档案。标准输入使用原始格式解多工器。否则,x64会尝试以ffms来开启档案,然后再尝试以lavf来开启档案,最后开启失败。
"lavf"和"ffms"选项需要x264以分别的程式库(libraries)编译。如果使用到两者之一,x264会从输入档案带入时间码(timecodes),条件是不能输出为原始格式。这有效地使x264感知VFR。其他选项可以指定--fps为固定帧率,或者指定--tcfile-in为变动帧率。
建议:预设值
参阅:--input, --muxer
input-csp
预设值:无
告诉x264原始格式视讯输入是什么色彩空间。支援的色彩空间可以从x264 --fullhelp的说明里得知。
注意,虽然有支援RGB色彩空间,但视讯在编码之前会使用bt601(即"SD")矩阵来转换成YUV。
参阅:--input-res, --fps
input-res
预设值:无
指定原始格式视讯输入的解析度。语法是--input-res 720x576。
参阅:--input-csp, --fps