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 秒实验
- 用 FFmpeg 压同一个视频两次:一次加
-x264-params cabac=0,一次默认(开启 CABAC)。 - 对比文件大小与解码耗时,看看那一成的压缩比要花多少代价。
常见误区
- 把亚像素精度当成【真的有半个像素】。它是插值出来的虚拟位置。
- 以为 CABAC 一定比 CAVLC 好。它是压缩比换解码复杂度,低算力场景未必划算。
- 以为六项改进贡献均等。预测那三项占了大头。
自测三问(点开对答案)
1. H.264 的六项改进是什么? —— 可变分块、1/4 像素、多参考帧、帧内预测、环路滤波、两种熵编码。 2. 为什么亚像素搜索代价更高? —— 每个候选位置都要先做插值计算,才能得到虚拟像素值。 3. CABAC 相对 CAVLC 的取舍是什么? —— 压缩比约高一成,但解码复杂度明显更高。- ☐ 下一节(9.2.2 H.264编解码流程)
相关笔记
- H.264的帧内预测编码 — 九种方向的细节
- H.264的帧间预测编码 — 三项帧间改进的细节
- 视频编码简介 — 预测是主战场
- 熵编码 — CAVLC/CABAC 的上位概念
- 🎬 FFmpeg入门详解 · 索引