FFmpeg音视频开发基础与实战
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

3.5.3 H.265的基本算法

1.帧间预测

一个按照帧间编码的编码单元,在编码之前首先按照某种方式分割为若干预测单元。每个预测单元由一个亮度预测块和两个色度预测块构成,其中,每个预测块都共享一组相同的运动信息,包括运动矢量和参考帧索引等。

H.265中定义了8种把编码单元分割为预测单元的模式,即4种对称模式和4种非对称模式,如图3-10所示。

除新的像素块划分方式外,H.265 的帧间预测还使用了多种改进技术以提升编码性能,其中代表性的有先进运动矢量预测(Advanced Motion Vector Prediction,AMVP)和帧间预测块合并等。

图3-10

在H.264中,获取运动矢量预测通常为取与当前像素块相邻的三个已编码块的运动矢量的中间值。某些编码模式(如预测模式为 TemporalDirect 模式)可能使用相邻块的运动矢量值作为运动矢量预测。在H.265中,由于引入了树形编码单元,所以某个预测单元与其相邻预测单元的关系更加复杂,如一个64像素×64像素的预测单元,其左侧邻域最多可能存在16个8像素×4像素的相邻预测单元。为了适应这种情况,H.265中引入的先进运动矢量预测并未使用从前期已编码的相邻块来估计当前块的运动矢量预测,而是将若干运动矢量预测的候选以列表的形式重建,并以显式编码索引值的方式获得运动矢量预测。通过该方式,不仅对编解码的实现较友好,而且保证了较高的压缩编码性能。

帧间预测块合并也是H.265中新增的方法。对于部分前景运动轨迹与背景差别较大,或运动物体的形状特殊的场景,树形编码单元的四叉树分割可能导致整帧图像的分割过于细碎,产生大量的无效边缘。无效边缘指边缘两侧的预测单元其运动参数完全一致或接近完全一致。过多相同参数的预测单元产生的数据将影响整体压缩效率。与先进运动矢量预测类似,H.265的帧间预测块合并同样生成一个运动信息的候选列表,并且在码流中写入一个索引值,由它决定当前预测单元应选择哪一个候选的运动信息。帧间预测块合并与先进运动矢量预测的主要区别在于:先进运动矢量预测的候选列表中只包括各个相邻预测单元的运动矢量,而帧间预测块合并的候选列表包括所有的运动信息,除运动矢量外,还有选用单个或两个参考帧列表、参考帧索引等信息。

2.变换编码

H.265继承了H.264中使用的整数变换算法,并且针对H.265的特点进行了优化和扩展。在H.264中,变换编码使用4像素×4像素或8像素×8像素大小的二维整数编码。H.265中使用了新的四叉树结构的块分割方法,编码的基本单元大小更加灵活,因此变换块尺寸也更加灵活。

一个从树形编码单元分割出的编码单元在完成预测过程后,编码单元内部须进行变换编码。一个编码单元在变换编码过程中,不是对编码单元的整个像素块进行变换,而是以当前编码单元为根继续进行四叉树分割,经过分割之后生成若干变换单元(Transform Unit,TU),之后在每一个变换单元中进行实际的变换操作。每一个变换单元包括了若干变换块(Transform Block,TB),当亮度变换块的尺寸大于4像素×4像素时,一个变换单元包含一个亮度变换块和两个色度变换块;当变换块尺寸为4像素×4像素时,则变换单元包括4个亮度变换块和8个色度变换块。最终划分的变换单元的大小受到多个参数的限制,如四叉树的最大深度、变换块的最大尺寸和最小尺寸等。由于变换单元和预测单元的形状差异,一个变换单元可能跨越多个预测单元进行递归划分。把一个编码单元划分为变换单元的方法如图3-11所示。

图3-11

由于变换块的大小不同,所以H.265为不同尺寸的像素块定义了相应的整数变换矩阵。其中,4像素×4像素的变换矩阵如下:

8像素×8像素的变换矩阵如下:

除离散余弦变换外,H.265 还使用了另一种类似的变换算法,即整数离散正弦变换专门应用于帧内预测模式,对 4 像素×4 像素大小的亮度分量块的预测残差进行变换编码。整数离散正弦变换在实现时的运算复杂度与离散余弦变换相同,并且更适应与帧内预测时残差信号的分布规律。整数离散正弦变换的变换矩阵如下:

3.帧内预测

