码率控制
x264码率控制概述(version20100611)
在x264中,,码率控制主要分为ABR和CBR。ABR(average bitrate),即将码流的平均码率控制在一定的范围内。CBR(const bitrate),在编码一个宏块行时调整QP,在vbv buffer不上溢的情况下,保证目标码率和图像质量。其总体流程如下。
ABR码率控制(version20100611)
概述
在H.264标准中,宏块的量化参数从三个语法元素控制。图像参数集中的pic_init_qp_minus26,slice_header()中的slice_qp_delta和macroblock_layer()中的mb_qp_delta。具体详见[1]P175。
在x264中,ABR码率控制的具体流程如下。
在x264 ABR码率控制中,最外层为创建和删除编码器。创建编码器对应的函数为:x264_ratecontrol_new(),其主要功能是分配存储空间,初始化码率控制参数。删除编码器的函数为x264_ratecontrol_delete(),主要功能是释放存储空间。x264_ratecontrol_summary()的功能是收集当前序列的码率控制信息。
ABR码率控制的中间层为图像层面的码率控制。首先是确定当前图像的QP,对应的函数为x264_ratecontrol_start();x264_ratecontrol_qp()的功能是将QP约束在一定的范围内。编码一帧图像结束后,调用函数x264_ratecontrol_end(),更新码率控制的某些参数。
ABR的最内层为宏块层面的码率控制。编码一个宏块之前,利用x264_ratecontrol_mb_qp()获取当前宏块的QP;在编码一个宏块之后,调用函数x264_ratecontrol_mb(),主要功能是更新编码参数。
最外层的码率控制
创建码率控制器x264_ratecontrol_new()
该函数的主要功能是:分编码器h的码率控制器(h->rc)分配内存空间,并初始化其中的参数。有些参数从输入设置中初始化,有的参数利用计算的方式初始化。具体如下表。x264码率控制参数初始化如下表。
参数名称 | 初始化方式 | 含义 |
---|---|---|
rc->fps | 利用输入设–fps | |
rc->qcompress | 利用输入设置–qcomp | |
rc->accum_p_norm | 初始化为0.01 | 用于计算I帧的QP |
rc->accum_p_qp | ABR_INIT_QPrc->accum_p_norm= 240.01 | 用于计算I帧的QP |
rc->cplxr_sum | rc->qcompress和一帧的宏块数决定 | |
rc->last_non_b_pict_type | SLICE_TYPE_I(I帧) | 上一幅非B帧图像的类型 |
rc->ip_offset | 由输入设–ipratio确定 | P帧QP/I帧的QP |
rc->pb_offset | 由输入设–pbratio确定 | B帧QP/P帧的QP |
rc->qp_constant[] | 由rc->ip_offset,rc->pb_offset, h->param.rc.i_qp_constant决定 | 在固定QP编码模式下,IPB帧的QP |
rc->lstep | ||
rc->last_qscale | 对应的QP为26 | 当前由码率控制推出的最后qscale |
rc->last_qscale_for | 对应的QP为ABR_INIT_QP | 同一类型上一幅图像的qscale |
rc->lmin[] | 对应的QP为–qpmin | 最小qscale |
rc->lmax[] | 对应的QP为–qpmax | 最大qscale |
rc->pred | 初始化为具体的数字 | 用于预测的系数 |
rc->row_preds | 初始化为具体的数字 | 用于预测的系数 |
删除码率控制器x264_ratecontrol_delete()
主要是释放内存资源。
图像层面的码率控制
概述
在本函数中,主要有两部分。第一部分为qscale2qp(rate_estimate_qscale(h)),主要用于计算当前图像的QP。第二部分为accum_p_qp_update(),主要用于更新rc的参数accum_p_qp、accum_p_norm;这些参数主要用于计算I帧的QP。
在计算QP过程中,主要是计算中间变量qscale。如果当前帧为I帧,且前一个非B帧为P帧,且不是序列的第一幅图像,其qscale由以前编码图像的QP估算出;否则由图像的编码复杂度,分配的bit数、实际使用的bit数、实际使用的量化参数计算出。
非I帧的qscale:rate_estimate_qscale()
qscale为计算QP的中间变量。影响qscale的因素有两方面:前n帧平均加权(估算)编码代价,编码已分配的bit数、过去图像实际消耗的bit数及实际使用的量化参数。
前n帧平均加权(估算)的编码代价
前n帧加权的编码代价,是前n帧估算出编码代价的加权和。离第n帧比较远的帧,其加权系数要小些;比较近的帧,其加权系数要大些。在代码中对应的变量为rce.blurred_complexity,计算方式如下。计算前n帧加权编码代价主要变量一览表。
公式变量 | 代码变量 | 具体含义 |
---|---|---|
n | 编码图像序号。第一幅编码图像的序号为0,依次加1。 | |
di | rcc->last_satd | 第i幅图像的编码代价 |
mi | rcc->short_term_cplxsum | 在第i帧,编码图像的累积编码代价 |
ti | rcc->short_term_cplxcount | 在第i帧,编码图像的累积序号 |
bi | rcc->wanted_bits_window | 在第i帧,编码已分配的bit数 |
ci | rce.blurred_complexity | 从第0帧开始,前i帧的平均编码代价 |
各变量之间的相互关系如下。设当前编码图像的序号为n。BitNumberOfiFrame:分配给第i帧的bit数。
m n = ∑ i = 0 n d i 2 n − i t n = ∑ i = 0 n 1 2 n − i b n = ∑ i = 0 n B i t N u m b e r O f i F r a m e c n = m n t n \begin{array}{l} {m_n} = \sum\limits_{i = 0}^n {\frac{
{
{d_i}}}{
{
{2^{n - i}}}}} \\ {t_n} = \sum\limits_{i = 0}^n {\frac{1}{
{
{2^{n - i}}}}} \\ {b_n} = \sum\limits_{i = 0}^n {
{\rm{BitNumberOf}}iFrame} \\ {c_n} = \frac{
{
{m_n}}}{
{
{t_n}}} \end{array} mn=i=0∑n2n−iditn=i=0∑n2n−i1bn=i=0∑nBitNumberOfiFramecn=tnmn
过去图像实际消耗的bit数及实际使用的量化参数
这个变量的计算位于函数x264_ratecontrol_end(),其计算方式如下。计算前n帧加权编码代价主要变量一览表如下。
公式变量 | 代码变量 | 具体含义 |
---|---|---|
a_bi | bits | 第i帧实际消耗的bit数 |
q_ai | rc->qpa_rc | 在码率控制模式下,第i帧所有宏块的平均QP |
l_rci | rc->last_rceq | 在只有图像复杂度影响的情况下,第i幅图像的qscale,关于此变量的计算,详见函数get_qscale() |
q | rcc->qcompress | 为常数,说明图像复杂度对qscale的影响 |
c_si | rc->cplxr_sum | 已编码图像的复杂度 |
l _ r c i = ( c i ) 1 − q c _ s n