🎬 第九章 H.264编解码基础
📄 一句话概括

H.264 帧内预测的核心是方向:亮度 4×4 有九种模式(一个 DC + 八个方向),16×16 另有四种——预测越准,残差越小,后面就越省。

📝 本节和前面几节的关系

9.2.2 讲了整体流程,这一节把流程里帧内预测那一步拆开看。

一、帧内预测在预测什么

帧内预测不参考别的帧,它只用同一帧里已经解码的邻居: 当前块上边一行与左边一列的像素已经重建好了,可以直接用; 用这些邻居按某个方向【延伸】,就得到当前块的预测值; 实际编码的是原始值减预测值的残差——预测越准,残差越小; 所以帧内预测的全部努力,就是找到那个最合适的方向。

二、亮度 4×4 的九种模式

细粒度预测用 4×4 块,一共九种模式: 模式 0 垂直——从上边像素垂直复制; 模式 1 水平——从左边像素水平复制; 模式 2 DC——取邻居平均值,不给方向; 模式 3~8——六个斜向模式(下左、下右、右垂直、下水平、左垂直、上水平)。 模式 2 是给平坦区域准备的;其余八个覆盖了从水平到垂直的整个角度范围。

三、16×16 与色度的模式

大块与色度另有一套更简单的模式表,原因很实际: 亮度 16×16 只有四种——垂直、水平、DC、平面(Plane); 色度 8×8 也是四种——同一套思路; 为什么大块反而模式少?因为块越大,内部的像素越可能不一致,细分方向的意义反而下降; 而且大块主要出现在平坦区域,垂直/水平/DC/平面已经够用。 块大小与模式数量是配套设计的,不是随便定的。

四、编码器怎么选模式

九种模式摆在那里,选哪一个?这是编码器的自由,标准不管(第 8.3.5 节): 逐模式试一遍——按每种模式算出预测值、残差与代价; 代价用 率失真代价衡量:编码残差需要的位数,加上失真; 取总代价最小的那个模式,把模式号写进码流; 这就是【模式选择】——H.264 里最耗时的步骤之一(仅次于运动估计)。 所以档次越高、模式越多,压缩比越好但编码越慢(第 9.1.4 节)。

五、帧内预测与 I 帧的关系

这一节讲的技术,几乎全部作用在 I 帧上: I 帧内部只有帧内预测(第 8.3.4 节),所以它的压缩比完全取决于这套模式; P 帧与 B 帧里也有帧内编码的块——遇到场景切换或遮挡时用得上; 第 8.3.5 节说过 I 帧的码率通常是 P 帧的好几倍——帧内预测做不到帧间那样的【整块搬运】; 但它在另一件事上无可替代:提供随机访问的落脚点。

六、动手 Demo:亮度 4×4 的九种帧内预测模式

H.264 帧内预测的细粒度,就体现在这张模式表里。

rows = [("0", "垂直", "从上边像素垂直复制"),
        ("1", "水平", "从左边像素水平复制"),
        ("2", "DC(均值)", "取邻居平均值,无方向"),
        ("3", "下左对角线", "沿左下方向插值")]
for a, b, c in rows:
    print("模式 %s  %-10s %s" % (a, b, c))

实跑输出:

--------------------------------------------------------------------
亮度 4×4 的九种帧内预测模式
--------------------------------------------------------------------

H.264 帧内预测的细粒度,就体现在这张模式表里。

  模式     名称           预测方向
  ---------------------------------------------
  0        垂直           从上边像素垂直复制
  1        水平           从左边像素水平复制
  2        DC(均值)     取邻居平均值,无方向
  3        下左对角线     沿左下方向插值
  4        下右对角线     沿右下方向插值
  5        右垂直         偏右的垂直方向
  6        下水平         偏下的水平方向
  7        左垂直         偏左的垂直方向
  8        上水平         偏上的水平方向

  模式 2(DC)是**给平坦区域准备的**——用量化均值,不选方向;
  其余八个方向覆盖了**从水平到垂直的整个角度范围**。
  **4×4 九种 + 16×16 四种 + 色度单独四种——这就是 H.264 帧内预测的全貌。**

模式 2(DC)给平坦区域准备——取量化均值,不选方向; 其余八个方向覆盖了从水平到垂直的整个角度范围。 4×4 九种 + 16×16 四种 + 色度单独四种,就是 H.264 帧内预测的全貌。

30 秒实验

  1. 用码流分析工具看几个 I 帧宏块,猜猜它们用了哪种预测模式。
  2. 找一块纯色背景,它的模式大概率是 DC 或 16×16 的平面模式。

常见误区

  1. 以为帧内预测用的是原始像素。只能用已经解码重建的邻居。
  2. 以为模式越多越好。大块反而模式少,因为块内一致性下降。
  3. 以为模式由标准指定。标准只给候选表,怎么选是编码器的自由。
自测三问(点开对答案) 1. 亮度 4×4 有几种预测模式? —— 九种:一个 DC 加八个方向。 2. 为什么 16×16 只有四种模式? —— 块越大内部越可能不一致,细分方向收益下降,且大块多出现在平坦区域。 3. 编码器怎么决定用哪种模式? —— 逐模式试算率失真代价,取总代价最小的那个。

相关笔记