🎬 第六章 音视频压缩编码基础
📄 一句话概括

预测编码存的是残差(实际值减去预测值)——预测得越准,残差越小,需要的比特就越少。

📝 本节和前面几节的关系

6.2 分完了类,6.3 进入四类关键技术。第一类是预测编码。

一、核心思想

预测编码的思路非常朴素:如果下一处的值和当前处差不多,那就别存它,只存差。 所以它编码的不是原始值,而是残差 = 实际值 − 预测值。 而【差不多】这件事在真实数据里普遍成立——这才是它能省空间的原因。

二、数字上看有多省

假设一段相邻值在 98~105 之间波动: 原始值:每个都要 8 位才放得下; 残差:都在 −3 到 +3 之间,3~4 位就够。 位数直接减半,而这里面一点信息都没丢(残差可以精确还原原值)。 所以预测编码在【还没量化】这一步就已经开始省了。

三、两种预测方向

空间预测:用同一帧里相邻的像素猜——这就是帧内预测。 时间预测:用相邻帧里同一位置的像素猜——这就是帧间预测。 音频里用的是时间方向:用前面的采样点猜后面的采样点。 所以【预测】是音频与视频共用的手段,只是参考的对象不同。

四、它的地位

在四类关键技术里,预测是唯一一个【直接利用数据相关性】的手段。 变换是把数据摊开、量化是按重要性取舍、熵编码是按概率改码长——它们都是在【残差】之上工作。 所以预测是整个压缩链条的第一道也是最重要的一道。 5.3.3 说过【视频比音频多一步预测】,这一步就是压缩比差一个数量级的直接原因。

五、动手 Demo:预测编码为什么能省这么多

预测编码存的是【实际值与预测值的差】,而这个差通常很小。

src = [100, 102, 105, 104, 101, 99, 98]
prev = src[0]
for v in src[1:]:
    print("实际 %3d,预测 %3d,残差 %+d" % (v, prev, v - prev))
    prev = v

实跑输出:

--------------------------------------------------------------------
预测编码为什么能省这么多
--------------------------------------------------------------------

预测编码存的是【实际值与预测值的差】,而这个差通常很小。

  原始序列:100, 102, 105, 104, 101, 99, 98
  相邻差值:+2, +3, -1, -3, -2, -1(共 6 个)

  原始值要 8 位才放得下,差值只用到很小的范围——
  **位数一下子降下来了**,这就是预测编码省空间的原理。

原始值要 8 位才放得下,残差只在 −3 到 +3 之间。 位数一下子降下来了,这就是预测编码省空间的原理。

30 秒实验

  1. 自己写一串 7 个数字,算出它的相邻残差。
  2. 比较原始值的范围与残差的范围。

常见误区

  1. 以为预测编码在丢信息。它完全无损,残差可以精确还原原值。
  2. 以为预测只用在视频。音频的预测编码同样重要。
自测三问(点开对答案) 1. 预测编码存的是什么? —— 残差——实际值减去预测值。 2. 为什么残差通常很小? —— 因为相邻数据高度相关,预测值往往接近实际值。 3. 空间预测与时间预测分别对应什么? —— 帧内预测与帧间预测。

相关笔记