1. 码控概述编码场景理论背景相关变量2. 编码器码控流程率失真 R-D 模型码率预测模型(R-Q 模型)图像复杂度的获取与更新目标码率分配算法帧级码率分配算法块级码率分配算法实际的码控算法设计3. 码率控制模型CQP (Constant QP) : 恒定 QP(一般不用)CBR (Constant Bit Rate):恒定码率(直播业务)VBR (Variable Bit Rate):不超上限的可变码率(点播等离线业务)Capped VBR:窗口内平均码率不超上限ABR (Average Bit Rate):平均码率恒定(一般不用)2-Pass ABR:增加了一个 pass 算编码代价(面向设备编码)CRF (Constant Rate Factor) / CQ (Constant Quality) : 恒定视频质量(存储业务)CRF v.s. CQP : 每帧 QP 是否不变缓冲区控制模型 : HRD (Hypothetical Reference Decoder)缓冲区填充度调整HRD 参数定义HRD 一致性(HRD Conformance)CBR HRD & VBR HRD缓冲区延时(buffer delay)HRD 工作原理5. CRF 码控算法全局最优/准全局最优的 CRF 码控算法CU-Tree(MB-Tree)算法* Reference
1. 码控概述码率控制是在保证缓冲区/带宽不发生上溢和下溢的前提下,通过为各帧甚至各个 CU 输出合适的编码参数QP,来控制输出码流的码率大小,使得瞬时码率或者平均码率符合一定的约束条件和需求。同时要求帧间编码帧和帧内编码帧的视频图像,主观质量能够平稳一致,尽可能使重建视频质量达到最佳。
编码场景
存档:将视频压缩后存于硬盘或网盘上,希望编码质量尽可能好、码率尽可能低,但不关心编码后具体大小;流媒体:通过网络传输视频流,需要确保码率不超过给定带宽,也可能要在不同带宽下提供不同码率的码流;直播流:与流媒体类似,但实时要求高,且无法预知视频内容;面向设备编码:目的时让编码后文件达到特定大小(正好占满碟片)。
理论背景
相关变量
量化参数 QP(是 Qstep 表的索引值,与 Qstep 的大小成线性正相关);Qscale(其值等于拉格朗日常数):由 QP 计算得到,Qscale 越低,则码率预算越高;rate factor:用于控制总体码流的大小(只用于 one-pass 编码情景)
用 rate factor 和复杂度一起算出 Qscale 的大小:;one-pass 编码中,未来帧的复杂度未知,因此 rate factor 的选取是基于已编码帧进行的,选取过程是将 rate factor 应用到所有已编码帧中,看是否能得到希望的码率。
Qcomp:帧复杂度压缩参数,其值介于 0 和 1 之间恒定质量并不代表恒定的 QP,对于高复杂度的场景,细节丢失难以发现,因此可以使用较高的 QP 值。基于该原理,可以对帧复杂度进行非线性压缩:,其中 rceq 代表压缩后的复杂度,是码率分配的依据。当时,Qscale 与复杂度成正比,相当于关闭了帧复杂度压缩过程;当时,Qscale 与复杂度无关(各帧 QP 相等),分配给简单帧和复杂帧的码字相同,接近 CBR。
2. 编码器码控流程码率控制作为编码器内部的一个重要模块,常由目标码率分配算法、率失真 RD 模型、QP 计算算法、基于人眼特性的自适应量化算法,以及缓冲区溢出控制算法等组成,其中主要的是码率分配和量化参数调整。
率失真 R-D 模型QP 值对码率和失真都会造成影响,因此选择最佳 QP 值的过程,也可以视为一种 RDO。码控的 R-D 模型可分为部分:R-Q 模型和 D-Q 模型。
R-Q 模型:根据目标码率预测所需的 QP 值(e.g. HEVC 中的 模型);
D-Q 模型:在计算 QP 时,考虑图像失真分布的平稳性(使时空域失真均衡分布,同时尽量降低失真);
码率预测模型(R-Q 模型)R-Q 模型是指码率 R 与 QP 的推导关系,其作用是对每帧码率进行估计,常见算法有:
其中是帧内容的复杂度,为量化步长,系数会根据实时输出码率不断更新;
一次模型:(在 X264、OpenH264 等编码器中被广泛使用);
二次模型:(在 JM 中使用);模型:(在 HM 中被引入的模型,显著提高了码控速度)
式中的是 RDO 中使用的拉格朗日乘子,是通过实验拟合得到的;HM 中使用的 是:
多个实际编码 QP 点拟合的 R-Q 模型;模型:,其中代表量化系数中零值个数占总数的比例。
其中,一次模型和模型运算量低,较为常用;其他两种模型虽然预测精度高,但复杂度也很高。
图像复杂度的获取与更新
图像复杂度定义:
one-pass 编码:某帧复杂度由经过运动补偿后參差的 SATD 或 MAD 值衡量;2-pass 编码:复杂度为第一次编码的实际码率;模糊复杂度:基于已编码帧的复杂度加权得到,相较于使用单帧复杂度,模糊复杂度能避免 QP 的波动。
码率预测模型的问题:图像复杂度可用 MAD 评估,但当前帧的 MAD 值只有编码后才能得到,而 QP 需要在编码前确定,二者相矛盾;此外,R-Q 模型确定后,还需要确定模型系数()的更新方式及速率,通过提高模型系数的更新速率,可使编码器的输出码率更加平稳,但相对的,画面质量可能由于 QP 变化幅度过大而下降。不同编码器的解决方案:
JM 中使用一阶线性模型,根据过去帧的 MAD 值来预测当前帧的复杂度。而 R-Q 模型的系数直接通过当前帧的编码结果反向计算得到;在 OpenH264 和 X264 中,放弃了 MAD 的计算,而是将一次 R-Q 模型中的合并为整体计算。
目标码率分配算法按照码率分配的粒度,目标码率分配算法可分为 GOP 级码率分配、帧级码率分配、CTU 级以及 CU 级码率分配,基本原则是给复杂的帧或区域分配更多比特,以保证编码失真的均匀分布。因此难点在于:如何度量图像的纹理复杂度。
帧级码率分配算法首先根据每帧的复杂度,分配各帧之间的码率比例。然后根据目标码率和之前已编码帧的实际码率,将每帧的 Qscale 缩放到合适的大小,该缩放系数称为 “rate factor”:Qscale = complexity / ratefactor,若之前帧的实际码率高于目标码率,则减小 rate factor,反之增大该系数,最后根据公式计算出 QP 值。CRF(Constant Rate Factor)模式就是固定 “rate factor” 参数,码率分配完全由复杂度决定;而 ABR 和 CBR 模式都是通过实时调整 rate factor 实现的。Qscale 最后会再经过 VBV 模块调整,确保不会发生缓冲区下溢,VBV 模块也是实现 CBR 模式的关键模块。
块级码率分配算法实际的码控算法设计实际中,码控算法首先要能视频的整体码率比较准确地达到目标值,并满足 HDR 缓冲区限制。在此基础上,再尽可能提升整体编码效率。此外,码控算法的稳定性和鲁棒性也很重要,比如在视频内容和特性急剧变化时,要求码控算法都能达到预期作用,并且要尽量保证没有极差质量的问题帧出现。码控算法设计中的另一个重点是:如何利用好过去编码帧的结果数据。包括已编码帧的预分析复杂度、实际 QP 值、实际码率等。这会引发另外两个问题:
如何存储和利用已编码帧的数据;当出现与过去相比明显变化的视频段时,如何自适应的调整和跟进码控算法。
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 算编码代价(面向设备编码)如果允许编码器进行次编码,则可以预先得知还未编码的内容。它可以在第一遍编码时计算编码代价,然后在第二遍编码时更高效地利用比特。这种模式使得在特定码率下输出的质量最好。该模式可以达到特定目标码率,适合于面向设备的编码;但不适于需要快速编码的场景,如直播等。此外,2-Pass ABR 有两点需要注意:
不知道最终视频流的失真如何,因此需要进行多次实验,以确保给定的码率足够编码复杂内容;该模式下码率可能出现局部峰值,即可能超过带宽限制。
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 调整两种机制。
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 的填充度:
对于 P 帧和第一个 I 帧,让当前帧编码结束后,VBV 至少还有一半容量;限制每帧大小的上限是当前 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)缓冲区大小除以码率就是缓冲区引入的最大延时,其大小与实际的应用场景需求密切相关:
视频会议、网络游戏等应用的延时一般很小();
广播电视、网上流媒体等应用延时一般在 0.5 ~ 3s 之间;离线大视频文件存储类应用延时一般较大(> 10s)。
HRD 工作原理
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)之和。被参考的用 CU 的 Intra cost 作为代表 CU coding bits 的特征量,用 PropCostIn、PropCostOut 代表当前 CU 对所有与它有预测参考关系的 CU 编码码率的影响,由于采用的是反向传播编码复杂度的计算方式,CU-Tree 算法的计算复杂度不高,便于实用。
* ReferenceWebPage知乎 - 视频编码技术之码率控制(Bytedance)手撕编解码 - 再谈视频编码的码率控制知乎 - 视频通信中的码率控制算法知乎 - x264 码率控制算法原理Blog - 量化参数QP与HEVC知乎 - x264和x265编码器码率控制之基本模型Blog - H.264 Rate Control AlgorithmBlog - What are CBR, VBV and CPB?