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

帧内编码只用当前帧自己的信息,所以能独立解码——它的压缩率不高,但它是所有帧间编码的【落脚点】。

📝 本节和前面几节的关系

6.3 讲完了通用的四类技术,6.4 专门讲视频特有的东西。先从不用别的帧的那种说起。

一、帧内编码是什么

帧内编码的意思是:这一帧只参考它自己,不看别的帧。 所以它可以独立解码——不依赖任何前后帧。 也正因为如此,它的压缩率相对低:只能利用空间冗余,用不上时间冗余。 在视频码流里,承担这个角色的就是 I 帧。

二、它怎么做预测

帧内预测的思路是:用同一帧里已经编码过的相邻像素,猜当前块。 常见的几种方向: 垂直预测:参考上方的块——适合上下纹理连续的区域; 水平预测:参考左侧的块——适合左右纹理连续的区域; DC 预测:取周边的平均值——适合平坦区域; 平面预测:双向渐变——适合平滑过渡的区域。

三、编码器怎么选

编码器会逐块试几种模式,挑残差最小的那个,再把模式号告诉解码器。 所以解码器不需要自己猜——模式号就写在码流里。 这个机制带来一个有趣的结论:帧内编码的复杂度主要花在【试模式】上。

四、它在整条链里的地位

虽然帧内编码压缩率不高,但它是一切帧间编码的起点。 因为帧间编码需要【参考帧】,而参考帧必须是能独立解码的——那就是 I 帧。 所以一段视频的结构永远是:I 帧打头,后面跟着一串依赖它的 P/B 帧。 这也解释了 5.3.1 那句话:关键位置放 I 帧,其余尽量用帧间编码。

五、动手 Demo:帧内编码有哪几种预测方向

帧内编码只用当前帧自己的信息,所以能独立解码。

rows = [("垂直预测", "上方相邻块", "上下纹理连续"),
        ("水平预测", "左侧相邻块", "左右纹理连续"),
        ("DC 预测", "周边平均值", "平坦区域"),
        ("平面预测", "双向渐变", "平滑过渡区域")]
for a, b, c in rows:
    print("%-8s %-14s %s" % (a, b, c))

实跑输出:

--------------------------------------------------------------------
帧内编码有哪几种预测方向
--------------------------------------------------------------------

帧内编码只用当前帧自己的信息,所以能独立解码。

  预测模式     参考方向       适合的块
  -----------------------------------------
  垂直预测     上方相邻块     上下纹理连续
  水平预测     左侧相邻块     左右纹理连续
  DC 预测      周边平均值     平坦区域
  平面预测     双向渐变       平滑过渡区域

  编码器会**逐块试几种模式,挑残差最小的那个**,再把模式号告诉解码器。
  所以帧内编码的压缩率不高,**但它是所有帧间编码的【落脚点】。**

编码器会逐块试几种模式,挑残差最小的那个,再把模式号告诉解码器。 所以帧内编码的压缩率不高,但它是所有帧间编码的【落脚点】。

30 秒实验

  1. 截取一张有明显水平条纹的图片,想象它的块该用哪种帧内预测。
  2. 再想一下纯色区域该用哪种。

常见误区

  1. 以为帧内编码【不压缩】。它利用空间冗余,只是用不上时间冗余。
  2. 以为模式要解码器自己猜。模式号是写在码流里的。
自测三问(点开对答案) 1. 帧内编码的参考范围是什么? —— 只参考当前帧自己,所以能独立解码。 2. 帧内预测常见的几种方向是什么? —— 垂直、水平、DC、平面。 3. 为什么说帧内编码是帧间编码的落脚点? —— 帧间编码需要能独立解码的参考帧,那就是 I 帧。

相关笔记