简述HEVC与VVC的视频编码过程

H.265/HEVC视频编码

视频编码的目的是为了压缩原始视频,压缩的主要思路是从空间、时间、编码、视觉等几个主要角度去除冗余信息。由于 H.264 出色的数据压缩比率和视频质量,成为当前市场上最为流行的编解码标准。而 H.265 是在 H.264 的基础上,保证相同视频质量的同时,视频流的码率还可以减少50%。随着H.265编码格式越来越流行,以下是 H.265 的编码框架流程图:
在这里插入图片描述
如图所示,一个视频被逐步分解成输入的图像块,然后经历大概三个编码过程,即预测编码、变换编码和统计编码。大致流程是先经历预测编码压缩视频帧,然后对预测编码的残差进行变换编码,将图像数据从空间域矩阵转换为频域的变换系数矩阵,得到的量化系数用于后续的熵编码从而得到二进制码流,在编码器内部还有一个分支用于反量化和变换,用于之后的像素参考,方便下一步预测,而统计编码则是频域的视频压缩。接下来详细讲解这三个过程。
这几天在论文中找到了个更专业和详细的描述:在这里插入图片描述
定义IV和PV为YUV视频的源值和预测后的值,(·)/Q为量化运算,Q为量化因子,DCT/DST由DT(·)表示。
则DCT变化系数D(1)=[DT (IV(1) − PV(1))/Q], [·]代表舍入。
源值经过变换量化后的量化系数经过反向解码进行帧重建并得到重建系数RESrt,定义RT(·)代表舍入和阶段操作,IDT(·)代表逆DCT/DST变换。
则RESrt=RT(IDT(D(1)/Q^-1) 。
逆变换后经过环路滤波,这个过程可以表示为IV(1)=环路滤波(PV(1)+RT(IDT(D(1)/Q^-1)),然后把帧存在buffer中,用于后续帧的预测。

1. 预测编码

视频的本质是由一系列连续的视频帧组成,在单个视频帧内部和多个视频帧之间都存在大量的冗余。从空间的角度看,单个视频帧内部的像素点之间的像素值相差很小。从时间的角度看,两个连续的视频帧之间也有很多相同的像素点。预测编码就是基于图像统计特性进行数据压缩的一种方法,利用了图像在时间和空间上的相关性,通过已经重建的像素数据预测当前正在编码的像素。预测编码又可分为帧内预测和帧间预测:
在这里插入图片描述

1.1 帧内预测

帧内预测是指用于预测的像素和当前正在编码的像素都在同一个视频帧内,并且一般都在邻近的区域内。由于邻近的像素之间有很强的相关性,像素值一般都非常接近,发生突变的概率非常小,差值都是0或者非常小的数。所以,帧内预测编码后传输的是预测值和真实值之间的差值,即0附近的值,叫做预测误差或残差,这样就用较少的比特传输,达到压缩的效果。
H.265帧内预测编码以块为单位,使用相邻已经重建的块的重建值对正在编码的块进行预测。预测分量分为亮度和色度两个,对应的预测块分别是亮度预测块和色度预测块。为了适应高清视频的内容特征,提高预测精度,H.265采用了更加丰富的预测块尺寸和预测模式。
H.265亮度预测块的尺寸在44到3232之间,所有尺寸的预测块都有35种预测模式,这些预测模式可以分为3类:平面(Planar)模式、直流(DC)模式和角度(Angular)模式。
1.Planar模式:亮度模式0,适用于像素值变换缓慢的区域,例如像素渐变的场景。对预测块中的每个像素都使用不同的预测值。预测值等于:该像素在水平和垂直两个方向线性插值的平均值。
2.DC模式:亮度模式1,适用于图像的大面积平坦区域,该模式对预测块中的所有像素都使用相同的预测值。 如果预测块是正方形,预测值等于左边和上边的参考像素的平均值;如果预测块是长方形,预测值等于长的那一边的平均值。
3.角度模式:亮度模式2~34,总共33个预测方向,其中模式10是水平方向,模式26是垂直方向。角度模式每个像素的预测值都是从对应预测方向前已经重建的像素集的样值进行水平或垂直方向偏移角度预测。
由于彩色视频中,相同位置的色度信号和亮度信号的特征类似,因此色度预测块和亮度预测块的预测模式也类似。H.265中色度预测块的预测模式有Planar模式、垂直模式、水平模式、DC模式和导出模式5种:
1.Planar模式:色度模式0,和亮度模式0一样。
2.垂直模式:色度模式1,和亮度模式26一样。
3.水平模式:色度模式2,和亮度模式10一样。
4.DC模式:色度模式3,和亮度模式1一样。
5.导出模式:色度模式4,采用和对应亮度预测块相同的预测模式。如果对应的亮度预测块模式是0、1、10、26中的一种,则替换为模式34。
帧内预测流程图如下,由于是简述,具体细节不多说了:
在这里插入图片描述

1.2 帧间预测

帧间预测是指用于预测的像素和当前正在编码的像素不在同一个视频帧内,但是一般在相邻或附近的位置。一般情况下,帧间预测编码的压缩效果要比帧内预测好,主要原因是视频帧之间的相关性非常强。如果视频帧中的运动物体变化速度很慢,那么视频帧之间的像素差值也就很小,时间冗余度就非常大。
帧间预测评估运动物体运动状况的方法是运动估计,它的主要思想就是对预测块从参考帧的给定范围中搜索匹配块,计算匹配块和预测块之间的相对位移,该相对位移就是运动矢量。得到运动矢量后,需要对预测修正,也就是运动补偿。将运动矢量输入到运动补偿模块,"补偿"参考帧,即可得到当前编码帧的预测帧。预测帧和当前帧的差,就是帧间预测误差。
如果帧间预测只用到了前一帧图像,就称为前向帧间预测或单向预测。该预测帧也就是P帧,P帧可以参考前面的I帧或者P帧。
如果帧间预测不仅用到了前一帧图像预测当前块,还用到了后一帧图像,那么就是双向预测。该预测帧也就是B帧,B帧可以参考前面的I帧或P帧和后面的P帧。
由于P帧需要参考前面的I帧或P帧,而B帧需要参考前面I帧或P帧和后面的P帧,如果在一个视频流中,先到了B帧,而依赖的I帧、P帧还没有到,那么该B帧还不能立即解码,那么应该怎么保证播放顺序呢?其实,在视频编码时,会生成PTS和DTS。通常情况下,编码器在生成一个I帧后,会向后跳过几个帧,用前面的I帧作为参考帧对P帧编码,I帧和P帧之间的帧被编码为B帧。推流的视频帧顺序在编码的时候就已经按照I帧、P帧、B帧的依赖顺序编好了,收到数据后直接解码即可。所以,不可能先收到B帧,再收到依赖的I帧和P帧。
PTS:Presentation Time Stamp,显示时间戳,告诉播放器在什么时间显示这一帧。
DTS:Decoding Time Stamp,解码时间戳,告诉播放器在什么时间解码这一帧。
帧间预测流程图如下:
在这里插入图片描述
整体来说,预测编码的输入输入输出如下:
在这里插入图片描述

2. 变换编码

变换编码是指将图像中的空间域信号映射变换到频域(频率域),然后对生成的变换系数编码。由于在空间域中,数据之间的相关性比较大,经过预测编码后的残差变化较小,存在大量的数据冗余,在图像中亮度值变化缓慢的平坦区域特别明显。而变换为频域后,会将空间域分散分布的残差数据转换成集中分布,可以降低相关性,减少数据冗余,从而达到去除空间冗余的目的。
在H.265中,一个编码块(CB)可以通过四叉树划分成若干个预测块(PB)和变换块(TB)。由于从 CB 到 TB 之间的四叉树划分主要是为了残差的变换运算,因此这种四叉树又称为残差四叉树(RQT)。如下图所示,就是一个 RQT 划分实例,将一个 3232 的残差 CB 划分成13个不同大小的 TB 。在这里插入图片描述
每个 TB 的大小有四种,分别是从 4
4、88、1616、3232,每个 TB 都对应一个整数变换系数矩阵。大尺寸的 TB 适用于图像亮度值变化缓慢的平坦区域,小尺寸的 TB 适用于图像亮度值变化剧烈的复杂区域。所有尺寸都可以使用离散余弦变换(DCT)变换。另外,对于 44 的帧内预测亮度残差块,还可以使用离散正弦变换(DST)。

由于帧内预测编码是基于左边和上边已经编码块的数据,因此预测块距离已编码块越近,相关性越强,预测误差越小;距离已编码块越远,相关性越小,预测误差越大。预测误差的这种数据分布特征和 DST 的正弦基函数 sin 非常相似,起始点最小,然后逐渐变大。但是因为 DST 计算量比 DCT 大,需要增加更多的变换类型标识,因此 DST 仅用于 4*4的帧内预测亮度残差块。

2.1 量化

由于变换编码只是将图像数据从空间域矩阵转换为频域的变换系数矩阵,矩阵的系数个数和数据量都没有减少。要想压缩数据,还需要对频域中的统计特征进行量化和熵编码。
常见的量化方法可以分为**标量量化(SQ)和矢量量化(VQ)**两类:
1.标量量化:将图像中的数据划分成若干个区间,然后在每个区间用一个值代表这个区间内所有样点的取值。
2.矢量量化:将图像中的数据划分成若干个区间,然后在每个区间用一个代表矢量代表这个区间的所有矢量取值。
由于矢量量化引入了多个像素之间的关联,并且使用了概率的方法,一般压缩率比标量量化高。但是由于其计算复杂度高,所以目前广泛使用的量化方法是标量量。
编码端的量化过程可以简单理解为是每个 DCT 变换系数除以量化步长得到量化值。在解码端对应的反量化过程就是量化值乘以量化步长得到 DCT 变化系数值。

3. 统计编码(熵编码)

熵编码是指在编码过程中按熵原理不丢失任何信息的编码。量化是一种有损的压缩方式,而熵编码是用更紧凑的方式标记和原数据之间的映射关系,属于无损压缩。常见的熵编码有香农(Shannon)编码、哈夫曼(Huffman)编码、算术(Arithmetic)编码、游程编码等。

3.1 哈夫曼编码

哈夫曼编码是一种变长编码,即不同字符的编码长度是变化的。该编码利用字符出现的概率构造哈夫曼二叉树,目标是让出现概率大的字符编码时用短码(距离根节点近),概率小的字符编码时用长码(距离根节点远),从而让平均码字长度最短。

3.2 算数编码

虽然哈夫曼编码在理论上可以获得最佳编码结果,但是在实际编码中,由于计算机处理的最小数据单位是1bit,对于包含小数点的码字长度只能按照整数处理,所以实际编码效果往往略逊于理论编码效果。在图像压缩领域,通常使用算术编码代替哈夫曼编码。不过,算术编码的理论基础和哈夫曼编码是一致的,都是概率大的字符用短码,概率小的字符用长码。
算术编码分为固定模式算术编码、自适应算术编码(AAC)、二进制算术编码、自适应二进制算术编码(CABAC)等,H.265 中使用了 CABAC 。此处将只介绍固定模式算术编码流程:
1.统计输入的符号序列中各个字符和出现的概率;
2.按照概率分布,将[0, 1)区间划分成多个子区间,每个子区间代表一个字符,子区间的大小代表字符出现的概率;所有子区间大小的和等于1;假设该字符的区间范围为 [L, H);
3.设置初始变量low=0, high=1,不断读取符号序列中的每个字符,找到该字符对应的区间范围 [L, H),更新low和high的值:
low = low + (high - low) * L
high = low + (high - low) * H
4.遍历完符号序列后,得到最终的low和high,转换二进制形式输出得到编码数据。

4. 其他技术

4.1 环路滤波

由于 H.265 采用分块编码,在图像反量化、反变换重建的时候,会存在一些失真效应,例如块效应、振铃效应。为了解决这些问题,H.265 采用了环路滤波技术,其中包括去方块滤波(DBF)和样点自适应补偿(SAO)。
DBF 作用于边界像素,用于解决块效应。块效应是指一些相邻编码块边界处的灰度值存在明显的不连续性,产生块效应主要有两个原因:
编码器对残差的DCT变换和量化是基于块的,忽略了块与块之间的相关性,导致块之间的处理不一致;
帧间预测运动补偿块的不完全匹配,存在误差;而编码时的预测参考帧通常来自这些重建图像,导致待预测图像失真;
DBF 针对边界类型采用强滤波、弱滤波或者不处理,边界类型的判定是由边界像素梯度阈值和边界块的量化参数决定的。DBF 处理时,先对整个图像的垂直边缘进行水平滤波,然后对水平边缘进行垂直滤波。滤波过程实际上就是对像素值进行修正的过程,让方块看起来不那么明显。H.264 中也存在 DBF 技术,但是应用于 44 大小的处理块,而 H.265 中应用于 88 大小的处理块。
SAO 是 H.265 新引入的对重建图像的误差补偿机制,用于改善振铃效应。振铃效应是指图像的灰度值剧烈变化产生的震荡,产生振铃效应主要原因是DCT变换后高频信息丢失。SAO 的原理就是通过对重构曲线的波峰像素添加负值补偿,波谷添加正值补偿,从而减小高频信息的失真。和 DBF 只作用于边界像素不同,SAO 作用于块中所有的像素。

补充理解

CU编码时,会根据RD选择最优的PU划分模式和帧内预测模式:
在这里插入图片描述
SATD (s, p)是原始PB块s与预测PB块p从mode的绝对转换差的和
SSD (s, c)表示s与重构块之间误差的平方和
Rtmode表示编码当前模式所需的比特率
Rtall是编码所有信息所需的总比特率(分区模式,预测模式数,残差系数)
先用(4)预选几个可能的最佳模式,然后用(5)选择最优模式

H.266/VVC视频编码

1. 帧内预测

在帧内预测方面,VVC 支持67种帧内预测模式(这个数字在HEVC中是35)并对非方形块的角度预测方向做了调整,预测像素插值采用两类四抽头插值滤波器(HEVC中的是低精度的线性差值)。基于位置的预测组合(Position Dependent intra Prediction Combination, PDPC)技术将滤波前后的预测信号合并在一起以进一步提高帧内预测精度。多参考行帧内预测技术不仅可以利用最近相邻的重建像素值,还可以采用更远的重建像素值进行帧内预测。基于矩阵的帧内预测技术中利用了矩阵向量的乘法来进行帧内预测。跨分量线性模型帧内预测技术利用亮度图像分量的像素值来预测同一图像中色度分量的像素值。在子分块模式中,一个亮度编码单元的不同子块采用相同的编码模式信息。

2. 帧间预测

在帧间预测方面,VVC 继承了HEVC的基于整个编码单元的运动矢量差值(Motion Vector Difference, MMVD)编码及运动信息继承模式,即:AMVP (Adaptive Motion Vector Prediction) 和Skip/Merge模式,并分别做了扩展。对AMVP模式,VVC引入了块级的自适应运动矢量精度,以及对称编码模式(Symmetric Motion Vector Differences Signalling)用于双向预测但只需要编码其中一个参考图像的MVD。对于Skip/Merge模式,VVC引入基于历史信息的运动矢量预测(HMVP, History-based Motion Vector Prediction)和配对平均运动矢量预测(pair-wise average merge candidate)。除了上述基于整个编码单元的运动矢量编码/继承之外,VVC还引入了基于子块的时域运动推导模式(Subblock-based Temporal Motion Vector Prediction, SbTMVP),即当前编码单元分为大小相同的子块(8×8亮度子块),每个子块的运动矢量单独进行推导。VVC还引进一个仿射运动模型来更精确地表示像缩放和旋转这样的高阶运动从而提高运动信息的编码效率。运动矢量的精度从HEVC中的1/4亮度像素提高到了1/16亮度像素。此外,VVC还引入多个新的帧间预测编码工具,如:将AMVP和merge模式结合起来的合并模式(Merge mode with MVD, MMVD),通过对 merge 模式增加额外的运动矢量差值得到了进一步提高;几何分块模式的分块结果可以更加切合视频内容中的实体对象边界的运动轨迹;帧间预测和帧内预测合并在一起的预测模式可以同时减少时域冗余和空域冗余以取得更高的压缩性能。VVC的另一个重要改进是引入解码端运动细化和双向光流这两个工具,在不增加码率开销的情况下进一步提升运动补偿效率。

3. 变换和量化

在变换方面,VVC引入了非正方形变换、多变换(主变换)选择、低频不可分变换和子块变换。VCC另外,VVC 中的最大变换维度提高到了64×64(HEVC中是32×32)。非正方形变换用于对非正方形的分块进行变换操作。这种变换在水平方向和垂直方向使用不同长度的变换内核。有了多变换选择,编码器可以从一组预定义的整数正弦、余弦、跳过变换并在码流中标明所用变换。低频不可分变换对帧内预测残差的主变换结果中的低频分量进行再进行二次变换,以更好地利用编码块内容的方向性进一步提高压缩性能。子块变换用于当对一个帧间预测残差块的一部分进行编码而其它部分的值全部设为零的时候。
VVC在量化方面引入了三个新编码工具:自适应色度量化参数偏差,依赖量化和量化残差联合编码。采用自适应色度量化参数偏差这个工具时,对于特定的量化组,色度量化参数不直接编码,而是通过亮度量化参数和预定义并传输的查找表推导得出。在依赖量化中,一个变换系数的重建值范围依赖于扫描顺序在它前面的几个变换系数的重建值,从而减少输入向量和最接近的重建向量之间的平均失真。量化残差联合编码指的是对两个色度分量的残差一起编码,而不是分别编码,这样当两个色度分量的残差相似时编码效率会更高。

4. 熵编码

与HEVC相同,VVC采用的熵编码也是上下文自适应的二进制算术编码(Context-Adaptive Binary Arithmetic Coding, CABAC),但是在CABAC引擎和变换系数编码两方面做了改进。在CABAC引擎方面的改进是多重假设概率更新模型和上下文模型绑定的自适应率(即概率更新速度依赖于上下文模型),其中采用了和每个上下文模型耦合的两个概率估计P0和P1,而P0和P1相互独立地根据各自的自适应率进行更新。用于二进制算术编码器中进行区间细分的概率估计P设为P0和P1的均值。在变换系数编码两方面,除了4×4的系数组之外,VVC还允许1×16、16×1、2×8、8×2、2×4和 4×2这六种系数组。此外,还增加了一个标志位用于依赖量化的状态过渡,以及一个改进的概率模型选择机制用于和变换系数绝对值相关的语法元素的编码。

5. 环路滤波

除了支持HEVC中也有的去块效应滤波器(Deblocking Filter, DBF)和样本自适应偏差(Sample Adaptive Offset, SAO)外,VVC还支持带色度缩放的亮度映射(Luma Mapping with Chroma Scaling, LMCS)和自适应环路滤波器(adaptive loop filter, ALF)。在DBF方便增加了更长的滤波器和一个专门为高动态视频设计的亮度自适应滤波模式。SAO与HEVC相同。编码器可以利用LMCS在编码前分段线性地改变输入视频信号幅度分布的动态范围从而提高编码效率,在解码端逆向复原。VVC中的ALF包括两种模式:1)亮度和色度样本基于块的ALF; 2)色度样本夸分量自适应滤波器(Cross-Component Adaptive Loop Filter, CC-ALF)。在ALF中,亮度和色度分别采用7×7和5×5的菱形滤波器;对于每个4×4块,根据其方向性和梯度活动性分成25类和4个转置状态的一种,从所传递的多组滤波器中选择一个采用。CC-ALF采用一个菱形线性高通滤波器利用ALF滤波后的亮度样本来进一步细化色度样本。

