视频编解码器如何工作? 第 1 部分:基础知识

第二部分: 视频编解码器的工作原理

任意栅格 图像 可以用以下形式表示 二维矩阵。 当谈到颜色时,可以通过将图像视为 三维矩阵,其中附加维度用于存储每种颜色的数据。

如果我们将最终的颜色视为所谓的组合。 原色(红、绿、蓝),在三维矩阵中,我们定义三个平面:第一个为红色,第二个为绿色,最后一个为蓝色。
视频编解码器如何工作? 第 1 部分:基础知识
我们将该矩阵中的每个点称为像素(图像元素)。 每个像素包含有关每种颜色的强度(通常为数值)的信息。 例如, 红色像素 表示它包含 0 绿色、0 蓝色和最大红色。 粉色像素 可以使用三种颜色的组合来形成。 使用 0 到 255 的数字范围,粉红色像素定义为 红色 = 255, 绿色 = 192 и 蓝色=203.

视频编解码器如何工作? 第 1 部分:基础知识

本文的发表得到了 EDISON 的支持。

我们开发 视频监控、视频流应用,而且我们也订婚了 手术室录像.

编码彩色图像的替代方法

还有许多其他模型可用于表示构成图像的颜色。 例如,您可以使用索引调色板,它只需要一个字节来表示每个像素,而不是使用 RGB 模型时所需的三个字节。 在这样的模型中,可以使用 2D 矩阵而不是 3D 矩阵来表示每种颜色。 这可以节省内存,但色域较小。

视频编解码器如何工作? 第 1 部分:基础知识

RGB

例如,看看下面这张图片。 第一张脸已完全涂好。 其他是红色、绿色和蓝色平面(相应颜色的强度以灰度显示)。

视频编解码器如何工作? 第 1 部分:基础知识

我们看到原图中的红色阴影将位于观察第二张脸的最亮部分的相同位置。 而蓝色的贡献主要只能在马里奥的眼睛(最后一张脸)和他的服装元素中看到。 请注意所有三个颜色平面贡献最少的位置(图像中最暗的部分) - 马里奥的小胡子。

为了存储每种颜色的强度,需要一定数量的位数 - 这个数量称为 位深度。 假设每个颜色平面花费 8 位(基于 0 到 255 之间的值)。 那么我们的颜色深度为 24 位(8 位 * 3 个 R/G/B 平面)。

图像的另一个属性是 разрешение,它是一维中的像素数。 通常表示为 宽×高,如下面的 4 x 4 示例图像所示。
视频编解码器如何工作? 第 1 部分:基础知识

我们在处理图像/视频时处理的另一个属性是 长宽比,描述图像或像素的宽度和高度之间的正常比例关系。

当他们说某部电影或图片的尺寸为 16 x 9 时,他们通常的意思是 显示纵横比 ( -来自 显示纵横比)。 然而,有时单个像素可能有不同的形状 - 在这种情况下我们正在讨论 像素比 (PAR -来自 像素纵横比).

视频编解码器如何工作? 第 1 部分:基础知识

视频编解码器如何工作? 第 1 部分:基础知识

女主人注意事项: DVD 对应于 达尔 4 至 3

尽管实际的 DVD 分辨率为 704x480,但由于 PAR 为 4:3 (10x11 / 704x10),它仍然保持 480:11 的宽高比。

最后,我们可以确定 视频 就像一个序列 n 期间的框架 时间,这可以被认为是一个额外的维度。 A n 那么是帧速率或每秒的帧数(医科 -来自 每秒帧数).

视频编解码器如何工作? 第 1 部分:基础知识

显示视频所需的每秒位数是 传输速度 - 比特率.

比特率 = 宽度 * 高度 * 位深度 * 每秒帧数

例如,30 fps、24 bps、480x240 视频需要 82,944,000 bps 或 82,944 Mbps (30x480x240x24) - 但这是在不使用压缩方法的情况下。

如果传输速度 几乎恒定,那么它被称为 恒定的传输速度 (CBR -来自 恒定比特率)。 但它也可以变化,在这种情况下它被称为 可变波特率 (VBR -来自 可变比特率).

该图显示了有限的 VBR,在完全黑暗的帧的情况下不会浪费太多比特。

视频编解码器如何工作? 第 1 部分:基础知识

工程师最初开发了一种方法,可以在不使用额外带宽的情况下将视频显示的感知帧速率加倍。 这种方法被称为 隔行视频; 基本上,它在第一个“帧”中发送一半屏幕,在下一个“帧”中发送另一半屏幕。

