x264编码参数详细介绍:Encoder

目录

引言

Encoder parameters

代码模块

解释

基础模块

码率控制模块

分析模块

其他模块

引言

x264编码器引入了引入了各类算法和各类基础编码功能,本片介绍Encoder配置参数详细介绍。

x264编码器全部参数的集合可以参考:x264参数全集_DogDaoDao的博客-CSDN博客

profile、preset、tune等参数集具体详细介绍可以参考: x264编码参数详细介绍_DogDaoDao的博客-CSDN博客

 cpu、Viode properties等参数集具体详细介绍可以参考:x264编码参数详细介绍:cpu与Video properties_DogDaoDao的博客-CSDN博客

Encoder parameters

代码模块

    param->i_frame_reference = 3;
    param->i_keyint_max = 250;
    param->i_keyint_min = X264_KEYINT_MIN_AUTO;
    param->i_bframe = 3;
    param->i_scenecut_threshold = 40;
    param->i_bframe_adaptive = X264_B_ADAPT_FAST;
    param->i_bframe_bias = 0;
    param->i_bframe_pyramid = X264_B_PYRAMID_NORMAL;
    param->b_interlaced = 0;
    param->b_constrained_intra = 0;

    param->b_deblocking_filter = 1;
    param->i_deblocking_filter_alphac0 = 0;
    param->i_deblocking_filter_beta = 0;

    param->b_cabac = 1;
    param->i_cabac_init_idc = 0;

    param->rc.i_rc_method = X264_RC_CRF;
    param->rc.i_bitrate = 0;
    param->rc.f_rate_tolerance = 1.0;
    param->rc.i_vbv_max_bitrate = 0;
    param->rc.i_vbv_buffer_size = 0;
    param->rc.f_vbv_buffer_init = 0.9;
    param->rc.i_qp_constant = -1;
    param->rc.f_rf_constant = 23;
    param->rc.i_qp_min = 0;
    param->rc.i_qp_max = INT_MAX;
    param->rc.i_qp_step = 4;
    param->rc.f_ip_factor = 1.4;
    param->rc.f_pb_factor = 1.3;
    param->rc.i_aq_mode = X264_AQ_VARIANCE;
    param->rc.f_aq_strength = 1.0;
    param->rc.i_lookahead = 40;

    param->rc.b_stat_write = 0;
    param->rc.psz_stat_out = "x264_2pass.log";
    param->rc.b_stat_read = 0;
    param->rc.psz_stat_in = "x264_2pass.log";
    param->rc.f_qcompress = 0.6;
    param->rc.f_qblur = 0.5;
    param->rc.f_complexity_blur = 20;
    param->rc.i_zones = 0;
    param->rc.b_mb_tree = 1;

    /* Log */
    param->pf_log = x264_log_default;
    param->p_log_private = NULL;
    param->i_log_level = X264_LOG_INFO;

    /* */
    param->analyse.intra = X264_ANALYSE_I4x4 | X264_ANALYSE_I8x8;
    param->analyse.inter = X264_ANALYSE_I4x4 | X264_ANALYSE_I8x8
                         | X264_ANALYSE_PSUB16x16 | X264_ANALYSE_BSUB16x16;
    param->analyse.i_direct_mv_pred = X264_DIRECT_PRED_SPATIAL;
    param->analyse.i_me_method = X264_ME_HEX;
    param->analyse.f_psy_rd = 1.0;
    param->analyse.b_psy = 1;
    param->analyse.f_psy_trellis = 0;
    param->analyse.i_me_range = 16;
    param->analyse.i_subpel_refine = 7;
    param->analyse.b_mixed_references = 1;
    param->analyse.b_chroma_me = 1;
    param->analyse.i_mv_range_thread = -1;
    param->analyse.i_mv_range = -1; // set from level_idc
    param->analyse.i_chroma_qp_offset = 0;
    param->analyse.b_fast_pskip = 1;
    param->analyse.b_weighted_bipred = 1;
    param->analyse.i_weighted_pred = X264_WEIGHTP_SMART;
    param->analyse.b_dct_decimate = 1;
    param->analyse.b_transform_8x8 = 1;
    param->analyse.i_trellis = 1;
    param->analyse.i_luma_deadzone[0] = 21;
    param->analyse.i_luma_deadzone[1] = 11;
    param->analyse.b_psnr = 0;
    param->analyse.b_ssim = 0;

    param->i_cqm_preset = X264_CQM_FLAT;
    memset( param->cqm_4iy, 16, sizeof( param->cqm_4iy ) );
    memset( param->cqm_4py, 16, sizeof( param->cqm_4py ) );
    memset( param->cqm_4ic, 16, sizeof( param->cqm_4ic ) );
    memset( param->cqm_4pc, 16, sizeof( param->cqm_4pc ) );
    memset( param->cqm_8iy, 16, sizeof( param->cqm_8iy ) );
    memset( param->cqm_8py, 16, sizeof( param->cqm_8py ) );
    memset( param->cqm_8ic, 16, sizeof( param->cqm_8ic ) );
    memset( param->cqm_8pc, 16, sizeof( param->cqm_8pc ) );

    param->b_repeat_headers = 1;
    param->b_annexb = 1;
    param->b_aud = 0;
    param->b_vfr_input = 1;
    param->i_nal_hrd = X264_NAL_HRD_NONE;
    param->b_tff = 1;
    param->b_pic_struct = 0;
    param->b_fake_interlaced = 0;
    param->i_frame_packing = -1;
    param->i_alternative_transfer = 2; /* undef */
    param->b_opencl = 0;
    param->i_opencl_device = 0;
    param->opencl_device_id = NULL;
    param->psz_clbin_file = NULL;
    param->i_avcintra_class = 0;
    param->i_avcintra_flavor = X264_AVCINTRA_FLAVOR_PANASONIC;

