📄 一句话概括
帧内编码只用当前帧自己的信息,所以能独立解码——它的压缩率不高,但它是所有帧间编码的【落脚点】。
📝 本节和前面几节的关系
6.3 讲完了通用的四类技术,6.4 专门讲视频特有的东西。先从不用别的帧的那种说起。
一、帧内编码是什么
帧内编码的意思是:这一帧只参考它自己,不看别的帧。 所以它可以独立解码——不依赖任何前后帧。 也正因为如此,它的压缩率相对低:只能利用空间冗余,用不上时间冗余。 在视频码流里,承担这个角色的就是 I 帧。
二、它怎么做预测
帧内预测的思路是:用同一帧里已经编码过的相邻像素,猜当前块。 常见的几种方向: 垂直预测:参考上方的块——适合上下纹理连续的区域; 水平预测:参考左侧的块——适合左右纹理连续的区域; DC 预测:取周边的平均值——适合平坦区域; 平面预测:双向渐变——适合平滑过渡的区域。
三、编码器怎么选
编码器会逐块试几种模式,挑残差最小的那个,再把模式号告诉解码器。 所以解码器不需要自己猜——模式号就写在码流里。 这个机制带来一个有趣的结论:帧内编码的复杂度主要花在【试模式】上。
四、它在整条链里的地位
虽然帧内编码压缩率不高,但它是一切帧间编码的起点。 因为帧间编码需要【参考帧】,而参考帧必须是能独立解码的——那就是 I 帧。 所以一段视频的结构永远是:I 帧打头,后面跟着一串依赖它的 P/B 帧。 这也解释了 5.3.1 那句话:关键位置放 I 帧,其余尽量用帧间编码。
五、动手 Demo:帧内编码有哪几种预测方向
帧内编码只用当前帧自己的信息,所以能独立解码。
rows = [("垂直预测", "上方相邻块", "上下纹理连续"),
("水平预测", "左侧相邻块", "左右纹理连续"),
("DC 预测", "周边平均值", "平坦区域"),
("平面预测", "双向渐变", "平滑过渡区域")]
for a, b, c in rows:
print("%-8s %-14s %s" % (a, b, c))
实跑输出:
--------------------------------------------------------------------
帧内编码有哪几种预测方向
--------------------------------------------------------------------
帧内编码只用当前帧自己的信息,所以能独立解码。
预测模式 参考方向 适合的块
-----------------------------------------
垂直预测 上方相邻块 上下纹理连续
水平预测 左侧相邻块 左右纹理连续
DC 预测 周边平均值 平坦区域
平面预测 双向渐变 平滑过渡区域
编码器会**逐块试几种模式,挑残差最小的那个**,再把模式号告诉解码器。
所以帧内编码的压缩率不高,**但它是所有帧间编码的【落脚点】。**
编码器会逐块试几种模式,挑残差最小的那个,再把模式号告诉解码器。 所以帧内编码的压缩率不高,但它是所有帧间编码的【落脚点】。
30 秒实验
- 截取一张有明显水平条纹的图片,想象它的块该用哪种帧内预测。
- 再想一下纯色区域该用哪种。
常见误区
- 以为帧内编码【不压缩】。它利用空间冗余,只是用不上时间冗余。
- 以为模式要解码器自己猜。模式号是写在码流里的。
自测三问(点开对答案)
1. 帧内编码的参考范围是什么? —— 只参考当前帧自己,所以能独立解码。 2. 帧内预测常见的几种方向是什么? —— 垂直、水平、DC、平面。 3. 为什么说帧内编码是帧间编码的落脚点? —— 帧间编码需要能独立解码的参考帧,那就是 I 帧。- ☐ 下一节(6.4.2 帧间编码)
相关笔记
- 帧间编码 — 用上时间冗余的那一类
- 预测编码 — 空间预测的一般原理
- I/P/B/IDR帧 — 帧内编码对应的帧类型
- 🎬 FFmpeg入门详解 · 索引