2. 多媒体流基础
说到视频编码器选型,我见过太多团队一上来就追新——「AV1 压缩率最高,必须上!」结果编码耗时翻了几倍,播放端解码还卡成幻灯片。说白了,选编码器不是选跑车,是选合脚的鞋。
这一章咱们就掰开揉碎,把 H.264、H.265、AV1 这三兄弟的底裤扒干净。我会结合自己踩过的坑,告诉你什么场景该用什么,硬件编码和软件编码到底怎么取舍,以及参数调优到底调什么。
2.1 编码效率对比:压缩率与计算代价
先看一组我实际压测过的数据。测试素材是 1080p 24fps 的《地球脉动》片段,目标码率 2Mbps,用 x264/x265/SVT-AV1 的 medium preset 做软件编码。
| 编码器 | 码率节省(相对 H.264) | 编码速度(fps) | 解码复杂度 | 硬件支持 |
|---|---|---|---|---|
| H.264 (x264) | 基准 | 120-150 | 低 | 几乎所有设备 |
| H.265 (x265) | 35-50% | 30-50 | 中 | 2016年后设备 |
| AV1 (SVT-AV1) | 50-65% | 5-15 | 高 | 2020年后旗舰机 |
看到没?AV1 压缩率确实漂亮,但编码速度是 H.264 的十分之一。我在做短视频平台时试过全量转 AV1,结果编码集群的 CPU 直接拉满,任务排队排到天荒地老。后来只对 Top 5% 的热门视频做 AV1 编码,其余用 H.265,成本降了 70%。
2.2 硬件编码 vs 软件编码:取舍之道
这个问题我当年也纠结过。硬件编码快,但画质差;软件编码画质好,但慢得像蜗牛。到底怎么选?
先说说硬件编码。Intel QuickSync、NVIDIA NVENC、Apple VideoToolbox 这些,本质上是芯片上固化的专用电路。我测过 NVENC 的 H.265,在同等码率下比 x265 medium preset 的 VMAF 分低 3-5 分。但它的编码速度能到 300+ fps,延迟只有几毫秒。
软件编码呢?x265 的 placebo preset 能压出极致画质,但编码一帧要算半天。说白了,软件编码是用时间换质量,硬件编码是用质量换速度。
| 维度 | 硬件编码 | 软件编码 |
|---|---|---|
| 编码速度 | 极快(300+ fps) | 慢(10-150 fps) |
| 画质效率 | 中等 | 优秀 |
| 延迟 | 低(<10ms) | 高(50-500ms) |
| 灵活性 | 参数有限 | 完全可控 |
| 适用场景 | 直播、实时通信 | 点播、离线转码 |
2.3 编码参数调优实战
调参数这事儿,说白了就是找平衡点。我习惯从三个维度入手:码率控制、预设级别、GOP 结构。
2.3.1 码率控制模式
CBR、VBR、CRF 这三个概念,你肯定听过。但什么时候用哪个?
- CBR(恒定码率):码率稳定,适合直播推流。但场景切换时画质会崩。
- VBR(可变码率):码率波动,适合点播。2-pass VBR 能精准控制目标码率,画质也稳。
- CRF(恒定质量):固定画质,码率自动调整。适合离线归档,但码率不可控。
我个人习惯:直播用 CBR,点播用 2-pass VBR,归档用 CRF 18-22。
2.3.2 预设级别与速度控制
x264 和 x265 的 preset 从 ultrafast 到 placebo,速度差了上百倍。我做过一个测试:
# x265 不同 preset 的编码效率对比(1080p 源,目标码率 3Mbps)
ultrafast: 450 fps, VMAF 82.3
medium: 85 fps, VMAF 88.7
slow: 35 fps, VMAF 90.1
veryslow: 12 fps, VMAF 91.2
placebo: 4 fps, VMAF 91.5
看到没?从 slow 到 veryslow,编码时间翻了 3 倍,VMAF 只涨了 1 分。从 veryslow 到 placebo,时间再翻 3 倍,VMAF 只涨 0.3 分。所以我的经验是——点播场景用 slow 或 medium 就够了,再慢就是浪费电。
--no-sao --no-strong-intra-smoothing 这两个参数。我在多个项目里验证过,能在几乎不损失画质的情况下提速 15-20%。
2.3.3 GOP 结构与 B 帧策略
GOP 大小直接影响编码效率和随机访问能力。我见过有人把 GOP 设成 250 帧,结果用户拖动进度条要等 5 秒才能出图。
- 直播场景:GOP 2-4 秒(48-96 帧),B 帧尽量少用,降低延迟。
- 点播场景:GOP 4-6 秒(96-144 帧),开 B 帧(3-5 个连续 B 帧),压缩率能提升 10-15%。
- 短视频场景:GOP 1-2 秒,方便快速起播和滑动播放。
嗯,这里要注意——B 帧虽然能省码率,但解码器需要缓存多帧,低端设备可能会卡。我在做海外市场时,发现很多东南亚用户的手机是三四年前的机型,解码 B 帧时掉帧严重。后来把 B 帧数从 5 降到 2,问题就解决了。
2.3.4 实战参数模板
下面是我常用的几个参数模板,直接拿去用:
# 直播 H.264 硬件编码(NVENC)
ffmpeg -i input.mp4 -c:v h264_nvenc \
-preset p4 -tune ll -rc cbr \
-b:v 2M -minrate 2M -maxrate 2M \
-g 48 -bf 0 -profile:v high \
-c:a aac -b:a 128k output.ts
# 点播 H.265 软件编码(x265)
ffmpeg -i input.mp4 -c:v libx265 \
-preset slow -x265-params \
"crf=22:no-sao=1:no-strong-intra-smoothing=1:bframes=5:keyint=120" \
-c:a libfdk_aac -b:a 128k output.mp4
# 归档 AV1 软件编码(SVT-AV1)
ffmpeg -i input.mp4 -c:v libsvtav1 \
-preset 6 -crf 30 -g 120 \
-svtav1-params "enable-overlays=1:enable-tf=1" \
-c:a libopus -b:a 96k output.mkv
2.4 选型决策清单
最后,给你一个我每次做编码器选型时都会过的清单:
- 用户设备分布:如果 80% 用户还在用 iPhone 8 之前的设备,别上 AV1。
- 带宽成本:CDN 带宽贵还是编码集群贵?算 ROI。
- 实时性要求:延迟容忍度是多少?超过 100ms 用户就骂娘?上硬件编码。
- 内容类型:游戏直播(高动态)和访谈节目(低动态)的参数完全不同。
- 编码预算:你愿意为每路流花多少编码时间?1x 实时?10x 实时?
- 解码兼容性:要不要考虑 WebRTC、HLS、DASH 等协议的解码限制?
我记得有一次帮一个教育平台做选型,他们坚持要用 AV1,说「技术要超前」。我让他们先跑个 A/B 测试——结果 AV1 编码的课程在老旧平板上花屏率高达 12%,而 H.264 只有 0.3%。最后他们乖乖切回 H.264,只在 App 端对旗舰机型提供 AV1 选项。
说白了,编码器选型不是技术竞赛,是工程决策。选对了,用户爽、成本低、运维省心。选错了,你就是在给运维团队和用户添堵。