🎬 第八章 音视频编解码技术与流程
📄 一句话概括

判断帧类型只要问两句:它参考谁?别人参考它吗?——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 秒实验

  1. 用码流分析工具看一个视频里 I/P/B 三类帧各占多少、平均多大。
  2. 对比一个【直播录制】文件与一个【点播压制】文件,看 B 帧比例的差别。

常见误区

  1. 以为 I 帧比 P 帧【更不容易出错】。I 帧本身丢了就是整帧花屏,只是不连累别人。
  2. 以为 B 帧可有可无。它是压缩比的重要来源,点播场景几乎必用。
  3. 以为帧类型是文件属性。它是编码器的决策,同一个文件可以全是 I 帧。
自测三问(点开对答案) 1. 哪一类帧不被别人参考? —— B 帧。它只参考别人,错误不会穿过它传播。 2. 为什么 P 帧的错误会往后传? —— 因为后面的帧要参考它,一旦它错了,参考它的帧也会错。 3. 直播为什么少用 B 帧? —— B 帧必须等后面的参考帧到达才能解码,会带来额外延迟。

相关笔记