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

相关文章

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实现多路视频播放功能服务端开

Python实现视频转换为音频的方法详解

《Python实现视频转换为音频的方法详解》这篇文章主要为大家详细Python如何将视频转换为音频并将音频文件保存到特定文件夹下,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. python需求的任务2. Python代码的实现3. 代码修改的位置4. 运行结果5. 注意事项

Python视频处理库VidGear使用小结

《Python视频处理库VidGear使用小结》VidGear是一个高性能的Python视频处理库,本文主要介绍了Python视频处理库VidGear使用小结,文中通过示例代码介绍的非常详细,对大家的... 目录一、VidGear的安装二、VidGear的主要功能三、VidGear的使用示例四、VidGea

流媒体平台/视频监控/安防视频汇聚EasyCVR播放暂停后视频画面黑屏是什么原因?

视频智能分析/视频监控/安防监控综合管理系统EasyCVR视频汇聚融合平台,是TSINGSEE青犀视频垂直深耕音视频流媒体技术、AI智能技术领域的杰出成果。该平台以其强大的视频处理、汇聚与融合能力,在构建全栈视频监控系统中展现出了独特的优势。视频监控管理系统EasyCVR平台内置了强大的视频解码、转码、压缩等技术,能够处理多种视频流格式,并以多种格式(RTMP、RTSP、HTTP-FLV、WebS

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

C++ | Leetcode C++题解之第393题UTF-8编码验证

题目: 题解: class Solution {public:static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num &