视频编码技术之码率控制

avatar
技术运营 @北京字节跳动科技有限公司

1. 概述

码率控制技术 RC (Rate Control) 是实际视频编码器中一个非常重要的技术模块。根据实际中各种具体应用场景的不同,比如:实时 (real-time or online) 还是离线 (offline) 编码,传统的广播电视 (TV broadcasting) 业务,还是互联网上的流媒体传输 (streaming) 业务等,对视频编码器的输出码率也就有了多种不同的具体要求和限制,比如:平均还是最大目标码率,缓冲器大小,初始延时等。码率控制就是针对各种不同应用业务场景,通过控制每帧,乃至每个编码单元 CU (Coding Unit),编码的量化参数 QP (Quantization Parameter),使得输出的编码后视频码率满足各项具体限制要求,同时编码性能,包括编码效率和主观质量,也尽可能地最优化。

实际中,根据不同的典型应用业务场景,常见的码率限制要求,即码率控制的模式,大致总结为以下几种类型。

1.1 CBR (Constant Bit Rate)

CBR RC 即假定信道传输带宽或码率不变的情况,常用于传统的广播电视,或网上的流媒体应用。实际中,还通常假定视频解码器端有一定大小的输入码流缓冲器(buffer),这样即使对恒定的信道传输码率,在视频编码器端还是可以允许每帧的实际编码码率有一定范围的上下浮动,从而可以获得更好的编码性能和质量。

解码器缓冲器的模型即所谓的 “leaky bucket” 模型,即:输入的是信道传输过来的一定码率的编码视频码流,输出则是在每帧对应的解码时间从缓冲器中取出该帧对应的编码码流。这个模型工业界常用的术语叫做 VBV (Virtual Buffer Verifier)。自从 H.264/AVC MPEG 国际视频编码标准起,VBV 模型就被定义在了 MPEG 系列的视频编码的国际标准里,比如:H.265/HEVC, H.266/VVC,在标准里的名称叫做 HRD (Hypothetical Reference Decoder),即通过这一模型定义了解码器的缓冲器的行为过程。HRD 的定义有三个参数:信道传输输入码率 (channel bit rate),缓冲器的大小 (buffer size),和初始帧移除延时 (initial removal delay)。

关于 HRD 模型和 CBR 码控后面还会详细介绍。

1.2 VBR (Variable Bit Rate)

VBR RC 即假定信道传输有一个最大码率,传输码率可以等于或低于这个最大码率甚至是0,但不能超过这个最大码率,常用于离线视频压缩的文件存储类应用 (offline file storage),比如:影视文件的压缩存储,VOD (video-on-demand) 业务应用等。对应的在 MPEG 视频编码标准里定义的 HRD 模型为 VBR HRD。

1.3 ABR (Average Bit Rate)

ABR RC 的码率要求是每个视频帧连续块 (chunk) 的平均码率为一个目标码率,除此之外一般不再有任何 HRD 缓冲器的限制。比如视频块是每隔两秒钟的一个个视频帧窗口。ABR 是工业界使用的一种非正式的码控模式定义,通常用于自适应流媒体的业务场景 (adaptive streaming)。在这种业务里,根据网络传输带宽的变化情况,内容发送端可以视频块为单位切换不同平均码率的码流进行有效传输。

1.4 Capped VBR

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

1.5 Stat-Mux (Statistical Multiplexing)

Stat-Mux (统计复用) 是广播电视业务中常见的一种码控模式。这种场景下编码器端一般会有多个电视节目视频频道通过同一个传输信道传输的情况出现,这就需要将总的信道带宽在各个频道间进行自适应的分配,以达到所有频道总体编码效率的最大化。

1.6 CRF (Constant Rate Factor)

CRF 是实际中常用的一种恒定编码质量(constant quality) 的视频编码模式 [1]。设定一个特定的目标编码质量水平 (quality level) , 即 CRF 值,编码器通过控制各个帧及帧内各个编码单元 CU 的 QP 围绕目标 CRF 值上下浮动的大小,使得整体视频的编码效率最大化。实际中一个比较简单有效的 CRF 码控算法是 CU-Tree 算法 [2],这个后面会有详细一点的介绍。  CRF 模式中并没有明确指定的目标码率,而是一个目标编码质量水平,所以它本质上可以看成是一种没有明确指定最大目标码率限制的 VBR 编码模式。实际使用中,比如通常是对离线大视频文件的编码存储应用,需要根据业务质量需求和信道码率的情况,经验性地设定或调整 CRF 值,使得实际的编码码率能够满足业务场景的需要和要求。另外,CRF 也可以和 capped VBR 结合在一起,来支持一些比如流媒体等的业务应用。