解释

基础模块

i_frame_reference 

/* Maximum number of reference frames */

  • 控制DPB(Decoded PictureBuffer)的大小,取值范围1~16,其实就是设置P帧可以选择它之前的多少帧作为参考帧;
  • 当设置为1的时候,只参考自己前面的那帧;
  • B帧能利用的P帧数要少1-2帧,取决于是否开启B帧参考;
  • h264标准限制了每个level可以参考的帧数量,如果选择level4.1,则1080p最大的ref可用是4,720p最大ref可用是9;
  • 该值不影响解码的速度,但是值越大解码所需要的内存越大,ref一般越大效果越好,但是超过6以上效果就不明显了;一定程度上影响性能,但是影响不大;
  • ref=13 比 ref=4可以节省6%~15%的体积;
  • 缺省状态是 3;
  • preset = ultrafast(1)、superfast(1)、veryfast(1)、faster(2)、fast(2)、medium(3)、slow(5)、slower(8)、veryslow(16)、placebo(16)
  • tune = animation(ref>1?ref*2:1)、touhou(ref>1?ref*2:1)
  • ffmpeg解释
    • One of H.264′s most useful features is the abillity to reference frames other than the one immediately prior to the current frame. This parameter lets one specify how many references can be used, through a maximum of 16. Increasing the number of refs increases the DPB (Decoded Picture Buffer) requirement, which means hardware playback devices will often have strict limits to the number of refs they can handle. In live-action sources, more reference have limited use beyond 4-8, but in cartoon sources up to the maximum value of 16 is often useful. More reference frames require more processing power because every frame is searched by the motion search (except when an early skip decision is made). The slowdown is especially apparent with slower motion estimation methods. Recommended default: -refs 6
  • 使用方法
    • param->i_frame_reference = 3; //代码版
    • --ref/frameref 3 //命令行版

i_keyint_max 

/* Force an IDR keyframe at this interval */

  • 在此间隔强制插入一个IDR关键帧;一般是最大的IDR帧间距,user根据不同的业务场景设置符合业务特性的值;
  • 缺省状态是250;
  • 使用方法
    • param->i_keyint_max=250; //代码版
    • --keyint 30 //命令行版

i_keyint_min

/* Scenecuts closer together than this are coded as I, not IDR. */

  • 参考:基础不牢之x264中的min-keyint参数有什么用? - 知乎
  • 设置IDR帧之间的最小间隔,keyint范围太小将导致IDR帧出现在“错误”的位置(如闪烁的场景a strobing scene),该参数限制每个IDR帧后必须经过多少帧才能出现下一个IDR帧;
  • 缺省状态是 0时候;X264_MIN( h->param.i_keyint_max/10, (int)fps );
  • 如果手动设置时,则x264_clip3( h->param.i_keyint_min, 1, h->param.i_keyint_max/2+1 );
  • 一般建议保持默认值或者与fps相等值;
  • 使用方法
    • param->i_keyint_min=X264_KEYINT_MIN_AUTO;//代码版
    • --min-keyint/keyint-min 15 //命令行版

i_scenecut_threshold

/* how aggressively to insert extra I frames */

  • 如何积极的插入额外的I帧;设置决策使用I帧、IDR帧的阈值(场景变化检测);
  • x264会计算每一帧与前一帧的不同程度并得到一个值,如果这个值低于scenecut,那么就算检测到一个“场景变化”;如果此时距离上一帧的距离小于min-keyint,则插入一个I帧,否则插入一个IDR帧;
  • Without B-frames, a typical x264 stream has frame types like so: IPPPPP...PI. With --bframes 2, up to two consecutive P-frames can be replaced with B-frames, like: IBPBBPBPPPB...PI.
  • 缺省状态是40;
  • preset= ultrafast时,scenecut = 0,即不插入额外的I/IDR帧;
  • 使用方法
    • param->i_scenecut_threshold=0;//代码版
    • --scenecut 40//命令行版

i_bframe

/* how many b-frame between 2 references pictures */

  • 两个参考图片之间可使用的B帧的数量;
  • B帧和P帧的区别在于B帧可以参照它之后的帧,此特点可以显著的提高压缩率,平均品质还要收到-pbratio选项控制;
  • 有两种B帧类型,一种可以被其他B帧参考,一种不可以被其他B帧参考;
  • B帧的设置会涉及到延时、时间戳同步问题、以及解码播放复杂度,特别场景如RTC一般不用;
  • 缺省状态是 3;
  • preset = ultrafast(0)、veryslow(8)、placebo(16);
  • tune = animation(+2)、zerolatency(0);
  • 使用方法
    • param->i_bframe=0; //代码版
    • --bframes 0 //命令行版

i_bframe_adaptive

  • 设置B帧决策算法,会影响到x264使用P帧或B帧;
  • 0--关闭,总是使用B帧;1--快速算法,B帧越多速度越快;2--最佳算法,B帧越多速度越慢;
  • 缺省状态1(X264_B_ADAPT_FAST);
  • preset = ultrafast(X264_B_ADAPT_NONE)、slower(X264_B_ADAPT_TRELLIS)、veryslow(X264_B_ADAPT_TRELLIS)、placebo(X264_B_ADAPT_TRELLIS)
  • Set the adaptive B-frame placement decision algorithm. This setting controls how x264 decides between placing a P- or B-frame.
    • 0. Disabled. Pick B-frames always. This is the same as what the older no-b-adapt setting did.Note: For a multi-pass encode, this option is only needed for the first pass where frame types are decided.
    • 2. 'Optimal' algorithm, slower, speed significantly decreases with higher --b-frames setting.
    • 1. 'Fast' algorithm, faster, speed slightly increases with higher --b-frames setting. When using this mode, you basically always want to use --bframes 16.
  • 使用方法
    • param->i_bframe_adaptive=X264_B_ADAPT_FAST;//代码版
    • --b-adapt 1 //命令行版

