H264 码率控制原理

一、H264编码模型

 

      

如图,关注前向的编码路径。理解H264的码率控制,首先要理解编码中的预测和量化。

1.1 预测模式

  编码传输的是当前帧和预测帧之间的差值。预测帧可以通过帧内 或者帧间的预测的方式得到。帧内或者帧间具体如何来得到预测帧 ,就有相应的预测模式。(如预测帧某个8X8可通过编码重构后的帧上下或者左右的8X8的块得到)。采用编码重构后的帧是因为解码端也是通过残差来进行重构解码图像的。

   预测模式有很多种,不同的预测模式会有不同的失真?如何决定使用哪种预测模式?预测模式选择方法:

为了能够保证在获得尽可能好的编码质量的同时将编码后的数据比特降至最小,采用的RDO(率失真优化)。 这里QP是已知的,通过RD模型来决策用哪种预测模式。其中预测编码失真是通过预测块和原始块差值的平方和来度量的。

步骤:选择RDO为代价函数,对每种预测模式计算RDO,选择RDO最小的。

 

其中

 

在可选模式中选择最佳的模式,使得在限定码率 Rc下,失真 D 最小。

具体对于亮度分量来说,帧内预测可分为 4×4 亮度子块预测或 16×l6宏块预测,其中 4×4 亮度子块有 9 种可选的预测模式,它适用于带有大量细节的图像码;16×l6 亮度块有 4 种可选方式,它适用于平坦区域图像编码。如何决定使用哪种大小宏块。

首先计算一个16x16块 4种预测模式的Cost,然后选择最小的。在把这16x16块分成16个4x4块,计算每个4x4块9种预测模式的最小,将所有16个最小值加起来 。如果分块的Cost小的那采用4X4分块的方式,否则用16X16大块的方式。

1.2 量化步长

量化是多对一的映射,目的是降低比特率。量化过程的量化步长是一个很关键的参数,决定了编码输出的比特率。实际上,QP 反映了空间细节压缩情况,QP 小,则大部分的细节都会被保留;QP 增大,一些细节丢失,码率降低,但图像失真加强和质量下降。也就是说,QP 和比特率成反比的关系,而且随着视频源复杂度的提高,这种反比关系会更明显。如何确认这个参数? 同样也是利用RD模型来求解的。

 

二、 码率控制

2.1 码率控制意义:

    场景的简单,复杂, 不同帧之间编出来的比特数差距大,带宽利用率不均,有时发的数据多,有时发的少。带宽有限,为了充分利用带宽,采用码率控制来保持输出码率接近目标码率。所以视频编码的实际应用中,需要在编码器上应用码率控制算法,生成码率相对恒定和可控的原始码流,从而在经过其后的多道传输步序后,保证最终实时信源解码的播放效果。

2.2 码率控制模型

 

    码率控制器负责收集码率、延时和缓冲区状态信息并调节编码参数,使得性能指标维持在给定水平上。缓冲区起平滑码率波动的作用。在编码端,数据输入缓冲区的码率是变化的,而输出码率则取决于码率控制的模式。码率控制算法先根据目前带宽的要求和缓冲区剩余空间的大小为每一个将要编码的图片分配一定量的比特数,然后再为图片中每一个编码宏块也分配一定量的比特数,接着再根据每个宏块所分配的比特数来调整编码器中的宏块编码参数,然后编码器可以根据新的编码参数为该宏块编码,使得编码完的比特数能够近似等于码率控制算法为此宏块分配的比特数。

2.3码率控制中的关键技术

率失真理论:

描述编码失真度和编码数据速率的关系 R-D模型

 

信源模型:

        信源模型描述了码率、失真、量化步长以及其它状态之间关系。它的准确性

关系到编码器能否在给定的失真和码率条件下对编码比特数作出正确的预测。

H264使用的经验模型:

二阶抛物模型

 

X1,X2为模型参数,S为用 SAD (绝对误差和)表示的编码复杂度

 

2.4  H264的码率控制

存在的问题:

预测模式判决需要用到QP,  但是QP值只有码率控制完之后才知道,而码率控制要能够进行,就需要知道 MAD (宏块的失真,平均绝对差值)。MAD只有在预测模式知道后才能求得。

需要解决的问题:

1、应该给每个GOP, 帧和MB分配多少的码率?

2、MB的MAD怎么估计?

 

