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

H.264 能砍半,靠的是六项一起发力:可变分块、1/4 像素、多参考帧、帧内九种方向、环路内去块滤波、两种熵编码——其中前三项作用在预测上,贡献最大。

📝 本节和前面几节的关系

9.1 把 H.264 的外部特征认全了,从这一节开始看它内部的原理与实现。

一、六项改进清单

把 H.264 相对前代的改进逐条列出来,一共六项: 可变块大小运动补偿——16×16 一路细到 4×4,共 7 种分块; 1/4 像素精度——半像素与四分之一像素插值后再匹配; 多参考帧——参考帧列表最多可放 16 帧; 帧内预测——4×4 九种方向 + 16×16 四种; 环路内去块滤波——在预测环路里抑制方块效应; 两种熵编码——CAVLC 快、CABAC 压得小。

二、前三项为什么最值钱

六项里真正带来【砍半】的主要是作用在预测上的前三项: 可变分块——真实运动是【块状】的:物体整体平移就用大块,边缘处切成小块,残差一下子就小了; 亚像素精度——运动很少恰好是整数像素,差半个像素就能让残差翻倍,所以插值到 1/4 像素很划算; 多参考帧——周期性运动、遮挡反复出现时,最像的那一帧可能不在紧邻的位置,多给几个候选就找得到。 三者共同点:都是给编码器【更多选择】,而选择越多残差越小。

三、亚像素为什么必须靠插值

这一条值得单独澄清,因为它反直觉: 像素只有整数位置——画面里不存在【1/4 个像素】这个东西; 所谓 1/4 像素精度,是先用周围整数像素插值出一个虚拟位置,再用它去匹配; H.264 亮度用 6 抽头滤波器做半像素插值,再线性插值出 1/4 像素; 所以亚像素搜索的代价比整数搜索更高——每个候选点要先算插值。 精度的每一分提升,都是用计算量换来的。

四、CAVLC 与 CABAC 的选择

两种熵编码不是【新旧关系】,而是明确的取舍: CAVLC——基于上下文的自适应变长编码,解码简单、速度快; CABAC——基于上下文的自适应二进制算术编码,压缩比高出一成左右,但解码复杂度明显更高; Baseline 档次只能用 CAVLC,Main 与 High 才可以选 CABAC; 所以移动端低算力场景常常故意关掉 CABAC,换取流畅。 这一组取舍和第 8.5 节音频里的【无损与有损】是同一类思路:没有免费的好。

五、这一节给后面两节铺路

本节是 9.2 的总览,后面三节各拆一块: 9.2.2 编解码流程——这六项技术按什么顺序跑起来; 9.2.3 帧内预测——把【4×4 九种方向】讲透; 9.2.4 帧间预测——把【七种分块 + 1/4 像素 + 多参考】讲透。 六项里占了四节,可见预测在 H.264 里的分量。

六、动手 Demo:H.264 相对前代的六个改进

H.264 能把同画质码率砍半,靠的是这六项。

rows = [("可变块大小运动补偿", "16×16 一路细到 4×4,共 7 种分块"),
        ("1/4 像素精度", "半像素与四分之一像素插值后再匹配"),
        ("多参考帧", "参考帧列表最多可放 16 帧"),
        ("帧内预测", "亮度 4×4 九种方向 + 16×16 四种")]
for a, b in rows:
    print("%-20s %s" % (a, b))

实跑输出:

--------------------------------------------------------------------
H.264 相对前代的六个改进
--------------------------------------------------------------------

H.264 能把同画质码率砍半,靠的是这六项。

  改进项                 做法
  --------------------------------------------------------
  可变块大小运动补偿     16×16 一路细到 4×4,共 7 种分块
  1/4 像素精度           半像素与四分之一像素插值后再匹配
  多参考帧               参考帧列表最多可放 16 帧
  帧内预测               亮度 4×4 九种方向 + 16×16 四种
  环路内去块滤波         在预测环路里抑制方块效应
  两种熵编码             CAVLC 快、CABAC 更高压缩比

  六项里真正带来【砍半】的,主要是前三项——**它们都作用在预测那一步**。
  这也印证了 8.1 的说法:**预测才是压缩比的主战场,后半段只是收尾。**

六项里真正带来【砍半】的,主要是前三项——它们都作用在预测那一步。 这也印证了 8.1 的说法:预测才是压缩比的主战场,后半段只是收尾。

30 秒实验

  1. 用 FFmpeg 压同一个视频两次:一次加 -x264-params cabac=0,一次默认(开启 CABAC)。
  2. 对比文件大小与解码耗时,看看那一成的压缩比要花多少代价。

常见误区

  1. 把亚像素精度当成【真的有半个像素】。它是插值出来的虚拟位置。
  2. 以为 CABAC 一定比 CAVLC 好。它是压缩比换解码复杂度,低算力场景未必划算。
  3. 以为六项改进贡献均等。预测那三项占了大头。
自测三问(点开对答案) 1. H.264 的六项改进是什么? —— 可变分块、1/4 像素、多参考帧、帧内预测、环路滤波、两种熵编码。 2. 为什么亚像素搜索代价更高? —— 每个候选位置都要先做插值计算,才能得到虚拟像素值。 3. CABAC 相对 CAVLC 的取舍是什么? —— 压缩比约高一成,但解码复杂度明显更高。

相关笔记