i_bframe_bias 

  • 调节使用B帧的力度,越大的值越偏向B帧,取值范围-100~100;100或者-100也不能保证完全或全是B帧
  • 一般不推荐使用,除非能保证新的码率控制要比x264更好;
  • 缺省状态是0;

i_bframe_pyramid

 /* Keep some B-frames as references: 0=off, 1=strict hierarchical, 2=normal */

  • 允许B帧作为参考帧;
  • 0(X264_B_PYRAMID_NONE)--不允许B帧作为参考帧,此时只有I帧和P帧才能作为参考帧;1(X264_B_PYRAMID_STRICT)--一个图像组内只允许一个B帧参考帧,蓝光编码强制要求的标准;2(X264_B_PYRAMID_NORMAL)--任意使用B帧参考帧;
  • 缺省状态是2(X264_B_PYRAMID_NORMAL);
  • 使用方法
    • param->i_bframe_pyramid=X264_B_PYRAMID_NORMAL;//代码版
    • --b-pyramid 2 //命令行版

b_deblocking_filter

[-6, 6] -6 light filter, 6 strong

  • 调节H264标准中的内置去块滤镜,是一个性价比很高的选择,对质量提升很明显,相对性能消耗没有很多;
  • 一个总开关(b_deblocking_filter最好打开)和两个子开关(i_deblocking_filter_alphac0、i_deblocking_filter_beta)控制阈值;其中alphac0是去块范围,越大,去块越厉害,细节越小,视频也越模糊,一般来说默认值0就够用,不要超过+-2范围;其中beta是去块阈值,越小,保留细节越多,越多,去块力度越大,可以更好的去除块效应;值越大画面越flat(1:2),越小画面细节越多(-2:-1);
  • 建议值:Low--0:3;Medium--1:-1;High--0:-3;
  • 缺省状态是开启on(0:0);
  • preset=ultrafast(0);
  • tune = fastdecode(0)、film(-1:-1)、animation(1:1)、gain(-2:-2)、stillimage(-3:-3)、touhou(-1:-1);
  • 使用方法
    • param->b_deblocking_filter=1; param->i_deblocking_filter_alphac0=0;param->i_deblocking_filter_beta=0;//代码版
    • --deblock 0:0 //命令行版

b_cabac

  • 开启cabac(自适应二进制算术编码);一般开启可以带来5%~15%的压缩率,且并没有带来太多的性能消耗(高量化下性能消耗比较小);
  • 缺省状态是 1(开启),不开启时就是cavlc;
  • preset = ultrafast(0)、tune=fastdecode(0)、BASELINE(0);
  • ffmpeg解释
    • CABAC is the default entropy encoder used by x264. Though somewhat slower on both the decoding and encoding end, it offers 10-15% improved compression on live-action sources and considerably higher improvements on animated sources, especially at low bitrates. It is also required for the use of trellis quantization. Disabling CABAC may somewhat improve decoding performance, especially at high bitrates. CABAC is not allowed in Baseline Profile. Recommended default: -coder 1 (CABAC enabled)
  • 使用方法
    • param->b_cabac=1; //代码版
    • --cabac 1//命令行版

i_cabac_init_idc

  • 和cabac相关的控制边界参数;
  • 缺省状态是 0;可取值是0、1、2;
  • 保持默认值,没啥太大用,不推荐改动,除非想研究内部算法细节;
  • 使用方法
    • param->i_cabac_init_idc=0;
    • --cabac-idc 0

码率控制模块

i_rc_method 

  • 码率控制方法,主要有三种,X264_RC_CQP(固定量化值)、X264_RC_CRF(固定码率因子)、X264_RC_ABR(平均码率控制);
  • 缺省值X264_RC_CRF(固定码率因子);
  • 需要搭配i_bitrate 、f_rf_constant 、i_qp_constant 三个参数搭配使用;

i_bitrate 

  • 码率设置,需要搭配X264_RC_ABR使用;
  • 缺省值0;

f_rf_constant 

  • CRF设置,需要搭配X264_RC_CRF(固定码率因子)使用;
  • 缺省值23;

i_qp_constant 

  • CQP设置,需要搭配X264_RC_CQP使用;
  • 缺省值-1;

f_rate_tolerance

  • 此参数有双重用途,容忍值能力,是x264码率控制逻辑的一个参数;
  • 有两层含义:在1趟编码时,这个参数控制x264可以偏移给定的平均目标比特率的百分比;可以设置成inf完全关闭码率溢出侦测,最低可以设置成0.01;较高的值可以让x264更好的处理影片结束部分的复杂场景;(1.0意味这允许1%的bitrate偏差);
  • 当开启vbv时(只要使用了任何vbv开头的选项就会开启),这个选项就意味着vbv强度,更高的值意味着允许更高的在设定的vbv值上下波动,在这个含义时,可以使用任意的度量单位;
  • 缺省状态是 1.0,代表着百分比含义;(1.0~100.0可能是比较合理的值范围)
  • 使用方法
    • param->rc.f_rate_tolerance=1.0; //代码版
    • --ratetol 1.0//命令行版

