视频压缩 - 前一个和下一个 I 或 P 帧的平均值何时有用

信息处理 视频压缩
2022-02-22 12:44:41

我在一个星期二为我的多媒体系统考试做练习题,一个似乎经常出现的主题是适当使用基于以下内容的编码 B 帧:

1)之前的I或P帧

2)下一个I或P帧

3)前一个I或P帧的平均值

我在想出这些体面的例子时遇到了一些麻烦,而且我不完全确定什么时候平均是最合适的。有人介意检查我的例子,或者帮助我想一些更简洁或更现实的例子吗?

1) 一个即将落地的球。上一帧球是一样的形状,但是下一帧因为撞击地面的影响而变形,所以前一帧更好。

2) 一个人在人行道上奔跑,一辆汽车在前一帧中暂时在他和摄像机之间移动。由于对象遮挡,前一帧中的人的图像不完整,因此不是一个好的预测帧,但下一帧的人的图像是完整的,因此最好从中进行预测。

3) 我完全不知道该穿什么。我在想一辆汽车以恒定的速度在屏幕上移动,因为它在目标中的位置将是前一个和下一个的平均值 - 但这似乎很做作!

无论如何,任何帮助将不胜感激,所以如果您有任何想法,请告诉我!

2个回答

在详细说明任何内容之前,我会敦促您仔细阅读我的答案,以简化有关运动矢量和估计的一些常见混淆。


您的基本问题是 - 编码器何时或如何决定放置 B 帧或双向运动矢量。我将您的问题分为以下几个:

1、编码器什么时候决定使用B帧?

I 或 P 之间的 B 帧数几乎总是固定的。这通常是 2 或 3 张图片。I 帧之间的距离(称为 GoP 大小)可能会不断变化,但 B 帧的数量将始终保持固定。从 MPEG 的角度来看,这并不是真正的限制,但正如您的另一个问题所讨论的那样,如果您不断更改 B 帧,则传输和接收之间的节奏会出现严重问题。

此外,甚至在估计给定帧是否是作为 B 帧或新 I 或 P 帧的好选择之前,您必须实际确定预测的前向参考和过去参考。迭代给定的帧是否可以完美地作为 P 对已经消失的帧工作,或者您是否应该选择一些距离帧作为 P 和当前作为 B 的开销太大而无法完成编码,并且在此过程中您会严重波动延迟。

所以本质上,通常编码器将 B 帧的数量决定为 1,2 或最大 3,并且相应的图片始终固定为 B 帧。

2. 那么,如果我在上一个 I 和未来 P 之间有一张巨大的黑色/不相关图片怎么办?

好的 - 现在您已经选择查看给定的框架是 B,但在过去或未来之间几乎没有任何匹配的框架;或者有时只是框架的任一侧?但这并没有真正给编码器带来麻烦。

在 MPEG 中,每一帧都按照宏块来划分。每个宏块具有来自相应过去或未来图片的前向块或参考块的运动预测。

  • I 帧只能有 Intra 块 - 它没有运动补偿,因此它不需要任何其他准备好解码的帧。

  • P 帧可以有INTRAFORWARD-PREDICTED宏块。所以即使在P帧的情况下,当当前块与过去帧中的任何人都不匹配时,P帧也可以简单地使用INTRA块。

  • B 帧允许所有类型的宏块,包括INTRA(如 I)、FORWARD-PREDICTED mb(其中运动矢量仅取决于过去的图片)、BACKWARD-PREDICTED mb(其中运动矢量仅取决于未来的图片)和具有两个的BIDIRECTIONAL宏块来自过去和未来的运动矢量,并将它们平均以形成当前块。

因此,如果 B 图片或其一部分恰好非常独立,则很有可能为这些 MB 放置 INTRA 块,并且如果它仅匹配图片编码器的任一侧,则可以仅使用 FORWARD 或 BACKWARD 预测。