2. HRD 一致性 (HRD Conformance)

鉴于实际应用中的重要性,从 H.264/AVC 开始 [3],基于漏桶缓冲器的视频解码器模型就被定义在了 MPEG 系列的国际视频编码标准中,即 HRD。这些标准中的 HRD 一致性定义有两种类型:Type I HRD 的输入码流只考虑视频编码层单元 VCL (Video Coding Layer) units (即包含实际编码视频帧的数据单元) 和填充单元 filler units 这两类网络抽象层单元 NAL (Network Abstraction Layer) units 的编码数据;而 Type II HRD 则会考虑所有类型的网络抽象层单元 NAL units 数据, 比如除 VCL 和 filler units 之外的 SPS (Sequence Parameter Set),PPS (Picture Parameter Set), SEI (Supplemental Enhancement Information) 消息等所有类型的数据单元。同时,HRD 定义了 CBR 和 VBR 两种模式。CBR HRD 由平均码率、缓冲器大小,和初始移除延时(initial removal delay)三个参数定义。VBR HRD 也是由类似的三个参数定义,只是其中的平均码率换成了最大输入码率(即输入码率是可变的,可以是零到最大码率之间的任何值)。

缓冲器的大小除以码率就是缓冲器引入的最大延时 (buffer delay),这个缓冲延时的大小跟实际的应用场景要求密切相关,比如:视频会议、网络游戏等低延时应用延时一般很小,比如不超过 0.3 秒,广播电视、网上流媒体等应用延时一般在 0.5~3 秒之间,离线大视频文件存储类应用延时一般较大,比如大于10 秒钟,等。实际中,可以根据具体的业务需求来选择是否需要 HRD,以及如果需要,HRD 的具体参数等码控要求方面的设定。

解码端 CBR HRD 缓冲器的操作情况如下图所示。在以各帧播放间隔的时间间隔点 tr(0)t_{r}(0)tr(1)t_{r}(1),...tr(i)t_{r}(i)上,各帧对应的编码码流被从解码缓冲器中取出,时间点 0 到 tr(0)t_{r}(0) 之间即初始移除延时,LinitL_{init} 是初始缓冲器水平。缓冲器输入码流是均匀的码率 R ,帧与帧间隔是帧率 FR 的倒数,Bits(i) 即 i 帧的码流大小,B 是缓冲器的大小,即上限。

如果缓冲器水平超过上限大小即是上溢,通常可以通过在前一个编码帧之后加适当量的填充(即空)码流避免。但是填充码率的加入降低了整体的编码效率,所以应当尽量避免上溢。

反之,如果移除某一帧码流时,缓冲器水平低于 0 ,即是下溢,这说明当前帧的码流还没有完全传到解码端,所以解码器必须等待,从而造成视频解码播放的卡顿 (jittering) 现象。为了避免下溢,通常需要编码器适当降低当前帧的编码码率进行重新编码。但是如果当前帧的目标码率编码减小得太多,就有可能导致极差编码质量的情况出现。如何在实际中各种复杂多变的视频内容及不同内容的过渡或者切换的情况下,都能够有效地避免解码端缓冲器下溢,同时又能保证整体较好的编码质量,不出现极差质量帧,就是对视频编码器码控算法的鲁棒性提出的要求和挑战。

1.png

图 1.解码器 CBR HRD 缓冲器的相关操作流程

在实际的 MPEG 视频编码标准中,图 1 所示的 CBR HRD 的操作流程是通过每帧从缓冲器中移除的时间 (frame removal time) 和每帧的所有编码码流最终完全到达缓冲器的时间 (frame final arrival time) 的相对关系图来定义和表示的,如下图 2 所示:

2.png

图 2.标准中通过帧移除和到达时间点定义的解码器 CBR HRD 缓冲器的相关操作流程

