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 编码压缩

2.3 冗余信息

3. 碎片

3.1 图像时域依赖关系

3.2 IRAP

3.3 前置图像:RADL和RASL

3.4 帧内随机接入点(IRAP):IDR和CRA

3.5 DTS、PTS

3.6 GOP

3.7 运动矢量

3.8 视频的极快、极慢播放和倒放

3.9 Slice(片),可以进行并行编码

3.10 参数集

3.11 NALU(Network Abstraction Layer Units,网络抽象层单元)

4 帧类型:I帧、B帧、P帧

4.1 I帧(关键帧、帧内帧)

4.2 P帧(前向预测帧)与I帧相似度70%以上编码为P帧

4.3 B帧(双向参考帧)与I帧相似度95%以上编码为B帧

5.YUV

5.1 为什么视频编码要用YUV而不是RGB

5.2 YUV和RGB之间的转换

5.3 解码出错时显示绿屏的原因?

5.4 YUV存放格式

5.5 YUV采样表示法

5.6 YUV stride对齐问题

6 率失真函数


视频编码过程中涉及到多个步骤,其中一些是有损的,一些是无损的。

有损的过程包括:

1. 量化(Quantization):量化是将连续或大范围的值映射到较小范围或离散的值的过程。在视频编码中,量化被用来减少数据的大小,但这会导致一些信息的丢失,因此是有损的。

2. 变换编码(Transform coding):如离散余弦变换(DCT)或离散波尔特变换(DWT)等,这些变换的目的是将像素空间的数据转换为频率空间的数据。虽然理论上这些变换是可逆的,但在实际应用中,由于量化和舍入误差,这些变换通常是有损的。

无损的过程包括:

1. 预测(Prediction):视频编码中的帧内预测和帧间预测本质上都是有损的。

帧内预测(Intra-frame prediction)是指在单帧内部进行的预测,它根据已经编码的像素预测未编码的像素。这种预测方法通常涉及到量化过程,量化是一种有损过程,因此帧内预测是有损的。

帧间预测(Inter-frame prediction)是指利用前后帧之间的时间关联性进行预测。这种预测方法通常涉及到运动估计和运动补偿,这两个过程也可能涉及到量化,所以帧间预测也是有损的。

需要注意的是,尽管帧内预测和帧间预测都是有损的,但它们可以大大提高视频编码的效率,降低视频数据的冗余度,因此在实际的视频编码中被广泛应用。

2. 熵编码(Entropy coding):熵编码,如哈夫曼编码(Huffman coding)或算术编码(Arithmetic coding),是一种无损的数据压缩方法。它基于数据的统计特性来减少数据的大小,但不会导致任何信息的丢失。

3. 运动矢量编码(Motion vector coding):在帧间预测中,运动矢量的编码通常也是无损的。

需要注意的是,虽然上述某些步骤在理论上是无损的,但在实际的视频编码过程中,由于量化和舍入误差等因素,整个视频编码过程通常被认为是有损的。

部分内容来自于

作者:关键帧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 帧间预测

去除视频的时间冗余,将已编码的图像作为当前帧的参考图像,获取编码块的预测值。

帧间预测是YUV分量共同预测的,而不是按分量进行。色度块不会单独划分,而是与亮度块对应。

带有运动矢量差的Merge、几何划分帧间预测、放射运动补偿预测、联合帧内帧间预测等。

帧间预测:运动矢量和残差,去除时间冗余 

2.1.3.1 运动估计

运动估计是寻找当前编码的块在已编码的图像(参考帧)中的最佳对应块,并且计算出对应块的偏移(运动矢量)。

2.2.3.2 运动补偿

运动补偿是根据运动矢量和帧间预测方法,求得当前帧的估计值过程。其实就是将运动矢量参数贴到参考帧上获取当前帧。另外运动补偿是一个过程

2.1.4 变换

低频:平坦区域和内容缓慢变化区域

高频:细节区域和内容突变区域

人眼对高频信息不敏感,可以丢掉部分高频的信息

去除空间冗余,把以空间域像素形式描述的图像转换至变换域,以变换系数的形式表示。使得在比较平坦和内容变化缓慢的区域, 能量集中在低频区域。

绝大多数图像都有一个共同的特征:平坦区域和内容缓慢变化区域占据一幅图像的大部分,而细节区域和内容突变区域则占小部分。也可以说,图像中直流和低频区占大部分,高频区占小部分,所以将图像转换成频率系数,并丢掉高频系数,就能减少描述图像所需的数据量,而不会牺牲太多的图像质量。这样,空间域的图像变换到频域或所谓的变换域,会产生相关性很小的一些变换系数,并可对其进行压缩编码,即所谓的变换编码。

