1. Codec 基础概念:到底什么是 Codec?

各位好,我是老周。做音视频这行十几年了,每次面试新人,我第一个问题就是:「你说说,Codec 到底是什么?」

答案五花八门。有人说是编码器,有人说是压缩算法。其实都对,但都不全。

Codec 这个词,是 编码器(Encoder) 和 解码器(Decoder) 的合成词。说白了,它就是一个「翻译官」——把原始的音视频数据,翻译成更小的文件;等你要播放的时候,再翻译回来。

一句话总结:Codec = 压缩 + 解压缩。没有它,一部 2 小时的 4K 电影能占满你整个硬盘。

1.1 为什么需要压缩?

我给你算笔账。一帧 1920×1080 的 RGB 图像,每个像素 3 个字节,一帧就是 1920×1080×3 ≈ 6.2 MB。每秒 30 帧,就是 186 MB/s。一部 90 分钟的电影,算下来接近 1 TB。

这还只是视频。再加上 5.1 声道的音频,每秒 1.5 Mbps 左右。你想想看,没有压缩,流媒体根本不可能存在。

所以,Codec 的核心使命就两个:把文件变小,尽量保持质量。

1.2 音视频编码的核心原理

编码这件事,听起来玄乎,其实底层逻辑很朴素。我把它拆成三个层面来讲。

1.2.1 空间冗余:同一帧里的重复信息

你看一张蓝天白云的照片。天空大部分是蓝色,像素值非常接近。如果每个像素都单独存,太浪费了。

编码器会怎么做?它把图像分成小块,比如 16×16 的宏块。如果一块里全是差不多的蓝色,它只存一个「基准值」和「差异值」。这叫 帧内预测。

我在项目中遇到过,有些新手调参数,把帧内预测关掉了,结果码率直接翻倍。嗯,这里要注意:帧内预测是基础,不能省。

1.2.2 时间冗余:前后帧之间的重复信息

视频是一连串的图片。相邻两帧之间,变化其实很小。比如一个人坐在那里说话,背景几乎不动。

编码器只存第一帧的完整画面(I 帧),后面的帧只存「变化的部分」。这叫 帧间预测。变化的部分用运动矢量来描述——说白了,就是告诉解码器:「这块画面往右挪了 3 个像素。」

我习惯把 I 帧比作「关键帧」,P 帧和 B 帧是「差值帧」。P 帧参考前面的帧,B 帧参考前后两帧。B 帧压缩率最高,但计算量也最大。

1.2.3 心理视觉冗余:人眼不敏感的信息

人眼对亮度敏感,对颜色不敏感。对高频细节也不敏感。编码器利用这一点,把那些「人眼看不出来」的信息丢掉。

这就是 量化 的由来。量化越狠,文件越小,但画质损失也越大。我经常跟团队说:「量化参数(QP)是双刃剑,调小了文件大,调大了画面糊。」

我的经验: 做直播的时候,QP 可以稍微高一点(25-30),因为运动场景多,人眼来不及细看。做电影存档,QP 要低(18-22),保证细节不丢失。

1.3 有损编码 vs 无损编码

这是 Codec 世界里最根本的分水岭。我直接上表格,对比着看更清楚。

对比维度 有损编码 无损编码
压缩率 高(10:1 ~ 200:1) 低(2:1 ~ 3:1)
质量 有损失,人眼可接受 完全还原,无损失
典型应用 H.264、H.265、AAC、MP3 FLAC、ALAC、PNG、GIF
适用场景 流媒体、视频通话、存储 专业音频制作、医学影像
计算复杂度 高(需要大量运算) 低(算法相对简单)

1.3.1 有损编码:用「看不见的细节」换空间

有损编码的核心思想是:丢掉那些不影响主观体验的信息。

比如视频里的高频纹理、音频里超出人耳范围的频率。丢掉了,人眼/人耳几乎察觉不到。但文件大小能缩小几十倍。

我举个例子。MP3 音频编码,会把 20kHz 以上的频率全部切掉。人耳听不到,但文件小了很多。这就是有损。

避坑指南: 我曾经在一个医疗影像项目里,有人想用 H.264 压缩 X 光片。我赶紧叫停了。医疗影像必须无损,任何细节丢失都可能影响诊断。有损编码不是万能的,选型要看场景。

1.3.2 无损编码:一个比特都不少

无损编码不丢任何信息。它只利用数据本身的统计特性来压缩。

比如一段音频,连续 100 个采样点都是静音(值全为 0)。无损编码不会存 100 个 0,而是存「100 个 0」。这叫游程编码。

再比如,用更短的码字表示出现频率高的数据。这叫霍夫曼编码。

无损压缩的极限,取决于数据的熵。说白了,就是数据本身的「混乱程度」。越有规律的数据,压缩率越高。

1.4 一张图看懂 Codec 核心逻辑

下面这张 SVG 图,把整个编码流程串起来了。我建议你仔细看看,尤其是箭头指向,代表了数据流动的方向。

Codec 编码核心流程 原始音视频 空间冗余消除 时间冗余消除 量化 熵编码(无损) 压缩码流 说明: 1. 空间冗余:帧内预测,利用同一帧内像素的相似性 2. 时间冗余:帧间预测,利用前后帧的相似性(运动估计) 3. 量化:有损压缩的核心,丢掉人眼不敏感的高频信息

1.5 选 Codec 之前,先搞清楚这些

很多新手一上来就问:「H.264 和 H.265 哪个好?」

我的回答是:先搞清楚你的场景。

  • 实时通信(视频通话):延迟要低,选 H.264 或 VP8。计算复杂度低,编码快。
  • 点播流媒体(Netflix、B站):压缩率优先,选 H.265 或 AV1。编码慢没关系,可以离线做。
  • 专业制作(剪辑、调色):选 ProRes 或 DNxHD。这些是中间编码,质量高,但文件大。
  • 音频:音乐流媒体用 AAC,无损存档用 FLAC,语音用 Opus。

一个小技巧: 如果你不确定选哪个 Codec,先看你的目标平台。iOS 设备对 H.264/H.265 支持最好,Android 设备对 VP9 支持不错,Web 端用 H.264 最保险。

1.6 本章小结

这一章我们聊了 Codec 的本质——压缩与解压缩。核心原理就三个:空间冗余、时间冗余、心理视觉冗余。有损编码和无损编码的区别,说白了就是「要不要丢信息」。

记住一句话:没有最好的 Codec,只有最适合的 Codec。 选型之前,先搞清楚你的场景、你的平台、你的质量要求。