2.3.1 当前编码帧的目标比特数

流量往返模型用于计算当前编码帧的目标比特率。

初始时 缓冲区大小为0,第一个GOP 第一帧编出来的比特数 减去 编码时长内已经发送了多少数据。(帧率分之1,表示一帧多长时间 * 带宽(bit/s)), 就是占用了缓冲区的大小,后面每一帧占用缓冲区大小 = 前一帧编码后占用缓冲区大小+ 编码出来的比特数 - 通过信道已经发送出去的比特数。

2.3.2 MB的MAD的估计

后一帧的MAD根据前一帧的对应位置处的MAD来更新

 

2.3.3 假想参考解码器

   标准的好处在于保证所有符合标准的解码器能够解码出一致的视频质量。要实现标准,仅仅提供编码算法的描述是不够的,在实时系统中,指定如何馈送码流比特给解码器,解码的图像如何移出解码器等都是很重要的。要实现该功能,必须指定输入/出缓冲器模型和开发与实现无关的接收机模型。这样的接收机模型称为假想参考模型(HRD)。编码器不允许产生假想参考模型不能解码的位流。因此如果所有接收机都模拟假想参考模型的行为,可以保证所有解码器解出的码流具有很好的一致性。

目标比特数的上下限

 

A(n):表示第i个gop中第J-1帧生成的比特数。HRD目的是限制目标比特率的上下限, 防止缓冲区上溢和下溢。

2.5、H264码率控制的基本步骤

1.  根据流体流量模型计算当前帧的目标比特率;
    2.  将剩余比特平均分配到当前帧中所有未编码基本单元;
    3.  根据前一帧中对应位置处基本单元的实际 MAD 值,用线性 MAD 预测模型来预测当前帧中当前基本单元的 MAD;
    4.  利用二次 R-D 模型计算相应参数(QP);
    5.  用步骤 4 中得到的 QP 对当前基本单元中每个 MB 进行 RDO。

   可以分为三个层次进行码率控制

GOP层码率控制, 帧层码率控制, 基本单元层(可能包含一个或多个宏块 使用同一个量化参数)码率控制。

总体框架图如下:

从GOP层开始,GOP层的任务分配每个GOP的目标比特数和每个GOP起始I帧和P帧的QP值。 深入到GOP中,对GOP中的每一帧进行帧层码率控制,帧层的任务是计算每帧的目标比特数,求每帧的量化参数,根据B帧和P帧的不同,求取的方式不同。当一帧还有多个BU时,需要进行BU层的码率控制,同样也是计算BU的目标比特数和QP。GOP层决定了整个GOP层分配多少比特,而帧层的比特分配依赖于GOP成的比特分配,基本单元层的的比特分配则由帧层比特分配决定的。一层一层往下分配比特,同样编码完成后实际编码比特数也一层一层向上累积反应到GOP中的缓冲区。

 

2.6 GOP层的码率控制

目的:总的GOP比特率分配,  起始的QP(GOP中第一个I帧和P帧的QP)确认。

 

 

 

其中A(n):表示第i个gop中第J-1帧编码生成的比特数。

这个公式表示的是 分配给当前GOP的比特总数  为  当前GOP中的总帧数的时间内信道能够发送多少数据+ 上个GOP编码完成后缓冲区还剩下的大小 - 当前GOP编码完成后缓冲区应该还剩下的大小。

起始的QP确认:

分为两种情况,第一个GOP  和 非第一个GOP。

第一个GOP的I 帧和P帧用QP0进行编码,QP0大小取决于带宽和GOP的长度。原则是:可用带宽高的时候,QP0就取得大一点,否则就小一点。相同带宽,GOP长度越长,那么QP0要减小。

其他非第一个GOP的起始QP通过下式计算

2.7 帧层码率控制

分为两个阶段  预编码和后编码,预编码的任务是求GOP中所有帧的QP值,后编码阶段根据预编码阶段求的QP,预测模式进行编码,用编码后的帧和原始帧来更新预编码阶段使用模型的参数。

预编码阶段:首先B帧的量化参数

B帧一般不用于参考,使用的量化一般比较大,这里直接由前后的p帧来决定。具体参考

 

最终还有微调

 

P帧量化参数:

1、确定每个P帧的目标比特数

分为两个层次进行控制 利用目标缓冲区占用量来调节目标比特数。计算图像分配的比特需要考虑当前缓冲区的占用量和图像的复杂度。

