1. 码控概述

码率控制是在保证缓冲区/带宽不发生上溢和下溢的前提下,通过为各帧甚至各个 CU 输出合适的编码参数QP,来控制输出码流的码率大小,使得瞬时码率或者平均码率符合一定的约束条件和需求。同时要求帧间编码帧和帧内编码帧的视频图像,主观质量能够平稳一致,尽可能使重建视频质量达到最佳。

编码场景

  1. 存档:将视频压缩后存于硬盘或网盘上,希望编码质量尽可能好、码率尽可能低,但不关心编码后具体大小;
  2. 流媒体:通过网络传输视频流,需要确保码率不超过给定带宽,也可能要在不同带宽下提供不同码率的码流;
  3. 直播流:与流媒体类似,但实时要求高,且无法预知视频内容;
  4. 面向设备编码:目的时让编码后文件达到特定大小(正好占满碟片)。

image.png

理论背景

相关变量

  • 量化参数 QP(是 Qstep 表的索引值,与 Qstep 的大小成线性正相关);
  • Qscale(其值等于拉格朗日常数码控基本知识 - 图2):由 QP 计算得到,Qscale 越低,则码率预算越高;
  • rate factor:用于控制总体码流的大小(只用于 one-pass 编码情景)
    • 用 rate factor 和复杂度一起算出 Qscale 的大小:码控基本知识 - 图3
    • one-pass 编码中,未来帧的复杂度未知,因此 rate factor 的选取是基于已编码帧进行的,选取过程是将 rate factor 应用到所有已编码帧中,看是否能得到希望的码率。
  • Qcomp:帧复杂度压缩参数,其值介于 0 和 1 之间
    恒定质量并不代表恒定的 QP,对于高复杂度的场景,细节丢失难以发现,因此可以使用较高的 QP 值。基于该原理,可以对帧复杂度进行非线性压缩:码控基本知识 - 图4,其中 rceq 代表压缩后的复杂度,是码率分配的依据。当码控基本知识 - 图5时,Qscale 与复杂度成正比,相当于关闭了帧复杂度压缩过程;当码控基本知识 - 图6时,Qscale 与复杂度无关(各帧 QP 相等),分配给简单帧和复杂帧的码字相同,接近 CBR。

    2. 编码器码控流程

    码率控制作为编码器内部的一个重要模块,常由目标码率分配算法、率失真 RD 模型、QP 计算算法、基于人眼特性的自适应量化算法,以及缓冲区溢出控制算法等组成,其中主要的是码率分配和量化参数调整。

    率失真 R-D 模型

    QP 值对码率和失真都会造成影响,因此选择最佳 QP 值的过程,也可以视为一种 RDO。码控的 R-D 模型可分为部分:R-Q 模型和 D-Q 模型。

  • R-Q 模型:根据目标码率预测所需的 QP 值(e.g. HEVC 中的 码控基本知识 - 图7模型);

  • D-Q 模型:在计算 QP 时,考虑图像失真分布的平稳性(使时空域失真均衡分布,同时尽量降低失真);

    码率预测模型(R-Q 模型)

    R-Q 模型是指码率 R 与 QP 的推导关系,其作用是对每帧码率进行估计,常见算法有:

    其中码控基本知识 - 图8是帧内容的复杂度,码控基本知识 - 图9为量化步长,系数码控基本知识 - 图10会根据实时输出码率不断更新;

  • 一次模型:码控基本知识 - 图11(在 X264、OpenH264 等编码器中被广泛使用);

  • 二次模型:码控基本知识 - 图12(在 JM 中使用);
  • 码控基本知识 - 图13模型:码控基本知识 - 图14(在 HM 中被引入的模型,显著提高了码控速度)
    • 式中的码控基本知识 - 图15是 RDO 中使用的拉格朗日乘子,码控基本知识 - 图16是通过实验拟合得到的;
    • HM 中使用的 码控基本知识 - 图17是:码控基本知识 - 图18
  • 多个实际编码 QP 点拟合的 R-Q 模型;
  • 码控基本知识 - 图19模型:码控基本知识 - 图20,其中码控基本知识 - 图21代表量化系数中零值个数占总数的比例。

其中,一次模型和码控基本知识 - 图22模型运算量低,较为常用;其他两种模型虽然预测精度高,但复杂度也很高。
image.png