6. 屏幕内容编码

VVC保留了HEVC中的基于块的差分脉冲编码调制,但仅限于帧内预测的编码单元。变换跳过残差编码在HEVC基础上作了以下改进:1) 第一个非零值的位置不再编码,扫描方向改为相反方向;2) 利用上下文模型提高了正负号指示的编码效率;3) 绝对值的编码改进。也保留了帧内块拷贝(Intra Block Copy, IBC)和调色板模式这两个在HEVC中就有的工具并做了改进。在HEVC中,IBC被定义为一种帧间预测模式,其参考帧是当前帧本身并且运动向量必须指向当前帧已解码且未进行环路滤波的区域。在VVC中,IBC与帧间预测解耦,并对参考缓冲的管理相对于HEVC进行了简化,参考样本存储在一个局部的小缓冲器中。调色板的编码方式在VVC中取决于亮度色度是否使用单个编码树。如果使用单个编码树,三个色度分量的调色板联合在一起编码;否则亮度和色度调色板分开编码。对于采用调色板的编码单元,个别像素还可以不使用用调色板中的内容,而是直接编码其量化值。最后,VVC中的自适应颜色变换这个屏幕内容编码工具与HEVC中相同,未作改进。

7. 360度视频编码

360度视频是在2014、2015年左右逐渐开始流行起来的,而HEVC的第一版是在2013年年初定稿的,所以VVC顺利成章地成为第一个包含360度视频编码工具的国际视频编码标准。由于传统视频编码技术基本上都使用于360度视频编码,VVC中包含的360度视频“压缩”工具只有两个,更多的对360度视频的支持是在系统和传输接口的设计中(见本文下节)。VVC中的一个360度视频“压缩”工具叫做运动矢量环绕,就是当运动矢量指向图像右(左)边界之外的位置时,运动补偿中实际用的参考像素是图像左(右)边界内的像素(或通过插值滤波得到的子像素)。这是因为360度视频中常用的一种叫做等矩形映射(Equirectangular Projection, ERP)图像的左右边界实际上是物理世界的球形表面的连续位置,类似于世界地图的左右边界实际上是地球上的连接南北极的同一条经线。所以这样的运动矢量环绕可以提高采用ERP的360度视频的编码效率。另外一个360度视频“压缩”工具叫做环路滤波虚拟边界;如果采用,则环路滤波的适用效果不会夸过图像中某些水平或垂直线(这些线就是这里说的所谓的虚拟边界)。这个工具适用于360度视频中常用的另一种映射,叫做立方体贴图映射(Cube Map Projection, CMP)。参考文献 [13] 中包含详细的360度视频以及ERP和CMP的介绍。

部分资料参考:https://mp.weixin.qq.com/s/tQo3_EffwUNOpH4DnobFzg
https://juejin.cn/post/6940078108787769357

猜你喜欢

转载自blog.csdn.net/qq_39969848/article/details/129020948