宏观控制:

在帧层码率控制的时候 已经知道GOP中第一个P帧的QP值,那么目标缓冲级初始值就为第i个Gop中第一个P帧编码完成之缓冲区的实际占有度。

 

后续P帧目标缓冲级别的更新:

 

没有B帧时(即L为0),可以简化为

 

公式意义??:

微观控制:

第i个GOP中第j帧的目标比特数:

 

剩余比特的表达式:

 

最终的目标比特数是计算得到的目标比特数 和 剩余比特数的加权:

 

2、利用线性预测模型得到MAD计算P的QP值。

求MAD:

 

求QP:

 

由步骤1知道当前P帧分配的比特数,由线性模型知道MAD,X1, X2已知,求解

QP值。求出QP值后要进行调整。

最后,为了保证图像的视觉平滑性,要尽量避免相邻帧之间的量化参数激增,用如下

公式对QPc 进行调整, QPp 表示前一个 P 帧的量化参数。

 

3、决策预测模式

   将上一步求的的QP,分别对每种MODE求D。 取使D最小的那个预测模式。

 

后编码阶段:

在这一阶段,知道了预测模式之后,就能够得到预测的那帧图像,QP值也已知。

那么就可以通过编码后的帧和原始帧来更新MAD预测模型的参数,更新二次RD模型的参数,并决定要跳过的帧数。

1、MAD预测模型参数的更新

 原理:根据一组数据拟合出一条线性方程,使得拟合的数据偏差平方和最小的参数就是所求。

    第一步一数据点选择:数据点是用于更新模型参数,数据点的数量以及质量对于模型的准确性有着重要的影响。通常而言,数据点越多,模型越准确。在JM86模型中,采用滑动窗口机制进行数据点的选择,窗口大小通常为20。

    第二步一计算模型参数:根据选中的数据点,算法收集预测的MAD和实际MAD的值,采用线性回归的方法,计算得到a1和a2。

    第三步一去除坏的数据点:在得到al和a2之后,根据滑动窗口中数据点的参考值,用a1和a2形成的预测模型计算数据点的预测值,然后将得到的值与数据点的原始预测值比较,计算误差,如果误差大于一定的值(JM中取误差的均值),则将该数据点去除,用更新后的数据点重新计算模型参数al和a2。

2、二次RD模型的X1,X2的更新也类似。

3、决定要跳过的帧数

在对一帧进行编码后, 缓存级通过增加当前帧产生的总比特数并减去从缓存中移除的总比特数进行更新。如果更新的缓存级达到了缓存池的80%时候,编码端将忽略即将到达的帧,直到缓存占有量下降到安全界限以下。

2.8 基本单元层的码率控制

基本单元层的作用: 为帧中基本单元选择量化参数,使得所有基本单元的编码比特数之和与帧层计算的目标比特数接近。

在码率控制方案中,I帧和B帧仅通过量化参数进行编码,而基本单元层码率控制则仅在帧P中使用。

1、计算当前基本单元层的目标比特数

P帧的目标比特率在帧层码率控制的时候已经求得,剩余比特数被等分给p帧中每个基本单元。如下

 

2、预测当前帧当前基本单元的MAD

  通过MAD预测模型对当前帧当前单元的MAD进行预测,并计算当前基本单元的目标比特。

3、利用二次率失真模型求当前基本单元的QP。需要考虑以下三个情形

1、当前帧的第一个基本单元。将先前帧所有基本单元的QP平均值赋给当前单元的QP。

2、当前帧所有未编码基本单元的剩余比特数小于零的情况。在这种情况下, 当前单元的QP应该大于先前基本单元的QP值。

 

3、其他情况下,则通过使用二次率失真模型得到。

确定量化参数值后,在当前基本单元的所有宏块执行RDO,然后更新当前帧剩余比特数目和未编码基本单元数目。

总结:

根据带宽,缓冲区来为编码图像分配一定的目标比特数,根据目标比特数和失真确定量化步长QP,由QP去求预测模式,求得预测模式,就可以知道实际的编码比特。利用这个实际的编码比特去更新缓冲区和下一帧分配的目标比特。QP小,编出来比特数多了,那么下一帧就分配少了,下一帧QP相应会加大,让编出来的比特率就少点。这样一个动态调节的过程。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章