视频冗余与压缩思想:空间冗余、时间冗余、视觉冗余、统计冗余,有损与无损压缩的取舍

做视频编码这么多年,我经常被问到一句话:「视频到底是怎么压小的?」

很多人以为编码就是「把图片变小」。其实不对。视频压缩的核心,是干掉冗余。说白了,就是去掉那些「你其实不需要存、不需要传」的信息。

我刚开始接触 H.264 的时候,总觉得编码器像个黑盒子。后来自己动手调码控、做优化,才慢慢摸清楚——视频里藏着四种冗余。把这四种冗余吃透了,你再看编码标准,就跟看地图一样清晰。

核心观点:视频压缩的本质 = 消除冗余。冗余越少,码率越低。但冗余消除过头,画质就崩了。这就是「有损 vs 无损」的取舍问题。

4.1 空间冗余:相邻像素长得太像了

你想想看,一张蓝天白云的图,天空区域全是蓝色。每个像素都存一遍 RGB 值,是不是太浪费了?

这就是空间冗余——同一帧内,相邻像素之间的相关性太强了。

我在项目中遇到过一件事:有个客户非要传 4K 无损截图,一张图 20 多 MB。我说你换个 PNG 试试,结果压到 3MB。为什么?PNG 就是利用了空间冗余——它用预测 + 熵编码,把重复的像素信息压缩掉了。

在 H.264/H.265 里,消除空间冗余主要靠:

  • 帧内预测:用周围已编码的像素,预测当前块的值。只存预测残差,而不是原始像素。
  • 变换编码:DCT 或 DST,把空间域的像素能量集中到低频系数上,高频部分直接丢掉。

我的习惯:调帧内预测模式时,我会先看图像纹理复杂度。平坦区域用 DC 模式就够了,纹理复杂的地方才需要角度预测。别一上来就全开,码率会炸。

4.2 时间冗余:前后帧几乎没变

视频是一连串的帧。你拍一段 30fps 的视频,第 1 帧和第 2 帧之间,可能就动了一根头发丝。剩下的 99% 区域,一模一样。

这就是时间冗余——相邻帧之间的内容高度相似。

消除时间冗余,靠的是运动估计与运动补偿。编码器会找当前块在参考帧里的最佳匹配位置,然后只存一个运动矢量 + 残差。

我记得有一次做低码率直播优化,场景是固定机位拍一个人讲话。背景完全不动,只有嘴在动。这种情况下,时间冗余特别大。我直接把 GOP 拉长到 250 帧,P 帧间隔加大,码率直接砍了一半,画质几乎没变。

避坑指南:我曾经在运动剧烈的场景(比如球赛、飙车)里,把参考帧数设得太多。结果编码器花大量时间在搜索上,速度慢得离谱,码率反而没降多少。运动剧烈的场景,时间冗余本来就少,别指望它能压太多。

4.3 视觉冗余:人眼不是完美的传感器

人眼对亮度敏感,对颜色不敏感。对低频敏感,对高频不敏感。对静止区域敏感,对运动区域不敏感。

这就是视觉冗余——那些你眼睛根本看不出来的细节,存它干嘛?

H.264 和 H.265 里,消除视觉冗余的手段包括:

  • 色度子采样:4:2:0 比 4:4:4 少存一半的色度信息,但人眼看不出区别。
  • 量化:DCT 系数除以量化步长,高频系数直接变零。QP 越大,丢得越多。
  • 去块效应滤波 / SAO:平滑掉块边界,让视觉上更舒服。

我做过一个实验:同一段视频,分别用 QP=20 和 QP=40 编码。QP=40 的码率只有 QP=20 的 1/5,但大部分人看不出明显区别。为什么?因为 QP=40 丢掉的高频细节,人眼本来就不敏感。

关键认知:视觉冗余是「有损压缩」的理论基础。你丢掉的东西,人眼根本看不见。所以别纠结「无损才是好的」,在视频领域,有损才是常态。

4.4 统计冗余:符号出现的概率不均衡

编码后的数据,有些符号出现频率高,有些出现频率低。如果给高频符号分配短码字,低频符号分配长码字,平均码长就降下来了。

这就是统计冗余——也叫信息熵冗余。

消除统计冗余,靠的是熵编码:

  • CAVLC(H.264 的上下文自适应变长编码)
  • CABAC(上下文自适应二进制算术编码)

CABAC 比 CAVLC 压缩率高 10%-15%,但计算量也大。我在做移动端编码器时,低端芯片我强制用 CAVLC,高端芯片才开 CABAC。这就是工程上的取舍。

我的建议:如果你在做编码器优化,先看熵编码模块。很多时候,CABAC 的概率模型没调好,压缩率还不如 CAVLC。别迷信「CABAC 一定更好」。

4.5 有损 vs 无损:没有完美的压缩

无损压缩,比如 ZIP、PNG、FLAC,压缩率通常只有 2:1 到 3:1。有损压缩,比如 JPEG、MP3、H.264,压缩率可以到 50:1 甚至 100:1。

为什么差距这么大?因为无损压缩只能消除统计冗余和部分空间冗余。而有损压缩,把视觉冗余和时间冗余也干掉了。

压缩类型 消除的冗余 典型压缩率 适用场景
无损 统计冗余 + 部分空间冗余 2:1 ~ 3:1 医疗影像、存档、专业调色
有损 空间 + 时间 + 视觉 + 统计冗余 20:1 ~ 100:1 流媒体、视频通话、短视频

我在做视频云转码时,经常遇到客户要求「无损」。我说可以,但码率会很高,带宽扛不住。最后他们都会妥协——因为人眼真的看不出那点区别。

避坑指南:我曾经在一个医疗影像项目里,坚持用有损压缩,结果被客户投诉了。医疗影像有法律要求,必须无损。所以,有损还是无损,不是技术问题,是业务问题。先搞清楚场景,再决定压缩策略。

4.6 四种冗余的关系:一张图看懂

下面这张图,是我自己画的知识框架。四种冗余不是孤立的,它们层层叠加,共同决定了视频的压缩潜力。

视频冗余与压缩思想框架图 视频冗余与压缩思想框架 原始视频(大量冗余) 空间冗余 时间冗余 视觉冗余 统计冗余 帧内预测 + DCT 运动估计 + 补偿 量化 + 子采样 CAVLC / CABAC 压缩后的码流(冗余大幅减少) 有损压缩 = 空间 + 时间 + 视觉 + 统计冗余全部消除 | 无损压缩 = 仅消除统计冗余 + 部分空间冗余

4.7 工程中的取舍:别追求完美

做视频编码,本质上就是在码率、画质、复杂度三个维度上做权衡。你不可能同时做到「码率最低、画质最好、速度最快」。

我个人的经验是:

  • 直播场景:优先保延迟和码率,画质可以牺牲一点。视觉冗余大胆丢。
  • 点播场景:优先保画质,码率可以高一点。时间冗余尽量多消除。
  • 存档场景:如果带宽不是问题,用无损或近无损。统计冗余压到底就行。

一句话总结:视频压缩不是「把数据变小」,而是「把冗余去掉」。四种冗余,四种手段。有损还是无损,看场景,别纠结。