4、编码核心原理对比(二):帧内预测模式的演进与优化

帧内预测,说白了就是利用当前帧里已经编好的像素,去猜还没编的像素长什么样。H.264 和 H.265 在这块儿的思路完全不一样。我刚开始接触 H.265 时,看到那 35 种模式直接懵了——心想这得算到猴年马月去?后来才发现,模式多了不代表全都要算,关键是怎么快速找到最合适的那个。

4.1 H.264 的帧内预测:简单但够用

H.264 把帧内预测分成两种块大小:16×16 和 4×4。16×16 适合平坦区域,4×4 适合纹理复杂的区域。每种大小都有固定的预测方向。

H.264 帧内预测模式一览:
  • 16×16 亮度块:4 种模式(垂直、水平、DC、平面)
  • 4×4 亮度块:9 种模式(8 个方向 + DC)
  • 8×8 色度块:4 种模式(与 16×16 亮度类似)

我记得第一次调 H.264 编码器时,发现 4×4 的预测方向其实挺直观的。比如垂直模式就是直接复制上边一行像素,水平模式复制左边一列。DC 模式取平均值,平面模式做个渐变。说白了,就是拿相邻像素做简单的数学运算。

我的经验:H.264 的 4×4 预测在文字、图标这类细节丰富的区域效果很好。但遇到渐变天空或者光滑墙面,16×16 的平面模式反而更省码率。别死磕小块。

4.2 H.265 的帧内预测:精细到 35 种方向

H.265 把帧内预测的粒度大幅提升了。亮度块支持从 4×4 到 32×32 共 5 种大小,每种大小都有 35 种预测模式。这 35 种包括:33 个角度方向 + DC + 平面。

为什么会增加这么多方向?你想想看,H.264 只有 8 个方向,遇到斜着的纹理,预测出来的像素跟实际差距很大。H.265 把角度细分到每 2.5 度一个方向,基本上能覆盖自然界里大部分纹理走向。

特性 H.264 H.265
亮度块大小 16×16, 4×4 4×4, 8×8, 16×16, 32×32
角度模式数 8(4×4 块) 33
非角度模式 DC, 平面 DC, 平面
色度预测 4 种模式 5 种模式(含 LM 模式)

这里有个关键点:H.265 的平面模式比 H.264 复杂得多。它不光考虑上边和左边的像素,还考虑了右下角的参考像素,做双线性插值。我在项目中遇到过,平面模式对渐变区域的预测效果特别好,码率能省 10% 左右。

4.3 角度预测的精细化:从 8 到 33

H.264 的 8 个方向,说白了就是 0°、45°、90°、135° 这些整数角度。H.265 的 33 个方向覆盖了从 -135° 到 180° 的范围,每两个相邻方向之间只差 2.5° 左右。

这种精细化带来的好处很明显:预测残差更小,编码效率更高。但代价是计算量暴增。你想想看,每个块都要从 35 种模式里选一个最优的,如果全算一遍,编码时间直接翻好几倍。

避坑指南:我曾经在嵌入式平台上直接跑全模式搜索,结果编码一帧花了 3 秒。后来改用粗选 + 细选的两阶段策略,先通过 SATD 快速筛选出 Top N 个候选模式,再对这 N 个做完整 RD 计算。速度提升了 5 倍,码率只增加了不到 1%。

4.4 最可能模式(MPM)的演进

H.264 也有 MPM,但逻辑比较简单。它根据左边和上边块的模式,推导出当前块最可能用哪个模式。如果左边和上边模式相同,就只传一个 MPM 标志;如果不同,就传两个候选。

H.265 的 MPM 机制复杂多了。它维护一个长度为 3 的 MPM 列表,推导规则包括:

  • 左边块和上边块的模式
  • 左边块和上边块的衍生模式(比如 +1、-1 方向)
  • DC 和平面模式作为保底

我记得有次做码率分析,发现 H.265 的 MPM 命中率能达到 70% 以上。也就是说,大部分块只需要传一个 1-2 bit 的索引,就能确定预测模式。这比 H.264 的 MPM 效率高出一大截。

优化技巧:在实际编码器中,MPM 列表的构建顺序会影响压缩率。我习惯把左边块的模式放在第一位,因为空间相关性更强。上边块放第二位,平面和 DC 放最后。这样 MPM 命中率能再提升 2-3 个百分点。

4.5 色度预测的改进:LM 模式

H.265 引入了一个新东西:LM(Linear Model)模式。它利用亮度像素和色度像素之间的线性关系,通过已重建的亮度像素来预测色度像素。

这个模式在屏幕内容编码中特别有用。比如你有一段动画,画面里有很多纯色区域,亮度变化和色度变化高度相关。用 LM 模式预测,色度残差几乎为零。

H.264 没有这个模式,色度只能从相邻色度像素预测。遇到亮度变化剧烈但色度变化平缓的区域,H.264 的色度预测效率就很差。

4.6 帧内预测的优化策略

在实际工程中,全模式搜索是不现实的。我总结了几条优化经验:

  1. 粗选阶段用 SATD:计算速度快,能快速排除明显不好的模式
  2. 利用 MPM 优先:先算 MPM 列表里的模式,如果残差足够小,直接跳过其他模式
  3. 大块优先:32×32 和 16×16 的预测模式少,先算大块,再根据大块的结果决定是否细分
  4. 跳过对称模式:如果垂直模式残差很大,水平模式通常也好不到哪去
核心结论:H.265 的帧内预测比 H.264 精细得多,但计算量也大得多。优化的关键在于「粗选 + 细选」的两阶段策略,以及充分利用 MPM 机制。在实际项目中,合理的优化可以让编码速度提升 3-5 倍,而码率损失控制在 1% 以内。
帧内预测模式演进对比 H.264 帧内预测 块大小:16×16, 4×4 角度模式:8 个方向 非角度:DC, 平面 MPM:最多 2 个候选 色度:4 种模式 H.265 帧内预测 块大小:4×4 ~ 32×32 角度模式:33 个方向 非角度:DC, 平面(增强) MPM:3 个候选列表 色度:5 种模式(含 LM)

4.7 实际编码中的选择策略

说了这么多理论,咱们聊聊实际编码器里怎么选模式。我常用的策略是这样的:

  • 快速编码模式:只算 MPM 列表里的 3 个模式 + DC + 平面,选残差最小的。速度最快,码率损失约 3-5%。
  • 中等编码模式:先算 MPM 和 DC/平面,再根据残差大小决定是否扩展搜索范围。适合直播场景。
  • 高质量编码模式:全模式搜索 + 完整 RD 计算。适合离线转码,码率最优。
我的建议:如果你在做实时编码,千万别开全模式搜索。我见过有人把 x265 的帧内模式开到 full,结果 4K 30fps 都跑不动。用 fast 模式,配合 lookahead 和 VBV 控制,效果已经很好了。