i_vbv_max_bitrate

  • 最大的瞬时比特率,单位是kbps,需要同时设置vbv-bufsize的范围,在crf和ABR码率控制模式下都可以用此两个参数限制码率;
  • 一般设置为 vbv-maxrate = vbv-bufsize = a*bitrate;(也有设置vbv-bufsize = 1.25*vbv-maxrate);
    • a = 0,不启用vbv机制,编码性能最好,但是输出码率波动大,不适用于有实际贷款显示的流媒体传输;
    • a > 1,对每帧数据有限制,但又可以暂时超过平均码率,适用于流媒体传输;不同的分辨率a的取值不同,240p/360p(a=1.8)、432p-1080p(a= 1.5)、1080p以上(a = 1.25);
    • a = 1,等于CBR,一般不采用这中方法;
    • 0 < a < 1, 这样设置没有任何好处,没有意义;
  • 缺省状态是 0;
  • 使用方法
    • param->rc.i_vbv_max_bitrate=0; //代码版
    • --vbv-maxrate 2000 //命令行版

i_vbv_max_bufsize

  • 设置vbv最大可用的缓冲区,单位是kbits;( video BUffering Verifier,视频缓存检验器)
  • 必须与vbv-maxrate同时使用;

i_vbv_buffer_init

  • 设置播放之前必须先载入多少码流到vbv缓冲中,如果值小于1,那么大小就为vbv-init*vbv-bufsize,如果大于1,则是以kbits为单位的值(初始的填满量);
  • 缺省状态是0.9;一般保持默认值状态,不推荐改动;
  • 使用方法
    • param->rc.i_vbv_buffer_init=0.9; //代码版
    • --vbv-init 0.9 //命令行版

i_qp_min

/* min allowed QP value */

  • 最小量化值,范围0~51;
  • 缺省状态是 0;
  • 使用方法
    • param->rc.i_qp_min=0; //代码版
    • --qpmin 0//命令行版

i_qp_max

/* max allowed QP value */

  • 最大量化值,范围0~51;
  • 缺省状态是 INT_MAX(51);
  • 使用方法
    • param->rc.i_qp_max=0; //代码版
    • --qpmax 0//命令行版

i_qp_step

/* max QP step between frames */

  • 设置两帧间量化器最大的可变值;
  • 缺省状态是 4,不推荐改动,除非你有更好的算法;
  • 使用方法
    • param->rc.i_qp_step=4; //代码版
    • --qpstep 4//命令行版

f_pb_factor

  • I帧相对于P帧的量化值的平均增量,越大会提高I帧的品质;
  • 缺省状态时1.4;
  • 使用方法
    • param->rc.f_pb_factor=1.4; //代码版
    • --pbratio 1.4 //命令行版

f_pb_factor

  • B帧相对于P帧的量化值的平均减量,越大会降低B帧的品质;
  • 当mbtree启动时,此设定无作用,mbtree会自动计算最佳值;
  • 缺省状态时1.3;
  • 使用方法
    • param->rc.f_pb_factor=1.3; //代码版
    • --pbratio 1.3 //命令行版

i_aq_mode

/* psy adaptive QP. (X264_AQ_*) */

  • adaptive quantization,自适应量化模式,即根据宏块MB的复杂度来调整每个MB宏块的量化参数;该参数对视频主观质量的影响非常大,甚至决定了一个编码器的优劣;
  • 当 x264 打开 AQ(自适应量化技术,关闭 AQ 时,x264 倾向于对低细节度的平滑区域使用过低码率,AQ 可以更好地把码率分配到各个宏块中),PSNR 和 VMAF 都会严重掉分,SSIM 却能体现出收益。大量实践表明 AQ 与主观呈正相关,SSIM 在这点上更符合主观感受。
  • 缺省状态时 1(X264_AQ_VARIANCE);
  • 0(X264_AQ_NONE)--禁止AQ;
  • 1(X264_AQ_VARIANCE)--允许AQ在整个视频中和帧内重新分配码率;
  • 2(X264_AQ_AUTOVARIANCE)--自方差AQ(实验阶段),尝试逐帧调整强度;
  • 3(X264_AQ_AUTOVARIANCE_BIASED)--偏移方差自适应模式;【此外还有4/5】
  • preset=ultrafast(0)、tune = psnr(0)、tune=ssim(2)
  • 使用方法
    • param->rc.i_aq_mode=X264_AQ_VARIANCE;//代码版
    • --aq-mode 2//命令行版

i_aq_strength

  • 自适应量化强度,决定了码率偏向于低细节(ssd小)部分的强度;
  • 动漫选0.6-1.0、真人选0.8-1.2;
  • tune = animation(0.6)、gain(0.5)、stillimage(1.2)、touhou(1.3)
  • 缺省状态时1.0;0.0-2.0之外的值不推荐使用;
  • 使用方法
    • param->rc.i_aq_strength=1.0;//代码版
    • --aq-strength 1.0//命令行版

i_lookahead

  • 为mbtree和vbv-lookahead设置可用的帧数量,最大可设置250;对于MBtree部分,增加帧数带来更好的效果,但速度也会变慢,mbtree使用的最大缓冲区是MIN(rc-lookahead,keyint);对于vbv-lookahead部分,当使用vbv时,增加帧数带来更好的稳定性和准确度,vbv-lookahead所用的最大值是: MIN(rc-lookahead, MAX(--keyint, MAX(--vbv-maxrate, --bitrate) / --vbv-bufsize * --fps))
  • 缺省状态是40;
  • preset = ultrafast(0)、superfast(0)、verfast(10)、faster(20)、fast(30)、slow(50)、slower(60)、veryslow(60)、placebo(60);
  • tune = zerolatency(0);
  • 使用方法
    • param->rc.i_lookahead = 40;//代码版
    • --rc-lookahead 40//命令行版

f_qcompress