离散余弦变换(DCT)、多核变换、二次变换等

DCT变换可以使低频在左上角(直流分量),其余为高频(交流分量),大多数高频系数小于低频系数

2.1.5 量化(有损):视频编码产生失真的根本原因

把变换系数(不变换时为残差)进行多对一映射,减小变换系数的范围,减少信号取值空间有。量化过程根据图像的动态范围大小确定量化参数,既保留图像必要的细节,又减少码流。

量化就是把变换系数除以量化步长(Qstep)

Q_{step}=2^{(QP-4)/6}*2^{B-8}

B是比特深度,QP每增加6,量化步长变大一倍

使高频大部分为0

解码时的反量化就是再乘以量化步长

反量化以后的变换系数和量化之前的不一样了,造成了损失

QP越大、Qstep越大、损失越大、压缩率越高

2.1.6 熵编码(无损)

把编码控制数据、量化变换系数、帧内预测数据、帧间预测数据编码成二进制码流,从而进行传输和存储。熵编码模块输出的数据就是原始视频编码之后的码流。

熵的大小与信源的概率模型有着密切的关系,各个符号出现的概率不同,信源的熵也不同。当信源中各事件是等概率分布时,熵具有极大值。信源的熵与其可能达到的最大值之间的差值反映了该信源所含有的冗余度。信源的冗余度越小,即每个符号所独立携带的信息量越大,那么传送相同的信息量所需要的序列长度越短,符号位越少。因此,数据压缩的一个基本的途径是去除信源的符号之间的相关性,尽可能地使序列成为无记忆的,即前一符号的出现不影响以后任何一个符号出现的概率。

利用信源的统计特性进行码率压缩的编码就称为熵编码,也叫统计编码。熵编码是无损压缩编码方法,它生成的码流可以经解码无失真地恢复出原数据。熵编码是建立在随机过程的统计特性基础上的。

去除信息熵冗余,行程编码就是一种简单的熵编码,“bbbaaaaddddd”—>"3b4a5d",让需要12个字符才能表达的内容用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 帧数据与预测的差值信息进行存储和传输。

2.3 冗余信息

1.空间冗余:相邻像素之间的相关性,帧内预测去除

2.时间冗余:相邻帧内容之间的相关性,帧间预测去除

3.视觉冗余:人眼对高频信息的敏感度低于低频信息,变换量化去除

4.信息熵冗余(编码冗余):少的位数编码出现次数多的像素,多的位数编码出现次数少的像素,熵编码去除

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

这里的 B9 可以跨过 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 B
   DTS: 1 2 3 4
   PTS: 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 帧。

I帧的间隔调节会影响 GOP 的长度,进而影响到读取 GOP 的速度,为防止运动变化,一个 GOP 组内帧数不宜取多。

若I帧数据异常,则整个GOP的显示都会有问题,I帧数据丢失则解码会出现马赛克。

GOP大则压缩效率高

直播的GOP一般比较小,是帧率的1-2倍,可以保证进直播时可以正常解码

非直播一般设置两个连续的B帧来减少码流

GOP太大,则拖动播放(seek)不方便,10s的GOP不能拖动5秒,否则解码有问题,每次seek都要清空解码器;GOP太小,I帧会变多,P帧和B帧变少,码率会上升,一般来说1-2秒设置一个GOP

3.7 运动矢量

预测块在参考帧中的坐标值 (x0, y0) 与编码块在编码帧中的坐标值 (x1, y1) 的差值 (x0 - x1, y0 - y1) 称之为运动矢量。而在参考帧中去寻找预测块的过程称之为运动搜索。

3.8 视频的极快、极慢播放和倒放

极快:正常帧率录制,高帧率播放

极慢:高帧率录制,正常帧率播放

倒放:正常顺序解码,在进行倒序编码,然后再正常解码出新文件

3.9 Slice(片),可以进行并行编码

1.将一帧图像划分为多个相互独立、互不依赖的Slice

2.在机器性能比较高的情况下,可以多线程并行对多个Slice进行编码,从而提升编码速度

3.但是也因为一帧图像内的Slice是相互独立的,所以如果进行帧内预测,就不能跨Slice进行,因此编码性能会差一些

3.10 参数集

1.SPS(Sequence Parameter Set,序列参数集),主要包括图像的高、宽、YUV格式和位深等基本信息

2.PPS(Picture Paramter Set,图像参数集),主要包括熵编码类型、基础量化参数QP和最大参考帧数量等基本编码信息