对 CBR HRD 来讲,图 1 和图 2 的定义方式是等价的,因为信道的传输码率是一个恒定的平均码率值。但对于 VBR HRD 来讲,由于传输码率是可变的,而输入码率的变化调整只能通过帧移除和到达时间的相对关系才能清楚明确地来表示和判断,即 VBR HRD 缓冲器的上溢只能通过图 2 中所示的公式 (tr(i)ta,F(i1))>B/R(t_{r}(i)-t_{a,F}(i-1))>B/R 来判断。如有上溢,则 (i-1) 帧的输入码率就会相应地降低以避免。可以看到,这种上溢判断和码率调低是无法通过缓冲器水平图来清楚表示的,比如在 tr(0)t_r(0) 之前最终到达的各帧里,是否有导致缓冲器上溢的降低输入码率的帧,这一点是无法通过缓冲器水平图来进行判断的。因此,标准里都是用更为基本和一般性的帧移除和到达时间来定义 HRD 的 CBR 和 VBR 模式的 [3]。  

3. 实际中的码控算法设计

实际中,码控算法首先要能够使视频整体的编码码率比较准确地达到目标平均码率,以及如果有 HRD 缓冲器的限制,要能同时满足相应缓冲器方面的要求。在此基础上,要尽可能地提升整体编码效率。除此之外,一个实际的视频编码器产品,对码控算法的稳定性和鲁棒性也都有很高的要求,比如在实际中所有可能的各种视频内容和特性不断急剧动态变化的情况下,要求码控算法都能够使得最终的编码视频较好地达到和满足目标码率,以及相应的 HRD 缓冲器限制,如果有,同时还要尽量保证没有极差质量的问题帧的出现等。

  码控算法中需要的一项必不可少的技术,是对每帧的编码码率进行估计或预测的码率预测模型,即 R-Q 模型。关于 R-Q 模型,早已有很多很好的研究成果和相关论文,比如:

  • 一次模型:R=aX/QR=a*X/Q,其中 X 是帧编码复杂度。
  • 二次模型:R=a1/Q+b1/Q2R=a*1/Q + b*1/Q^{2}
  • 多个实际编码 QP 点结果数据拟合的 R-Q 模型
  • ρ\rho域模型:R=a(1ρ(Q))+bR=a*(1-\rho(Q))+b,其中ρ(Q)\rho(Q)代表以 Q 量化参数量化后的变换系数中量化系数为零的系数占总变换系数的比例 (ratio of zero quantized transform coefficients) [4]

其中,一次模型简单常用。多个实际编码 QP 点拟合的模型虽然预测精确度高,但计算复杂度也比较高。ρ\rho 域模型的预测精确度也很高,而且需要的计算复杂度,包括变换和量化查表计算,并不很高,所以也是一个比较便于实用化的模型。  

怎样利用好过去编码帧的结果数据,是码控算法设计中需要考虑的一个问题。这些数据包括过去编码帧的预分析复杂度,实际编码 QP,实际编码码率等。由于实际中随着视频编码的逐帧进行,从当前帧往前,可能会有大量已编码的帧,如何存储和利用这些数据是一个非常现实的问题。同时,当实际中已出现较长时段的视频特性与过去相比明显变化的视频段时,为了保证良好的性能,往往需要码控算法及时地自适应跟进和调整。这也是实际中需要考虑和注意的问题。

4. CRF 码控算法

实际中,一般的业务应用场景都会允许一定大小的前看延时 (look-ahead delay) 。CRF 码控主要就是通过充分利用一定数量的前看未编码帧的信息来尽可能地提升编码效率。关于 CRF 码控,已有许多相关的研究。CRF 码控的全局最优解或准全局最优解的方案都需要对整个前看视频段中,每个以 I-帧打头到下一个 I-帧之前一帧为止的 GOP(假定 GOP 之间是 closed GOP,即没有跨 GOP 的帧间预测存在)中每帧的每个 CU 进行逐帧逐 CU 的 CU QP 的遍历调整,使得当前 CU 及所有与当前 CU 有直接或间接预测参考关系的附属 CU 的所有 CU 的率失真代价 RD (Rate Distortion) Cost 之和最小。这样的对整个 GOP 逐帧逐 CU QP 的准全局 RDO (RD optimization) 最优化,需要反复迭代多次进行,直到各帧各 CU QP 的结果收敛为止。可以看到这样的准全局最优解的 CRF 码控算法的计算复杂度非常高,很难实用。所以,有许多研究提出了多种低复杂度的使用的 CRF 解决方案。其中,实际中一个常见的简单有效的 CRF 码控算法是 CU-Tree 算法 [2]