/* 0.0 => cbr, 1.0 => constant qp */

  • 量化期器曲线压缩因子(Quantizer curve compression factor);当与mbtree一起使用时,会影响mbtree的强度(较高的qcomp = 较弱的mbtree);取值范围0.0~1.0;0相当于cbr,1相当于cqp;
  • 缺省状态是 0.6;
  • tune = grain(0.8)
  • 使用方法
    • param->rc.f_qcompress=0.8;//代码版
    • --qcomp 0.8//命令行版

x264编码参数详细介绍:Encoder_第1张图片

f_qblur 

/* temporally blur quants */

  • 把给定的值作为高斯模糊的半径应用到量化曲线上,这意味这分配给每帧的量化期会被它附近的帧的量化期平均掉,这样会达到限制量化波动的效果;
  • 主要是为了防止QP的剧烈抖动,在rate_factor确定之前对complexity和qscale进行的高斯模糊,会和--cplxblur配合使用;
  • 该参数指明了RCEQ后(rate_factor已确定)对qscale进行高斯模糊的filter_size,” filter_size = (int)(qblur*4) | 1”
  • 缺省状态是0.5;
  • 使用方法
    • param->rc.f_qblur=0.5;//代码版
    • --qblur 0.5//命令行版

f_complexity_blur

  • 该参数指明了RCEQ之前(rate_factor未确定)对complexity进行高斯模糊的filter_size, “fileter_size=2*cplxblur+1”
  • 缺省状态是 20;
  • 使用方法
    • param->rc.f_complexity_blur=20; //代码版
    • --cplxblur 20//命令行版

x264编码参数详细介绍:Encoder_第2张图片

b_mb_tree

  • 基于宏块树的码率控制;通过持续监控宏块在帧间的运动和相对权重来提升视频质量;在一定参数条件下,该参数码率节省效果明显;
  • 与该参数有关的是rc-lookahead、qcomp;
  • 缺省状态时 1(开启);
  • preset = ultrafast(0)、superfast(0);
  • tune = zerplatency(0);
  • 使用方法
    • param->rc.b_mb_tree=1; //代码版
    • --mbtree 1//命令行版

分析模块

intra/inter

/* intra/inter partitions */

  • 帧内、帧间MB宏块划分模式;在编码分析模块的时,设置可允许的划分模式开关;
  • 此选项参数对RD性能影响巨大;intra一般有i4x4(X264_ANALYSE_I4x4,对应值是1)、i8x8(X264_ANALYSE_I8x8,对应值是2)、i16x16(最基础的MB大小,对应值是0);
  • inter包括了intra模式,此外还有16x8、8x16、8x8、8x4、4x8、4x4(包括P帧和B帧);
  • 缺省状态不包括PSUB8x8选项;
  • preset = ultrafast(0、0,即都只有16x16MB,不进行划分)、superfast(2、0,即帧内全都有,帧间只有MB16x16,不进行划分)、slowe/veryslow/placebo(增加PSUB8x8选项);
  • 使用方法
    • param->analyse.intra=X264_ANALYSE_I4x4|X264_ANALYSE_I8x8; //代码版
    • param->analyse.inter=X264_ANALYSE_I4x4|X264_ANALYSE_I8x8|X264_ANALYSE_PSUB16x16|X264_ANALYSE_BSUB16x16;//代码版x264编码参数详细介绍:Encoder_第3张图片

i_direct_mv_pred

/* spatial vs temporal mv prediction */

  • 时空MV预测;是B帧里采用的预测方式;即B帧里direct预测模式里对应的开关参数;0(X264_DIRECT_PRED_NONE)--速度和质量都会下降、1(X264_DIRECT_PRED_SPATIAL)--、2(X264_DIRECT_PRED_TEMPORAL)--、3(X264_DIRECT_PRED_AUTO)--质量会好一些,但是速度会下降些;
  • preset=slow(3)、slower(3)、veryslow(3)、placebo(3)
  • 缺省状态是1(X264_DIRECT_PRED_SPATIAL);
  • 使用方法
    • param->analyse.i_direct_mv_pred=X264_DIRECT_PRED_SPATIAL; //代码版
    • --direct 1 //命令行版

i_me_method

/* motion estimation algorithm to use (X264_ME_*) */

  • 整像素运动估计算法;在x264中共有5中快速搜素算法;
  • 0(X264_ME_DIA)--diamond菱形搜索,是最简单的搜索方式,从最优预测值出发,上、下、左、右一个像素处检测运动向量MV,挑选最好值,然后重复该步骤,知道找不到最优的运动向量mv;
  • 1(X264_ME_HEX)--hexagon六边形搜索,对周围六个点进行rang-2搜索,效率大大高于dia,且速度相当,一般都用此方法;
  • 2(X264_ME_UMH)--(uneven multi-hex不对称多六角形搜索)比hex慢很多,但能搜索复杂的多六角形,以避免错过很难找到的运动向量。与hex和dia相似,merange参数直接控制umh的搜索半径,使用者可自行增减搜索的空间尺寸。
  • 3(X264_ME_ESA)--(exhaustive全面搜索) 在最优预测值附近merange范围内的整个空间内,以高度优化的智能方式搜索运动向量。相当于数学上的穷举法,搜索区域内的每一个运动向量,但是更快些。然而,此方法远远慢于UMH,且好处不多,对于普通编码没有太大用处。
  • 4(X264_ME_TESA)-- (transformed exhaustive变换全面搜索)算法尝试对各个运动向量近似哈达玛变换比较法。与exhaustive类似,但效果略好,速度略慢。
  • preset = ultrafast(0)、superfast(0)、slower(2)、veryslow(2)、placebo(4)
  • 缺省状态是 1(X264_ME_HEX);
  • 使用方法
    • param->analyse.i_me_method=X264_ME_HEX; //代码版
    • --me 1//命令行版

