x264码率控制基础

x264码率控制模型

x264码率控制也是基于率失真模型即J = D + \lambda R,D为失真,R为码率,\lambda为拉格朗日因子,当\lambda取值较大时,倾向于低码率高失真的情况;当\lambda取值较小时,倾向于高码率低失真的情况。由拉格朗日乘数法知,\lambda = -\frac{\partial D}{\partial R} \quad\quad\quad\quad\quad (1)

参考[1], x264采用的是高码率下码率和失真之间的关系

R(D)=\alpha ln(\frac{\sigma^2}{D}) \quad\quad\quad\quad(2)

\alpha,\sigma为常数因子,由(2)得\frac{\partial D}{\partial R} = -\frac{D}{\alpha}\quad\quad\quad\quad\quad(3)

由(1)和(3)得,\lambda = \frac{D}{\alpha} \quad\quad\quad\quad\quad\quad(4)

高码率下失真又近似满足(5)

D = \frac{(2\cdot QUANT)^2}{12}=\frac{(QUANT)^2}{3}\quad\quad\quad\quad\quad\quad(5)

其中QUANT为量化步长,由(4)和(5)

\lambda=\frac{(QUANT)^2}{3\alpha}\quad\quad\quad\quad(6)

\alpha为常数,根据经验值,\lambda=0.85 \cdot(QUANT)^2 \quad\quad\quad\quad(7)

QUANT为量化因子,和QP存在转换关系,最终可以把\lambda表示为:

\lambda=0.85 \cdot 2^\frac{QP-12}{6} \quad\quad\quad\quad(8)

通过公式(8)可以看出QP值和\lambda的关系,当QP增加时,\lambda增加;当QP减小时,\lambda减小。我们知道QP增加时,画质质量变差,码率变小,而\lambda增加也意味着码率减小,失真增大。

264中用qscale来表示\lambda,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码率控制数学基础

rceq_{n}=(\frac{\sum_{i=0}^n(0.5^{n-i}\times SATD_{i})}{\sum_{i=0}^n0.5^{n-1}})^{1-comp} \quad\quad\quad\quad\quad(9)

QP_{n}=6\times log_2{\frac{\alpha_{n}\times X_{n}}{0.85\times R_n}} +12 =\\ 6 \times log_2(\frac{\alpha_n\times rceq_n\times (\sum_{i=1}^n\frac{bit_{i-1}\times qscale_{i-1}}{recq_{i-1}})}{0.85\times(\sum_{i=0}^n\frac{bitrate}{fps})})+12 \quad\quad\quad\quad(10)

对照上面的公式,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)

其中\alpha是个常数,comp是考虑人眼视觉特性对SATD的非线性映射,默认取0.6,上面这个式子兼顾了SATD(对标psnr),人眼视觉特性,以及前面帧的STAD和qscale的影响,看似各方面因素都考虑到了。我们做如下分析:

  • 当SATD较大时,recq也较大,qscale较大,前面说了qscale就是RD模型中的\lambda,所以qscale较大意味着倾向于低码率高失真的情况,和实际相符;反之当STAD较小时,对应高码率低失真情况。
  • SATD不但考虑到当前帧的SATD,还考虑到前面帧的SATD,且前面帧的影响力随着距离当前帧的距离由远及近而逐渐增加。
  • 由上面的分析可知,recq和qscale成正向关系,recq表征什么物理含义呢,简单归纳为表示当前帧的综合失真(考虑人眼视觉特性和前面帧的影响)。
  • 再看公式(11),说到底,此公式就是利用历史的\lambda和每一帧的bits来估计当前帧的\lambda。分母很好理解,bitrate为target bitrate,\frac{bitrate}{fps}为平均一帧所分配的bits数目,所以分母的含义为截至目前为止的理想情况下分配的bits,简单理解,如果分母越大,qscale越小,即对应如果目标码率越大,则可以让qscale小些,倾向低失真情况,反之亦然。公式(11)分子右侧部分,即

    \sum_{i=1}^n\frac{bit_{i-1}\times qscale_{i-1}}{recq_{i-1}},bit越小表示历史帧分配的bits少,那么相应的本帧就可以多分点bits,所以qscale就可以小点,反之,qscale就应该大点;如果历史帧的qscale越小,那么本帧的qscale越小,这样为了确保相近帧的画质不至于相差太大,使人眼感觉明显,除以recq是为了起平滑的作用。

以上便是x264码率控制的数学模型和基础,后面会针对x264代码做具体分析。

参考

《深入理解视频编解码技术——基于H.264标准及参考模型》3.11.3节 陈靖 刘京 曹喜信 [1]

x264和x265编码器码率控制之基本模型 - 知乎 [2]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Neil_baby

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值