一、码控简介
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