📄 一句话概括
视频能压这么狠,是因为里面有四类冗余——其中时间冗余最值钱:相邻两帧的差别通常不到 5%。
📝 本节和前面几节的关系
5.2 讲了视频怎么被打包,5.3 进入正题:它是怎么被压下去的。
一、四类冗余
空间冗余:同一帧里相邻像素的值很接近——可用帧内预测压。 时间冗余:相邻帧里同一位置的像素很接近——可用帧间预测压。 编码冗余:不同符号出现的概率不均——可用熵编码压。 视觉冗余:有些细节人眼分辨不出——可以量化时丢掉。
二、时间冗余为什么最值钱
因为它重复得最多:一秒 30 帧里,相邻两帧的变化通常不到 5%。 也就是说,95% 的像素在上下一帧里是同一个东西。 把相同的部分只存一次,省下来的就是大头——这就是视频能压到上百倍的根本原因。 4.2 里音频没有这么强的冗余,所以音频的压缩比天生低于视频。
三、两类编码的分工
帧内编码:只用当前帧自己的信息,可以独立解码(比如 I 帧)。 帧间编码:参考别的帧,压缩率高但不能独立解码(P 帧、B 帧)。 两者配合使用:关键的位置放 I 帧,其余尽量用帧间编码。
四、一个核心取舍
压缩的本质永远是一个取舍:压得越狠,依赖越多,出错的影响面也越大。 所以一段视频丢了几个包,在 I 帧附近恢复得快,在长 GOP 中间就会花屏一片。 理解了这一点,就能理解后面所有的编码参数为什么那样设。
五、动手 Demo:视频里到底有哪几种【冗余】
视频能被压这么狠,是因为里面重复的东西实在太多。
rows = [("空间冗余", "同一帧里相邻像素很像", "帧内预测"),
("时间冗余", "相邻帧里同一位置很像", "帧间预测、运动补偿"),
("编码冗余", "符号出现概率不均", "熵编码"),
("视觉冗余", "有些细节人眼看不到", "量化、丢高频")]
for a, b, c in rows:
print("%-8s %-22s %s" % (a, b, c))
实跑输出:
--------------------------------------------------------------------
视频里到底有哪几种【冗余】
--------------------------------------------------------------------
视频能被压这么狠,是因为里面重复的东西实在太多。
冗余类型 哪里重复 怎么压
---------------------------------------------------------
空间冗余 同一帧里相邻像素很像 帧内预测
时间冗余 相邻帧里同一位置很像 帧间预测、运动补偿
编码冗余 符号出现概率不均 熵编码
视觉冗余 有些细节人眼看不到 量化、丢高频
四类里**时间冗余最值钱**——
相邻两帧的差别通常不到 5%,**把相同的部分只存一次,省下的是大头**。
四类里时间冗余最值钱—— 相邻两帧的差别通常不到 5%,把相同的部分只存一次,省下的是大头。
30 秒实验
- 截取一段视频里相邻的两帧,对比它们的差别区域有多大。
- 这个差别区域,就是帧间编码真正要传的东西。
常见误区
- 以为压缩就是【把画面变模糊】。它先做的是去掉重复。
- 把帧内编码与帧间编码对立起来。两者是配合使用的。
自测三问(点开对答案)
1. 视频里有哪四类冗余? —— 空间冗余、时间冗余、编码冗余、视觉冗余。 2. 为什么时间冗余最值钱? —— 相邻帧差别通常不到 5%,重复的部分最多。 3. 帧内编码与帧间编码的分工是什么? —— 帧内可独立解码,帧间压缩率高但依赖别的帧。- ☐ 下一节(5.3.2 视频压缩)
相关笔记
- 视频压缩 — 这些冗余能压掉多少
- 色彩空间 — 一切压缩之前的那一次省
- 音频压缩 — 音频那边的对应章节
- 🎬 FFmpeg入门详解 · 索引