x264 参数解释

1. 概述

x264 编码的控制参数非常多,本文记录项目中实际用到的参数,并根据网上查找到的参考资料对这些参数给出进一步解释。

2. 参数解释

2.1 profile

profile 翻译成中文是“配置文件”的意思,可以理解为通过这个参数对 x264 编码的一些基本参数进行了限制。
可以取的值包括:

/* x264_param_apply_profile:
 *      Applies the restrictions of the given profile.
 *      Currently available profiles are, from most to least restrictive: */
static const char * const x264_profile_names[] = { "baseline", "main", "high", "high10", "high422", "high444", 0 };

baseline
这个级别是设置最严格的配置文件,支持 I/p 帧不支持 B 帧,只支持无交错和 CAVLC 编码,一般用于低阶和需要额外容错的应用,例如视频通话和会议电视等实时视频通信。

main
支持 I/P/B 帧,支持无交错(progressive)和交错(interlaced),同样提供对 CAVLC 和 CABAC 的支持,用于主流的消费电子类产品,如低规格的 mp4、便携的视频播放器等。

high
在 main 级别的基础上增加了 8*8 内部预测、自定义量化、无损视频编码和更多的 YUV 格式,用于广播及视频碟片存储、高清电视应用等。

三种 profile 应用的领域不同,baseline 多应用于实时通信领域,main 多应用于流媒体领域,high 多应用于广电和存储领域。

参数优先级
这个参数会覆盖 preset 和 tune 中,以及其他相关的设定值,保证输出 profile 兼容的视频流。如果使用这个选项,将不能进行无损压缩。

2.2 preset

这个值是 x264 的预设,用于设置 x264 的编码速度。可以取的值有:

/*      The presets can also be indexed numerically, as in:
 *      x264_param_default_preset( ¶m, "3", ... )
 *      with ultrafast mapping to "0" and placebo mapping to "9".  This mapping may
 *      of course change if new presets are added in between, but will always be
 *      ordered from fastest to slowest.
 *
 *      Warning: the speed of these presets scales dramatically.  Ultrafast is a full
 *      100 times faster than placebo! */
 /*      Currently available presets are, ordered from fastest to slowest: */
static const char * const x264_preset_names[] = { "ultrafast", "superfast", "veryfast", "faster", "fast", "medium", "slow", "slower", "veryslow", "placebo", 0 };

参数优先级
该参数设置了压缩效率和运算时间平衡的预设值,如果设定了,它会在其他选项生效前生效。

2.3 tune

tune 是 x264 中重要性仅次于 preset 的选项,是视觉优化参数,tune 可以理解为视频偏好(或者视频类型),设置 tune 实际上设置了一套参数集。
可以取的值有:

tatic const char * const x264_tune_names[] = { "film", "animation", "grain", "stillimage", "psnr", "ssim", "fastdecode", "zerolatency", 0 };

/*      Multiple tunings can be used if separated by a delimiter in ",./-+",
 *      however multiple psy tunings cannot be used.
 *      film, animation, grain, stillimage, psnr, and ssim are psy tunings. */

film
电影类型,对视频质量要求非常严格时使用该选项。
animation
动画片,压缩的视频是动画片时使用该选项。
grain
该选项适用于颗粒感很重的视频。
stillimage
静态图像,该选项适用于静止画面比较多的视频。
psnr
提高 psnr,该选项编码出来的视频的 psnr 比较高。
ssim
提高 ssim,该选项编码出来的视频 ssim 比较高。
fastdecode
快速解码,该选项有利于快速解码。
zerolatency
零延迟,该选项主要用于视频直播。

参数优先级
在 preset 选项的基础上进一步优化输出,如果设定了 tune 值,它将在 preset 后,其他选项前生效。

2.4 帧率相关

帧率设置
帧率设置与两个参数有关,分别是:i_fps_numi_fps_deni_fps_num 默认值为 25,ip_fps_den 默认值为 1,我们通常只需要设置 i_fps_num值即可。
例如,如果我们设置 i_fps_num = 20,那么意味着设置的帧率就是 i_fps_num / i_fps_den = 20
其中:num 是 numerator 的简写,den 是 denominator 的简写。

关键帧间隔设置

int         i_keyint_max;       /* Force an IDR keyframe at this interval */
int         i_keyint_min;       /* Scenecuts closer together than this are coded as I, not IDR. */

IDR 帧时视频流的“分隔符”,所有的帧都不可以使用越过关键帧的帧作为参考帧。这意味着 IDR 帧可以作为视频搜索的起点。

i_keyint_max 表示最大的 IDR 帧间隔,每当收到 IDR 帧,解码器就会清空参考队列,并且更新 SPS 和 PPS 参数。这个值设置的比较小有利于流畅的播放视频,但是会降低压缩效率,建议设置为帧率的 10 倍。这个值设置较大会减少搜索一个随机帧所需的平均时间。默认值为 250,是默认帧率的 10 倍。如果为蓝光、直播流或者其他什么专业流编码,可能需要更小的图像组长(一般等于 fps)。

i_keyint_min 表示最小的关键帧间隔,默认值为 X264_KEYINT_MIN_AUTO。建议取默认值,或者与帧率相等。
Scenecuts 是两个单词的合并,scene cut,表示场景切换。

插入 I 帧最低值

int         i_scenecut_threshold; /* how aggressively to insert extra I frames */

用于场景变换检测的值,也是决策使用 I 帧、IDR 帧的阈值,x264 会计算每一帧与前一帧的不同程度得出一个值,如果这个值大于 i_scenecut_threshold,那么视为检测到场景变换。正常来说,如果两帧图像的不同程度很低,应该插入 P 帧。但是不同程度低于阈值,如果此时距离上一 IDR 帧的距离小于 i_keyint_min,则插入一个 I 帧,反之则插入一个 IDR 帧。

2.5 码率相关

i_rc_method 设置码率控制方法,可取值有:

#define X264_RC_CQP                  0
#define X264_RC_CRF                  1
#define X264_RC_ABR                  2

具体参考转载的博客:

i_bitrate 表示平均码率,参数的量纲是 kilobits/sec,编码器最终输出文件或者视频流的大小将尽量与这个值相符。

i_vbv_max_bitrate 设置 VBV 可用的最大码率。量纲为 kilobits/sec,注意 VBV 选项在任何一项 VBV 参数开启时启用,VBV = Video Buffering Verifier。值得注意的是,使用 VBV 参数可能会降低视频的质量,只有在确定要使用时再开启。

这里强调一下动态更新码率的问题,在实际测试过程中,遇到可以动态降低码率,但是无法动态增加码率的情况。
这个问题的原因是设置的 i_vbv_max_bitrate 大于 i_bitrate 导致的,这可能是 x264 的一个 bug。如果将 i_vbv_max_bitrate 改为小于或者等于 i_bitrate,就可以动态降低和升高码率了。参考:x264码率控制测试

3.小结

x264 编码参数非常多,在一次项目实践过程中很难对这么多参数有比较深刻全面的理解,只能根据实际需求不断加深对这些参数的理解。

这篇文档以后还会继续扩充完善的。

参考

[1] 中文版MeGUI的x264编码配置详细解读
[2] X264设置

你可能感兴趣的:(x264,音视频开发)