i_me_range

/* integer pixel motion estimation search range (from predicted mv) */

  • 整像素运动估计搜索范围;对于dia、hex搜索算法,范围被控制在4-16像素;对于umh、esa,可以超出16像素进行大范围的运行搜索,这对高分辨率和快速运动的视频很有用;增大此参数也会显著地增加编码耗时;
  • Maximum motion vector search range [16];
  • merange设置太大(>64)也不太可能找到更多有用的运动向量mv,有时反而导致压缩率略微降低
  • preset = veryslow(24)、placebo(24);
  • 缺省状态是16;
  • 使用方法
    • param->analyse.i_me_range=16; //代码版
    • --merange 16//命令行版

i_subpel_refine

/* subpixel motion estimation quality */

  • 亚像素运动估计和模式决定;值越大越好,1-5单纯控制亚像素细化强度,6开启I/P帧的模式决策RDO,7开启全帧类的模式决策RDO;8-9会使用RDO进行最佳MV的模式决策;10时会对QP进行RDO搜索确定最佳值;11就是全部进行RD,无法提前终止;低于2的值会使用一种较快、但较低质量的lookahead模式,且会影响scencut的决策,一般不推荐;
  • Subpixel motion estimation and mode decision [7]
    • 0: fullpel only (not recommended)
    • 1: SAD mode decision, one qpel iteration
    • 2: SATD mode decision
    • 3-5: Progressively more qpel(3--HPel on MB then QPel、4--Always QPel、5--Multi QPel + bi-directional motion estimation)
    • 6: RD mode decision for I/P-frames
    • 7: RD mode decision for all frames
    • 8: RD refinement for I/P-frames
    • 9: RD refinement for all frames
    • 10: QP-RD - requires trellis=2, aq-mode>0
    • 11: Full RD: disable all early terminations
  • preset = ultrafast(0)、superfast(1)、veyfast(2)、faster(4)、fast(6)、slow(8)、slower(9)、veryslow(10)、placebo(11);
  • 缺省状态是 7;
  • 使用方法
    • param->analyse.i_subpel_refine=7;//代码版
    • --subme 8 //命令行版

mvrange/mv-range

/* maximum length of a mv (in pixels). -1 = auto, based on level */

  • 运动矢量的最大垂直范围,单位是像素;
  • 缺省状态是 -1 ,即设置根据level而不同;
  • level1/1b:64 、level1.1-2.0:128、level2.1-3.0:256、level3.1+:512;
  • 如果想手动更改mvrange,在上述基础上减去0.25;//?
  • 保持默认值是比较好的推荐;

mvrange-thread/mv-range-thread

/* minimum space between threads. -1 = auto, based on number of threads. */

  • 线程间最小运动向量缓冲,基于线程数,保持默认值,不不推荐改动;
  • 缺省状态是-1;

b_mixed_references

/* allow each mb partition to have its own reference number */

  • 混合参考,允许每个宏块位置有它自己的参考号;基于8x8区块选择参考,而非基于宏块MB,对于多ref模式可与你提升质量,但速度减慢;
  • 缺省状态是 1(开启状态);
  • preset = ultrafast(0)、superfast(0)、veryfast(0)、faster(0);
  • 使用方法
    • param->analyse.b_mixed_references=1; //代码版
    • --mixred-refs 0 //命令行版

b_chroma_me

  • 通常,运动预测同时作用于亮度和色度平面,当关闭此选项则禁用色度运动预测,以换取少量的速度提升。
  • 缺省状态是 1(开启状态);
  • 使用方法
    • param->analyse.b_chroma_me=1; //代码版
    • --chroma-me 1 //命令行版

f_psy_rd/f_psy_trellis

/* Psy RD strength *//* Psy trellis strength */

  • 是一个组合参数,即第一个参数是f_psy_rd(rd强度参数),第二个参数是f_psy_trellis(trellis强度参数);是针对心理视觉优化的选项参数;
  • f_psy_rd只有在subme>=6才会开启;
  • trellis值越大就代表越看重优化之后的bits大小,反之亦然更注重图像的质量,但目前还在实验阶段;严格来说,psy_trellis是一种算法,而不是一种量化矩阵,只是它的行为(或者说函数名字)伪装成了量化矩阵。在正常编码阶段,数据会经过DCT变换->quant量化->zigzag扫描->编码,这几个阶段。而psy_trellis干的事情,就是把quant量化之后的数据拿出来,然后对每一个系数coef进行评估,试图找出到底是coef-1好,还是原本的 coef更优秀,然后找出一串最优的编码。所以经过psy_trellis量化的系数,它的解码过程和正常的解码一点区别也没有,因为psy_trellis并没有提供另一种更优秀的量化矩阵,所以也用不着特定的反量化矩阵了。它做的仅仅是评估一下“如果把系数coef减去1,会不会得到更优秀的结果”这件事。至于为什么要这么做,或者说为什么coef-1会比原本的coef更优秀,究其原因还是因为quant量化带来的精度损失,再加上x264采用了严格的四舍五入的整数运算策略,这就导致有时候coef-1反而对图像更友好,而且还能减少编码之后的bits。要实现这个功能,在CABAC和CAVLC下是不同的;
  • 缺省状态是1.0:0.0;
  • tune = film(1:0.15)、gain(1:0.25)、animation(0.4:0)、stilimage(2.0:0.7)、touhou(1:0.2)
  • ffmpeg解释
    • First value represents the amount that x264 biases in favor of detail retention instead of max PSNR in mode decision. Requires subme >= 6. Second value is psy-trellis, an experimental algorithm that tries to improve sharpness and detail retention at the expense of more artifacting. Recommended starting values are 0.1-0.2. Requires trellis >= 1. Recommended default: 1.0:0.0
  • 使用方法
    • param->analyse.f_psy_rd=1.0;param->analyse.f_psy_trellis=0; //代码版
    • --psy-rd 1.0:0.0 //命令行版

