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 秒实验
- 用码流分析工具看几个 I 帧宏块,猜猜它们用了哪种预测模式。
- 找一块纯色背景,它的模式大概率是 DC 或 16×16 的平面模式。
常见误区
- 以为帧内预测用的是原始像素。只能用已经解码重建的邻居。
- 以为模式越多越好。大块反而模式少,因为块内一致性下降。
- 以为模式由标准指定。标准只给候选表,怎么选是编码器的自由。
自测三问(点开对答案)
1. 亮度 4×4 有几种预测模式? —— 九种:一个 DC 加八个方向。 2. 为什么 16×16 只有四种模式? —— 块越大内部越可能不一致,细分方向收益下降,且大块多出现在平坦区域。 3. 编码器怎么决定用哪种模式? —— 逐模式试算率失真代价,取总代价最小的那个。- ☐ 下一节(9.2.4 H.264的帧间预测编码)
相关笔记
- H.264的帧间预测编码 — 另一个方向的预测
- 视频压缩编码的基本技术 — 帧内预测在六项里的位置
- 帧内编码流程 — 模式选择属于编码器自由
- 帧内编码 — 帧内编码的通用原理
- 🎬 FFmpeg入门详解 · 索引