x264码率控制模型
x264码率控制也是基于率失真模型即,D为失真,R为码率,
为拉格朗日因子,当
取值较大时,倾向于低码率高失真的情况;当
取值较小时,倾向于高码率低失真的情况。由拉格朗日乘数法知,
参考[1], x264采用的是高码率下码率和失真之间的关系
,
为常数因子,由(2)得
由(1)和(3)得,
高码率下失真又近似满足(5)
其中QUANT为量化步长,由(4)和(5)
为常数,根据经验值,
QUANT为量化因子,和QP存在转换关系,最终可以把表示为:
通过公式(8)可以看出QP值和的关系,当QP增加时,
增加;当QP减小时,
减小。我们知道QP增加时,画质质量变差,码率变小,而
增加也意味着码率减小,失真增大。
264中用qscale来表示,qscale和qp的转换关系如下,也和上面的公式吻合。
/* Terminology:
* qp = h.264's quantizer
* qscale = linearized quantizer = Lagrange multiplier
*/
static inline float qp2qscale( float qp )
{
return 0.85f * powf( 2.0f, ( qp - (12.0f + QP_BD_OFFSET) ) / 6.0f );
}
static inline float qscale2qp( float qscale )
{
return (12.0f + QP_BD_OFFSET) + 6.0f * log2f( qscale/0.85f );
}
所以,从本质上来讲,码率控制就是在调整QP,需要先计算出qscale,但是如何计算再进一步把qscale转为便于我们计算的物理量。
x264码率控制数学基础
对照上面的公式,qscale的计算如下
qscale_{n}= \frac{\alpha_n\times rceq_n\times (\sum_{i=1}^n\frac{bit_{i-1}\times qscale_{i-1}}{recq_{i-1}})}{(\sum_{i=0}^n\frac{bitrate}{fps})})\quad\quad\quad\quad(11)
其中是个常数,comp是考虑人眼视觉特性对SATD的非线性映射,默认取0.6,上面这个式子兼顾了SATD(对标psnr),人眼视觉特性,以及前面帧的STAD和qscale的影响,看似各方面因素都考虑到了。我们做如下分析:
- 当SATD较大时,recq也较大,qscale较大,前面说了qscale就是RD模型中的
,所以qscale较大意味着倾向于低码率高失真的情况,和实际相符;反之当STAD较小时,对应高码率低失真情况。
- SATD不但考虑到当前帧的SATD,还考虑到前面帧的SATD,且前面帧的影响力随着距离当前帧的距离由远及近而逐渐增加。
- 由上面的分析可知,recq和qscale成正向关系,recq表征什么物理含义呢,简单归纳为表示当前帧的综合失真(考虑人眼视觉特性和前面帧的影响)。
-
再看公式(11),说到底,此公式就是利用历史的
和每一帧的bits来估计当前帧的
。分母很好理解,bitrate为target bitrate,
为平均一帧所分配的bits数目,所以分母的含义为截至目前为止的理想情况下分配的bits,简单理解,如果分母越大,qscale越小,即对应如果目标码率越大,则可以让qscale小些,倾向低失真情况,反之亦然。公式(11)分子右侧部分,即
,bit越小表示历史帧分配的bits少,那么相应的本帧就可以多分点bits,所以qscale就可以小点,反之,qscale就应该大点;如果历史帧的qscale越小,那么本帧的qscale越小,这样为了确保相近帧的画质不至于相差太大,使人眼感觉明显,除以recq是为了起平滑的作用。
以上便是x264码率控制的数学模型和基础,后面会针对x264代码做具体分析。
参考
《深入理解视频编解码技术——基于H.264标准及参考模型》3.11.3节 陈靖 刘京 曹喜信 [1]