当前位置: 代码迷 >> 综合 >> H264/AVC 码率控制
  详细解决方案

H264/AVC 码率控制

热度:90   发布时间:2023-12-21 07:17:19.0

春节快乐呀,前面种种原因停更了一段时间,现在继续看看书。

        264仅规定了编码后bit stream的句法结构和解码器的结构,对于编码器的结构和实现模式没有具体的规定。在进行压缩编码时,编码器通过相应的编码控制算法已确定各种编码模式,如宏块的划分类型、运动矢量以及量化参数等,已选定的各种编码模式进一步确定了编码器输出比特流的比特率和失真度。

        264采用基于Lagrangian优化算法的编码控制模型,其编码性能相较于以往的所有编码标准有了重大提高。

        视频编码的控制是编码器实现的核心问题,编码控制的目的就是确定一组编码参数。264采用Lagrangian优化算法的率失真优化模型实现视频编码的控制。


Lagrangian优化算法

        关于Lagrangian优化算法的定义,《新一代视频压缩编码标准H.264》中描述的非常清楚,下面直接截图啦


编码控制模型

        总的理论就是:在对视频序列进行基于块的混合视频编码时,对于每个块所选定的编码模式应当使编码后的J代价函数达到最小,当且仅当此时认为基于块的混合视频编码器达到最优化。

        264的基于Lagrangian优化算法的编码控制模型的流程图如下所示:

图中λ_mode由Q计算得到,λ_motion由λ_mode计算得到,二者同属于Lagrange参数。m_t为运动矢量、D_rec为重建损失、R_rec为重建比特。R_c为限定的比特。

        (细节:在计算D_rec时,不同编码模式可能使用不同的计算方式,并不是统一的。)


JM中的码率控制

控制比特率的一种方法是,通过测量输出比特率并将其反馈给control QP,尝试并强制每个编码帧的比特数不变。增加QP能够降低编码比特率,降低QP能够增加编码比特率。然而这种方法是存在问题的,1)它没有考虑I、P和B片的编码所需比特数量是有明显区别的;2)当编码器快速地增加或者减少QP以维持比特率时,图像的质量会有明显的变换,这是不好的。

一种更加合适的方法是下图这样的。可用通道比特率(以比特每秒为单位)用于确定GOP的目标比特数(GOP通常是I片后面跟着多个P和/或B片)。GOP可用的比特数被分配给I、P和B,不同类型的片分配的比特数不同。在每个片中,一定数量的比特被分配给每个宏块,码率控制算法就控制编码器产生一定数量的编码比特。

码率控制算法的目的是1)在编码过程中保持目标编码比特率;2)最小化解码视频序列中明显的质量波动。它使用下面约束进行操作:

 通常的方法是下面这样的:

上面这种方法可应用于从GOP编码图像的各种级别,并可选地应用于单个宏块或宏块序列级别。控制速率的最低级别被描述为basic unit,可以是单个宏块、多个连续宏块或整个编码帧。

1. GOP级别的码率控制

假设GOP结构包含一个I片,后面跟着P片和/或B片,过程分为两步

 为了保持合理一致的帧质量,GOP内QP的变化是有限的。

2. 编码图像帧和/或basic unit级别的码率控制

如果bacis unit是一个完整的编码帧,则每帧应用以下步骤一次,如果基本单元小于一个帧,则每帧应用多次。

其中MAD是对“活动”、运动和/或细节的估计,尺寸与basic unit一致,MAD、QP与基本单元编码尺寸i的关系可以用如下的二次表达式表示:

其中T是当前基本单元的编码比特数量,Qstep是量化器的步长,h是编码header和mv所需要的比特数量,c1和c2是模型系数,在每个unit完事之后更新。可以计算产生正确数量的编码比特 Ti 所需的 QP。 然而,在对当前基本单元进行编码之前,MAD 是未知的。为了解决这个问题,当前基本单元 i 的 MAD 是根据前一码帧中相同位置(co-located)的基本单元的 MAD 估计的,如下式。 系数 a1 和 a2 在编码每个基本单元后更新。

以这种方式,编码器估计当前basic unit的“活动”,从而估计可能产生目标比特数量Ti的量化器参数。 由于模型的不准确性,实际的比特数会有所不同。 根据算法的实际性能,更新模型参数以最小化模型误差。