2. 多媒体流基础

说到视频编码器选型,我见过太多团队一上来就追新——「AV1 压缩率最高,必须上!」结果编码耗时翻了几倍,播放端解码还卡成幻灯片。说白了,选编码器不是选跑车,是选合脚的鞋。

这一章咱们就掰开揉碎,把 H.264、H.265、AV1 这三兄弟的底裤扒干净。我会结合自己踩过的坑,告诉你什么场景该用什么,硬件编码和软件编码到底怎么取舍,以及参数调优到底调什么。

核心观点:没有最好的编码器,只有最适合你业务场景的编码器。选型前先问自己三个问题——我的用户设备是什么?我的带宽成本是多少?我的实时性要求有多高?
编码器选型决策树 业务场景分析 实时通信 / 直播 点播 / 存储归档 H.264 硬件编码 低延迟预设 + B帧限制 H.265 / AV1 软件编码 2-pass VBR + 慢速预设 💡 我的经验: • 直播场景: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%。

我的建议:别被压缩率的数字冲昏头。AV1 省下来的带宽成本,能不能覆盖编码集群的硬件投入?算清楚这笔账再动手。

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)
灵活性 参数有限 完全可控
适用场景 直播、实时通信 点播、离线转码
避坑指南:我曾经在直播场景里用软件编码做 4K 推流,结果编码延迟飙到 300ms,主播和观众之间差了半句话。后来切回 NVENC 硬件编码,延迟降到 8ms,画质损失肉眼几乎看不出来。记住——直播场景,延迟是第一优先级。

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 就够了,再慢就是浪费电。

调优技巧:如果你用 x265,试试 --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
关键提醒:参数模板只是起点。每个视频内容不同,最优参数也不同。我习惯用 VMAF 做自动化调参——写个脚本遍历 preset、crf、bframes 的组合,选 VMAF 最高且码率达标的那组参数。别手动试,累死人。

2.4 选型决策清单

最后,给你一个我每次做编码器选型时都会过的清单:

  1. 用户设备分布:如果 80% 用户还在用 iPhone 8 之前的设备,别上 AV1。
  2. 带宽成本:CDN 带宽贵还是编码集群贵?算 ROI。
  3. 实时性要求:延迟容忍度是多少?超过 100ms 用户就骂娘?上硬件编码。
  4. 内容类型:游戏直播(高动态)和访谈节目(低动态)的参数完全不同。
  5. 编码预算:你愿意为每路流花多少编码时间?1x 实时?10x 实时?
  6. 解码兼容性:要不要考虑 WebRTC、HLS、DASH 等协议的解码限制?

我记得有一次帮一个教育平台做选型,他们坚持要用 AV1,说「技术要超前」。我让他们先跑个 A/B 测试——结果 AV1 编码的课程在老旧平板上花屏率高达 12%,而 H.264 只有 0.3%。最后他们乖乖切回 H.264,只在 App 端对旗舰机型提供 AV1 选项。

说白了,编码器选型不是技术竞赛,是工程决策。选对了,用户爽、成本低、运维省心。选错了,你就是在给运维团队和用户添堵。