一、码控简介
x264码率控制主要分为单次编码(1pass)和多次编码(2pass)两大类,其中单次编码主要分如下三种:
- CRF(constant Rate Factor):恒定质量编码(运动/纹理复杂场景,码率上升;静态/纹理简单的画面,码率下降)
- CQP(constant quantization parameter):固定的量化参数,随着视频运动情况,码率会上升和下降。但是码率不可控,码率大小取决于残差大小。
- ABR(average bitrate):编码出来的视频码率在一个恒定值左右波动。该模式下,当目标码率和峰值码率配置相等的时候,就是CBR。
二、ABR算法简介
参考《X264的平均比特率控制算法优化》文档,知道X264的ABR码控流程如下:

算法公式如下:

三、实现过程
1)计算图像的satd
X264对当前图像做抽样滤波,得到分辨率是原来一半的小图。在小图上做半像素精度预测,与原图相减得到残差Xd,再对Xd做hadamond变换并求绝对和得到SATD。
1)x264_frame_init_lowres函数中会根据原图像生成一个宽高都为原图一半的子图像,保存在frame->lowres中。
2)x264_rc_analyse_slice获取当前帧的SATD。satd保存在frames->i_cost_est变量里面。frames->i_cost_est计算过程如下图所示:

2)计算图像模糊复杂度blurred_complexity
rate_estimate_qscale函数:

3)计算量化等级参数qscale。
get_qscale函数:

4)计算rate_factor
rate_estimate_qscale函数:

5)overflow计算
rate_estimate_qscale函数:

6)根据qscale计算QP
qscale2qp函数:

至此,初始帧级QP计算出来了。但是还需要根据实际编码码率和目标码率继续微调。
7)根据VBV buffer调整帧级QP
VBV(Video Buffering Verifier,视频缓存检验器),处理各帧编码后大小不一和恒定输出码率的矛盾。可将VBV想象一个水池,水池的入口连接着encoder的输出,出口为恒定码率的网络输出。为使输出恒定,encoder必须保证水池既不上溢也不下溢。下溢会导致无数据输出,上溢会导致数据丢失。所以encoder在编码一帧时会参考当前vbv的充盈情况,并由此计算出,当前帧应当编码出多少比特,从而保证既不上溢(增加QP)也不下溢(减少QP)。
clip_qscale函数

8)关于自适应量化功能
- X264_AQ_NONE
不开启AQ模式,帧内宏块全部使用同一QP或者固定的QP表
- X264_AQ_VARIANCE
使用方差动态计算每个宏块的QP。

- X264_AQ_AUTOVARIANCE
方差自适应模式,会先遍历一次全部宏块,统计出一些中间参数,之后利用这些参数,对每个宏块计算QP。

- X264_AQ_AUTOVARIANCE_BIASED

x264_adaptive_quant_frame函数


六、参考
http://www.joca.cn/CN/abstract/abstract16235.shtml
https://blog.youkuaiyun.com/u011875342/article/details/78110181
本文深入探讨了x264视频编码器的码率控制机制,包括CRF、CQP、ABR和CBR等编码模式,重点解析了ABR算法的工作流程和实现细节,从图像复杂度评估到量化参数调整,再到自适应量化功能,全面覆盖了x264码控的关键技术。

3431





