I 帧、P 帧和 B 帧的概念是视频压缩领域的基础。这三种帧类型在特定情况下用于提高编解码器的压缩效率、压缩流的视频质量以及流对传输和存储错误和故障的恢复能力。
在本文中,我们将了解 I 帧、P 帧和 B 帧的工作原理以及它们的用途。
现在让我们开始了解现代视频压缩的几个基本方面——帧内和帧间预测。
帧间和帧内预测
我不会在本文中深入探讨帧内和帧间预测,但是,我会让您了解它们存在的原因以及它们的用途。
举个例子,下图。它显示了两个带有黑色像素矩形块的视频帧(彼此相邻)。在第一帧中,块位于图像的左侧,而在第二帧中,它已移动到右侧。
如果我想使用像 H.264 或 HEVC 这样的现代视频编解码器来压缩第 2 帧,我会做如下的事情——
- 将视频分成像素块(宏块)并一次压缩一个。
- 为了压缩每个宏块,第一步是通过在当前帧或先前或未来帧中搜索来找到与我们要压缩的宏块相似的宏块。
- 记录最佳匹配宏块的位置(哪个帧及其在该帧中的位置)。然后,两个宏块的差异被压缩并与位置信息一起发送到解码器。
到目前为止和我在一起吗?好的!
看看下面的图片。如果我想压缩第 2 帧中的宏块(我已用红色方块标记),您认为最好的选择是什么?或者应该怎么做?
- 首先,我可以查看第 1 帧并找到匹配的块。它似乎移动了大约框架宽度的距离(我知道少一点)并且大约在相同的高度。很好,我们现在有了运动矢量。
- 我可以在同一帧内搜索并快速意识到标有红色的块上方的块与它相同。所以,我可以告诉解码器复制那个而不是在另一帧中搜索。运动矢量(如果有的话)也是最小的。
现在看看下一个例子。我们想要压缩帧 #2 中包含蓝色球体的宏块。我们应该怎么做呢?在同一帧中搜索还是在先前编码的帧中搜索?
- 首先,我可以查看第 1 帧并找到匹配的球体。它似乎移动了大约框架宽度的距离(我知道少一点)并向上移动了一点。这给了我们运动矢量。包含球体的两个块之间的差异似乎非常小(猜测!)
- 其次,我可以在同一帧内进行搜索,发现没有其他块包含球体。所以,在同一帧内搜索匹配项的运气不佳!
那么,我们从这些示例中学到了什么?
- 编码器搜索匹配的宏块以减少需要传输的数据的大小。这是通过运动估计和补偿过程完成的。这允许编码器找到另一个帧中宏块的水平和垂直位移。
- 编码器可以在同一帧(帧内预测)和相邻(帧间预测)帧内搜索匹配块。
- 它比较每个宏块的帧间和帧内预测结果,并选择“最佳”一个。这个过程被称为“模式决定”,在我看来,它是视频编解码器的核心。
再次,对于帧内和帧间预测的超快速解释感到抱歉。这是一个很大的话题,我什至没有触及表面。在以后的文章中,我将讨论执行运动估计、快速搜索、子像素运动估计、提前退出以及运动估计和补偿的许多惊人方面的不同方法!
现在,通过对 Intra 和 Inter 预测的快速介绍,让我们了解 I、P 和 B 帧。
什么是 I 帧?
I 帧或关键帧或帧内帧仅包含使用帧内预测的宏块。就是这样。
I 帧中的每个宏块只允许引用同一帧内的其他宏块。即只能利用帧中的“空间冗余”进行压缩。空间冗余是一个术语,用于指代单个帧的像素之间的相似性。
I 帧在不同的视频编解码器中有不同的化身,如 IDR、CRA 或 BLA 帧,但这些类型的 I 帧的本质是相同的——I 帧中不允许进行时间预测。
I 帧有许多用途,我们将在介绍 P 和 B 帧后进行研究。
什么是P帧?
P 帧代表预测帧,除了空间预测之外,还允许使用时间预测来压缩宏块。对于运动估计,P 帧使用先前已编码的帧。本质上,P 帧中的每个宏块都可以是,
- 时间预测,或
- 空间预测,或
- 跳过(即,您告诉解码器从前一帧复制位于同一位置的块——“零”运动矢量)。
我做了一个插图来说明一个重要的观点。您可以在上图中看到 I 帧和 P 帧。如前所述,P 帧指的是先前编码的 I/P 帧。您还可以看到帧编码/解码的顺序与它们呈现给用户的顺序相同。这是因为 P 帧仅指以前编码的图片。
什么是B帧?
B 帧是一种可以引用在它之前和之后出现的帧的帧。由于这个原因,B代表双向。如果您的视频编解码器使用基于宏块的压缩(如 H.264/AVC),那么 B 帧的每个宏块都可以
- 使用后向预测进行预测(使用未来发生的帧)
- 使用前向预测进行预测(使用过去发生的帧)
- predicted without inter-prediction – only Intra
- 完全跳过(使用帧内或帧间预测)。
并且因为 B 帧可以选择引用它之前和之后(在时间维度上)发生的两个(或更多)帧并从中进行插值,所以 B 帧可以非常有效地减小帧的大小,同时保留视频质量。它们可以利用空间和时间冗余(未来和过去的帧),使它们在视频压缩中非常有用。
然而,B 帧是资源密集型的——无论是在编码器还是解码器。让我们看看为什么!
要了解 B 帧的影响,让我们了解Presentation/Display Order和Decoding Order的概念。
以 I 和 P 帧的简单情况为例。如果您只使用这两种图片类型,则每一帧要么引用自身(I 帧),要么引用前一帧(P 帧)。因此,帧可以按相同的顺序进出编码器。此处,呈现顺序(或显示顺序)与解码/编码顺序相同。
但是,如果一个框架引用了以后显示的另一个框架,你会怎么做?这是我们使用 B 帧进行压缩时看到的情况。看看下图,它显示了一个 GOP(图片组)结构,每个 mini-GOP 中使用两个 B 图片和一个 P。即,IBBPBBP。
显示顺序中的第 2 帧是 B 帧,它依赖于第 1 帧和第 4 帧作为参考。但是,要对第 2 帧进行编码,我们需要等到第 4 帧进入编码器,进行编码,然后才可用作第 2 帧的参考。
同样的事情发生在解码器上。
解码器按解码顺序解码帧 #1(I 帧),然后解码帧 #2(P 帧)。但是,它无法显示第 2 帧,因为它实际上是显示顺序中的第 4 帧!因此,解码器需要将第 2 帧(按解码顺序)放入缓冲区,直到显示它为止。
因此,编码器和解码器需要在它们的内存中维护两个“顺序”或“队列”——一个以正确的显示顺序放置帧,另一个将帧放置在编码和解码它们所需的另一个中。
由于重新排序要求,B 帧会影响解码器缓冲区的大小并增加延迟。
这就是为什么许多系统严格限制可用作压缩单个 B 帧的参考的帧数的原因。同样,H.264/AVC 的基线配置文件针对低端设备,不允许使用 B 帧或切片。
参考 B 帧和非参考 B 帧
正如我们所了解的,一个 B 帧可以指代两个或多个帧——通常,一个在未来,一个在过去关于它的位置。我们还了解到,I 帧不引用任何其他帧,P 帧引用过去的图片。问题自然就来了——任何图片都可以用B图作为参考帧吗?
答案是肯定的。
- B 帧可以充当参考,如果是这样,则称为参考 B 帧。
- 如果一个 B 帧不被用作参考,则它被称为非参考 B 帧。
在比特流中用信号表示帧是参考帧还是非参考 B 帧很重要,因为解码器需要将参考帧存储在其 DPB(解码图片缓冲区)中。
如果一个帧被标记为非参考 B 帧,并将其用作参考,则解码器可能会崩溃,因为解码器很可能会在解码和显示该帧后丢弃该帧。
大多数解码器将以比非参考 B 帧更好的质量量化参考 B 帧,以最大限度地减少传播损失。
在视频压缩和流媒体中使用 I、P 和 B 帧
了解了 I 帧、P 帧和 B 帧的工作原理后,现在让我们来解决一个重要问题。为什么要使用它们?
在接下来的几节中,让我们了解 I、P 和 B 帧在视频压缩中最重要的用例。
您在哪里使用 I 帧?
我们在前面的部分了解到 I 帧可以独立编码和解码,这推动了它们在视频压缩中的使用。
令人耳目一新的视频质量
通常插入 I 帧以指定 GOP(图片组)或视频片段的结尾。由于 I 帧压缩不依赖于先前编码的图片,因此可以“刷新”视频质量。编码器通常在大小和质量方面调整为支持 I 帧,因为它们在保持视频质量方面起着关键作用。在对一个高质量视频的 I 帧进行编码后,编码器可以将其作为参考图像来压缩 P 帧和 B 帧。
I 帧是否仅用于刷新视频质量?没有!
从比特流错误中恢复
还记得我们说过 I 帧可以独立编码和解码吗?这意味着 I 帧可用于从视频文件或视频流中的灾难性故障中恢复。
让我们看看如何。
如果 P 帧或参考 B 帧损坏,则所有依赖于它们的帧都无法令人满意地解码,这会导致视频出现故障。视频通常无法从此类问题中恢复。但是,当损坏的视频流到达 I 帧时,它可以独立对其进行编码解码并从问题中恢复。这是解码过程的干净重启,如果从那一点开始的所有帧都引用 I 帧之后的帧,则视频可以恢复。
这种 I 帧通常称为瞬时解码器刷新或 IDR 帧。并且,不引用 I 帧之前的图片的行为称为封闭 GOP。
IDR 帧通常用于 ABR 流式传输以表示视频的新片段。通过以 IDR 开始每个片段,该平台可以确保每个片段都可以独立于其他视频片段进行解码。此属性可确保即使由于传输问题导致一些片段损坏或丢失,视频播放也可以继续。
技巧模式(向前和向后寻找)
最后,关键帧对于特技模式至关重要!
如果你想在视频中向前或向后搜索,你需要在重新开始视频时有一个 I 帧。正确的?
想一想,如果你寻找一个 P 或 B 帧,而解码器已经从内存中转储了它的参考帧,你将如何重建它们?视频播放器自然会寻找一个起点(I 帧)以成功解码并从该点开始播放。
这给我们带来了另一个有趣的观点。
如果您在视频中将关键帧放置得相距很远——比如每 20 秒一次,那么您的用户只能以 20 秒的增量进行搜索。这是一个糟糕的用户体验!
但是如果关键帧放的太多,虽然找的体验很好,但是视频的尺寸会太大,可能会造成缓冲!
设计最佳 GOP 和 mini-GOP 结构确实是一门平衡的艺术
你在哪里使用P和B帧?
这是人们问的一个非常常见的问题:我应该在哪里、何时以及如何使用 P 帧和 B 帧?
如果您从前面的部分了解了 P 帧和 B 帧的工作原理,您就会认识到 P 和 B 帧在保持视频质量的同时减小了视频的大小。这是它们的主要用途!P 和 B 帧插入适当的位置以减小视频的文件大小或比特率,并进行调整以保持一定的视频质量水平。
根据您决定在编码器中使用的 GOP 和 mini-GOP 结构,P 帧和 B 帧(插入参考和非参考)并使用相关 QP 值进行压缩以实现目标比特率或质量。
本文来自作者投稿,版权归原作者所有。如需转载,请注明出处:https://www.nxrte.com/jishu/16413.html