8 月 4 日,FFmpeg 9.0 正式发布,代号 "Lei"。
版本号从 8.1 跳到 9.0,属于 major release,意味着破坏性变更和一批新特性。距离 8.1 发布大约 4 个月。但这个版本最值得注意的,反而不是那些新编解码器——而是 DNN 后端的扩展、NVENC 旧选项的清除,以及版本代号背后的那个人。
代号 "Lei":不是随便起的
FFmpeg 用物理学家/工程师的名字命名版本:Heaviside、Riemann、Rao、Hoare、Huffman、Péter……这次轮到 "Lei"——纪念中国开发者雷霄骅(Lei Xiaohua)。
雷霄骅是《FFmpeg 从入门到精通》的作者,中国传媒大学毕业生,国内 FFmpeg 技术的早期传播者。他 2020 年意外离世,年仅 30 岁出头。FFmpeg 社区用一次 major release 的代号记住了他。
对一个开源项目来说,用一位中国开发者命名主版本,在 FFmpeg 历史上是第一次。这比任何新功能都更有分量。
Changelog 里值得盯的 8 件事
9.0 的 Changelog 不算长,但信息密度高。我按"影响面"排个序:
1. ONNX Runtime DNN 后端 + GPU 执行提供程序
这是 9.0 最重的一块。FFmpeg 的 DNN 模块(libavfilter/dnn)此前主要支持 TensorFlow 后端,9.0 加入 ONNX Runtime 后端,且支持 GPU execution provider。
意义在哪?FFmpeg 滤镜链里跑 DNN 推理(超分、去噪、目标检测),之前基本是 CPU 跑 ONNX 或走 TF。现在 ONNX Runtime + GPU EP 意味着:dnndetect、dnn_classify、dnn_processing 这些滤镜可以直接调用 GPU 推理,不用自己拼 TensorRT 管线。
用法大致是:
ffmpeg -i in.mp4 -vf "dnn_processing=dnn_backend=onnx:model=model.onnx:input=x:output=y" out.mp4
GPU EP 的配置项(providers、device_id 等)在 dnn_processing 滤镜选项里暴露。要启用 CUDA EP,编译时 --enable-libonnxruntime 之外还要让 FFmpeg 找到带 GPU 支持的 ORT 库,运行时指定:
-vf "dnn_processing=dnn_backend=onnx:model=model.onnx:input=x:output=y:options=providers=CUDAExecutionProvider:device_id=0"
对做实时视频处理的场景,这是把 FFmpeg 从"转码工具"推向"AI 处理管线"的一步——以前超分/去噪要在外部服务里单独跑一次模型,现在 -vf 链上直接串进去,和 scale、fps 这些传统滤镜平级。
2. Dolby Vision 多层 HEVC 拆分 bitstream filter
dvbsf 家族新增的 bitstream filter,能把 Dolby Vision 双层 HEVC 拆成独立的 base layer + enhancement layer。
这对做 HDR 内容分发的人很实用:双层 Dolby Vision(BL+EL+RPU)在部分播放链路上只认单层,拆开后可以单独转码 base layer、单独处理 enhancement layer,再重新封装。以前要用外部工具(dolby_vision 相关脚本)预处理,现在滤镜链里直接搞定:
ffmpeg -i dv_layer_hevc.mkv \
-bsf:v hevc_dv_splitter=output=base -c:v copy base_layer.mkv \
-bsf:v hevc_dv_splitter=output=el -c:v copy el_layer.mkv
拆出来的 enhancement layer 是 10-bit 的残差数据,体积远小于 base layer,可以按需丢弃或单独分发——对带宽敏感的 OTT 场景,这是"杜比视界内容只发一层"的实现基础。
3. 移除 NVENC 废弃选项 + 放弃 pre-11.1 SDK
9.0 清掉了所有标记废弃的 NVENC 选项,并放弃对 NVIDIA Video Codec SDK 11.1 之前版本的支持。
如果你还在用 -c:v nvenc_hevc 配老参数(比如 -rc vbr_hq、-cbr 这类旧式 rate control),9.0 会直接报错。新 SDK 的语法是 -rc vbr -cq 23 这种统一风格。升级到 9.0 时,NVENC 命令行是第一处要改的。
4. 移除 CELT 解码支持
CELT(Constrained Energy Lapped Transform)解码被移除,ogg/celt 解析也一并删除。官方说明明确:不影响 Opus CELT(Opus 里的 CELT 是内嵌模式,不是独立的 CELT 容器流)。但如果你有老旧的 .celt 文件或依赖 -c:a celt 的管线,9.0 会拒收。
5. Playdate 视频编码器 + muxer
Playdate——那个黄黑屏、带 crank 摇杆的掌机——有了官方视频编码器和封装器。Playdate 的 video API 支持播放特定格式的动画视频,以前要第三方工具转,现在 FFmpeg 原生支持。冷门但完整:encoder + muxer 一起进。
6. HE-AAC 960 解码(DAB+)
加入 HE-AAC 960 采样率解码支持,服务 DAB+ 数字广播。国内 DAB+ 不普及,但欧洲广播场景是刚需。对做广播/流媒体接收端的人是个补全。
7. ProRes RAW VideoToolbox 硬解 + APV Vulkan hwaccel
macOS 上 ProRes RAW 现在走 VideoToolbox 硬件加速;APV(另一个 RAW 视频格式)多了 Vulkan hwaccel。剪辑软件生态里 ProRes RAW 是标准工作流,硬件加速解 Raw 对 M 系列芯片用户是实打实的提升。
8. AMF 家族扩展
vpp_amf(AMF 颜色转换滤镜)扩展 HDR 能力- 新增
frc_amf帧率转换滤镜(AMF 硬件 FRC) - AMF 硬件内存映射支持
AMD 平台(尤其 APU/核显)上做视频处理的,9.0 给了更多硬件滤镜路径。
其他值得扫一眼的
v360_vulkan:Vulkan 版 360° 全景视频滤镜transpose_cuda:CUDA 转置滤镜- Animated WebP decoder + demuxer:动图 WebP 解封装支持(解码之前就有,现在是完整 demux)
- SMPTE 2094-50 元数据支持与直通(HDR10+ 动态元数据的载体)
- LCEVC 轨道 MP4 muxing 支持
升级注意清单
如果你在跑生产管线,9.0 升级前核对这几项:
- NVENC 命令行:所有
-rc vbr_hq/-cbr/-rc-lookahead旧写法换成新式-rc vbr -cq N。SDK 版本要 ≥ 11.1。 - CELT:
-c:a celt、.celt容器输入会失败。Opus 不受影响。 - 构建依赖:新 DNN 后端要
--enable-libonnxruntime并链接 ONNX Runtime 的 GPU EP 库。 - 行为变更:major bump 里默认行为有变,跑一遍自己的回归测试集再上生产。
我的做法
我把 9.0 的 changelog 里最关心的三件事记进了部署清单:
- 转码服务里 NVENC 参数全部迁移到新式 rate control(这个迟早要做,9.0 逼着做完了)
- 评估
dnn_processing+ ONNX GPU EP 替换现在用的独立超分服务——如果延迟能压到滤镜链内完成,架构能简化一大截 - Dolby Vision 拆分器接进 HDR 内容预处理脚本,替代现在的外部工具
9.0 是个"清理 + 铺路"的版本:清理了 NVENC/CELT 的旧债,铺了 ONNX Runtime 这条 AI 处理的路。加上 "Lei" 这个代号,这一版值得记住。
浙公网安备 33010602011771号