3.11 NALU(Network Abstraction Layer Units,网络抽象层单元)

1.SPS是一个NALU、PPS是一个NALU、每个Slice也是一个NALU

2.每个NALU由1B的NALU Header和若干字节的NALU Data组成

3.对于Slice NALU,其中的NALU Data又是由Slice Header和Slice Data组成,而Slice Data又是由一个个MB Data组成
对于图像Slice,NALU类型中只区分了IDR Slice(类型为5)和非IDR Slice(类型为1),至于非IDR Slice是普通I Slice、P Slice还是B Slice,需要继续解析Slice Header中的Slice Type字段得到

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.YUV

5.1 为什么视频编码要用YUV而不是RGB

1.减少数据量,YUV420和YUV422格式都可以使每个像素点的数据量减少,降低对带宽的要求

2.Y、U、V可以分别独立编码,如果只编码并输出Y就是黑白图像,解决彩色电视和黑白电视的兼容问题

3.RGB的图像内容是相同的,只是颜色不同,因此之间有相关性不能独立编码

4.人眼对亮度变化敏感,对色度不敏感,因此可以把UV分量多压缩一点,不会影响最后的视觉效果

5.2 YUV和RGB之间的转换

1.RGB转YUV
一般是先转换到YUV444格式(参见色度信号取样格式),然后再将UV信号的分辨率降低,变成我们所需的格式。

RGB与YUV之间的转换公式(BT601 TV range):

Y=0.299R+0.587G+0.114B\\U=-0.169R-0.331G+0.5B\\V=0.5R-0.419G-0.081B

2.YUV转RGB
在做YUV到RGB的转换时,首先需要将缩水的UV信号的分辨率拉升到与Y信号相同的分辨率,然后再转换到RGB信号。在播放视频或显示图像的时候,我们需要将YUV信号转换为RGB信号。这个步骤称为渲染(Rendering)。

RGB与YUV之间的转换公式(BT601 TV range):

R=Y+1.402(Y-128)\\G=Y-0.34414(U-128)-0.71414(V-128)\\B=Y+1.772(V-128)

注:若结果小于0,则取0;若结果大于255,则取255

5.3 解码出错时显示绿屏的原因?

解码失败时,Y、U、V都为0

R=0+1.402(0-128) =-126.598\\G=0-0.34414(0-128)-0.71414(0-128)=135.4598\\B=0+1.772(0-128)=-126.228

R<0,取0;G取135.4598;B<0,取0。因此只有G分量有值,显示绿色

5.4 YUV存放格式

1.packed格式:每个像素点的Y、U、V交叉排列,一个数组存放

2. planar格式:三个数组分开连续存放Y、U、V,此格式更普遍

5.5 YUV采样表示法

Y、U、V每个分量都是8bit,即一个字节

4:4:4 每个像素都是Y、U、V三个分量,Y+U+V=每像素3字节

4:2:2 两个Y分量共用一个UV分量,相当于水平下采样,(2Y+U+V)/2=每像素2字节

4:2:0 四个Y分量共用一个UV分量,相当于水平垂直下采样(更常用),(4Y+U+V)/2=每像素1.5字节

5.6 YUV stride对齐问题

比如638×480的YUV420图像,在内存处理时,若要以16字节对齐,则638不能被整除,要在每行的尾部加2个字节,即640。图片的stride=640字节,638字节+2字节padding数据。

6 率失真函数

有损压缩算法,性能由编码输出的比特率失真共同决定。

编码的目的:就是在保证一定视频质量的条件下尽量减少编码比特率,或在一定编码比特率限制条件下尽量地减小编码失真。

编码器的工作:根据以上率失真准则找到最佳编码参数。

信息论中率失真概念:在允许一定程度失真的条件下,能够把信源信息压缩到什么程度,即最少需要多少比特数才能描述信源。由此得到率失真函数:R(D) = min I(X, Y),它给出了限定失真条件下信息压缩允许的下界。但其在视频编码中难以应用,因为各种概率和条件概率未知,只能作为理论值。

视频编码中的率失真曲线:为了研究视频码率与视频质量的平衡。由于系统性,不能达到理论上的 R(D) 值,只能由不同的编码参数(如 QP 和选择的模式)得到有限的 (R, D) 可操作点,形成凸包络。

视频编码中的率失真优化(RDO) :遍历所有的参数候选模式对视频进行编码,满足码率限制的失真最小的一组参数集作为最优的视频编码参数。每一层级都找出,最终使整体系统性能最优。这里假设了无相关性的独立优化,如相关性较强则共同优化。

更新中。。。

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白色彩券

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值