图像复杂度的获取与更新

  • 图像复杂度定义
    • one-pass 编码:某帧复杂度由经过运动补偿后參差的 SATD 或 MAD 值衡量;
    • 2-pass 编码:复杂度为第一次编码的实际码率;
    • 模糊复杂度:基于已编码帧的复杂度加权得到,相较于使用单帧复杂度,模糊复杂度能避免 QP 的波动。
  • 码率预测模型的问题
    图像复杂度可用 MAD 评估,但当前帧的 MAD 值只有编码后才能得到,而 QP 需要在编码前确定,二者相矛盾;此外,R-Q 模型确定后,还需要确定模型系数(码控基本知识 - 图24)的更新方式及速率,通过提高模型系数的更新速率,可使编码器的输出码率更加平稳,但相对的,画面质量可能由于 QP 变化幅度过大而下降。
  • 不同编码器的解决方案
    • JM 中使用一阶线性模型,根据过去帧的 MAD 值来预测当前帧的复杂度。而 R-Q 模型的系数直接通过当前帧的编码结果反向计算得到;
    • 在 OpenH264 和 X264 中,放弃了 MAD 的计算,而是将一次 R-Q 模型中的码控基本知识 - 图25合并为整体计算。

      目标码率分配算法

      按照码率分配的粒度,目标码率分配算法可分为 GOP 级码率分配、帧级码率分配、CTU 级以及 CU 级码率分配,基本原则是给复杂的帧或区域分配更多比特,以保证编码失真的均匀分布。因此难点在于:如何度量图像的纹理复杂度。
      image.png
      image.png
      image.png

      帧级码率分配算法

      首先根据每帧的复杂度,分配各帧之间的码率比例。然后根据目标码率和之前已编码帧的实际码率,将每帧的 Qscale 缩放到合适的大小,该缩放系数称为 “rate factor”:Qscale = complexity / ratefactor,若之前帧的实际码率高于目标码率,则减小 rate factor,反之增大该系数,最后根据公式计算出 QP 值。
      CRF(Constant Rate Factor)模式就是固定 “rate factor” 参数,码率分配完全由复杂度决定;而 ABR 和 CBR 模式都是通过实时调整 rate factor 实现的。Qscale 最后会再经过 VBV 模块调整,确保不会发生缓冲区下溢,VBV 模块也是实现 CBR 模式的关键模块。
      image.png

      块级码率分配算法

      实际的码控算法设计

      实际中,码控算法首先要能视频的整体码率比较准确地达到目标值,并满足 HDR 缓冲区限制。在此基础上,再尽可能提升整体编码效率。此外,码控算法的稳定性和鲁棒性也很重要,比如在视频内容和特性急剧变化时,要求码控算法都能达到预期作用,并且要尽量保证没有极差质量的问题帧出现。
      码控算法设计中的另一个重点是:如何利用好过去编码帧的结果数据。包括已编码帧的预分析复杂度、实际 QP 值、实际码率等。这会引发另外两个问题:
  1. 如何存储和利用已编码帧的数据;
  2. 当出现与过去相比明显变化的视频段时,如何自适应的调整和跟进码控算法。

    3. 码率控制模型

    码控类型有:CQP、CBR、VBR、ABR、Capped VBR、Stat-Mux 和 CRF 等。

    CQP (Constant QP) : 恒定 QP(一般不用)

    对整个码流采用固定的 QP 值进行编码,CQP 模式会导致根据场景复杂度不同而码率波动很大,无法控制实际码率,因此不常使用。

    CBR (Constant Bit Rate):恒定码率(直播业务)

    CBR 假定信道传输带宽或码率不变(“恒定信道”),常用于传统广播电视或网络的流媒体应用。这种模式会强制编码视频为恒定码率,不适于文档存储或需要高效利用带宽的场景。但在实时直播业务中,用户带宽恒定,且缓冲区大小受限,因此需要对码率做限制(否则局部码率高峰会引起卡顿)。此外,由于 CDN 是按流量计费的,因此使用 VBR 会使带宽成本不可控(实时场景无法预知后续码率情况),因此直播等实时业务会选用 CBR。
    实际中,通常假定解码端有一定大小的输入码流缓冲区(VBV buffer / HRD),这样即使是恒定信道传输,解码端也还是允许每帧的实际码率有一定范围波动,从而可以获得更好的编码性能和质量。

    VBR (Variable Bit Rate):不超上限的可变码率(点播等离线业务)

    VBR 假定信道传输有一个最高码率上限,常用语离线视频压缩的文件存储类应用(offline file storage),如多媒体文件的压缩存储、VoD(点播)业务等。对应的在 MPEG 视频编码标准中定义的 HRD 模型为 VBR HRD。
    VBR 可以在给定限制下用最少比特保持最高质量,其难点在于:在难编码的地方花费更多比特,在编码简单的地方花费更少比特。通常纹理复杂或有大量运动的视频难以编码,需要更多比特。

    Capped VBR:窗口内平均码率不超上限

    Capped VBR 要求在序列开始的 1 秒钟,帧连续滑动窗口内的平均码率不超过一个最大码率,除此之外没有任何 HRD 缓冲区限制,该模式也是工业界的一种非正式码控定义,常用于一些网络的流媒体传输业务。

    ABR (Average Bit Rate):平均码率恒定(一般不用)

    ABR 要求每个视频帧连续块(chunk)的平均码率为一个目标码率,除此之外不再有任何 HRD 缓冲区的限制。

    视频块通常是每隔两秒钟的一个个视频帧窗口

