应用率失真优化需要三个算法/模型
- 根据信源输入及选择的编码框架,建立合适的R-D模型(通常是R-Q、D-Q关系);
- 根据给定的码率R以及缓冲区状态,为每个编码单元分配比特并带入R-D模型求解Q,并在编码完成后更新模型参数;
- 针对给定的λ,求解最佳编码参数;
分析应用率失真优化的过程,会发现如下悖论:
- 建立的R-D模型中往往存在与图像内容相关的参数,而这部分参数需要在RDO优化后得到;
- 在比特分配后,求得相应的Qp需要使用该R-D模型,而此时图像尚未进行RDO优化,模型参数无法更新;
因此,部分码率控制模型需要进行二次编码。
本文对H.264参考编码器中采用的JVT-G012r1基础码率控制算法进行了整理,在参考已有研究和文献的基础上记录了一些自己对于公式的理解,并从中分析上述率失真优化算法1、2及其悖论如何实际求解。
参考:
- 专栏H.264 by zhanghui_cuc
- Li Z. Adaptive basic unit layer rate control for JVT
- Scalable Rate Control for MPEG-4 Video
- A novel rate control scheme for video over the internet
预备知识
基础码率控制单元(BasicUnit, BU)的定义
作用:确定码率控制的粒度
为提高码率控制的灵活性,JVT-G012r1中提出BU作为码率控制的粒度。首先给出该方案中对于BU的定义:
N u n i t = N m b p i c N m b u n i t (1) N_{unit} = \frac{N_{mbpic}}{N_{mbunit}} \tag{1} Nunit=NmbunitNmbpic(1)
其中, N u n i t N_{unit} Nunit代表BU个数, N m b p i c N_{mbpic} Nmbpic代表图像中宏块(MacroBlock,MB)总数, N m b u n i t N_{mbunit} Nmbunit代表每一BU中希望分配的MB数量。需要指出,一个BU中的MB是连续的,和片组对于宏块的划分不同。
从定义不难看出,BU的定义使得图像的码率控制可以在帧到宏块的范围间灵活选择。实际应用中,选择更大的BU,比如帧,可以活得更好的率失真性能,但也会导致较大的码率波动;而较小的BU在保证码率平稳的同时则会牺牲部分质量。
流体传输模型
作用:描述虚拟缓冲区的状态
由于实际编码其输出的比特流码率步恒定,且传输信道也可能存在速率波动,因此在编码器与解码器之间需要加入缓冲区以实现速率匹配。流体流量模型对缓冲区的描述如下:
B c ( n i , j + 1 ) = m i n { m a x { 0 , B c ( n i , j ) + A ( n i , j ) − u ( n i , j ) F r } , B s } (2.1) B_c(n_{i,j+1}) = min\left\{ max\left\{0, B_c(n_{i,j}) + A(n_{i,j}) - \frac{u(n_{i,j})}{F_r} \right\} ,B_s \right\} \tag{2.1} Bc(ni,j+1)=min{
max{
0,Bc(ni,j)+A(ni,j)−Fru(ni,j)},Bs}(2.1)
B c ( n 1 , 1 ) = B s 8 (2.2) B_c(n_{1,1}) = \frac{B_s}{8} \tag{2.2} Bc(n1,1)=8Bs(2.2)
B c ( n i + 1 , 0 ) = B c ( n i , N G O P ) (2.3) B_c(n_{i+1,0}) = B_c(n_{i,N_{GOP}}) \tag{2.3} Bc(ni+1,0)=Bc(ni,NGOP)(2.3)
其中:
- n i , j n_{i,j} ni,j为第i个GOP中第j帧图像
- N G O P N_{GOP} NGOP为GOP中图像总数
- B c ( n i , j ) B_c(n_{i,j}) Bc(ni,j)为编码第j帧图像后缓冲区占用的比特数
- A ( n i , j ) A(n_{i,j}) A(ni,j)为 n i , j n_{i,j} ni,j产生的比特数
- u ( n i , j ) u(n_{i,j}) u(ni,j)为编码完 n i , j n_{i,j} ni,j时刻可用的信道带宽
- F r F_r Fr为帧率
- B s B_s Bs为缓冲区上限
解释:
- 式(2.1)表明,在向假设解码器(Hypothetical Reference Decoder, HRD)中输入第j+1帧码流后,缓冲区内的数据容量由三项构成:第一项为第j帧输入后的缓冲区容量,第二项为第j帧的比特数,第三项为当前信道速率下每一帧的平均码率。
- 式(2.2)表明第一帧编码完后的缓冲区初始充盈度为缓冲区上限的1/8;
- 式(2.3)表明第i+1个GOP刚刚开始时缓冲区充盈度为第i个GOP结束时的充盈度。
二项式率失真模型
作用:建立码率R-失真D的关系
文献“A New Rate Control Scheme Using Quadratic Rate Distortion Model”指出二次R-D率失真模型如下:
R = a Q − 1 + b Q − 2 (3.1) R = aQ^{-1}+bQ^{-2} \tag{3.1} R=aQ−1+bQ−2(3.1)
在MPEG-4 VM8码率控制算法中对该模型进行改进:
R − H M A D = a Q − 1 + b Q − 2 (3.2) \frac{R-H}{MAD} = aQ^{-1}+bQ^{-2} \tag{3.2} MADR−H=aQ−1+bQ−2(3.2)
其中:
- H H H为非纹理(头信息)比特数
- M A D MAD MAD为待变换编码数据平均误差和
- a , a a, a a,a为模型参数
解释:
- 该公式直观地反应了率失真优化中存在的悖论:为当前帧编码选取Q需要得知当前图像与预测图像的MAD,而MAD在编码前无法获得。
线性MAD预测模型
作用:通过预测解决R-D模型中MAD值的选取,即悖论的解决
该模型通过前一帧中相同位置的BU实际得到的MAD值预测当前帧BU的MAD值。
M A D c b = a 1 ∗ M A D p b + a 2 (4) MAD_{cb} = a_1 * MAD_{pb} + a_2 \tag{4} MADcb=a1∗MADpb+a2(4)
其中:
- M A D c b MAD_{cb} MADcb为当前帧当前BU的MAD预测值
- M A D p b MAD_{pb} MADpb为上一帧同位置BU的MAD实际值
- a 1 , a 2 a_1, a_2 a1,a2为模型参数,初始值为1和0
码率控制方案大体流程
- 用流体传输模型和线性跟踪理论来计算当前帧的目标比特数
- 平均分配剩余的比特数给当前帧中其他没有编码的基本单元
- 通过MAD线性预测模型用前一帧相同位置处的基本单元的实际MAD值来预测当前帧的当前基本单元的MAD值
- 用二次R-D模型计算相应的QP值
- 用从步骤4得来的QP值来对当前基本单元中的每一个宏块进行RDO
层级:GOP -> 帧 -> BU
GOP级码率控制方案
该层级码率控制方案主要解决每一GOP的总可用比特数、初始QP分配。
总比特数计算
T r ( n i , 0 ) = u ( n i , 1 ) F r ∗ N G O P − ( B s 8 − B c ( n i − 1 , N G O P ) ) (5.1) T_r(n_{i,0}) = \frac{u(n_{i,1})}{F_r} * N_{GOP} - (\frac{B_s}{8} - B_c(n_{i-1,N_{GOP}})) \tag{5.1} Tr(ni,0)=Fru(ni,1)∗NGOP−(8Bs−Bc(ni−1,NGOP))(5.1)
其中:
- F r F_r Fr为帧率
- u (