JM编码器码率控制算法笔记:以JVT-G012r1为例

本文详细介绍了H.264编码器中JVT-G012r1码率控制算法,包括基本单元(BU)定义、流体传输模型、率失真模型、线性MAD预测模型以及帧级和BU级的码率控制策略。在率失真优化过程中,通过二次R-D模型和线性MAD预测模型解决悖论,实现码率与失真的最优平衡。此外,还讨论了GOP、帧和BU级别的码率控制细节,如初始QP选择、B帧QP计算以及编码后模型参数更新。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

应用率失真优化需要三个算法/模型

  1. 根据信源输入及选择的编码框架,建立合适的R-D模型(通常是R-Q、D-Q关系);
  2. 根据给定的码率R以及缓冲区状态,为每个编码单元分配比特并带入R-D模型求解Q,并在编码完成后更新模型参数;
  3. 针对给定的λ,求解最佳编码参数;

分析应用率失真优化的过程,会发现如下悖论:

  • 建立的R-D模型中往往存在与图像内容相关的参数,而这部分参数需要在RDO优化后得到;
  • 在比特分配后,求得相应的Qp需要使用该R-D模型,而此时图像尚未进行RDO优化,模型参数无法更新;

因此,部分码率控制模型需要进行二次编码。

本文对H.264参考编码器中采用的JVT-G012r1基础码率控制算法进行了整理,在参考已有研究和文献的基础上记录了一些自己对于公式的理解,并从中分析上述率失真优化算法1、2及其悖论如何实际求解。

参考:

  1. 专栏H.264 by zhanghui_cuc
  2. Li Z. Adaptive basic unit layer rate control for JVT
  3. Scalable Rate Control for MPEG-4 Video
  4. 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=aQ1+bQ2(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} MADRH=aQ1+bQ2(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=a1MADpb+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

码率控制方案大体流程

  1. 用流体传输模型和线性跟踪理论来计算当前帧的目标比特数
  2. 平均分配剩余的比特数给当前帧中其他没有编码的基本单元
  3. 通过MAD线性预测模型用前一帧相同位置处的基本单元的实际MAD值来预测当前帧的当前基本单元的MAD值
  4. 用二次R-D模型计算相应的QP值
  5. 用从步骤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(8BsBc(ni1,NGOP))(5.1)

其中:

  • F r F_r Fr为帧率
  • u (
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值