本文主要是介绍VVC视频编码笔记,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
目录
1. 划分模式
1.1 划分模式的种类
1.2 划分模式的约束条件(不全面且仅针对亮度块)
1.2.1 四叉树划分模式
1.2.2 二叉树水平划分模式
1.2.3 二叉树垂直划分模式
1.2.4 三叉树水平划分模式
1.2.5 三叉树垂直划分模式
1.3 划分模式的选择
2. 编码流程
2.1 编码框架
2.1.1 分区
2.1.2 帧内预测(有损)
2.1.3 帧间预测(一般是无损的)
2.1.3.1 运动估计
2.2.3.2 运动补偿
2.1.4 变换
2.1.5 量化(有损):视频编码产生失真的根本原因
2.1.6 熵编码(无损)
2.1.7 比特流格式
2.1.8 环路滤波(解码阶段)
2.2 编码压缩
3. 碎片
3.1 图像时域依赖关系
3.2 IRAP
3.3 前置图像:RADL和RASL
3.4 帧内随机接入点(IRAP):IDR和CRA
3.5 DTS、PTS:
3.6 GOP
4 帧类型:I帧、B帧、P帧
4.1 I帧(关键帧、帧内帧)
4.2 P帧(前向预测帧)与I帧相似度70%以上编码为P帧
4.3 B帧(双向参考帧)与I帧相似度95%以上编码为B帧
5 率失真函数
部分内容来自于
作者:关键帧Keyframe
链接:视频编码(1):可能是最详尽的 H.264 编码相关概念介绍_牛客网
来源:牛客网
1. 划分模式
1.1 划分模式的种类
在VVC中划分模式一共有六种,不划分(NS)、四叉树划分(QT)、二叉树水平划分(BTH)、二叉树垂直划分(BTV)、三叉树水平划分(TTH)和三叉树垂直划分(TTV)。
1.2 划分模式的约束条件(不全面且仅针对亮度块)
1.2.1 四叉树划分模式
16 ≤ W ≤ 128 && 16 ≤ H ≤ 128 时可进行四叉树划分
父CU为二叉树或三叉树划分模式,则当前CU不进行四叉树划分
1.2.2 二叉树水平划分模式
W ≤ 32 && 4 < H ≤ 32 时可进行二叉树水平划分
父CU为三叉树水平划分,则当前CU不进行二叉树水平划分
1.2.3 二叉树垂直划分模式
4 < W ≤ 32 && H ≤ 32 时可进行二叉树垂直划分
父CU为三叉树垂直划分,则当前CU不进行二叉树垂直划分
1.2.4 三叉树水平划分模式
W ≤ 32 && 8 < H ≤ 32 时可进行三叉树水平划分
1.2.5 三叉树垂直划分模式
8 < W ≤ 32 && H ≤ 32 时可进行三叉树垂直划分
1.3 划分模式的选择
划分模式的选择顺序是:四叉树划分、二叉树水平划分、二叉树垂直划分、三叉树水平划分和三叉树垂直划分
在VVC中划分模式的选择是一个递归的过程,自上而下划分、自下而上比较,每次只针对一层中的一个CU块(深度优先)
①采用四叉树划分模式自上而下进行划分(第0层-第4层),达到最底层(第4层)时计算第4层4个块划分模式的率失真代价和,与第3层划分模式的率失真代价进行比较,记录第3层CU率失真代价最小的划分模式;
②采用二叉树水平划分模式划分第3层CU,计算第4层2个块划分模式的率失真代价和,与第3层划分模式的率失真代价进行比较,记录第三层CU率失真代价最小的划分模式;
③采用二叉树垂直划分模式划分第3层CU,计算第4层2个块划分模式的率失真代价和,与第3层划分模式的率失真代价进行比较,记录第三层CU率失真代价最小的划分模式;
④采用三叉树水平划分模式划分第3层CU,计算第4层3个块划分模式的率失真代价和,与第3层划分模式的率失真代价进行比较,记录第三层CU率失真代价最小的划分模式;
⑤采用三叉树垂直划分模式划分第3层CU,计算第4层3个块划分模式的率失真代价和,与第3层划分模式的率失真代价进行比较,记录第三层CU率失真代价最小的划分模式,此时的划分模式是第3层该CU的最佳划分模式;
根据步骤①到⑤确定第3层4个CU的最佳划分模式,并与第2层对应CU的率失真代价进行比较,记录第2层CU率失真代价最小的划分模式,然后按照步骤②到⑤对第二层的所有CU进行划分、计算和比较,直到比较出第0层的最佳划分模式,从而得到CTU的最佳划分模式。
2. 编码流程
2.1 编码框架
在进行当前信号编码时,编码器首先会产生对当前信号做预测的信号,称作预测信号(Predicted Signal),预测的方式可以是时间上的帧间预测(Inter Prediction),亦即使用先前帧的信号做预测,或是空间上的帧内预测(Intra Prediction),亦即使用同一张帧之中相邻像素的信号做预测。得到预测信号后,编码器会将当前信号与预测信号相减得到残差信号(Residual Signal),并只对残差信号进行编码,如此一来,可以去除一部分时间上或是空间上的冗余信息。接着,编码器并不会直接对残差信号进行编码,而是先将残差信号经过变换(通常为离散余弦变换)然后量化以进一步去除空间上和感知上的冗余信息。量化后得到的量化系数会再透过熵编码,去除统计上的冗余信息
2.1.1 分区
编码单元划分结构:CTU和CTB,一个CTU由一个亮度CTB和两个色度CTB组成,编码以CTU为单位。
VVC利用四叉树、二叉树和三叉树将CTU递归划分成多个CU,CU是视频编码的基本单位。
将帧分区,在移动和纹理复杂部分使用小的分区,在静态背景和纹理平坦区域使用大的分区,可以更精确的处理预测。
在VVC中有六种分区方式不划分、四叉树划分、二叉树水平划分、二叉树垂直划分、三叉树水平划分和三叉树垂直划分,大小从128×128到4×4
2.1.2 帧内预测(有损)
去除图像空间冗余,通过编码后的重建信息来预测当前像素块以去除空间冗余信息。
多参考行帧内预测、更多的角度模式等
帧内预测:预测方向和残差,去除空间冗余
2.1.3 帧间预测(一般是无损的)
去除视频的时间冗余,将已编码的图像作为当前帧的参考图像,获取编码块的预测值。
带有运动矢量差的Merge、几何划分帧间预测、放射运动补偿预测、联合帧内帧间预测等。
帧间预测:运动向量和残差,去除时间冗余
2.1.3.1 运动估计
运动估计是寻找当前编码的块在已编码的图像(参考帧)中的最佳对应块,并且计算出对应块的偏移(运动矢量)。
2.2.3.2 运动补偿
运动补偿是根据运动矢量和帧间预测方法,求得当前帧的估计值过程。其实就是将运动矢量参数贴到参考帧上获取当前帧。另外运动补偿是一个过程
2.1.4 变换
去除空间冗余,把以空间域像素形式描述的图像转换至变换域,以变换系数的形式表示。使得在比较平坦和内容变化缓慢的区域, 能量集中在低频区域。
绝大多数图像都有一个共同的特征:平坦区域和内容缓慢变化区域占据一幅图像的大部分,而细节区域和内容突变区域则占小部分。也可以说,图像中直流和低频区占大部分,高频区占小部分,所以将图像转换成频率系数,并丢掉高频系数,就能减少描述图像所需的数据量,而不会牺牲太多的图像质量。这样,空间域的图像变换到频域或所谓的变换域,会产生相关性很小的一些变换系数,并可对其进行压缩编码,即所谓的变换编码。
离散余弦变换(DCT)、多核变换、二次变换等
2.1.5 量化(有损):视频编码产生失真的根本原因
把变换系数(不变换时为残差)进行多对一映射,减小变换系数的范围,减少信号取值空间有。量化过程根据图像的动态范围大小确定量化参数,既保留图像必要的细节,又减少码流。
2.1.6 熵编码(无损)
把编码控制数据、量化变换系数、帧内预测数据、帧间预测数据编码成二进制码流,从而进行传输和存储。熵编码模块输出的数据就是原始视频编码之后的码流。
熵的大小与信源的概率模型有着密切的关系,各个符号出现的概率不同,信源的熵也不同。当信源中各事件是等概率分布时,熵具有极大值。信源的熵与其可能达到的最大值之间的差值反映了该信源所含有的冗余度。信源的冗余度越小,即每个符号所独立携带的信息量越大,那么传送相同的信息量所需要的序列长度越短,符号位越少。因此,数据压缩的一个基本的途径是去除信源的符号之间的相关性,尽可能地使序列成为无记忆的,即前一符号的出现不影响以后任何一个符号出现的概率。
利用信源的统计特性进行码率压缩的编码就称为熵编码,也叫统计编码。熵编码是无损压缩编码方法,它生成的码流可以经解码无失真地恢复出原数据。熵编码是建立在随机过程的统计特性基础上的。
上下文自适应的变长编码(哈夫曼编码)、上下文自适应的二进制算术编码
2.1.7 比特流格式
将压缩过的帧和内容打包进去。需要明确告知解码器编码定义,如颜色深度,颜色空间,分辨率,预测信息(运动向量,帧内预测方向),档次(Profile),级别(Level),帧率,帧类型,帧号等等。
档次:规定编码器可以采用哪些编码工具或算法
级别:根据解码端的负载和存储空间情况对关键参数(比如最大采样频率、最大图像尺寸、分辨率、最小压缩率、最大比特率和解码缓冲区大小)加以限制
2.1.8 环路滤波(解码阶段)
去方块滤波(方块效应)、像素自适应补偿(响铃效应)、自适应环路滤波(减小解码误差)、亮度映射和色度缩放(给动态范围内的信息重新分配码字,提高压缩效率)
2.2 编码压缩
编码压缩分为帧内压缩(空间压缩)和帧间压缩(时间压缩),帧内压缩是生成I帧的算法,帧间压缩是生成P帧和B帧的算法。帧内压缩是有损的,帧间压缩一般是无损的。
编码压缩的步骤大致如下:
- 分组,也就是将一系列变换不大的图像归为一个组,也就是一个序列,也就是 GOP;
- 定义帧,将每组的图像帧归分为 I 帧、P 帧和 B 帧三种类型;
- 预测帧,以 I 帧做为基础帧,以 I 帧预测 P 帧,再由 I 帧和 P 帧预测 B 帧;
- 数据传输,最后将 I 帧数据与预测的差值信息进行存储和传输。
3. 碎片
3.1 图像时域依赖关系
解码顺序:1,2,3,4,5,6,7,8,9
播放顺序:1,4,3,5,2,8,7,9,6
3.2 IRAP
IRAP(Intra Random Access Point)帧内随机接入点:播放顺序在IRAP后的图像可以独立正确解码,无需参考IRAP前面的视频信息。
IRAP后的第一幅解码图像被称为IRAP图像
解码顺序在IRAP图像之后,播放顺序在其之前的图像称为该IRAP图像的前置(leading)图像,比如5是2的前置图像;
播放顺序在IRAP图像之后(解码必在之后)的图像称为该IRAP图像的后置(Trailing)图像,比如8是2的后置图像。
3.3 前置图像:RADL和RASL
RADL(Random Access Decodable Leading)随机接入可解码前置图像:从IRAP接入以后可以正确解码,不依赖IRAP之前的码流信息,如5是2的随机接入可解码前置图像
RASL(Random Access Skipped Leanding)随机接入跳过前置图像:从IRAP接入以后不能正确解码,依赖IRAP之前的码流信息,如3是2的随机接入跳过前置图像
3.4 帧内随机接入点(IRAP):IDR和CRA
IDR(Instantaneous Decoding Refresh)及时解码刷新图像:前置图像必须是RADL图像,即IDR图像及其后续的码流可以不依赖该IDR图像之前的视频流信息进行独立解码,错误不会传播
IDR1 P2 B3 B4 P5 B6 B7 I8 B9 B10 P11 B12 B13 P14 B15 B16
这里的 B8 可以跨过 I8 去参考 P7。
IDR1 P2 B3 B4 P5 B6 B7 IDR8 B9 B10 P11 B12 B13 P14 B15 B16
这里的 B9 就不可以参考 IDR8 前面的帧。
CRA(Clean Random Access)完全随机接入图像:允许前置图像是RASL图像,允许依赖CRA之前的码流,从CRA图像接入时,RASL图像不能正常解码
IDR必是I帧,I帧可以是IDR和CRA。视频开头的 I 帧一定是 IDR 帧;一个封闭类 GOP 的开头的 I 帧也一定是 IDR 帧。
3.5 DTS、PTS
DTS(Decoding Time Stamp):解码时间戳,这个时间戳的意义在于告诉播放器该在什么时候解码这一帧的数据。
PTS(Presentation Time Stamp):显示时间戳,这个时间戳用来告诉播放器该在什么时候显示这一帧的数据。
虽然 DTS、PTS 是用于指导播放端的行为,但它们是在编码的时候由编码器生成的。
当视频流中没有 B 帧时,通常 DTS 和 PTS 的顺序是一致的。但如果有 B 帧时,解码顺序和播放顺序不一致了。
比如一个视频中,帧的显示顺序是:I B B P,现在我们需要在解码 B 帧时知道 P 帧中信息,因此这几帧在视频流中的顺序可能是:I P B B,这时候就体现出每帧都有 DTS 和 PTS 的作用了。DTS 告诉我们该按什么顺序解码这几帧图像,PTS 告诉我们该按什么顺序显示这几帧图像。顺序大概如下:
Stream: I P B BDTS: 1 2 3 4PTS: 1 4 2 3
3.6 GOP
GOP(Group Of Pictures)是图像组,它指的是视频编码序列中两个 I 帧之间的距离。 通常意义上的 GOP 由 I 帧开始,到下一个 I 帧之前的帧结束。严格意义上讲,这个 I 帧是一个 IDR 帧。
H.264 使用的是封闭 GOP(Closed GOP),即在一个 GOP 中所有帧的解码不依赖该 GOP 外的其他帧,除了第一帧必须是 I 帧,其他帧可以是 P 帧或 B 帧。
关键帧的间隔调节会影响 GOP 的长度,进而影响到读取 GOP 的速度,为防止运动变化,一个 GOP 组内帧数不宜取多。
若I帧数据异常,则整个GOP的显示都会有问题,I帧数据丢失则解码会出现马赛克。
GOP太大,则拖动播放(seek)不方便,10s的GOP不能拖动5秒,否则解码有问题,每次seek都要清空解码器;GOP太小,I帧会变多,P帧和B帧变少,码率会上升,一般来说1-2秒设置一个GOP
4 帧类型:I帧、B帧、P帧
4.1 I帧(关键帧、帧内帧)
自带全部信息的独立帧,可以进行独立解码不需要参考其它的图像,是最完整的画面且占用空间最大
I帧都是帧内编码,仅由帧内预测的宏块组成,仅利用本帧图像内的空间相关性
视频序列的第一帧和GOP的第一帧都是I帧
IDR图像都是I帧,I帧可以是IDR图像或者CRA图像
I 帧的特点:
- 它是一个全帧压缩编码帧,将全帧图像信息进行压缩编码及传输;
- 解码时仅用 I 帧的数据就可重构完整图像;
- I 帧描述了图像背景和运动主体的详情;
- I 帧不需要参考其他画面而生成;
- I 帧是 P 帧和 B 帧的参考帧,其质量直接影响到同组中以后各帧的质量;
- 一般地,I 帧是图像组 GOP 的基础帧(第一帧),在一组中只有一个 I 帧;
- I 帧所占数据的信息量比较大。
I帧编码流程:
- 进行帧内预测,决定所采用的帧内预测模式;
- 当前像素值减去预测值,得到残差;
- 对残差进行变换和量化;
- 变长编码和算术编码;
- 重构图像并滤波,得到的图像作为其它帧的参考帧
4.2 P帧(前向预测帧)与I帧相似度70%以上编码为P帧
需要参考前面的I帧或者P帧来进行编码和解码,但压缩率比较高,占用的空间比较小
使用已编码的帧进行运动估计,支持帧内、帧间预测。利用空间和时间上的相关性。
P 帧的预测与重构:P 帧是以 I 帧为参考帧,在 I 帧中找出 P 帧『某点』的预测值和运动矢量,取预测差值和运动矢量一起传送。在接收端根据运动矢量从 I 帧中找出 P 帧『某点』的预测值并与差值相加以得到 P 帧『某点』样值,从而可得到完整的 P 帧。
P 帧特点:
- P 帧是 I 帧后面相隔 1-2 帧的编码帧;
- P 帧采用运动补偿的方法传送它与前面的 I 或 P 帧的差值及运动矢量(预测误差);
- P 帧属于前向预测的帧间编码,它只参考前面最靠近它的 I 帧或 P 帧;
- P 帧可以是其后面 P 帧的参考帧,也可以是其前后的 B 帧的参考帧;
- 由于 P 帧是参考帧,它可能造成解码错误的扩散;
- 由于是差值传送,P 帧的压缩比较高。
P 帧编码的基本流程:
- 进行运动估计,计算采用帧间编码模式的率失真函数值。P 帧只参考前面的帧;
- 进行帧内预测,选取率失真函数值最小的帧内模式与帧间模式比较,确定采用哪种编码模式;
- 计算实际值和预测值的差值;
- 对残差进行变换和量化;
- 若编码,如果是帧间编码模式,编码运动矢量。
4.3 B帧(双向参考帧)与I帧相似度95%以上编码为B帧
需要参考之前的图像帧(I帧或P帧)和之后的图像帧(P帧)进行编码和解码,压缩率最高。但是由于要依赖后面的帧,所以不适合实时传出(比如视频会议等)
B 帧的预测与重构:B 帧以前面的 I 或 P 帧和后面的 P 帧为参考帧,找出 B 帧『某点』的预测值和两个运动矢量,并取预测差值和运动矢量传送。接收端根据运动矢量在两个参考帧中找出预测值并与差值求和,得到 B 帧『某点』样值,从而可得到完整的 B 帧。
B 帧特点:
- B 帧是由前面的 I 或 P 帧和后面的 P 帧来进行预测的;
- B 帧传送的是它与前面的 I 或 P 帧和后面的 P 帧之间的预测误差及运动矢量;
- B 帧是双向预测编码帧;
- B 帧压缩比最高,因为它只反映两参考帧间运动主体的变化情况,预测比较准确;
- B 帧不是参考帧,不会造成解码错误的扩散。
B 帧编码的基本流程:
- 进行运动估计,计算采用帧间编码模式的率失真函数值。B 帧可参考后面的帧;
- 进行帧内预测,选取率失真函数值最小的帧内模式与帧间模式比较,确定采用哪种编码模式;
- 计算实际值和预测值的差值;
- 对残差进行变换和量化;
- 若编码,如果是帧间编码模式,编码运动矢量。
5 率失真函数
有损压缩算法,性能由编码输出的比特率和失真共同决定。
编码的目的:就是在保证一定视频质量的条件下尽量减少编码比特率,或在一定编码比特率限制条件下尽量地减小编码失真。
编码器的工作:根据以上率失真准则找到最佳编码参数。
信息论中率失真概念:在允许一定程度失真的条件下,能够把信源信息压缩到什么程度,即最少需要多少比特数才能描述信源。由此得到率失真函数:R(D) = min I(X, Y)
,它给出了限定失真条件下信息压缩允许的下界。但其在视频编码中难以应用,因为各种概率和条件概率未知,只能作为理论值。
视频编码中的率失真曲线:为了研究视频码率与视频质量的平衡。由于系统性,不能达到理论上的 R(D) 值,只能由不同的编码参数(如 QP 和选择的模式)得到有限的 (R, D) 可操作点,形成凸包络。
视频编码中的率失真优化(RDO) :遍历所有的参数候选模式对视频进行编码,满足码率限制的失真最小的一组参数集作为最优的视频编码参数。每一层级都找出,最终使整体系统性能最优。这里假设了无相关性的独立优化,如相关性较强则共同优化。
更新中。。。
这篇关于VVC视频编码笔记的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!