阶段 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 显示。
javascriptconst 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 };- 先解码前参考 I0 独立重建并进入参考帧集合。
- 提前解码后参考 P3 参考 I0,随后成为 B1/B2 的未来参考。
- 按 PTS 恢复展示 输出队列最终按 0、1、2、3 展示。
码流按依赖可解码的顺序传递,播放器按展示时间戳恢复观众看到的顺序。
OPTIONAL · 按需查阅完整术语表与概念边界遇到陌生术语时再展开,不打断主线实验。
展开⌄
音视频原理I-frame仅使用当前画面内部信息编码的图像,不依赖其他帧进行像素预测。音视频原理P-frame主要使用过去已解码参考图像进行帧间预测的编码图像。音视频原理B-frame可利用前后参考列表进行双向预测的编码图像,常引入解码与显示重排。音视频原理Reference Frame被后续图像用于运动补偿和预测的已解码图像。音视频原理PTSPresentation Timestamp,表示解码后帧应在媒体时间轴上展示或播放的时间。音视频原理DTSDecode Timestamp,表示压缩数据应按什么时刻或顺序进入解码器。音视频原理Frame Reordering存在双向预测帧时,压缩数据的解码顺序与画面的呈现顺序不同,解码器需按 PTS 重新排队输出。音视频原理Decode Order压缩图像送入解码器并建立参考关系的先后顺序,常由 DTS 表达;存在 B 帧时可能不同于展示顺序。音视频原理Presentation Order解码后画面真正显示给观众的先后顺序,常由 PTS 表达;播放器需将重排后的帧按此顺序输出。
LIVE EXPERIMENT · 先获得反馈
边改边运行
浏览器加载后会激活代码编辑器、独立运行环境与实时输出。
本课挑战
给定一组参考关系,计算最早可输出每一显示帧的时刻。
回到原理,解释刚才发生了什么
先用结果建立反馈,再按运行流程、核心原理和知识关系逐层深入。
CORE IDEA
核心讲解
帧类型描述预测方式
I 帧只使用帧内信息;P 帧通常参考过去已解码帧;B 帧可同时使用前后参考。实际 Codec 还允许更灵活的参考列表。
未来参考必须先解码
显示顺序 I B B P 中,P 必须先解码才能重建前面的 B,因此编码码流中的解码顺序可能是 I P B B。
OPTIONAL · 迁移时查阅Web 与原生实现对照主线实验完成后,再用完整映射处理跨平台或跨 API 迁移。
展开⌄
Web 与原生接收到的压缩帧遵循同一依赖图,原生更常直接管理重排序队列。
WebGL
FFmpeg 解码器接收 Packet 并输出 Frame,播放器依据 PTS 进入展示队列。
WebGPU
video 元素隐藏解码顺序;WebCodecs 通过 Chunk timestamp 和输出 VideoFrame 交付排序结果。
不要用“收到包的顺序”直接决定显示顺序,B 帧存在时必须尊重时间戳。