9月7日-8日,相约 2023 腾讯全球数字生态大会!聚焦产业未来发展新趋势! 了解详情
写点什么

字节跳动视频编码技术:码率控制

字节跳动视频云技术团队

  • 2023-03-05
    北京
  • 本文字数:5800 字

    阅读完需:约 19 分钟

字节跳动视频编码技术:码率控制

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 leve l) , 即 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)tr​(0) , tr(1)tr​(1),...tr(i)tr​(i) 上,各帧对应的编码码流被从解码缓冲器中取出,时间点 0 到 tr(0)tr​(0) 之间即初始移除延时, LinitLinit ​是初始缓冲器水平。缓冲器输入码流是均匀的码率 R ,帧与帧间隔是帧率 FR 的倒数, Bits(i) 即 i 帧的码流大小, B 是缓冲器的大小,即上限。


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


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


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


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


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


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


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


实际中,码控算法首先要能够使视频整体的编码码率比较准确地达到目标平均码率,以及如果有 HRD 缓冲器的限制,要能同时满足相应缓冲器方面的要求。在此基础上,要尽可能地提升整体编码效率。除此之外,一个实际的视频编码器产品,对码控算法的稳定性和鲁棒性也都有很高的要求,比如在实际中所有可能的各种视频内容和特性不断急剧动态变化的情况下,要求码控算法都能够使得最终的编码视频较好地达到和满足目标码率,以及相应的 HRD 缓冲器限制,如果有,同时还要尽量保证没有极差质量的问题帧的出现等。码控算法中需要的一项必不可少的技术,是对每帧的编码码率进行估计或预测的码率预测模型,即 R-Q 模型。关于 R-Q 模型,早已有很多很好的研究成果和相关论文,比如:


  • 一次模型: R=a∗X/QR=a∗X/Q ,其中 X 是帧编码复杂度。

  • 二次模型: R=a∗1/Q+b∗1/Q2R=a∗1/Q+b∗1/Q2

  • 多个实际编码 QP 点结果数据拟合的 R-Q 模型

  • ρρ域模型: R=a∗(1−ρ(Q))+bR=a∗(1−ρ(Q))+b ,其中 ρ(Q)ρ(Q) 代表以 Q 量化参数量化后的变换系数中量化系数为零的系数占总变换系数的比例 ( ratio of zero quantized transform coefficients ) [4]


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


怎样利用好过去编码帧的结果数据,是码控算法设计中需要考虑的一个问题。这些数据包括过去编码帧的预分析复杂度,实际编码 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-Tree 算法本质上是用 CU 的 IntraCostIntraCost 作为代表 CU coding bits 的特征量,用 PropCostInPropCostIn 来代表当前 CU 对所有与它有直接或间接预测参考关系的后续帧中的相关 CU 的编码码率的影响。由于采用的是反向传播编码复杂度的计算方式, CU-Tree 算法的计算复杂度不是很高,比较便于实用。


5. 小结


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



参考文献

[1] https://slhck.info/video/2017/02/24/crf-guide.html

[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.

活动推荐:

2023年9月3-5日,「QCon全球软件开发大会·北京站」 将在北京•富力万丽酒店举办。此次大会以「启航·AIGC软件工程变革」为主题,策划了大前端融合提效、大模型应用落地、面向 AI 的存储、AIGC 浪潮下的研发效能提升、LLMOps、异构算力、微服务架构治理、业务安全技术、构建未来软件的编程语言、FinOps 等近30个精彩专题。咨询购票可联系票务经理 18514549229(微信同手机号)。

2023-03-05 10:425092
用户头像
鲁冬雪 InfoQ 资深编辑

发布了 245 篇内容, 共 107.0 次阅读, 收获喜欢 187 次。

关注

评论

发布
暂无评论
发现更多内容

Maven-技术专题-Setting文件结构解析

洛神灬殇

消灭微服务的坏味道 之 循环依赖

码猿外

微服务 循环依赖 坏味道

架构师系列之6: python实现一致性hash

桃花原记

接口的幂等性的多重考虑,你会了吗?

moon聊技术

Java 接口

石、火、水:从OriginOS透视移动系统进化论

脑极体

大专学历Java开发7年,从年初被裁到四面美团点评成功上岸,闭关七个月,入职那一天我哭了!

Java架构追梦

Java 阿里巴巴 面试 美团 java架构

Nacos实战及其源码分析

Fox

Spring Cloud nacos spring cloud alibaba

《使用C ++的数据结构和程序设计》限时免费下载

计算机与AI

c++

区块链的新信任模式将重塑传统金融业

CECBC

区块链 资产流动性

git使用与原理剖析及其私服搭建

Fox

git

LeetCode 热题 - 递归

helbing

LeetCode

架构师训练营第 1 期 - 第九周作业

Todd-Lee

极客大学架构师训练营

结合实战和源码来聊聊Java中的SPI机制?

冰河

Java spi 服务发现

阿里大牛八年打造,编程宝典,从初学到编程进阶—深入学习—实战

Java~~~

Java 阿里巴巴 程序员 架构 编程语言

《ZooKeeper分布式过程协同技术详解》.pdf

田维常

电子书

阿里内部“新鲜出炉”手慢无!首发面试终极指南V3.0,符合一线大厂面试知识点+面试题

Java架构追梦

Java 阿里巴巴 架构 面试 分布式

DataOps系列丨DataOps的组织架构与挑战

DataPipeline数见科技

大数据

Appium常用操作之「Toast提示信息获取」

清菡软件测试

第五周 - 作业

leo

极客大学架构师训练营

看“区块链”如何为外贸企业融资

CECBC

区块链 银行

React 灵魂 23 问

局外人

Java 大前端 React

实现2nm工艺突破,台积电为何能给“摩尔定律”续命?

脑极体

用 Python 实现定时自动化收取蚂蚁森林能量

Python小二

Python

第五周-笔记

leo

极客大学架构师训练营

五、一致性哈希算法

Geek_28b526

输入法B端市场转化:百度推动产业智能化的新路径

脑极体

JVM运行时数据区,你真得好好学一学

Simon郎

JVM Java 分布式

Spring Cloud Config 实现分布式配置中心

AI乔治

Java 架构 微服务 Spring Cloud

给,你们想要的内存溢出MAT排查工具

田维常

内存溢出

架构师训练营第 1 期 - 第九周总结

Todd-Lee

极客大学架构师训练营

网络冲浪信任危机频发,区块链能否破局?

CECBC

区块链 征信透明

  • 扫码添加小助手
    领取最新资料包
字节跳动视频编码技术:码率控制_语言 & 开发_InfoQ精选文章