H.265 的帧内预测编码使用了全新的设计。在 H.264 中,亮度分量的帧内预测针对两种尺寸:16像素×16像素或4像素×4像素,其中4像素×4像素的亮度块定义了9种预测模式,16像素×16像素的亮度块定义了4种预测模式。由于H.265使用了树形编码单元图像帧分割方式,因此简单地针对某种尺寸定义若干预测模式便显得过于烦琐。

当一个树形编码单元按四叉树分割为若干编码单元后,每个编码单元都决定了自身使用帧内编码还是帧间编码。当一个编码单元使用帧内编码时,该编码单元的帧内预测模式将编码后写入输出码流,具体如下。

◎ 如果当前编码单元的大小大于指定的最小编码单元尺寸,则在编码单元中为亮度编码块指定一个帧内预测模式。

◎ 如果当前编码单元的大小等于指定的最小编码单元尺寸,则编码单元中的亮度编码块继续按四叉树分割为4个子块,并为每个子块分配一个帧内预测模式。

◎ 每个编码单元都为色度编码块分配了一个帧内预测模式,该模式适用于编码单元内的两个色度编码块。

针对亮度分量,总共可能有 5 种尺寸的像素块执行帧内预测的操作,分别为 64 像素×64像素、32像素×32像素、16像素×16像素、8像素×8像素和4像素×4像素。对于每一种尺寸,H.265共定义了35种预测模式,包括DC模式、平面(Planar)模式、水平模式、垂直模式和31种角度预测模式。35种模式如图3-12所示。

图3-12

从图3-5可知,H.264并未提供右上方向的预测模式。很明显,H.265中定义的帧内预测模式继承了H.264的并进行了扩展,即H.264中定义的9种预测模式可以被认为是H.265定义的35 种预测模式的子集,如 H.265 中的平面模式就是由 H.264 中的平面模式发展而来的。而 31种角度预测模式是对H.264中的偏对角模式的扩展,与H.264中定义的6种对角、斜对角模式相比,31种角度预测模式提供了更为精细的预测候选。另一方面,更多的预测模式带来了更高的算力需求,为了平衡算法性能与运算复杂度,H.265还定义了多种帧内预测的快速算法。

在多种预测角度中,H.265提供了若干右上方向的预测方式的原因之一在于其使用了比H.264 更多的预测像素。在 H.264 中,由于当前像素块左下方的块尚未进行编码或解码,所以无法作为参考像素。而H.265使用了四叉树分割,因此在编码当前块时,有可能获取左下方的像素作为参考。H.265在进行帧内预测的过程中,当前像素块与参考像素的相对位置关系如图3-13所示。

图3-13

4.熵编码

H.265取消了对CAVLC算法的支持,所有的profile均以CABAC算法为主,并以指数哥伦布编码算法作为部分语法元素的解析方法。与H.264的CABAC算法相比,H.265中的CABAC算法基本继承了其主要特性,并针对部分特性做了改进,主要包括优化对邻域数据的依赖性、提升对并行编码的适应性等。

5.环路滤波

环路滤波(In-loop Filter)是在H.264等早期标准中便已使用的技术,其主要目的是降低块效应和振铃效应等副作用,提升重建图像的质量。从图 3-8 所示的编码框架结构中可以看出,滤波部分在反量化、反变换之后,位于解码子环路中,因此被称为环路滤波。在H.265中,环路滤波的主要功能有两个。

◎ 去块滤波(Deblocking Filter):去除编码产生的块效应。

◎ 像素自适应补偿(Sample Adaptive Offset,SAO):改善图像的振铃效应。

去块滤波在一帧中的各个树形编码单元解码完成后进行,针对每一帧中亮度和色度分量的8像素×8像素块边沿进行,先处理垂直边界,再处理水平边界。如果操作的是色度分量,则边界两侧至少有一个像素块为帧内预测时方可进行滤波。针对某个 8 像素×8 像素边缘滤波时,最多修正边缘两侧的各3个像素,因此不同边缘的滤波操作相互不影响,利于并行操作。

像素自适应补偿主要用于改善图像中的振铃效应。所谓振铃效应,指的是由于有损编码带来的高频信息损失,图像剧烈变化的边沿产生的波纹形失真。H.265引入的像素自适应补偿,可以降低振铃效应的影响。像素自适应补偿以一个树形编码单元为基本单元,对其中的像素进行滤波。对一个树形编码单元中的像素进行分类处理的方式有三种。

◎ 边沿补偿(Edge Offset,EO):计算当前像素与相邻像素的大小关系,进行分类和修正。

◎ 像素带补偿(Band Offset,BO):根据像素值所处的像素带进行补偿。

◎ 参数合并(Merge):直接使用相邻树形编码单元的参数进行计算。