ABR 是工业界使用的一种非正式码控模式,常用于自适应流媒体场景(adaptive streaming),该业务中,根据网络传输带宽的变化情况,内容发送端能以视频块为单位切换不同平均码率的码流进行传输。
ABR 适应中可变码率模式(而非恒定码率),由于编码器不知道后面尚未编码的内容,因此不得不猜测如何达到给定码率,导致码率要一直变化,尤其是在视频开始时。对于 HAS 流,这会导致短时间内质量的巨大波动。

2-Pass ABR:增加了一个 pass 算编码代价(面向设备编码)

如果允许编码器进行码控基本知识 - 图30次编码,则可以预先得知还未编码的内容。它可以在第一遍编码时计算编码代价,然后在第二遍编码时更高效地利用比特。这种模式使得在特定码率下输出的质量最好。该模式可以达到特定目标码率,适合于面向设备的编码;但不适于需要快速编码的场景,如直播等。
此外,2-Pass ABR 有两点需要注意:

  1. 不知道最终视频流的失真如何,因此需要进行多次实验,以确保给定的码率足够编码复杂内容;
  2. 该模式下码率可能出现局部峰值,即可能超过带宽限制。

    CRF (Constant Rate Factor) / CQ (Constant Quality) : 恒定视频质量(存储业务)

    CRF 值代表了目标编码质量水平(quality level),编码器通过控制各个帧以及各 CU 的 QP 来达到恒定质量编码,使整体视频的编码效率最大化。实际中一个比较简单有效的 CRF 码控算法是 CU-Tree 算法。由于没有明确指定的目标码率,因此 CRF 可以看作是无码率上限约束的 VBR 模式。
    在 AVC 和 HEVC 中,CRF 的取值为 0~51 的整数(和 QP 类似)。CRF 是 X264 和 X265 默认的码控模式,X264 中默认值是 23,x265 中默认值是 28。CRF 取值越小则压缩率越低、码率越高(CRF 值与码率大小成反相关)。CRF 每增减 6 会导致码率减半或翻倍。VP9 的 CRF 取之范围是 0~63,推荐值为 15~35。
    CRF 可以保持整个视频流的质量恒定,不足在于无法确定最终文件的码率和码率波动(码率大小由源视频的复杂度决定)。适用于文档存储,以达到尽可能好的质量;不适于流媒体等需要特定码率的场合。

    CRF v.s. CQP : 每帧 QP 是否不变

    CQP 模式会保持每帧的 QP 值不变,即都等于设定的序列 QP;而 CRF 会通过动态调整每帧的 QP 值,来保持序列质量恒定。CRF 的码率总是低于 CQP(更能节省码字)。

    缓冲区控制模型 : HRD (Hypothetical Reference Decoder)

    解码端缓冲区使用 “leaky bucket” 模型(Virtual Buffer Verifier, VBV):输入是信道传输来的码流,输出是每帧对应解码时间从缓冲区取出的该帧码流。VBV 被定义在 AVC, HEVC, VVC 标准中,称为 HRD(Hypothetical Reference Decoder),规定了解码器缓冲区的行为过程。

    缓冲区填充度调整

    在 X264中,根据是否有 look-ahead 模块,可分为 look-ahead VBV 调整和 real-time VBV 调整两种机制。
    image.png
  • lookahead VBV 调整

