1. 编解码基础回顾:从 H.264 到 H.266 的演进之路
各位同学好,我是老张。做视频编解码这行十几年了,踩过的坑比吃过的盐还多。今天咱们先不急着调参数,先把地基打牢。你想想看,连编码器怎么工作的都不知道,调优就是瞎调。
这一章,我带大家快速过一遍视频编码标准的发展史、核心流程和码率控制的基本概念。嗯,都是干货,没有废话。
1.1 视频编码标准演进:H.264 → H.265 → H.266
视频编码标准,说白了就是一套压缩视频的「通用语言」。不同厂商的设备要能互通,就得遵守同一套规则。我最早做项目时用的是 MPEG-2,那会儿一个高清视频动不动几十个 G,现在想想真是原始社会。
目前主流的标准有三个,我列个表大家对比着看:
| 标准 | 发布年份 | 核心目标 | 压缩率提升(相对上一代) | 典型应用 |
|---|---|---|---|---|
| H.264/AVC | 2003 | 替代 MPEG-2,支持网络传输 | — | 视频会议、蓝光、YouTube 早期 |
| H.265/HEVC | 2013 | 支持 4K/8K,降低带宽 | 约 50% | 4K 流媒体、HEIF 图片、直播 |
| H.266/VVC | 2020 | 面向 8K/VR/云游戏 | 约 30-50% | 8K 电视、云渲染、实时通信 |
关键认知:每一代标准都在「同等画质下降低码率」这条路上死磕。H.265 比 H.264 省一半带宽,H.266 又在 H.265 基础上再省 30-50%。但代价是计算复杂度翻倍——你调优时得在「压缩率」和「编码速度」之间找平衡。
我个人习惯是:存量项目用 H.264,新项目直接上 H.265,只有对带宽极度敏感的场景(比如 8K 直播)才考虑 H.266。为什么?因为 H.266 的编码器现在还不太成熟,我在一个云游戏项目里试过,编码延迟比 H.265 高了将近一倍,用户都骂娘了。
1.2 编解码核心流程:预测 → 变换 → 量化 → 熵编码
所有视频编码器,不管哪一代,核心流程都是这四步。我画了一张图,大家先看个全貌:
这四步,每一步都有调优空间。我一个个说。
1.2.1 预测:去掉冗余
视频为什么能压缩?因为相邻像素、相邻帧之间高度相关。预测就是利用这种相关性,只编码「预测值和真实值的差」(残差)。
- 帧内预测:用当前帧已编码的像素,预测当前块。H.264 有 9 种模式,H.265 有 35 种,H.266 直接干到 67 种。模式越多,预测越准,但编码器要算的也越多。
- 帧间预测:用前面或后面的帧做参考,通过运动矢量找到最匹配的块。我调优时最常碰到的坑就是运动搜索范围设太大,编码时间暴涨,画质却没提升多少。
调优小技巧:如果你做的是实时编码(比如直播),帧间预测的搜索范围别超过 64x64。我曾经为了省带宽把搜索范围开到 256x256,结果编码器卡得跟幻灯片似的,被产品经理追着骂了三天。
1.2.2 变换:从像素域到频域
预测完得到残差块,接下来做变换。最常用的是 DCT(离散余弦变换)。为什么做变换?因为残差在像素域里看着乱,但转到频域后,能量都集中在低频区域(左上角),高频部分接近零。这样量化时就能扔掉高频,几乎不影响主观画质。
H.265 引入了 DST(离散正弦变换)用于帧内预测的 4x4 块,效果更好。H.266 更进一步,支持多种变换核组合。嗯,这些细节你暂时不用全记住,知道「变换是为了让能量集中」就够了。
1.2.3 量化:有损压缩的核心
量化,说白了就是「除一下再取整」。变换后的系数除以一个量化步长(QP),小数部分直接扔掉。QP 越大,丢得越多,码率越低,画质越差。
这是调优的重中之重。我见过太多新手一上来就把 QP 设成 0(无损模式),结果码率爆炸。也有为了省带宽把 QP 拉到 50 以上的,画面全是马赛克。
注意:量化是编码器中唯一不可逆的步骤。一旦量化,信息就永久丢失了。所以调优时,QP 的选择要慎之又慎。我的经验是:先设一个中等 QP(比如 28),然后根据实际码率和画质微调,不要一上来就追求极致压缩。
1.2.4 熵编码:最后的无损压缩
量化后的系数还有很多统计冗余,熵编码就是去掉这些冗余。H.264 用 CAVLC(上下文自适应变长编码)和 CABAC(上下文自适应二进制算术编码),H.265/H.266 只用 CABAC。
CABAC 压缩率比 CAVLC 高 10-15%,但计算复杂度也高。我在一个嵌入式项目里,CPU 跑不动 CABAC,只能退回到 CAVLC,码率虽然高了点,但至少能实时编码。
1.3 码率控制基础概念
码率控制,就是决定「每一帧该分配多少比特」。目标是在带宽限制下,让画质尽可能好。常用的模式有三种:
| 模式 | 全称 | 特点 | 适用场景 |
|---|---|---|---|
| CBR | 恒定码率 | 码率波动小,延迟低 | 直播、视频会议 |
| VBR | 可变码率 | 码率波动大,画质稳定 | 点播、本地存储 |
| CRF | 恒定质量 | 固定 QP,码率随内容变化 | 离线转码、归档 |
我个人最常用的是 CRF 模式。为什么?因为它简单粗暴——你设一个质量值(比如 23),编码器自动调整 QP 来维持这个质量。码率高就高,低就低,你不用操心。但直播场景不行,带宽是固定的,码率不能乱跳,这时候就得用 CBR。
核心原则:码率控制没有银弹。CBR 保带宽,VBR 保画质,CRF 保质量。调优的第一步,就是搞清楚你的场景最在意什么。