第四十七章 视频帧概念

基础概念认知

在排查 WebRTC 丢包问题时,我们会接触到一些视频帧相关的名词,如 GOP、I-帧、P-帧、B-帧等。如果是之前对视频编解码不是特别了解的同学(比如笔者)可能会有些疑惑。因此本文尝试将这些名词逐一解释,方便大家查阅。

我们都知道,当多张连续图像以一定的速率(比如每秒 24 张)播放,即可形成视频。但视频传输却并不是单纯地发送连续图像这么简单。假设一张图像分辨率为 1280×720,且每个 ARGB 像素点大小为 32bits,则单张图像大小约为 29.5Mbits;如果每秒需要传输 24 张,则大约需要占用约 708Mbits/s 的带宽。显然这样的带宽占用是不现实的。

由此便引申出了视频编码技术,比如常见的 H.264、VP8 等编码格式。这些技术的基本思想都是类似的。我们可以将一张完整的图像分为很多小的图像块(Macroblock)。如下图 (1) 所示,人在挥手时身体并没有动,那么身体部分的图像块即是冗余信息,没必要每次都传输;可以只传输挥手的那部分,接收方再将其与之前的某些参考图像 diff 即可得到最新的图像:

第四十七章 视频帧概念

图中的 Intraframe 即我们常说的 I-帧,而 Interframe 则包含了 P-帧和 B-帧。

GOP 结构

由一个 I-帧和若干个 P-帧和 B-帧组成的连续帧序列则称为一个 GOP(Group of Pictures)。编码器会将视频编码为多个连续的 GOP,以下便是一个典型的 GOP 结构图:

第四十七章 视频帧概念

I-帧即帧内编码,是一种不需要其他参考帧即可编码的视频帧。一个视频文件总是以 I-帧开头,并拥有一定间隔的 I-帧序列。I-帧有时也被称为关键帧(Keyframe),我们可以通过 I-帧随机访问该文件中的(几乎)任意位置,实现快退和快进;也可以通过读取 I-帧序列实现视频预览,比如下图便是 Google Photos 编辑视频的拖动条:

第四十七章 视频帧概念

当然,由于 I-帧每次都对整个图像进行编码,它所占的体积(磁盘或带宽)也是最大的。

由于包含所有的信息,因此关键帧IDR,或者I帧,必定是尺寸很大的。

我们有一个的项目没有处理很好,导致每次传递的都直接是I帧数据,导致最终的视频流卡顿非常严重。

如果遇到强卡顿状况,你也可以排查下这种情况。

P-帧(Predicted)属于帧间预测的一种,它需要之前的 I-帧或 P-帧作为参考帧进行编码。P-帧会分析出参考帧中总是不变的部分,只有变化的部分会被编码,因此 P-帧比 I-帧的体积要小得多。当然,由于 P-帧需要参考帧,所以它对传输错误的容忍度较低。通俗的理解,P帧就是差异内容,因此,使得传递数据小得多,同时保证了差异能在GOP的一个阶段中以最佳的性能方式相对较好的呈现出来。

B-帧(Bi-directional Predicted)也属于帧间预测,它需要同时使用之前的 I-帧或 P-帧和之后的 I-帧或 P-帧进行编码,记录的是前后参考帧之间的差别,压缩比更高。但 B-帧显然增加了编码复杂度,且对延迟要求较高,所以在实时通话领域通常不使用 B-帧。

DTS 和 PTS

由于 B-帧需要未来的参考帧才能解码,于是便有了 DTS(Decode Timestamp,解码时间戳)和 PTS(Presentation Timestamp,显示时间戳)的概念。

编码器在编码时需要提供 DTS 和 PTS;而解码器在解码时会根据 DTS 顺序解码,再根据 PTS 顺序播放。当然,编码器是按照 DTS 顺序进行编码的,视频帧也是按照 DTS 顺序传输的。

以上述 GOP 结构图为例,PTS 顺序为图中的 1-9 顺序,对应的 DTS 顺序如下:

     I B P B P B P B I
PTS: 1 2 3 4 5 6 7 8 9
DTS: 1 3 2 5 4 7 6 9 8

即在解码 B-帧之前,先根据 DTS 解码它需要的所有参考帧,再根据 PTS 组帧播放。不过我们在实时通话领域通常不使用 B-帧,所以 DTS 通常等于 PTS。

以上便是 WebRTC 中常见的视频帧名词了,理解这些名词有助于我们后续理解 WebRTC 的 NACK、PIL 和 FIR 等丢包处理机制。当然,本文也仅仅涉及了视频编码的基础内容,更多编码相关的内容已经超出了笔者目前的能力范围,感兴趣的读者可以自行深入。

总结

以下是对这三种帧的总结和特征描述:

  1. I帧(Intra-coded Frame)

特征:

  • 完整图像:I帧是完整的图像帧,它不依赖于其他帧的数据。每个I帧都包含了该帧的全部信息。
  • 关键帧:I帧被称为关键帧,因为它们可以被用作解码视频流的起点。解码时,如果丢失了I帧,则后续的P帧和B帧可能无法正确解码。
  • 高比特率:由于I帧包含了完整的图像数据,它通常比P帧和B帧更大,需要更高的比特率。
  • 频率较低:在视频编码中,I帧的频率通常较低,因为它们会占用较多的带宽。通常会每隔一定数量的帧插入一个I帧来保证解码的稳定性。

应用:

  • 用于快速访问和恢复视频流。
  • 适用于需要快速随机访问的场景,比如视频点播(VOD)。
  1. P帧(Predictive-coded Frame)

特征:

  • 预测编码:P帧只记录与前一帧(I帧或P帧)之间的差异。它通过对前一帧进行预测和编码来减少冗余数据。
  • 依赖性:P帧依赖于前一帧的数据进行解码,因此不能单独解码。缺失前面的I帧或P帧可能会导致解码错误。
  • 压缩率:P帧的压缩效率较高,相比I帧体积更小,因为它只存储变化的部分。

应用:

  • 用于减少数据量,提升带宽利用率。
  • 适用于流媒体传输,尤其是需要较高压缩比和传输效率的场景。
  1. B帧(Bidirectional-coded Frame)

特征:

  • 双向预测:B帧通过同时参考前后两帧来进行预测和编码。它考虑了前后的I帧和P帧,进一步提高压缩率。
  • 最高压缩率:由于其双向预测的特性,B帧通常具有最高的压缩效率,生成的数据量最小。
  • 依赖性:B帧需要前后两帧(通常是I帧或P帧)来进行解码,因此解码过程比较复杂。丢失前后帧中的任何一帧都可能导致B帧无法正确解码。

应用:

  • 在需要最大化压缩效率的场景中使用,比如高压缩视频存储和广播。

总结

  • I帧:完整图像,关键帧,频率较低,提供高稳定性。
  • P帧:基于前一帧进行预测,压缩效率高,但依赖前一帧。
  • B帧:基于前后两帧进行预测,压缩效率最高,但依赖性最强。

在实际应用中,I帧、P帧和B帧通常会结合使用,形成复杂的帧结构来平衡压缩效率和视频质量。视频编码器会根据内容和需求调整这些帧的使用策略,以优化视频流的质量和带宽利用率。

RA/SD 衍生者AI训练营。发布者:chris,转载请注明出处:https://www.shxcj.com/archives/6694

Like (0)
Previous 2024-09-30 4:01 下午
Next 2024-09-30

相关推荐

发表回复

Please Login to Comment
本文授权以下站点有原版访问授权 https://www.shxcj.com https://www.2img.ai https://www.2video.cn