b_psy

 /* Toggle all psy optimizations */

  • 切换所有心理视觉优化;心理视觉优化算法,针对人眼特别优化..通过舍弃那些人眼不容易注意到的信息来提高压缩率;
  • 缺省状态是1(开启状态);
  • tune = psnr(0)、ssim(0);
  • 最好保持开启状态,能提升视频的主观视觉质量;
  • 使用方法
    • param->analyse.b_psy=1; //代码版
    • --psy 1 //命令行版

i_chroma_qp_offset

  • 设置一个用于色度编码(译者按:视频使用YUV编码,人眼对于亮度更敏感)的量化器的偏移值。可以是负值。在开启 psy-rd或 psy-trellis时 x264会自动降低色度的量化参数用于补偿亮度的量化器,意味着色度质量会被降低。它们默认会在chroma-qp-offset的基础上减2。
  • 注意:x264在量化器=29时会为亮度和色度使用同样的量化器。往后,色度都会使用比亮度还好的量化器,最后,亮度达到q=51时,色度的量化器是q=39。这个是H.264标准中要求的做法。
  • 缺省状态是 0;
  • 使用方法
    • param->analyse.i_chroma_qp_offset=0;
    • //代码版--chroma-qp-offset 0 //命令行版

b_fast_pskip

/* early SKIP detection on P-frames */

  • P帧的早期跳过决策,关闭时会带来非常大的耗时,只能换回来非常小的质量提升,最好开启状态;
  • 缺省状态是1(开启状态);
  • preset = placebo(0);
  • 使用方法
    • param->analyse.b_fast_pskip=1; //代码版
    • --fast-pskip 1 //命令行版

i_weighted_pred

/* weighting for P-frames */

  • 参考:https://www.cnblogs.com/wangnath/p/15057885.html
  • 使x264能够使用明确加权预测(explicit weighted prediction)来改善P帧的压缩。亦改善淡入/淡出的品质。模式越高越慢。
  • 在lookahead阶段计算权重系数w,所以正式编码阶段只要去用w就行了。而Weight-P主要添加的代码是在reference_build_list函数中,如果当前帧编码帧是P帧,那么在编码阶段,会调用x264_mb_analyse_init函数把wieghted-ref帧数据算出来,然后就可以进行运动预测的计算了。
  • 0(X264_WEIGHTP_NONE)--停用、1(X264_WEIGHTP_SIMPLE)--简易分析淡入淡出,但不分析重复参考帧、2(X264_WEIGHTP_SMART)--智慧分析淡入淡出和重复参考帧;
  • 在webrtc中使用该参数报错,不兼容;//目前不知道为什么原因?
  • 注意:为Adobe Flash(版本低于10.1)编码时请把此值设为0,会导致解码时出现错误。Flash 10.1时此BUG得到修正。
  • 缺省状态是 2;
  • preset = ultrafast(0)、superfast(1)、veryfast(1)、faster(1);tune = fastdecode(0);BASELINE(0);
  • 使用方法
    • param->analyse.i_weighted_pred=X264_WEIGHTP_SMART; //代码版
    • --weightp 2 //命令行版

b_weighted_bipred

/* implicit weighting for B-frames */

  • weighted prediction for B-frames;
  • h264允许给可参考B帧加上影响预测图像的权重,算法和功能类似-weightp;但只有0和1,即开启关闭状态;
  • 缺省状态1(开启);
  • preset = ultrafast(0);
  • tune = fastdecode(0);
  • 使用方法
    • param->analyse.b_weighted_bipred=1; //代码版
    • --weightb 1 //命令行版

b_dct_decimate

 /* transform coefficient thresholding on P-frames */

  • 在P帧里的DCT变换的系数阈值;该参数会舍弃它认为“不必要的”的DCT区块,会改善编码效率,但降低的品质通常微不足道;
  • 缺省状态是 1(开启);
  • tune = gain(0);
  • 使用方法
    • param->analyse.b_dct_decimate=1; //代码版
    • --dct-decimate 1 //命令行版

b_transform_8x8

  • 自适应变换size;该选项的编码和解码速度成本都接近为0,关闭掉的唯一原因有些设备不兼容hiigh profile设置;
  • ffmpeg解释
    • Gives a notable quality boost by allowing x264 to choose between 8×8 and 4×4 frequency transform size. Required for i8x8 partitions. Speed cost for this option is near-zero both for encoding and decoding; the only reason to disable it is when one needs support on a device not compatible with High Profile
  • 缺省状态是 1(开启);
  • preset = ultrafast(0)、BASELINE(0)、MIAN(0);
  • 使用方法
    • param->analyse.b_transform_8x8=0; //代码版
    • --8x8dct 0 //命令行版

i_trellis

/* trellis RD quantization */

  • 格子RD量化,来提升编码效率;
  • Trellis quantization is an algorithm that can improve data compression in DCT-based encoding methods. It is used to optimize residual DCT coefficients after motion estimation in lossy video compression encoders such as Xvid and x264. Trellis quantization reduces the size of some DCT coefficients while recovering others to take their place. This process can increase quality because coefficients chosen by Trellis have the lowest rate-distortion ratio. Trellis quantization effectively finds the optimal quantization for each block to maximize the PSNR relative to bitrate. It has varying effectiveness depending on the input data and compression method.
  • 0--禁用、1--仅用于最终编码的宏块MB、2--用于所有模式选择;一般选择1能更好的平衡速度和效率,选择2会进一步降低速度,有时候还会令细节模糊;
  • 缺省状态是 1;
  • preset = ultrafast(0)、superfast(0)、veryfast(0)、slow(2)、slower(2)、veryslow(2)、placebo(2)
  • 需要开启cabac熵编码才生效;
  • 使用方法
    • param->analyse.i_trellis=1; //代码版
    • --trellis 1 //命令行版