与准全局最优化 CRF 算法以当前 CU 为起点从前往后地考察所有以它做直接或间接预测参考关系的附属 CU 的 RD Cost 不同,CU-Tree 算法采用的是从后往前的反向编码复杂度传播的计算方法,即:对一个 GOP 从最后一个 miniGOP,即包含一个 temporal layer 0 的非双向预测 non-B 帧的以及到它之前一个temporal layer 0 的 non-B 帧之间的所有双向预测帧 B-帧 的子 GOP 结构,开始到第一个 miniGOP 结束,每个 miniGOP 从 temporal layer 最高层的非参考帧 non-reference 的 B-帧开始到最低 temporal layer 0 的 non-B 帧结束,逐帧逐 CU 计算每个 CU 的总的编码复杂度 (coding cost)。每个 CU 的 coding cost 由当前 CU 的预分析所得的 intra cost 加上所有之前更高 temporal layer 帧直接或间接与当前帧当前 CU 有预测参考关系,从而沿预测方向反向传播 (back propagation) 过来的所有传播复杂度 (propagation cost) 的和。最后,每个 CU 的最优 QP offset 就是由包含了 propagation cost 的当前 CU 的总的 coding cost,即 CU intra cost 和 propagation cost 之和,与不包含 propagation cost 而只包含当前 CU 的 intra cost 的原始 coding cost 之比计算得到的。具体计算过程如下所示。

  • 对每个 CU 计算:PropCostOut=(PropCostIn+IntraCost)PropRatioPropCostOut=(PropCostIn + IntraCost)*PropRatioPropRatio=(IntraCostInterCost)/IntraCostPropRatio=(IntraCost-InterCost)/IntraCost。其中 PropCostInPropCostInPropCostOutPropCostOut 是当前 CU 的输入和输出 propagation cost,IntraCostIntraCost是预分析计算的当前 CU 最佳帧内预测模式的 coding cost,InterCostInterCost 则是考虑了帧间和帧内预测的最佳模式的预分析 coding cost。
  • 每个 CU 的 PropCostOutPropCostOut 会反向传播到它的帧间预测参考 CU ,作为那个 CU 的 PropCostInPropCostIn 的一部分。具体反向传播到预测参考 CU 的 cost 是根据那个 CU 参与当前 CU 运动补偿预测的部分的面积与那个 CU 总面积之比,乘以当前 CU 的 PropCostOutPropCostOut 得到的。
  • 对每个 CU:ΔQP=strengthlog2(IntraCost+PropCostIntraCost)\Delta{QP}=-strength*log2(\frac{IntraCost+PropCost}{IntraCost})

可以看出,CU-Tree 算法本质上是用 CU 的IntraCostIntraCost作为代表 CU coding bits 的特征量,用PropCostInPropCostIn来代表当前 CU 对所有与它有直接或间接预测参考关系的后续帧中的相关 CU 的编码码率的影响。由于采用的是反向传播编码复杂度的计算方式,CU-Tree 算法的计算复杂度不是很高,比较便于实用。

5. 小结

码控算法是一个实际视频编码器产品中一个综合性较强的技术模块,它的设计往往需要考虑实际应用,标准兼容,产品质量,以及和编码器系统其他相关技术模块的交互配合,等诸多方面的要求和问题。好的码控算法不仅有助于提升整体的编码效率和质量,同时还于编码视频质量在各种实际视频特性情况下的稳定性密切相关。除了初期基础版本的开发调试,实际使用中往往还要根据新的测试发现或用户问题反馈等,不断地对算法的细节设计各相关方面进行改进,从而不断完善。

参考文献

[1] slhck.info/video/2017/…

[2] “A novel macroblock-tree algorithm for high-performance optimization of dependent viddeo coding in H.264/AVC",J.Garrett-Glaser, 2011.

[3] "Advanced video coding for generic audiovisual services," ITU-T H.264, Mar 2010.

[4] “Low-delay rate control for DCT video coding via ρ-domain source modeling”, Z. He, Y.-K. Kim, S.K. Mitra, IEEE Trans. CSVT, Vol. 11, Issue. 8, p928-40, Aug 2001.