在详细说明任何内容之前,我会敦促您仔细阅读我的答案,以简化有关运动矢量和估计的一些常见混淆。
您的基本问题是 - 编码器何时或如何决定放置 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 帧可以有INTRA和FORWARD-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 块无法利用的巨大时间冗余;但它们确实提供了随机访问自由。