1. 课程导入
各位好,我是老周。做音视频这行十几年了,每次面试新人,我第一个问题就是:「你说说,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 图,把整个编码流程串起来了。我建议你仔细看看,尤其是箭头指向,代表了数据流动的方向。
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。 选型之前,先搞清楚你的场景、你的平台、你的质量要求。