词典

视频中的B帧是什么?

B 帧是一种视频帧,可以同时利用前面的帧和后面的帧。了解 B 帧是如何工作的,以及文件中 Has B Frames 数值的含义。

b-frames

B 帧是一种视频帧,可以同时使用前面的帧和后面的帧来生成当前画面。B 表示双向预测 (bidirectional)。B 帧比其他类型的帧提供更多压缩率,有助于减小视频文件大小。

在视频文件的元数据中,你可能会看到一个名为 Has B Frames 的字段,也可以写作 has_b_frames。这个名字看起来像是“是”或“否”的问题,但它的值其实是一个数字。这个数字表示解码器为了按正确顺序显示视频,需要在内存中同时保留多少帧。

B 帧与 I 帧和 P 帧有何不同

视频压缩通常通过比较帧并记录它们之间的差异来工作。MPEG-2 视频定义了 3 种帧类型:

  • I 帧 (I-frame):编码时不参考其他帧,所以解码可以从这里开始
  • P 帧 (P-frame):可以参考前一个 I 帧或 P 帧
  • B 帧 (B-frame):可以同时参考前一个和后一个 I 帧或 P 帧

B 帧可以依赖时间上更晚的帧,所以那个更晚的帧必须先被存储。因此,存储顺序会和你在屏幕上看到的顺序不同。一个典型的 MPEG-2 序列如下:

  • 显示顺序:B1 B2 I3 B4 B5 P6 B7 B8 P9 B10 B11 P12
  • 存储顺序:I3 B1 B2 P6 B4 B5 P9 B7 B8 P12 B10 B11

数值的呈现方式

Has B Frames 是一个整数。FFmpeg 将这个值描述为解码器中帧重排缓冲区的大小。对于 MPEG-2 视频,FFmpeg 定义了 2 个取值:

  • 0:仅包含 I 帧和 P 帧的低延迟视频
  • 1:包含 I 帧、P 帧和 B 帧的视频

H.264 和 HEVC 编码器也可以将部分 B 帧作为其他帧的参考帧。FFmpeg 的 H.264 测试文件展示了这种设置如何改变该数值。文件名中给出了编码器的设置:

  • 连续最多 3 个 B 帧,且不把它们作为参考帧:1
  • 连续最多 3 个 B 帧,其中一部分作为参考帧:2
  • 连续最多 4 个 B 帧,其中一部分作为参考帧:2

所以这个值并不是 B 帧的数量。ffprobe 程序通过 pict_type 值显示每一帧的类型:I、P 或 B。字段 NB Frames 给出帧的总数,但不包含它们的类型。

数值的来源

这个字段名来自 FFmpeg,其中的 ffprobe 程序会为视频流打印 has_b_frames。H.264 流可以在自己的头部中给出这个数字。如果头部没有写明这个数字,FFmpeg 会根据帧及其时间戳推算出来。

是否使用 B 帧由编码器设置决定。在 FFmpeg 和 Microsoft H.264 编码器中,将该设置为 0 会关闭 B 帧。

哪些文件携带它

该字段只存在于视频流中。你可以在 MP4、MOV、MKV、WebM 和 AVI 文件的视频中看到这个字段。带有重排帧的 MOV 文件还会存储一个表,用来记录每一帧从解码到显示之间的时间差。

是否支持 B 帧由编码器决定。MPEG-2 视频和 H.264 Main profile 可以使用 B 帧,但 H.264 Baseline profile 不可以。VP8 是一种用于 WebM 文件的编码器,它没有 B 帧,因为它的帧从不依赖后面的帧进行预测。

它的重要性

B 帧有助于减小视频体积,但会增加延迟。编码器在存储前必须对帧进行重排,这种延迟取决于连续 B 帧的数量。

重排过的视频中,每一帧会有两个不同的时间:一个是解码时间,一个是显示时间。FFmpeg 会在流的时间基准内,用时间戳给出这两个时间。