VVC视频编码笔记

2023-10-30 22:59
文章标签 视频 笔记 编码 vvc

本文主要是介绍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视频编码笔记的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/311133

相关文章

解决IDEA报错:编码GBK的不可映射字符问题

《解决IDEA报错:编码GBK的不可映射字符问题》:本文主要介绍解决IDEA报错:编码GBK的不可映射字符问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录IDEA报错:编码GBK的不可映射字符终端软件问题描述原因分析解决方案方法1:将命令改为方法2:右下jav

利用Python快速搭建Markdown笔记发布系统

《利用Python快速搭建Markdown笔记发布系统》这篇文章主要为大家详细介绍了使用Python生态的成熟工具,在30分钟内搭建一个支持Markdown渲染、分类标签、全文搜索的私有化知识发布系统... 目录引言:为什么要自建知识博客一、技术选型:极简主义开发栈二、系统架构设计三、核心代码实现(分步解析

基于Python和MoviePy实现照片管理和视频合成工具

《基于Python和MoviePy实现照片管理和视频合成工具》在这篇博客中,我们将详细剖析一个基于Python的图形界面应用程序,该程序使用wxPython构建用户界面,并结合MoviePy、Pill... 目录引言项目概述代码结构分析1. 导入和依赖2. 主类:PhotoManager初始化方法:__in

Python使用自带的base64库进行base64编码和解码

《Python使用自带的base64库进行base64编码和解码》在Python中,处理数据的编码和解码是数据传输和存储中非常普遍的需求,其中,Base64是一种常用的编码方案,本文我将详细介绍如何使... 目录引言使用python的base64库进行编码和解码编码函数解码函数Base64编码的应用场景注意

用js控制视频播放进度基本示例代码

《用js控制视频播放进度基本示例代码》写前端的时候,很多的时候是需要支持要网页视频播放的功能,下面这篇文章主要给大家介绍了关于用js控制视频播放进度的相关资料,文中通过代码介绍的非常详细,需要的朋友可... 目录前言html部分:JavaScript部分:注意:总结前言在javascript中控制视频播放

Python基于wxPython和FFmpeg开发一个视频标签工具

《Python基于wxPython和FFmpeg开发一个视频标签工具》在当今数字媒体时代,视频内容的管理和标记变得越来越重要,无论是研究人员需要对实验视频进行时间点标记,还是个人用户希望对家庭视频进行... 目录引言1. 应用概述2. 技术栈分析2.1 核心库和模块2.2 wxpython作为GUI选择的优

VSCode中C/C++编码乱码问题的两种解决方法

《VSCode中C/C++编码乱码问题的两种解决方法》在中国地区,Windows系统中的cmd和PowerShell默认编码是GBK,但VSCode默认使用UTF-8编码,这种编码不一致会导致在VSC... 目录问题方法一:通过 Code Runner 插件调整编码配置步骤方法二:在 PowerShell

Python如何实现读取csv文件时忽略文件的编码格式

《Python如何实现读取csv文件时忽略文件的编码格式》我们再日常读取csv文件的时候经常会发现csv文件的格式有多种,所以这篇文章为大家介绍了Python如何实现读取csv文件时忽略文件的编码格式... 目录1、背景介绍2、库的安装3、核心代码4、完整代码1、背景介绍我们再日常读取csv文件的时候经常

Java如何获取视频文件的视频时长

《Java如何获取视频文件的视频时长》文章介绍了如何使用Java获取视频文件的视频时长,包括导入maven依赖和代码案例,同时,也讨论了在运行过程中遇到的SLF4J加载问题,并给出了解决方案... 目录Java获取视频文件的视频时长1、导入maven依赖2、代码案例3、SLF4J: Failed to lo

Python实现多路视频多窗口播放功能

《Python实现多路视频多窗口播放功能》这篇文章主要为大家详细介绍了Python实现多路视频多窗口播放功能的相关知识,文中的示例代码讲解详细,有需要的小伙伴可以跟随小编一起学习一下... 目录一、python实现多路视频播放功能二、代码实现三、打包代码实现总结一、python实现多路视频播放功能服务端开