我们在前文《H.264 视频编码》和 《H.265视频编码》 中探讨了 H.264 视频编码的基本概念、编码工具、编码流程及码流结构等基础知识,以及在 H.264 基础上迭代而生的 H.265 有哪些改进。接下来我们再来聊聊更新一代编码技术 H.266 的改进。
3、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 的新编码工具和对已有编码工具的技术改进主要包括以下几类:
- 块划分
- 帧内预测
- 帧间预测
- 变换和量化
- 熵编码
- 环路滤波
- 屏幕内容编码
- 360 度视频编码
3.1、编码工具
3.1.1、块划分
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 有两种实现方式:
- 作用在帧内编码条带级别,这种编码方式也称为双树(Dual-Tree)编码,对于每个支持的最大编码树单元(Coding Tree Unit, CTU),亮度和色度采用不同的分块树结构;
- 对于使用单编码树(Single-Tree,CTU 级别的亮度和色度采用相同分块树)的条带,当亮度块大小满足某种条件时,亮度和色度也会采用不同的分块树划分,这种编码方式也称为局部双树(Local Dual-Tree)编码,主要用于防止分块结果中有很多小色度块。
另外,H.265 支持的最大 CTU 是 64×64,而在 H.266 中的最大 CTU 增加到 128×128,最小 CTU 可支持 32×32。
3.1.2、帧内预测
H.266 的帧内预测技术改进如下:
- H.266 支持 67 种帧内预测模式(H.265 是 35)。
- 对非方形块的角度预测方向做了调整,预测像素插值采用两类四抽头插值滤波器(H.265 是低精度的线性插值)。
- 基于位置的预测组合技术(Position Dependent intra Prediction Combination, PDPC)将滤波前后的预测信号合并在一起以进一步提高帧内预测精度。
- 多参考行帧内预测技术不仅可以利用最近相邻的重建像素值,还可以采用更远的重建像素值进行帧内预测。
- 基于矩阵的帧内预测技术中利用了矩阵向量的乘法来进行帧内预测。
- 跨分量线性模型帧内预测技术利用亮度图像分量的像素值来预测同一图像中色度分量的像素值。
- 在子分块模式中,一个亮度编码单元的不同子块采用相同的编码模式信息。
3.1.3、帧间预测
H.266 的帧间预测技术改进如下:
- H.266 继承了 H.265 的基于整个编码单元的运动矢量差值(Motion Vector Difference, MMVD)编码及运动信息继承模式,即:AMVP(Adaptive Motion Vector Prediction)和 Skip/Merge 模式,并分别做了扩展:
- 对 AMVP 模式,H.266 引入了块级的自适应运动矢量精度,以及对称编码模式(Symmetric Motion Vector Differences Signalling)用于双向预测但只需要编码其中一个参考图像的 MVD。
- 对于 Skip/Merge 模式,H.266 引入基于历史信息的运动矢量预测(HMVP, History-based Motion Vector Prediction)和配对平均运动矢量预测(Pair-wise Average Merge Candidate)。
- H.266 还引入了基于子块的时域运动推导模式(Subblock-based Temporal Motion Vector Prediction, SbTMVP),即当前编码单元分为大小相同的子块(8×8 亮度子块),每个子块的运动矢量单独进行推导。
- H.266 还引进一个仿射运动模型来更精确地表示像缩放和旋转这样的高阶运动从而提高运动信息的编码效率。
- 运动矢量的精度提高到了 1/16 亮度像素(H.265 是 1/4 亮度像素)。
- H.266 还引入多个新的帧间预测编码工具,如:
- 将 AMVP 和 merge 模式结合起来的合并模式(Merge mode with MVD, MMVD),通过对 merge 模式增加额外的运动矢量差值得到了进一步提高。
- 几何分块模式的分块结果可以更加切合视频内容中的实体对象边界的运动轨迹。
- 帧间预测和帧内预测合并在一起的预测模式可以同时减少时域冗余和空域冗余以取得更高的压缩性能。
- H.266 的另一个重要改进是引入解码端运动细化和双向光流这两个工具,在不增加码率开销的情况下进一步提升运动补偿效率。
3.1.4、变换和量化
H.266 在变换方面的优化:
- H.266 的最大变换维度提高到了 64×64(H.265 是 32×32)。
- 引入了非正方形变换,非正方形变换用于对非正方形的分块进行变换操作。这种变换在水平方向和垂直方向使用不同长度的变换内核。
- 引入了多变换(主变换)选择,有了多变换选择,编码器可以从一组预定义的整数正弦、余弦、跳过变换并在码流中标明所用变换。
- 引入了低频不可分变换,低频不可分变换对帧内预测残差的主变换结果中的低频分量进行再进行二次变换,以更好地利用编码块内容的方向性进一步提高压缩性能。
- 引入了子块变换,子块变换用于当对一个帧间预测残差块的一部分进行编码而其它部分的值全部设为零的时候。
H.266 在量化方面的优化:
- 引入了自适应色度量化参数偏差。采用自适应色度量化参数偏差这个工具时,对于特定的量化组,色度量化参数不直接编码,而是通过亮度量化参数和预定义并传输的查找表推导得出。
- 引入了依赖量化。在依赖量化中,一个变换系数的重建值范围依赖于扫描顺序在它前面的几个变换系数的重建值,从而减少输入向量和最接近的重建向量之间的平均失真。
- 引入了量化残差联合编码。量化残差联合编码指的是对两个色度分量的残差一起编码,而不是分别编码,这样当两个色度分量的残差相似时编码效率会更高。
3.1.5、熵编码
与 H.265 相同,H.266 采用的熵编码也是上下文自适应的二进制算术编码(Context-Adaptive Binary Arithmetic Coding, CABAC),但是在 CABAC 引擎和变换系数编码两方面做了改进:
- 在 CABAC 引擎方面的改进:多重假设概率更新模型和上下文模型绑定的自适应率(即概率更新速度依赖于上下文模型),其中采用了和每个上下文模型耦合的两个概率估计 P0 和 P1,而 P0 和 P1 相互独立地根据各自的自适应率进行更新。用于二进制算术编码器中进行区间细分的概率估计 P 设为 P0 和 P1 的均值。
- 在变换系数编码方面的改进:
- 除了 4×4 的系数组之外,H.266 还允许 1×16、16×1、2×8、8×2、2×4 和 4×2 这六种系数组。
- 增加了一个标志位用于依赖量化的状态过渡。
- 一个改进的概率模型选择机制用于和变换系数绝对值相关的语法元素的编码。
3.1.6、环路滤波
H.266 中环路滤波方面的改进:
- 支持 H.265 中也有的去块效应滤波器(Deblocking Filter, DBF)。增加了更长的滤波器和一个专门为高动态视频设计的亮度自适应滤波模式。
- 支持 H.265 中也有的样本自适应偏差(Sample Adaptive Offset, SAO)。与 H.265 相同。
- 新增支持带色度缩放的亮度映射(Luma Mapping with Chroma Scaling, LMCS)。编码器可以利用 LMCS 在编码前分段线性地改变输入视频信号幅度分布的动态范围从而提高编码效率,在解码端逆向复原。
- 新增支持自适应环路滤波器(adaptive loop filter, ALF)。H.266 中的 ALF 包括两种模式:
- 亮度和色度样本基于块的 ALF。在 ALF 中,亮度和色度分别采用 7×7 和 5×5 的菱形滤波器;对于每个 4×4 块,根据其方向性和梯度活动性分成 25 类和 4 个转置状态的一种,从所传递的多组滤波器中选择一个采用。
- 色度样本夸分量自适应滤波器(Cross-Component Adaptive Loop Filter, CC-ALF)。CC-ALF 采用一个菱形线性高通滤波器利用 ALF 滤波后的亮度样本来进一步细化色度样本。
3.1.7、屏幕内容编码
H.266 中屏幕内容编码方面的优化:
- H.266 保留了 H.265 中的基于块的差分脉冲编码调制,但仅限于帧内预测的编码单元。
- 变换跳过残差编码在 H.265 基础上作了以下改进:
- 第一个非零值的位置不再编码,扫描方向改为相反方向;
- 利用上下文模型提高了正负号指示的编码效率;
- 绝对值的编码改进。
- 保留了 H.265 帧内块拷贝(Intra Block Copy, IBC)并改进。在 H.265 中,IBC 被定义为一种帧间预测模式,其参考帧是当前帧本身并且运动向量必须指向当前帧已解码且未进行环路滤波的区域。在 H.266 中,IBC 与帧间预测解耦,并对参考缓冲的管理相对于 H.265 进行了简化,参考样本存储在一个局部的小缓冲器中。
- 保留了 H.265 调色板模式并改进。调色板的编码方式在 H.266 中取决于亮度色度是否使用单个编码树。如果使用单个编码树,三个色度分量的调色板联合在一起编码;否则亮度和色度调色板分开编码。对于采用调色板的编码单元,个别像素还可以不使用调色板中的内容,而是直接编码其量化值。
- H.266 中的自适应颜色变换这个屏幕内容编码工具与 H.265 中相同,未作改进。
3.1.8、360 度视频编码
360 度视频是在 2014、2015 年左右逐渐开始流行起来的,而 H.265 的第一版是在 2013 年年初定稿的,所以 H.266 顺利成章地成为第一个包含 360 度视频编码工具的国际视频编码标准。
由于传统视频编码技术基本上都能用于 360 度视频编码,H.266 中包含的 360 度视频压缩工具只有两个,更多的对 360 度视频的支持是在系统和传输接口的设计中。
- H.266 中的一个 360 度视频压缩工具叫做运动矢量环绕。就是当运动矢量指向图像右(左)边界之外的位置时,运动补偿中实际用的参考像素是图像左(右)边界内的像素(或通过插值滤波得到的子像素)。这是因为 360 度视频中常用的一种叫做等矩形映射(Equirectangular Projection, ERP)图像的左右边界实际上是物理世界的球形表面的连续位置,类似于世界地图的左右边界实际上是地球上的连接南北极的同一条经线。所以这样的运动矢量环绕可以提高采用 ERP 的 360 度视频的编码效率。
- 另外一个 360 度视频压缩工具叫做环路滤波虚拟边界。如果采用,则环路滤波的适用效果不会跨过图像中某些水平或垂直线(这些线就是这里说的所谓的虚拟边界)。这个工具适用于 360 度视频中常用的另一种映射,叫做立方体贴图映射(Cube Map Projection, CMP)。
3.2、系统和传输接口
视频编码标准的系统和传输接口通常也叫做高层语法(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 中的新的或有显著改进的设计主要包括以下这些方面:
- 矩形条带(Slice)和子图像(Subpicture)
- 自适应图像分辨率更新
- 自适应参数集(Adaptation Parameter Set, APS)
- 图像头
- 逐渐解码刷新(Gradual Decoding Refresh, GDR)
- 参考图像列表(Reference Picture List, RPL)的直接编码
- 多层可伸缩编码设计大大简化
3.2.1、条带和子图像
相对于 H.264 和 H.265,H.266 在条带支持方面有一个重大的变化,那就是用基于瓦片(Tile)或瓦片中的 CTU 行的条带机制取代了基于分块单元(H.264 中的宏块或 H.265 中的 CTU)的条带机制。这个变化的原因是网络技术和视频编码及传输技术的发展让过去常用的视频错误隐藏技术基本上不再被需要,人们看到的视频基本上不再包含采用错误隐藏技术得到的视频帧了。
H.266 条带有两种模式:
- 矩形条带。矩形条带的形状总是一个矩形。每个矩形条带可以包含一个或多个完整的瓦片(如下面第一幅图所示),也可以包含一个瓦片中的一个或多个 CTU 行(如下面第二幅图中右上角的那个矩形条带)。
包含 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 的改进主要有以下五点:
- 可抽取子图像中的运动矢量可以指向子图像边界之外,如果发生则运动补偿时采用像素填充技术,就像运动矢量指向图像边界之外时一样,从而提高编码效率。
- 对合并模式和解码端运动矢量细化中的运动矢量选择和推导作了针对子图像的改进。
- 抽取子图像时不需要改动条带头。
- 包含不同类型条带(比如支持随机访问的和不支持随机访问的)的子图像可以被简单合并为一个图像,合并时也不需要改动条带头。
- 定义了子图像序列的 HRD 和类别,从而编码器可以保证每个可抽取子码流的一致性。
3.2.2、自适应图像分辨率更新
在 H.264 和 H.265 中,改变图像分辨率有在编码视频序列(Coded Video Sequence, CVS)的起始帧并开始使用一个新的序列参数集的时候才可能。而在 H.266 中图像分辨率可以在一个 CVS 中的任何帧改变,而且改变时还可以继续用帧间预测。这就需要允许在不同分辨率的两个图像之间进行帧间预测,因此需要能够进行参考图像重采样(Reference Picture Resampling, RPR)。这里的重采样既可能是上采样,也可能是下采样,取决于参考帧的分辨更大还是当前帧的分辨率更大。
3.2.3、自适应参数集(APS)
H.266 中增加了一种新的参数集:APS,用来传输符合以下三个条件的图像层或条底层信息:
- 可以被一个图像的多个条带和/或不同图像的多个条带共享的;
- 可能在图像之间频繁变化;
- 可能取值的个数比较大,如果放到图像参数集(Picture Parameter Set, PPS)中去的话会导致 PPS 在一个码流中需要更新从而无法进行 PPS 的带外传输。
在 H.266 中 APS 被用来传输三种参数:
- ALF 参数
- LMCS 参数
- 缩放列表(Scaling List)参数
3.2.4、图像头
图像头并不是一个新概念,在 MPEG-2 等 H.264 之前的编码标准里面就有,但是在采用基于 NAL 单元的码流结构的 H.264 和 H.265 中没有。H.266 中重新引入图像头的主要目的是为了减少图像层信息在一个图像的不同条带中的重复,所以包含的信息基本上就是同一图像中各个条带必须或很可能共享的信息。
3.2.5、逐渐解码刷新(GDR)
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)帧,也可以整个合法码流没有一个帧内编码帧。
3.2.6、参考图像列表(RPL)的直接编码
参考图像管理负责解码图像存入到解码图像缓冲区(Decoded Picture Buffer, DPB)、从 DPB 中删除、以及将参考帧按合理顺序放到 RPL 中去这些操作,是视频编码标准中的核心功能之一。在 H.265 中,参考帧管理通过一个叫做参考图像集(Reference Picture Set, RPS)的机制,包括 RPL 的建立过程。H.266 对 RPL 信息直接编码,而不是间接地通过 RPS。
3.2.7、多层可伸缩编码设计
因为有了上面提到的 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
作者:想进阶音视频开发的 iOS/Android 开发者可以关注公众号 关键帧Keyframe。
版权声明:本文内容转自互联网,本文观点仅代表作者本人。本站仅提供信息存储空间服务,所有权归原作者所有。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至1393616908@qq.com 举报,一经查实,本站将立刻删除。