3. 那么给定帧的所有MB都必须是同一类型吗?

一点也不,假设一个新的对象刚刚进入一个被编码为 B 帧的帧,只有部分帧需要 INTRA 宏块,但大多数其他帧可以从其他块预测它们的运动。

了解,所有 MPEG 关心的是,如果编码器可以找到几乎与当前块一样好的块,则使用以最小化错误,如果不是运气不好,并将其编码为新的信息。甚至这种发现自身的能力也因编码器而异。

4. 那么编码器是如何做出这么多选择的呢?

通常,对于 B 图像,编码器通过从过去搜索最合适的块开始通常的业务,然后是未来图像。

一种。如果两个帧都产生了一些合理的运动矢量,这是最优选的以最小化能量并将块预订为BIDIRECTIONAL MB。

湾。如果过去帧或未来帧不产生运动矢量 - 即最小能量 (SAD) 高于有用数字,则相应地仅编码 1 个运动矢量,仅进行 MB FORWARD 或 BACKWARD 预测。

C。如果没有一个参考帧具有足够好的运动矢量 - MB 被编码为 INTRA。

5. 那么我为什么不简单地将所有内容编码为 INTRA 块并省去所有麻烦呢?

你绝对可以做到这一点。它仍然是完全合法的 MPEG 流。只是INTRA编码需要更多的符号来编码,因此它必须被严重量化以适应给定的比特预算。将所有内容都作为 INTRA 会显着降低效率,因为通常视频总是具有 INTRA 块无法利用的巨大时间冗余;但它们确实提供了随机访问自由。

我假设您想知道的内容类似于“嘿,我听说 H.264/AVC/MPEG-4 第 10 部分允许每个 B 宏块从单个过去的 I 或 P 帧复制,从单个未来复制I 或 P 帧,编码为 INTRA 块而不参考过去或未来,或“双向预测”并从两个不同 I 或 P 帧的某种平均值复制。为什么编码器会选择双向预测

我喜欢用的两个例子:

渐行渐远的夕阳

  • 逐渐的日落,被阳光照射的物体慢慢变暗,但在树叶之间的缝隙中,您开始注意到篝火和其他灯光。

假设您在当前 B 帧中有一个大宏块,其中包括从阳光照射的亮绿色变暗的前景叶子的一部分,或多或少恒定亮度的暗暗篝火,以及它们之间的参差不齐的边缘.

编码器可以尝试仅从过去或仅从未来的 I 或 P 帧估计该宏块。我们最终会估计叶子太亮或太暗,否则(如果我们使用加权预测)篝火太亮或太暗。在这四种情况中的任何一种情况下,参差不齐的边缘都需要花费大量位来准确描述需要修复的像素

然而,将过去 I 或 P 帧中的相应位置与“下一个”“未来”I 或 P 帧的对应位置平均,我们得到一个估计,叶子将是一些中间亮度,篝火将是相同的恒定亮度,并且它们之间的参差不齐的边缘是相同的。如果编码器选择“双向预测”方法,那么在这种情况下,估计值更接近我们试图编码为 B 帧的实际快照。所以双向预测让我们获得更好的质量或使用更少的比特或两者兼而有之(在这种情况下)。

一辆大货车

  • 一辆大货车在屏幕上移动,部分遮挡了一些非常精细的不变背景

随着货车向前移动,其后边缘后面的一些高度详细的背景会暴露出来。该信息在前一个 I 或 P 帧中找不到(它仍然被面包车挡住),但可以在“下一个”“未来”I 或 P 帧中找到。

随着货车向前移动,货车前面的区域很快就会被遮挡。在“未来”的 I 或 P 帧(被面包车挡住的地方)中找不到当前 B 帧中货车前面的那个高度详细的背景,但可以从之前的 I 帧或 P 帧中复制它.

在这两种情况下进行任何类型的双向预测“平均”只会让事情变得更糟。