目前,场景大多使用 逐行扫描技术。 它是一种显示、存储或传输运动图像的方法,其中每帧的所有线都是顺序绘制的。

视频编解码器如何工作? 第 1 部分:基础知识

出色地! 现在我们知道图像如何以数字方式表示、其颜色如何排列、每秒显示视频需要多少位、比特率是恒定 (CBR) 还是可变 (VBR)。 我们知道使用给定帧速率的给定分辨率,我们熟悉许多其他术语,例如隔行视频、PAR 等。

消除冗余

众所周知,未经压缩的视频是无法正常使用的。 一个小时长的 720p 分辨率、每秒 30 帧的视频将占用 278 GB。 我们通过乘以 1280 x 720 x 24 x 30 x 3600(宽度、高度、每像素位数、FPS 和时间(以秒为单位))得出该值。

使用 无损压缩算法,如 DEFLATE(用于 PKZIP、Gzip 和 PNG),不会充分减少所需的带宽。 我们必须寻找其他方法来压缩视频。

为此,您可以使用我们愿景的功能。 我们更擅长区分亮度而不是颜色。 视频是一系列随时间重复的连续图像。 同一场景的相邻帧之间存在微小差异。 此外,每个帧包含许多使用相同(或相似)颜色的区域。

颜色、亮度和我们的眼睛

我们的眼睛对亮度比对颜色更敏感。 您可以通过查看这张图片来亲自了解这一点。

视频编解码器如何工作? 第 1 部分:基础知识

如果您在图像的左半部分看不到方块的颜色 A и B 其实都是一样的,那很正常。 我们的大脑迫使我们更多地关注光和影而不是颜色。 在指定方块之间的右侧有一个相同颜色的毛衣 - 所以我们(即我们的大脑)很容易确定它们实际上是相同的颜色。

让我们(以简化的方式)看看我们的眼睛是如何工作的。 眼睛是一个复杂的器官,由许多部分组成。 然而,我们最感兴趣的是锥体和杆体。 眼睛含有约 120 亿个视杆细胞和 6 万个视锥细胞。

让我们将颜色和亮度的感知视为眼睛某些部分的独立功能(事实上,一切都有点复杂,但我们将简化它)。 杆细胞主要负责亮度,而视锥细胞负责颜色。 根据所含色素的不同,视锥细胞分为三种类型:S 视锥细胞(蓝色)、M 视锥细胞(绿色)和 L 视锥细胞(红色)。

由于我们的视杆细胞(亮度)比视锥细胞(颜色)多得多,因此我们可以得出结论,我们比颜色更有能力区分黑暗和光明之间的过渡。

视频编解码器如何工作? 第 1 部分:基础知识

对比灵敏度功能

实验心理学和许多其他领域的研究人员发展了许多人类视觉理论。 其中之一叫做 对比敏感度函数。 它们与空间和时间照明有关。 简而言之,就是需要进行多少更改才能被观察者注意到。 注意“函数”一词的复数形式。 这是因为我们不仅可以测量黑白图像的对比敏感度函数,还可以测量彩色图像的对比敏感度函数。 这些实验的结果表明,在大多数情况下,我们的眼睛对亮度比对颜色更敏感。

由于我们知道我们对图像亮度更敏感,因此我们可以尝试利用这一事实。

色彩模型

我们了解了如何使用 RGB 方案处理彩色图像。 还有其他型号。 有一个模型可以将亮度与色度分开,它被称为 的YCbCr。 顺便说一句,还有其他模型也有类似的划分,但我们只考虑这个。

在这个颜色模型中 Y 是亮度的表示,也使用两个颜色通道: Cb (浓郁的蓝色)和 Cr (浓郁的红色)。 YCbCr可以从RGB导出,也可以逆向转换。 使用这个模型我们可以创建全彩色图像,如下所示:

视频编解码器如何工作? 第 1 部分:基础知识

YCbCr 和 RGB 之间的转换

有人会反对:如果不使用绿色怎么可能得到所有颜色呢?

为了回答这个问题,我们将 RGB 转换为 YCbCr。 我们使用标准中采用的系数 BT.601,是单位推荐的 国际电联无线电通信部门。 该部门制定了数字视频的标准。 例如:什么是4K? 帧速率、分辨率、颜色模型应该是多少?

首先我们来计算一下亮度。 让我们使用 ITU 提出的常数并替换 RGB 值。

Y = 0.299R + 0.587G + 0.114B

获得亮度后,我们将分离蓝色和红色:

Cb = 0.564(B - Y)

Cr = 0.713(R - Y)

我们还可以使用 YCbCr 转换回来,甚至变成绿色:

R = Y + 1.402Cr

B = Y + 1.772Cb

G = Y - 0.344Cb - 0.714Cr

通常,显示器(监视器、电视、屏幕等)仅使用 RGB 模型。 但这个模型可以用不同的方式组织:

视频编解码器如何工作? 第 1 部分:基础知识

颜色子采样

对于表示为亮度和色度组合的图像,我们可以通过选择性地删除信息来利用人类视觉系统对亮度比对色度更高的敏感度。 色度子采样是一种使用比亮度更低的色度分辨率对图像进行编码的方法。

视频编解码器如何工作? 第 1 部分:基础知识

颜色分辨率允许降低多少?! 事实证明,已经有一些图表描述了如何处理分辨率和合并(结果颜色 = Y + Cb + Cr)。

这些计划被称为 下采样系统 并表示为 3 倍比率 - a:x:y,它决定了亮度和色差信号的样本数量。

a ——水平采样标准(通常等于4)
x — 第一行像素中的色度样本数(相对于水平分辨率 a)
y — 第一行和第二行像素之间色度样本的变化数量。

例外是 4:1:0,在每个 4×4 亮度分辨率块中提供一个色度样本。

现代编解码器中使用的常见方案:

  • 4:4:4 (无下采样)
  • 4:2:2
  • 4:1:1
  • 4:2:0
  • 4:1:0
  • 3:1:1

YCbCr 4:2:0 - 融合示例

这是使用 YCbCr 4:2:0 的合并图像。 请注意,我们每个像素仅花费 12 位。

视频编解码器如何工作? 第 1 部分:基础知识

这就是同一张图像的样子,使用主要类型的颜色子采样进行编码。 第一行是最终的 YCbCr,底行显示色度分辨率。 考虑到质量上的轻微损失,结果非常不错。

视频编解码器如何工作? 第 1 部分:基础知识

还记得我们计算过 278 GB 的存储空间可以存储一个 720p 分辨率、每秒 30 帧的一小时视频文件吗? 如果我们使用 YCbCr 4:2:0,那么这个大小将减少一半 - 139 GB。 到目前为止,距离可接受的结果还很远。

您可以使用 FFmpeg 自己获取 YCbCr 直方图。 在此图像中,蓝色比红色占主导地位,这在直方图本身中清晰可见。

视频编解码器如何工作? 第 1 部分:基础知识

颜色、亮度、色域 - 视频回顾

我们建议观看这个精彩的视频。 它解释了什么是亮度,一般来说所有的点都是点状的 ё 关于亮度和颜色。

框架类型

让我们继续。 让我们尝试消除时间冗余。 但首先,让我们定义一些基本术语。 假设我们有一部每秒 30 帧的电影,以下是它的前 4 帧:

视频编解码器如何工作? 第 1 部分:基础知识 视频编解码器如何工作? 第 1 部分:基础知识 视频编解码器如何工作? 第 1 部分:基础知识 视频编解码器如何工作? 第 1 部分:基础知识

我们可以在帧中看到很多重复:例如,蓝色背景在帧与帧之间没有变化。 为了解决这个问题,我们可以将它们抽象地分为三类框架。

I 帧(I介绍帧)

I 帧(参考帧、关键帧、内部帧)是独立的。 无论您想要可视化什么,I 帧本质上都是静态照片。 第一帧通常是 I 帧,但即使不是第一帧,我们也会定期观察 I 帧。

视频编解码器如何工作? 第 1 部分:基础知识

P 型框架(P预测帧)

P 帧(预测帧)利用了几乎总是可以使用前一帧再现当前图像的事实。 例如,在第二帧中,唯一的变化是球向前移动。 我们可以通过简单地稍微修改帧 2 来获得帧 1,仅使用这些帧之间的差异。 为了构造第 2 帧,我们参考前面的第 1 帧。

视频编解码器如何工作? 第 1 部分:基础知识视频编解码器如何工作? 第 1 部分:基础知识

B 型框架(Bi-预测框架)

不仅链接到过去的帧,还链接到未来的帧以提供更好的压缩怎么样?! 这基本上是一个 B 帧(双向帧)。

视频编解码器如何工作? 第 1 部分:基础知识视频编解码器如何工作? 第 1 部分:基础知识视频编解码器如何工作? 第 1 部分:基础知识

中级提款

这些帧类型用于提供尽可能最佳的压缩。 我们将在下一节中了解这是如何发生的。 现在,我们要注意的是,就内存消耗而言,最“昂贵”的是 I 帧,P 帧明显更便宜,但视频最有利可图的选择是 B 帧。

