Visual LabINTERACTIVE LEARNING
阶段 2 · 压缩编码基础22 分钟

I 帧、P 帧、B 帧:画面如何引用过去与未来

Intra、Forward Prediction、Bi-prediction 与参考关系

用帧依赖图理解 I 帧独立编码、P 帧向前参考、B 帧双向预测,以及解码顺序为何可能不同于显示顺序。

LEARNING GOALS

先明确本课目标

1

区分 I/P/B 帧的参考关系

2

理解参考帧与非参考帧

3

解释 B 帧为何引入重排序

MENTAL MODEL · 再建立心智模型

I 帧是一张完整地图,P 帧写“从过去怎么改”,B 帧还可以同时参考过去和未来,用更少描述换取更复杂的依赖。

MINIMAL EXAMPLE

为什么 I B B P 会以 I P B B 进入解码器?

两个 B 帧需要同时参考前面的 I 和后面的 P。解码器必须先拿到并解码 P,才能重建依赖它的 B 帧,最终再按 PTS 显示。

最小例子javascript
const displayOrder = ['I0', 'B1', 'B2', 'P3'];
const decodeOrder = ['I0', 'P3', 'B1', 'B2'];

const pts = { I0: 0, B1: 1, B2: 2, P3: 3 };
const dts = { I0: 0, P3: 1, B1: 2, B2: 3 };
  1. 先解码前参考 I0 独立重建并进入参考帧集合。
  2. 提前解码后参考 P3 参考 I0,随后成为 B1/B2 的未来参考。
  3. 按 PTS 恢复展示 输出队列最终按 0、1、2、3 展示。

码流按依赖可解码的顺序传递,播放器按展示时间戳恢复观众看到的顺序。

本课概念
OPTIONAL · 按需查阅完整术语表与概念边界

遇到陌生术语时再展开,不打断主线实验。

展开⌄
LIVE EXPERIMENT · 先获得反馈

边改边运行

浏览器加载后会激活代码编辑器、独立运行环境与实时输出。

本课挑战

给定一组参考关系,计算最早可输出每一显示帧的时刻。

DEEP DIVE · 实验之后

回到原理,解释刚才发生了什么

先用结果建立反馈,再按运行流程、核心原理和知识关系逐层深入。

CORE IDEA

核心讲解

01

帧类型描述预测方式

I 帧只使用帧内信息;P 帧通常参考过去已解码帧;B 帧可同时使用前后参考。实际 Codec 还允许更灵活的参考列表。

02

未来参考必须先解码

显示顺序 I B B P 中,P 必须先解码才能重建前面的 B,因此编码码流中的解码顺序可能是 I P B B。

OPTIONAL · 迁移时查阅Web 与原生实现对照

主线实验完成后,再用完整映射处理跨平台或跨 API 迁移。

展开⌄
API COMPARISON

Web 与原生接收到的压缩帧遵循同一依赖图,原生更常直接管理重排序队列。

WebGL

FFmpeg 解码器接收 Packet 并输出 Frame,播放器依据 PTS 进入展示队列。

WebGPU

video 元素隐藏解码顺序;WebCodecs 通过 Chunk timestamp 和输出 VideoFrame 交付排序结果。

不要用“收到包的顺序”直接决定显示顺序,B 帧存在时必须尊重时间戳。