look-ahead 模块可以预测未来若干帧的复杂度。look-ahead VBV 的原理是:将此前相同帧类型的 Qscale 值应用到 look-ahead 的帧中,检测是否有帧会使得 VBV 缓存下溢,并且要逐步调整 Qscale,直到 look-ahead 中所有帧编码结束后,VBV 填充度在合理范围(0.5~0.8)。

  • real-time VBV 调整
    没有 look-ahead 模块时,未来帧的复杂度未知,则只能根据当前帧的复杂度来控制 VBV 的填充度:
    1. 对于 P 帧和第一个 I 帧,让当前帧编码结束后,VBV 至少还有一半容量;
    2. 限制每帧大小的上限是当前 VBV 已填充量的一半,下限是 bufferRate 的一半(bufferRate = vbvMaxrate / fps),并且限制 Qscale 不能小于输入的 Qscale 值。
  • miniGOP VBV 调整
    B 帧的 QP 不直接被 VBV 调整,而是由 P 帧 QP 加一个偏移量得到。在 miniGOP VBV 调整中,需要检查当前 P 帧和到(编码顺序)下一个 P 帧之间的 B 帧复杂度,适当调低 Qscale(调高码率预算),使得本 miniGOP 过后,缓冲区没有上溢。

    HRD 参数定义

    HRD 的定义有三个参数:

  • 信道传输输入码率(channel bit rate);

  • 缓冲区大小(buffer size)
    buffersize 的设置取决于期望的码率波动情况,通常设置 buffersize = 2 * maxbitrate,如果客户端缓存较小,则设置 buffersize = maxbitrate;而如果想限制码流的码率,则设置 buffersize 为 maxbitrate 的一半或更小。
  • 初始帧移除延时(initial removal delay)

    HRD 一致性(HRD Conformance)

    编码标准中的 HRD Conformance 定义有两种模型:Type I HRD 和 Type II HRD

  • Type I HRD 的输入码流只考虑下面两种网络抽象层单元(Network Abstraction Layer, NAL) Units

    • VCL(Video Coding Layer) units:包含实际编码视频帧的数据单元;
    • filter units
  • Type I HRD 会考虑所有类型的 NAL units 数据:除了 VCL units 和 filter units 之外还有 SPS, PPS, SEI 等单元

    CBR HRD & VBR HRD

    在 CBR 和 ABR 模式下使用 VBV,能取得更稳定的码率,HDR 定义的三个参数中,CBR HDR 是平均码率,而 VBR HDR 是最大码率。CRF 模式一般不用 VBV 模块,因为 CRF 模式只依据复杂度分配码率,最终码率未知。

    缓冲区延时(buffer delay)

    缓冲区大小除以码率就是缓冲区引入的最大延时,其大小与实际的应用场景需求密切相关:

  • 视频会议、网络游戏等应用的延时一般很小(码控基本知识 - 图32);

  • 广播电视、网上流媒体等应用延时一般在 0.5 ~ 3s 之间;
  • 离线大视频文件存储类应用延时一般较大(> 10s)。

    HRD 工作原理

    image.png
    image.png

5. CRF 码控算法

一般的业务场景都会允许一定的前看延时(look-ahead delay)。CRF 码控主要就是通过利用一定数量的前看未编码帧信息,来尽可能提升编码效率。

全局最优/准全局最优的 CRF 码控算法

在追求(准)全局最优的 CRF 码控中,需要对整个前看视频段中每个 GOP、每帧、每个 CU 进行遍历,并调整 QP 值,使当前 CU 及所有与当前 CU 有直接/间接预测参考关系的所有 CU RD cost 之和最小。这样对整个 GOP 逐帧逐 CU 调整 QP 的 RDO,需要反复迭代多次进行,直到结果收敛为止。
全局最优/准全局最优的 CRF 码控算法复杂度过高,很难实用,因此提出了多种低复杂度的 CRF 解决方案。其中一个有效的 CRF 码控算法是 CU-Tree 算法。

CU-Tree(MB-Tree)算法

CU-Tree 算法考虑了视频编码时的依赖关系,被参考数据的失真程度直接影响到后续的预测精度,因此根据依赖关系给予不同画面不同的码率权重,即可从整体上提升画面质量。该算法采用的是从后往前的反向编码复杂度传播计算方法,从一个 GOP 中的第一个 miniGOP 到最后一个 miniGOP,每个 miniGOP 从 temporal layer 最高层的非参考 B 帧开始,到最低 temporal layer 的 non-reference B 结束,逐帧逐 CU 计算每个 CU 的总编码复杂度(coding cost = intra cost + propagation cost)。其中 miniGOP 指的是包含一个 tyemporal layer 0 的非双向预测 non-B 帧
具体来说,每个 CU 的 coding cost 由两部分相加得到:1) 当前 CU 预分析得到的 Intra cost;2) 所有更高 temporal layer 帧中与当前 CU 有直接/间接参考关系的块,从沿预测方向反向传播过来的传播复杂度(propagation cost)之和。
image.png
被参考的用 CU 的 Intra cost 作为代表 CU coding bits 的特征量,用 PropCostIn、PropCostOut 代表当前 CU 对所有与它有预测参考关系的 CU 编码码率的影响,由于采用的是反向传播编码复杂度的计算方式,CU-Tree 算法的计算复杂度不高,便于实用。

* Reference

WebPage知乎 - 视频编码技术之码率控制(Bytedance)
手撕编解码 - 再谈视频编码的码率控制
知乎 - 视频通信中的码率控制算法
知乎 - x264 码率控制算法原理
Blog - 量化参数QP与HEVC
知乎 - x264和x265编码器码率控制之基本模型
Blog - H.264 Rate Control Algorithm
Blog - What are CBR, VBV and CPB?