判断帧类型只要问两句:它参考谁?别人参考它吗?——I 不参考别人却被别人参考,P 两头都参与,B 只参考别人、不被别人参考。
8.3.1 讲了三个顺序,这一节把三类帧的性质一条条对照清楚。
一、两个问题定类型
帧类型的全部区别就落在两个方向上: 它参考别人吗——决定它能不能独立解出来; 别人参考它吗——决定它错了会不会连累后面的帧。 把这两问填进一张表,三类帧就分完了。
二、I 帧:不进门,却人人都靠它
不参考任何帧,所以可以独立解码——这是随机访问的前提; 被别人参考,所以它是【落脚点】,码流里最大的那一类; 一个 I 帧错了,本帧画质受损,而且后续参考它的帧会一起坏—— 所以 I 帧是错误传播的源头,不是终点; 所以在工程上把 I 帧放得足够密,是抗丢包与快速拖动的基本手段。
三、P 帧:既参考别人,也被别人参考
只参考前面的帧(前向预测); 会被后面的帧参考,所以错误会沿链往后传; 码流大小居中——比 I 小得多,比 B 大不少; 不能单独作为随机访问点,必须从头往前解。 P 帧是把 GOP 串起来的那根线,GOP 有多长,它的链就有多长(第 6.5.2 节)。
四、B 帧:只进不出的那一类
前后都参考(双向预测); 不被任何帧参考——这是它最特别的地方; 于是带来两个后果:码流最小(可以压得很狠),且错误不会穿过它往后传; 代价是解码必须等——要等到后面的参考帧到达,才有得解。 所以 B 帧在【压缩比】上几乎稳赚,在【延迟】上是净付出。
五、对照的工程结论
把三条性质合起来,就能解释工程上的一堆默认配置: 直播少用 B 帧——延迟敏感,等不起; 点播多用 B 帧——延迟无所谓,白赚压缩比; GOP 不宜过长——太长则拖动要解很久、I 帧错了影响范围大; GOP 也不宜过短——太短则 I 帧频繁,码率压不下来。 这一切取舍的根,都在这一张帧性质表里。
六、动手 Demo:I/P/B 三帧的职责对照
判断一个帧的类型,只要问两个问题:它参考谁?别人参考它吗?
rows = [("I", "不参考", "会", "最大"),
("P", "参考前面", "会", "中等"),
("B", "前后都参考", "不会", "最小")]
for kind, ref, refby, size in rows:
print("%s 参考别人 %-10s 被别人参考 %-5s 大小 %s"
% (kind, ref, refby, size))
实跑输出:
--------------------------------------------------------------------
I/P/B 三帧的职责对照
--------------------------------------------------------------------
判断一个帧的类型,只要问两个问题:**它参考谁?别人参考它吗?**
帧类型 参考别人 被别人参考 相对大小 能否随机访问
-------------------------------------------------------------------------
I 不参考 会(是落脚点) 最大 能
P 参考前面的帧 会 中等 不能
B 前后都参考 不会 最小 不能
这张表有三条推论:
一是 **I 帧最大却最值钱**——它是随机访问与错误恢复的唯一依靠;
二是 **B 帧最小却最娇气**——不能作为别人的参考,所以解码器必须为它多留缓冲;
三是 **P 帧在中间**——它既参考别人又被参考,**错误会沿着它往后传**。
I 帧最大却最值钱——它是随机访问与错误恢复的唯一依靠; B 帧最小却最娇气——不被别人参考,所以要为它多留缓冲; P 帧在中间——错误会沿着它往后传。
30 秒实验
- 用码流分析工具看一个视频里 I/P/B 三类帧各占多少、平均多大。
- 对比一个【直播录制】文件与一个【点播压制】文件,看 B 帧比例的差别。
常见误区
- 以为 I 帧比 P 帧【更不容易出错】。I 帧本身丢了就是整帧花屏,只是不连累别人。
- 以为 B 帧可有可无。它是压缩比的重要来源,点播场景几乎必用。
- 以为帧类型是文件属性。它是编码器的决策,同一个文件可以全是 I 帧。
自测三问(点开对答案)
1. 哪一类帧不被别人参考? —— B 帧。它只参考别人,错误不会穿过它传播。 2. 为什么 P 帧的错误会往后传? —— 因为后面的帧要参考它,一旦它错了,参考它的帧也会错。 3. 直播为什么少用 B 帧? —— B 帧必须等后面的参考帧到达才能解码,会带来额外延迟。- ☐ 下一节(8.3.3 I/P/B帧的基本流程)
相关笔记
- I/P/B帧的基本流程 — 解码器逐帧的动作
- I/P/B/IDR帧 — 三类帧的第一次登场
- GOP详细讲解 — 三类帧怎么配比
- 帧内编码 — I 帧背后的技术
- 🎬 FFmpeg入门详解 · 索引