i_luma_deadzone[0]/i_luma_deadzone[1]

/* the deadzone size that will be used in luma quantization */

  • 设定inter/intra亮度量化deadzone(死区,提供输出为0的区域)的大小,该参数取值范围0~32,deadzone值设定了x264对于何种精细程度的细节,会选择丢弃而不保留。太精细的细节很难察觉,且编码代价大,丢弃这类细节能防止在低回报画面上浪费码率;
  • deadzone与trellis相斥;
  • 缺省状态是deadzone-inter = 21,deadzone-intra = 11;
  • tune = grain(6, 6)
  • 使用方法
    • param->analyse.i_luma_deadzone[0] =6; param->analyse.i_luma_deadzone[1] =6; //代码版
    • --deadzone-inter 6 --deadzone-intra 6 //命令行版

其他模块

i_cqm_preset 

  • 自定义量化矩阵设置为内置预设值,一般包括flat、jvt、custom三种;很少有手动改动示例;不推荐改动,尽量保持默认值;
  • 0(X264_CQM_FLAT)、1(X264_CQM_JVT)、2(X264_CQM_CUSTOM);
  • 缺省状态是0;
  • profile = BASELINE(0)、MAIN(0);
  • 使用方法
    • p->i_cqm_preset=X264_CQM_FLAT; //代码版
    • --cqm 0 //命令行版

b_repeat_headers

/* put SPS/PPS before each keyframe */

  • 在每个关键帧前面都放置SPS、PPS;最好保持开启状态,这样在丢包情况下,减少错误解码情况;
  • 缺省状态是 1(开启);
  • 使用方法
    • param->b_repeat_headers=1; //代码版
    • --repeat-header 1 /--global-header 0 //命令行版

annexb

/* if set, place start codes (4 bytes) before NAL units, otherwise place size (4 bytes) before NAL units. */

  • 使能b_annexb参数:X264编码器输出的码流格式符合《T-REC-H.264-201704-I!!PDF-E》Annex B Byte stream format+《T-REC-H.264-201704-I!!PDF-E》NAL unit syntax定义格式;
  • 关闭b_annexb参数:X264编码器输出的码流格式符合 “四个字节的长度字段“+《T-REC-H.264-201704-I!!PDF-E》NAL unit syntax定义格式;
  • 两种数据格式的差别主要是在NAL前面这三个或者四个字节的含义上。annexb模式下,b_long_startcode下是4个字节的起始码,short startcode下是3个字节的起始码;当该NAL是NAL_SPS、NAL_PPS或者第一个Slicehead情况下,b_long_startcode为1。非annexb模式下,起始4个字节为该NAL的长度。播放器只能播放annexb格式的裸流。
  • X264编码器之所以有这两种格式,主要是为了配合封装MP4文件格式。MP4文件是由许多个BOX组成,每个BOX的结构是BOX 名+长度+净荷。若长度位不放在净荷信息里面,封装Mp4文件实现起来比较复杂。
  • 缺省状态是1(开启);

x264编码参数详细介绍:Encoder_第4张图片

force-cfr

/* VFR input. If 1, use timebase and timestamps for ratecontrol purposes. If 0, use fps only. */

  • 设置 时,使用timebase和timestamps来进行码率控制处理,计算帧间距离;
  • 设置 0 时,仅仅根据fps来码率控制,计算帧间距离;
  • 在编码器中,码率控制有两个重要的参数,时间基准 和 当前帧时间戳; 为什么需要这两个?因为编码器的码率控制是以时间s为单位的,比如1000kbps,意思是1s有1000kbits的数据量,然后在编码器中并没有时间的概念,只有时间基准和时间戳,这两个合并可以计算出来时间,所以编码器的码率控制都是以这两个参数为基础计算出来的。
  • 时间基准:很多编码器设置的都是1/fps, 但是也有时候需要直接传入ms为单位的帧pts,这样的话,时间基准就需要设置为1/1000, 还有如果像ts/mp4格式解码出来的视频帧,时间基准是1/90000,这样编码的时候就设置成1/90000。
  • 时间戳:当时间基准为1/fps时, 时间戳每次+1,依次递增,这样编码出来的帧之后,需要把时间戳scale为容器(flv,rtmp,mp4, ts等)需要的基准。
  • b_vfr_input意思是变动帧率输入,这样编码器计算帧之间的duration, 直接用前后帧时间戳相减。见代码 h->lookahead->next.list[i]->i_duration = 2 * (h->lookahead->next.list[i+1]->i_pts - h->lookahead->next.list[i]->i_pts);
  • 当b_vfr_input关闭的时候,时间基准需要被设置为1/fps, 要不然无法计算出帧duration。见代 码h->lookahead->next.list[i]->i_duration = delta_tfi_divisor[h->lookahead->next.list[i]->i_pic_struct];delta_tfi_divisor是一个数组,预先设定了,某种类型的帧,duration为多少个时间基准单元。
  • 缺省状态是 1(开启);
  • tune = zerolatency(0);
  • 使用方法
    • param->b_vfr_input=1; //代码版
    • --force-cfr 1 //命令行版

你可能感兴趣的:(H264标准,x264,h264,编码参数,实时音视频,视频编解码,视频直播,转码)