视频编解码器如何工作? 第 1 部分:基础知识

时间冗余(帧间预测)

让我们看看我们有哪些选择可以最大限度地减少随着时间的推移的重复。 我们可以使用交叉预测方法来解决这种类型的冗余。

我们将尝试使用尽可能少的比特来编码帧 0 和 1 的序列。

视频编解码器如何工作? 第 1 部分:基础知识

我们可以生产 减法,我们只需从帧 1 中减去帧 0。我们得到帧 1,仅使用它与前一帧之间的差异,实际上我们只对所得的余数进行编码。

视频编解码器如何工作? 第 1 部分:基础知识

但是,如果我告诉您有一种使用更少位的更好方法呢?! 首先,让我们将第 0 帧分解为由块组成的清晰网格。 然后我们将尝试将帧 0 中的块与帧 1 进行匹配。换句话说,我们将估计帧之间的移动。

来自维基百科 - 块运动补偿

块运动补偿将当前帧划分为不重叠的块,并且运动补偿向量报告块的起源(一个常见的误解是 предыдущий 帧被分成不重叠的块,运动补偿向量告诉这些块去哪里。 但事实上,情况恰恰相反——分析的不是前一帧,而是下一帧;不清楚块在哪里移动,但不清楚它们来自哪里)。 通常,源块在源帧中重叠。 一些视频压缩算法从甚至不是一个帧的一部分而是从几个先前传输的帧的部分组合当前帧。

视频编解码器如何工作? 第 1 部分:基础知识

在评估过程中,我们看到球已经从 (x= 0, y=25) 到 (x= 6, y=26), 值 x и y 确定运动矢量。 我们可以做的另一个保留比特的步骤是仅对最后一个块位置与预测位置之间的运动矢量差值进行编码,因此最终的运动矢量将是 (x=6-0=6, y=26-25=1 )。

在真实情况下,这个球会分为 n 阻止,但这并不能改变事情的本质。

框架中的对象在三个维度上移动,因此当球移动时,它在视觉上会变得更小(如果朝观察者移动,则它会变大)。 块之间不会出现完美匹配,这是正常的。 这是我们的估计和真实情况的综合视图。

视频编解码器如何工作? 第 1 部分:基础知识

但我们发现,当我们使用运动估计时,与使用更简单的计算帧间增量的方法相比,用于编码的数据明显更少。

视频编解码器如何工作? 第 1 部分:基础知识

真实的运动补偿是什么样子的

该技术同时应用于所有块。 通常我们的条件移动球会同时被分成几个块。

视频编解码器如何工作? 第 1 部分:基础知识

您可以自己使用来感受这些概念 朱皮特.

要查看运动向量,您可以使用以下命令创建外部预测视频 ffmpeg的.

视频编解码器如何工作? 第 1 部分:基础知识

您还可以使用 英特尔视频专业分析器 (它是付费的,但有一个免费试用版,仅限前十帧)。

视频编解码器如何工作? 第 1 部分:基础知识

空间冗余(内部预测)

如果我们分析视频中的每一帧,我们会发现许多相互关联的区域。

视频编解码器如何工作? 第 1 部分:基础知识

让我们看一下这个例子。 这个场景主要由蓝色和白色组成。

视频编解码器如何工作? 第 1 部分:基础知识

这是一个 I 帧。 我们不能用以前的帧进行预测,但我们可以对其进行压缩。 让我们对红色块的选择进行编码。 如果我们观察它的邻居,我们会注意到它周围有一些颜色趋势。

视频编解码器如何工作? 第 1 部分:基础知识

我们假设颜色在框架中垂直传播。 这意味着未知像素的颜色将包含其邻居的值。

视频编解码器如何工作? 第 1 部分:基础知识

这样的预测可能会被证明是错误的。 正是由于这个原因,您需要应用这种方法(内部预测),然后减去实际值。 这将为我们提供一个残差块,与原始矩阵相比,这将导致压缩程度更高的矩阵。

视频编解码器如何工作? 第 1 部分:基础知识

如果您想练习内部预测,您可以使用 ffmpeg 创建宏块及其预测的视频。 要了解每个块颜色的含义,您必须阅读 ffmpeg 文档。

视频编解码器如何工作? 第 1 部分:基础知识

或者您可以使用 Intel Video Pro Analyzer(正如我上面提到的,免费试用版仅限于前 10 帧,但这对您来说已经足够了)。

视频编解码器如何工作? 第 1 部分:基础知识

第二部分: 视频编解码器的工作原理

来源: habr.com

添加评论