​ 视频是利用人眼视觉暂留的原理,通过播放一系列的图片,使人眼产生运动的感觉。单纯传输视频画面,视频量非常大,对现有的网络和存储来说是不可接受的。为了能够使视频便于传输和存储,人们发现视频有大量重复的信息,如果将重复信息在发送端去掉,在接收端恢复出来,这样就大大减少了视频数据的文件,因此有了H.264视频压缩标准。

​ 视频里边的原始图像数据会采用 H.264编码格式进行压缩,音频采样数据会采用 AAC 编码格式进行压缩。视频内容经过编码压缩后,确实有利于存储和传输。不过当要观看播放时,相应地也需要解码过程。因此编码和解码之间,显然需要约定一种编码器和解码器都可以理解的约定。就视频图像编码和解码而言,这种约定很简单:

编码器将多张图像进行编码后生产成一段一段的 GOP ( Group of Pictures ) , 解码器在播放时则是读取一段一段的 GOP 进行解码后读取画面再渲染显示。GOP ( Group of Pictures) 是一组连续的画面,由一张 I 帧和数张 B / P 帧组成,是视频图像编码器和解码器存取的基本单位,它的排列顺序将会一直重复到影像结束。I 帧是内部编码帧(也称为关键帧),P帧是前向预测帧(前向参考帧),B 帧是双向内插帧(双向参考帧)。简单地讲,I 帧是一个完整的画面,而 P 帧和 B 帧记录的是相对于 I 帧的变化。如果没有 I 帧,P 帧和 B 帧就无法解码。

  • I 帧 (Intra-coded frame):也称为关键帧,它是独立的帧,不依赖其他帧的信息。I 帧包含完整的图像信息,因此它的压缩效果相对较差,但是它可以独立地被解码。
  • P 帧 (Predicted frame):它依赖于前面的 I 帧或者 P 帧,P 帧在存储图像信息的同时,还记录了图像的变化量,因此它的压缩效果比 I 帧更好。
  • B 帧 (Bidirectional frame):它依赖于前面和后面的 I 帧或者 P 帧,B 帧可以从多个方向预测图像,因此其压缩效果比 P 帧更好,但是不能独立地被解码,必须和相邻的 I 帧或者 P 帧配合使用。

​ I、P、B 帧的使用顺序在视频编码中是有规律的,通常的顺序是 I 帧、P 帧、B 帧,在视频解码时可以使用这些帧信息来还原完整的图像。

​ 这些帧的作用只是用来解码吗?

​ 这些帧不仅仅是用来解码的,它们还在视频压缩中扮演了重要的角色。视频编码中使用 I、P 和 B 帧,是为了在保证视频质量的前提下最大限度地减少视频的文件大小。

​ 通过对图像的预测和变化量的存储,I 帧、P 帧和 B 帧实现了视频的高效压缩,从而提高了视频的传输效率和存储效率。因此,这些帧不仅仅是用来解码的,它们还是视频压缩技术中不可缺少的组成部分。

​ 具体是怎么根据IPB帧进行解码的?

​ 视频解码通常基于 I、P 和 B 帧的相互依存关系,下面是大致的解码流程:

  • I帧:I帧是独立的帧,其中包含了完整的图像数据。I帧不依赖于其他帧,因此它可以被独立解码。
  • P帧:P帧是预测帧,其中包含了图像的差异数据(即与前一帧的变化量)。P帧需要依赖于先前的 I 帧或 P 帧来解码。
  • B帧:B帧是双向预测帧,其中包含了图像与前一帧和后一帧的变化量。B帧需要同时依赖于前一帧和后一帧来解码。

​ 解码器将根据当前帧的类型(I、P 或 B)解码其内容,并使用预测或双向预测来生成完整的图像。

​ 最终,I 帧、P 帧和 B 帧将在视频中有序地组合在一起,以提供一个平滑、连续的视频流。

​ 我感觉P帧和B帧的作用一样的,他们的具体区别是什么?为什么用双向?

​ P帧和B帧的主要区别在于它们的预测方向不同。

  • P帧是预测帧,其中包含了图像与前一帧的差异,并依赖于前一帧进行解码。
  • B帧是双向预测帧,其中包含了图像与前一帧和后一帧的差异,并同时依赖于前一帧和后一帧进行解码。

​ 使用双向预测是因为它可以更有效地利用图像中的空间冗余,从而提高图像压缩效率。双向预测能够利用图像中的更多相关性,从而生成更高质量的图像。在实际应用中,B帧压缩效率要高于 P 帧。

​ 有时,需要在视频中包含 I 帧、P 帧和 B 帧以提高视频的压缩效率和图像质量。比较常见的是,使用 I 帧作为关键帧,P 帧和 B 帧作为普通帧,以提高图像的空间压缩效率。

​ 如果我提取p帧和b帧,那提取出来的是不是变化值,而不是完整的图像

​ 是的,提取出来的是图像的差异信息,而不是完整的图像。P帧和B帧只包含了图像与前一帧或者前后帧的差异,因此需要依赖关键帧 I 帧才能完整解码出图像。

​ 解码时,通常需要从 I 帧开始,依次解码其他帧,最终得到完整的图像序列。

​ 如果只提取 P 帧和 B 帧,很难直接得到完整的图像,因为它们只是图像的差异信息,而不是完整的图像数 据。

​ 所有的视频都必须要有ipb帧吗?三者是缺一不可吗?

​ 不是所有的视频都必须要有 IPB 帧。有些视频格式或者编码方式可能不使用 IPB 帧进行编码。

​ 但是,在大多数的视频编码中,都是使用 IPB 帧结构来进行编码的,因为它具有很好的编码效率和解码效果,可以很好地平衡视频文件大小和画面质量。

​ 如果编码方案缺少某种帧类型,这可能对图像质量造成影响,或者在解码时产生问题。

​ 什么格式不是ipb帧进行编码

​ 有一些视频格式,如 Lossless 压缩格式(例如 FFV1),不使用 IPB 帧结构进行编码。这类格式一般不需要考虑文件大小的限制,因此可以选择不同于 IPB 帧的其他编码方案。

​ 另外,有些视频格式可能使用 IP 帧结构进行编码,而不使用 B 帧。这种情况下,编码效率和图像质量会有一定的损失,但是文件大小相对较小。

​ 总的来说,不同的视频格式和编码方案可能会有不同的帧结构,并不一定都是 IPB 帧结构。