视频基础与编解码原理
大家好,我是你们这堂课的主讲。今天咱们聊聊视频编解码最底层的那些事儿。说实话,我见过太多人一上来就扎进 H.264、H.265 的细节里,结果连「视频信号到底是什么」都没搞明白。嗯,这就像盖楼不打地基,迟早要塌。
所以,咱们先把地基夯实了。这一章我会带着大家,从视频信号的本源开始,一步步走到编解码器的工作原理。放心,我不会堆砌公式,更多的是我这些年踩过的坑和总结的经验。
视频信号基础:从光到电再到数字
视频信号,说白了就是一系列快速播放的静态图像。人眼有个特性叫「视觉暂留」,只要每秒播放超过 24 帧,你就会觉得画面是连续运动的。这个原理,一百多年前的电影就玩明白了。
但到了数字时代,事情变得复杂了。摄像机把光信号转换成电信号,再通过模数转换变成数字信号。这里有个关键参数——分辨率。我记得刚入行时,项目里用的是 720p 的摄像头,大家都觉得够清晰了。现在呢?4K 都快成标配了。
核心概念:视频信号的本质是「时间维度上的图像序列」。每一帧图像由像素矩阵构成,每个像素包含亮度与色彩信息。
还有一个容易忽略的点——帧率。电影是 24fps,电视是 25fps(PAL)或 30fps(NTSC)。我做过一个直播项目,客户非要用 60fps 推流,结果带宽扛不住,画面卡成幻灯片。后来我建议降到 30fps,配合动态补偿,效果反而更好。你想想看,有时候不是越高越好,得看场景。
色彩空间:为什么你的视频颜色不对?
色彩空间这个话题,我敢说 90% 的初学者都栽过跟头。我自己就吃过亏——有一次做视频拼接,两个源文件一个用 BT.709,一个用 BT.2020,结果拼出来的画面颜色完全对不上。排查了整整两天,最后发现是色彩空间没统一。
最常见的色彩空间是 RGB 和 YUV。RGB 是给显示器看的,YUV 是给编解码器用的。为什么?因为人眼对亮度更敏感,对色彩没那么敏感。YUV 把亮度(Y)和色度(U、V)分开,就可以在色度上做「降采样」,压缩数据量。
| 色彩空间 | 用途 | 特点 |
|---|---|---|
| RGB | 显示、图像处理 | 三通道等权重,数据量大 |
| YUV 4:4:4 | 专业制作 | 无压缩,质量最高 |
| YUV 4:2:0 | 消费级视频 | 色度压缩一半,最常用 |
我的经验:做视频处理时,第一步永远先确认色彩空间。用 ffprobe 看一眼,比什么都靠谱。我曾经因为没做这一步,导致整个渲染管线重写,那叫一个惨。
这里有个避坑指南——色彩范围。YUV 有「有限范围」(16-235)和「全范围」(0-255)之分。如果你把有限范围的视频当成全范围去处理,黑色会发灰,白色会发暗。嗯,这个问题在 HDR 视频里尤其常见。
视频压缩的必要性:不压缩,你根本存不下
咱们算笔账。一段 1080p、30fps、时长 2 小时的电影,不压缩的话有多大?
分辨率:1920 × 1080 = 2,073,600 像素
每像素:RGB 各 8 位 = 24 位 = 3 字节
每帧:2,073,600 × 3 = 6.22 MB
每秒:6.22 × 30 = 186.6 MB
两小时:186.6 × 7200 = 1,343,520 MB ≈ 1.28 TB
1.28TB!你想想看,一部电影就占掉你一块硬盘。这还不算 4K、8K。所以,视频压缩不是「要不要」的问题,而是「必须做」的问题。
压缩的原理,说白了就是去掉「冗余」。视频里有三种冗余:
- 空间冗余:同一帧里,相邻像素往往很相似。比如蓝天,一大片都是蓝色。
- 时间冗余:相邻帧之间,变化很小。比如背景,可能几十帧都不动。
- 视觉冗余:人眼看不到的细节,可以丢掉。比如高频纹理,你其实看不太清。
我做过一个监控项目,场景是停车场,画面几乎不动。用 H.264 压缩,码率压到 500kbps 都看不出区别。但换成球赛直播,同样的码率就糊成一团。为什么?因为运动场景的时间冗余少,压缩效率自然低。
注意:压缩不是无损的。有损压缩会丢掉信息,码率越低,画质越差。别指望用 100kbps 的码率做出 4K 画质,那是不可能的。我曾经被客户这样要求过,最后只能苦笑。
编解码器工作原理:编码器在做什么?
编解码器,就是一套「压缩-解压」的算法。编码器负责把原始视频压小,解码器负责把它还原。常见的编解码器有 H.264、H.265、VP9、AV1 等。
编码器的工作流程,我习惯把它分成四步:
- 预测:用已经编码的帧,预测当前帧的内容。帧内预测用本帧的像素,帧间预测用前后帧。
- 变换:把预测残差从像素域变换到频率域。最常用的是 DCT(离散余弦变换)。
- 量化:丢掉不重要的频率分量。这是有损压缩的核心步骤。
- 熵编码:用更少的比特表示常见的数据。比如 CAVLC、CABAC。
我举个例子。假设你有一张纯蓝色的图片,所有像素都是 (0, 0, 255)。编码器会怎么做?
- 预测:帧内预测发现,每个像素都和左边的一样,残差为 0。
- 变换:残差全是 0,DCT 后也全是 0。
- 量化:0 还是 0。
- 熵编码:用一个「全零」的标志位就搞定了。
你看,一张几 MB 的图片,压缩后可能只有几十字节。这就是编码器的威力。
关键点:编码器的核心是「预测 + 变换 + 量化 + 熵编码」。其中量化是唯一的有损步骤,也是控制码率和画质的关键。
说到量化,我得多说两句。量化参数(QP)越小,画质越好,码率越高。QP 越大,画质越差,码率越低。H.264 的 QP 范围是 0-51,0 是几乎无损,51 是糊成一团。我一般建议 QP 设在 18-28 之间,具体看场景。
我曾经做过一个视频会议项目,为了省带宽,把 QP 设到了 35。结果画面全是块状噪声,人脸都看不清。后来我改成动态 QP——静止时用低 QP,运动时用高 QP。效果好了很多,带宽也没增加多少。
总结一下
这一章我们聊了视频信号的基础、色彩空间的坑、压缩的必要性,以及编解码器的工作原理。说白了,视频编解码就是「在画质和码率之间找平衡」。没有完美的编码器,只有适合场景的编码器。
下一章,我会带大家深入 H.264 的细节,看看它到底是怎么做到「又小又清晰」的。到时候我会分享一些实际项目中的调优经验,保证干货满满。
课后建议:找一段视频,用 ffmpeg 转码,试试不同的 QP 值。看看画质和码率的变化。亲手做一遍,比看十遍文章都管用。