文森特·梵高《诗人公园》像素版
我们在前文《视频编码(1)》和《视频编码(2)》中探讨了 H.264 视频编码的基本概念、编码工具、编码流程及码流结构等基础知识,以及在 H.264 基础上迭代而生的 H.265 有哪些改进。接下来我们再来聊聊更新一代编码技术 H.266 的改进。
H.266,也被称为多功能视频编码(Versatile Video Coding,简称 VVC)是最新一代视频编码标准,2020 年 7 月定稿,ITU 第一版于当年 11 月正式发布,ISO/IEC 第一版于 2021 年 2 月正式发布。伴随 VVC 的 VSEI 标准的第一版的定稿和发布时间与 VVC 相同。
相对于之前的 H.265/HEVC 和 H.264/AVC 视频编码标准,VVC 对 8K 超高清、屏幕、高动态和 360 度全景视频等新的视频类型以及自适应带宽和分辨率的流媒体和实时通信等应用有了更好的支持。VSEI(Versatile Supplemental Enhancement Information),主要规定用于 VVC 视频码流的视频可用性信息(Video Useability Information, VUI)和一些承载辅助增强信息(SEI)的消息的格式。在 H.265 和 H.264 标准中,这些 VUI 和 SEI 格式是放在编码标准主文本中的,而在制定 H.266 是被分开放在两个不同的标准文本中。
相对于 H.265,根据官方主观测试结果,H.266 的平均编码性能提高了 49%。H.266 的新编码工具和对已有编码工具的技术改进主要包括以下几类:
H.266 中增加了四叉树分块之外的新分块方法:MTT(Multiple-Type Tree)。H.266 采用了四叉树加多类型树(QT+MTT)的分块法。在 QT+MTT 分块中,一个方块可以均匀分成左右或上下两个矩形块,也称为 BT 划分(Binary-Tree Split);或者也可以从左到右或从上到下按 1:2:1 的比例分成三个矩形块,也称为 TT 划分(Ternary-Tree Split),如下图所示。同时,BT 或者 TT 划分得到的子块还允许继续使用 BT 或者 TT 划分,但是不能再使用 QT 划分。
H.266 中还允许对色度分量采用不同的分块树结构 CST(Chroma Separate Tree)。CST 有两种实现方式:
另外,H.265 支持的最大 CTU 是 64×64,而在 H.266 中的最大 CTU 增加到 128×128,最小 CTU 可支持 32×32。
H.266 的帧内预测技术改进如下:
H.266 的帧间预测技术改进如下:
H.266 在变换方面的优化:
H.266 在量化方面的优化:
与 H.265 相同,H.266 采用的熵编码也是上下文自适应的二进制算术编码(Context-Adaptive Binary Arithmetic Coding, CABAC),但是在 CABAC 引擎和变换系数编码两方面做了改进:
H.266 中环路滤波方面的改进:
H.266 中屏幕内容编码方面的优化:
360 度视频是在 2014、2015 年左右逐渐开始流行起来的,而 H.265 的第一版是在 2013 年年初定稿的,所以 H.266 顺利成章地成为第一个包含 360 度视频编码工具的国际视频编码标准。
由于传统视频编码技术基本上都能用于 360 度视频编码,H.266 中包含的 360 度视频压缩工具只有两个,更多的对 360 度视频的支持是在系统和传输接口的设计中。
视频编码标准的系统和传输接口通常也叫做高层语法(High-Level Syntax, HLS),是编解码器中压缩工具和视频应用和传输系统之间的联系纽带。HLS 涉及视频编码标准中的众多课题,包括:码流的基本结构、编码数据的基本结构、序列层和图像层的参数编码、随机访问、视频流自适应、解码图像管理(这里包括参考图像管理)、档次(Profile)和级别(Level)的定义和编码、码流缓冲模型、高层图像分割(比如条带划分和瓦片划分)、时域伸缩性、可扩展性、后向兼容性、容错、增强信息编码,等等。
H.266 继承了 H.264 和 H.265 的 HLS 设计中很多方面,包括基于网络抽象层(Network Abstraction Layer, NAL)单元的语法结构、分等级的语法和数据单元结构、VUI 和 SEI 机制、基于虚拟参考解码器(Hypothetical Reference Decoder, HRD)的视频缓冲模型。
与 H.264 和 H.265 相比,H.266 的 HLS 中的新的或有显著改进的设计主要包括以下这些方面:
相对于 H.264 和 H.265,H.266 在条带支持方面有一个重大的变化,那就是用基于瓦片(Tile)或瓦片中的 CTU 行的条带机制取代了基于分块单元(H.264 中的宏块或 H.265 中的 CTU)的条带机制。这个变化的原因是网络技术和视频编码及传输技术的发展让过去常用的视频错误隐藏技术基本上不再被需要,人们看到的视频基本上不再包含采用错误隐藏技术得到的视频帧了。
H.266 条带有两种模式:
包含 18×12 CTUs 的图像被划分为 24 个瓦片和 9 个矩形条带:
一个图像被划分为 4 个瓦片和 4 个矩形条带(注:左边两个瓦片合为一个条带,而右上角的瓦片被划分为 2 个矩形条带):
包含 18×12 CTUs 的图像被划分为 12 个瓦片和 3 个光栅扫描条带:
H.266 是第一个引入子图像这个设计的视频编码标准。概念上子图像与 H.265 中的运动受限的瓦片集(Motion-Constrained Tile Set, MCTS)相同,但是在设计上做了改进以提高编码压缩效率和应用系统友好性。每个子图像的形状也必须是矩形的,包含一个或多个矩形条带(如下图所示)。
一个图像被划分为 18 个瓦片、24 个条带和 24 个子图像(这个例子中每个子图像正好包含一个矩形条带):
子图像可以独立编码从而可以被提取出来单独解码,所以可以用于感兴趣区域(Region Of Interest, ROI)编码,也可以用于 360 度视频的传输优化,如下图所示。360 度视频与传统视频应用的最关键区别之一是用户在任何瞬间都只会看到整个 360 度球面的一小部分,这个传输方案就是利用这个关键点进行优化,目标是让用户看到的部分具有高画质,而看不到的部分的画质可以比较低。看不到的部分也不能完全不传,因为那样的话,如果用户突然转头就只能看到黑屏,那样就离侵入式体验想去太远了。
基于子图像的 360 度视频传输方案:
H.266 子图像设计相对于 MCTS 的改进主要有以下五点:
在 H.264 和 H.265 中,改变图像分辨率有在编码视频序列(Coded Video Sequence, CVS)的起始帧并开始使用一个新的序列参数集的时候才可能。而在 H.266 中图像分辨率可以在一个 CVS 中的任何帧改变,而且改变时还可以继续用帧间预测。这就需要允许在不同分辨率的两个图像之间进行帧间预测,因此需要能够进行参考图像重采样(Reference Picture Resampling, RPR)。这里的重采样既可能是上采样,也可能是下采样,取决于参考帧的分辨更大还是当前帧的分辨率更大。
H.266 中增加了一种新的参数集:APS,用来传输符合以下三个条件的图像层或条底层信息:
在 H.266 中 APS 被用来传输三种参数:
图像头并不是一个新概念,在 MPEG-2 等 H.264 之前的编码标准里面就有,但是在采用基于 NAL 单元的码流结构的 H.264 和 H.265 中没有。H.266 中重新引入图像头的主要目的是为了减少图像层信息在一个图像的不同条带中的重复,所以包含的信息基本上就是同一图像中各个条带必须或很可能共享的信息。
GDR 指的是可以从一个帧间编码的图像进行随机访问,虽然不能立即得到正确解码的图像,但是随着更多帧的解码,视频内容中正确解码的区域逐渐增大直至到某一帧所有的区域都能正确解码。由于采用帧内编码的块可以相对均匀地分布在多个连续的图像中,编码器就可能使码率很平滑,从而降低点到点延时。
GDR 也不是新概念,在 H.264 和 H.265 中可以支持,并可以用恢复点(Recovery Point)SEI 消息表明对 GDR 的支持和给出 GDR 恢复点的位置。在 H.266 中,GDR 通过一个新的 NAL 单元类型来表明,GDR 恢复点的位置信息放在图像头里,一个码流或 CVS 的首帧就可以是采用帧间编码的 GDR 帧,甚至整个合法码流里面可以没有任何一帧是瞬时解码刷新(Instantaneous Decoding Refresh, IDR)或干净随机访问(Clean Random Access, CRA)帧,也可以整个合法码流没有一个帧内编码帧。
参考图像管理负责解码图像存入到解码图像缓冲区(Decoded Picture Buffer, DPB)、从 DPB 中删除、以及将参考帧按合理顺序放到 RPL 中去这些操作,是视频编码标准中的核心功能之一。在 H.265 中,参考帧管理通过一个叫做参考图像集(Reference Picture Set, RPS)的机制,包括 RPL 的建立过程。H.266 对 RPL 信息直接编码,而不是间接地通过 RPS。
因为有了上面提到的 RPR,H.266 中支持多层可伸缩编码就变得简单了。因为相对于单层编码不需要任何其它『低层』编码工具了,只需要增加 HLS 的支持即可。这也正式 H.266 第一版中就会支持多层可伸缩编码的主要原因(H.264 和 H.265 都是在第一版之后才加入对多层可伸缩编码的支持的)。相对于 H.264 和 H.265 后期版本中的多层可伸缩编码,H.266 中的多层可伸缩编码设计从一开始就聚焦于对单层解码器设计的友好性。首先,对解码多层码流的能力的规定与单层码流一致,从而一个单层解码器只需要少量的改变就可以解码多层码流,比如级别中对最小 DPB 能力的规定与码流中有几层无关。另外,多层可伸缩编码的 HLS 的设计大大简化,代价是牺牲了一些灵活性,比如在每个随机访问点要求每层的图像都必须存在。
H.266 中的多层可伸缩编码设计虽然相对简单,但是仍然不仅支持了传统的空间可伸缩性、质量可伸缩性、以及多视角可伸缩性,还支持了一些可伸缩性和子图像的组合。比如,前面图所示的基于子图像的 360 度视频传输方案可以通过允许层间预测进一步改进,如下图所示:
基于子图像并允许层间预测的 360 度视频传输方案:
1)H.266/VVC 视频编码标准概述
https://juejin.cn/post/6940078108787769357
2)新一代视频压缩编码标准 H.264/AVC https://book.douban.com/subject/1314942/
3)新一代高效视频编解码 H265/HEVC 原理、标准与实现 https://book.douban.com/subject/26828613/
4)率失真优化
https://blog.csdn.net/weixin_42979679/article/details/104534543
5)ITU 第一版
https://www.itu.int/rec/T-REC-H.266/en
6)ISO/IEC 第一版
https://www.iso.org/standard/73022.html
7)VSEI 标准的第一版
https://www.itu.int/rec/T-REC-H.274/en
(通过上文的介绍,我们了解了 H.266 的编码工具及相对 H.265 的改进。关于视频编码基础知识的探讨暂时告一段落。后续我们将在继续探讨音视频封装格式相关的内容,敬请期待)