发布日期:2026 年 8 月 4 日
代号:Lei
代码量:超过 2200 次提交,1781 个文件变更,净增约 52,000 行
贡献者:160+ 位开发者
ABI 版本:7 个库全部升级主版本号
一、引言
2026 年 8 月 4 日,FFmpeg 社区正式发布了FFmpeg 9.0—— 这也是距 8.1 “Hoare” 仅四个半月后的一次重大版本跃迁。
这不是一个挤牙膏式的小版本。代码仓库中超过2200 次提交、1781 个文件被触碰、净增超过五万行代码,libswscale / libavcodec / libavformat / libavfilter / libavutil / libavdevice / libswresample 七个库的 ABI 全部破坏升级(soname 从 63/61/62/10/60/62/6 → 63/63/63/12/61/63/7),意味着所有下游应用和发行版都必须重新编译适配。
但比所有这些数字更让人动容的,是它选择的代号。
二、「Lei」—— 一个名字的重量
FFmpeg 的版本命名有一个延续多年的传统:每个大版本用一位科学家或数学家的名字作为代号。过去的列表包括了牛顿、傅里叶、香农、霍夫曼等等。
“Lei” 打破了这个惯例。
Lei,是雷霄骅(Lei Xiaohua)的姓。
在国内音视频开发社区,大家叫他「雷神」。他生前是中国传媒大学数字电视技术方向的博士研究生。在 2013 到 2016 年间,他围绕 FFmpeg 构建了大量实验项目、开发示例和系列教程,把 C API、AVCodec、AVFormat、AVPacket、AVFrame、编解码器原理、封装格式、Demux/Mux、音视频同步这些对初学者来说壁垒森严的概念,一点点拆开讲透。
他做了一件看起来不那么「硬核」、但影响可能比很多代码贡献更深的事 ——让 FFmpeg 在中文世界里变得可学、可用、可入门。
他连续两届斩获 CSDN 博客之星。他的博客访问量,在停更十年后的今天,依然在增长。任何一个刚入门的音视频开发者,打开搜索引擎搜「FFmpeg 教程」,排在前面的,很可能依然是雷霄骅的文章。
2016 年,雷霄骅去世,年仅 26 岁,博士学业尚未完成。
2026 年 3 月,在雷霄骅离世十周年之际,中国开发者刘歧(FFmpeg 社区长期活跃贡献者)在社区邮件列表中发起倡议,提议以「Lei」作为版本代号纪念雷霄骅的贡献。经过社区讨论,这个代号最终落地在了FFmpeg 9.0上。
FFmpeg 社区的这个决定,用代码世界的语言宣告了一件事:
传播知识的人,和创造知识的人一样值得被记住。
三、核心模块更新
3.1 libswscale:二十年后的架构重写(最重磅)
这是 9.0 周期中最具战略意义的工程。由Niklas Haas主导(本周期 libswscale 内超过 300 次提交),Ramiro Polla负责 ARM 端。
旧架构的问题:二十年积累下来的定制化、格式特定的转换代码,每加一种格式就要手写一条特殊路径,维护成本高到不可持续。
新架构的设计:将每一次像素格式转换分解为一系列基础操作(read → swizzle → linear transform → scale → pack),由优化器分析和拆分操作列表,再由后端编译为内核链(kernel chain)。
新增的公开 API:
| API | 作用 |
|---|---|
SwsBackend选择器 | 显式选择后端(C / x86 SIMD / NEON / Vulkan) |
SwsScaler枚举 | 显式选择缩放算法,替代旧的 flags 组合 |
新增四个后端:
- C 参考实现—— 基于模板,所有后端的正确性基准
- 快速 memcpy 路径—— 无需转换的直通场景
- 链式 x86 SIMD 内核—— 从 NASM 宏生成,含 AVX2 调色板读取路径
- 链式 AArch64 NEON 内核—— 使用 Ramiro Polla 构建的
rasm汇编框架,具备指令级 IR 和 builder API,设计上支持未来的运行时代码生成 - Vulkan SPIR-V 后端—— 将同一套操作列表编译为 GPU 计算着色器,同一个转换图可在 CPU 或 GPU 上运行
正确性工程亮点:
- 常量数学计算全面迁移到新的64 位有理数类型,精确计算而非浮点近似,消除一系列溢出检查
- 请求
SWS_BITEXACT时,Vulkan 后端通过 SPIR-V 的NoContraction装饰禁止 GPU 的融合乘加(FMA),确保 CPU 和 GPU 结果逐 bit 一致 - 优化器学会按平面拆分操作列表为链接子 pass,避免一个庞大的内核循环
⚠️ 新架构当前仍受
SWS_UNSTABLE门控,旧代码为稳定默认值。想尝鲜的需要显式启用。
3.2 libavcodec:超过 700 次提交
新编解码器
| 新增项 | 详情 |
|---|---|
| 动画 WebP 解码器 | 原生支持,含配套 demuxer。关闭了自 2015 年开启的 ticket #4907。由 Josef Zlomek 起始,Ramiro Polla 完成。处理 RGB 和 YUV 两种情况 |
| HE-AAC 960 解码 | 支持 960 采样帧的 DAB+ 数字广播内容(常规 AAC 使用 1024 采样帧) |
| Playdate 编码器 | 为 Playdate 掌机提供视频编码器和 muxer,输出 1-bit 400×240 视频,使用 delta 编码和 zlib 压缩 |
新 API
// 新增 avcodec_receive_frame_flags(),支持 AV_CODEC_RECEIVE_FRAME_FLAG_SYNCHRONOUS// 绕过帧线程延迟,适用于低延迟消费者(如实时通信场景)intavcodec_receive_frame_flags(AVCodecContext*avctx,AVFrame*frame,intflags);NVENC 改进
- AV1 编码支持分层 B 帧参考模式
- 兼容 Video Codec SDK 13.1
- 接受 12 位输入格式(内部截断为 10 位)
Camera Raw 与 FFV1
- ProRes RAW:原生解码器与参考实现同步;新增解析线性化曲线、帧裁剪、通过
AV_FRAME_DATA_RAW_COLOR_PARAMS侧数据导出原始 Bayer 色彩参数 - FFV1 Bayer:FFV1 学会编码 Bayer 像素格式 —— 原始传感器马赛克可直接无损压缩,无需先去马赛克。由Lynne实现了单切片内自动搜索最佳可逆色彩变换系数,以及独立的Vulkan GPU FFV1 编解码器(该工作部分由Sovereign Tech Fund赞助)
3.3 libavformat:近 400 次提交
| 新增项 | 详情 |
|---|---|
| Demuxer 命令 API | avformat_send_command()/avformat_receive_command_reply(),让应用与运行中的 demuxer 对话。首个用户为 RTSP(暴露SET_PARAMETER),交互式摄像头控制不再需要带外连接 |
| LCEVC 轨道封装 | MP4 中作为正规轨道 mux,Matroska 中作为 ITU-T T.35 block additions,补齐了两个版本前开始的 LCEVC 链路 |
| MP4/MOV TREF 流组 | 模型化轨道引用,使定时元数据流(EXIF 或相机遥测)保持附加到所描述的媒体 |
| MP4/MOV 其他 | 版本 1chnlboxes、stsd版本 2(多于两声道)、导出初始 padding 和尾部样本裁剪(无缝音频) |
shared:协议 | 并发块缓存协议:线程安全且跨进程。多个 FFmpeg 实例读取同一远程流可共享单个缓存文件。内存映射,流完全读取后缓存文件即为可用的本地副本。由 Niklas Haas 开发 |
| IAMF | 动态参数(mix gain、demixing 信息、recon gain)作为正规帧侧数据暴露,ffprobe 和 showinfo 滤镜可打印 |
9.0 同时完成了Dolby Vision 流组模型(
AVStreamGroupLayeredVideo,系 LCEVC 流组的泛化),支持在 MP4、MPEG-TS 和 Matroska 中 demux 时检测,mux 到 MP4 或 Matroska 时写出(含hvcE增强层配置)。
四、Vulkan 与 GPU 加速:全面铺开
9.0 最突出的技术方向,是Vulkan 加速体系的系统化扩展—— FFmpeg 正在摆脱对单一厂商 SDK 的依赖,构建一个真正跨平台的 GPU 加速基础设施。
Vulkan 新增
| 新功能 | 详情 |
|---|---|
| v360_vulkan 滤镜 | 360° 全景视频投影重映射在 GPU 计算着色器中执行,8K 球面内容处理不再是纯 CPU 的噩梦 |
| APV Vulkan | Samsung 的专业制作编解码器(8.0 引入)获得 Vulkan GPU 加速解码器 |
| 构建时着色器编译 | 运行时 GLSL 编译被移除,所有 Vulkan 着色器在构建时预编译为 SPIR-V。scale / nlmeans / blackdetect 滤镜已移植,swscale GLSL 后端被 SPIR-V 后端取代。不再需要在运行时附带 GLSL 编译器 |
AMD AMF
- 新增帧率转换滤镜
frc_amf - 新增视频质量增强滤镜
vqe_amf - 色彩转换器
vpp_amf新增 HDR 能力(含 HDR 元数据与 AMF 表示互译的公开 helpers) - 硬件内存映射支持
NVIDIA CUDA
- 新增
transpose_cuda滤镜 —— 画面旋转和转置操作全程保持在 GPU 端,不需要拷贝回系统内存 scale_cuda新增通用过滤路径- 端到端 10 位和 12 位 4:2:2 / 4:4:4 格式管线打通(NVDEC → CUDA 滤镜 → NVENC)
Apple VideoToolbox
- 新增 ProRes RAW 硬件加速解码
ONNX Runtime DNN GPU 后端(暗藏杀招)
这是 9.0 中最容易被忽视、但最具前瞻性的变化。FFmpeg 的 DNN 滤镜现在支持了ONNX Runtime GPU 执行提供者,涵盖:
- NVIDIA CUDA
- Windows DirectML(跨厂商 GPU)
- AMD Ryzen AI NPU(通过 VitisAI 执行提供者)
结合 8.0 引入的 Whisper 语音识别滤镜,现在可以跑出这样的管线:
GPU解码 → Vulkan着色器处理 → ONNX超分辨率模型(GPU) → 编码输出帧数据全程不碰 CPU。滤镜图正在从一个「像素处理工具」演变为一个AI-native 的媒体处理层。
五、HDR 与 Dolby Vision:专业化管线
Dolby Vision Profile 7(UHD 蓝光)
Profile 7 的结构比较特殊:完整增强层 HEVC 比特流和 RPU 元数据交织在基础层流内部(隐藏在 NAL 单元类型 62 和 63 中)。
9.0 新增dovi_split比特流过滤器,可以:
- 分离出仅供基础层的标准 HEVC 流(向后兼容播放器)
- 或正确分离各层用于专业后期处理
配合新的 Dolby Vision 流组模型,demux / split / remux 的信号完整性得到保证。
SMPTE 2094-50 动态 HDR 元数据
新增解析、写入和透传。这是 HDR10+ 之外的另一个 SMPTE 2094 格式。支持 libaom 和 libvpx 编码、Matroska block additions、ffprobe 输出。
统一 T.35 元数据处理
整个 ITU-T T.35 动态元数据体系(HDR10+、中国 HDR Vivid、AOM film grain、Active Format Description)通过一套统一的 helpers 解析,不再逐个编解码器重新实现。CLI 新增 per-stream-mastering_display和-content_light输入覆盖选项,用于修正携带错误静态 HDR 元数据的文件。
六、汇编与 SIMD 优化
x86(约 200 次提交)
Andreas Rheinhardt主持了最底层 DSP 代码的现代化运动:
- 半像素运动补偿代码(hpeldsp 和 fpel,源自 MMX 时代)移植到SSE2
- H.264 帧内预测增加AVX2水平预测器
- pp7 后处理 DCT 和 mpegvideoenc 中的最后 MMX 残余被清理
- 运动估计比较函数获得SSSE3版本的 median SAD
ARM(约 100 次提交)
- NEON yuv2rgb 路径重构为一次处理两行(覆盖 packed RGB、planar GBR、16-bit RGB、yuva420p、大端 16-bit)
- HEVC 帧内角度模式 10 和 26 获得 NEON 实现
- AAC SBR 和 float DSP 循环重新展开以更好填充现代流水线
- Ramiro Polla构建了
rasm汇编框架 —— 一个小型汇编框架,指令级 IR + builder API,在构建时生成链式 NEON 内核
RISC-V
持续跟进:RVV 优化hevc_add_res和 pixelutils SAD。大部分 RISC-V 向量能量投入了 dav1d,FFmpeg 通过 dav1d 的 AV1 解码免费获得性能提升。
七、大清理:告别历史包袱
CLI 移除
-vsync(换-fps_mode)、-top、-qphist、-filter_complex_script、-adrift_threshold
编解码器 / 滤镜移除
| 移除项 | 说明 |
|---|---|
| OpenMAX 编码器 | 完全移除 |
| NPP 滤镜全家 | scale_npp、scale2ref_npp、sharpen_npp、transpose_npp全部移除,transpose_cuda接替,不再需要 libnpp 依赖 |
| v308 / v408 / v410 | packed-YUV 奇特格式失去专用编解码器 |
| NVENC 旧支持 | 移除旧 preset 别名、旧速率控制模式、SDK 11.1 以下全部支持 |
| 独立 CELT 解码器 | 不影响 Opus(Opus 内含自己的 CELT)。提交消息指出自2014 年就已损坏,十一年间无人察觉。由 VideoLAN 的 Marvin Scholz 移除 |
| Sonic 编解码器 | Michael Niedermayer 在 2000 年代初的实验性编解码器家族。如果你还有 Sonic 文件(统计上你没有),用 8.x 转码 |
⚠️ 重要行为变更:TLS 证书默认验证
FFmpeg 现在默认验证 TLS 对等证书。这是 8.0 时预告过、9.0 正式落地的变更。如果你的脚本连接的是证书有问题的服务器 —— 它们在 9.0 中将不再工作。这不是 bug,是 overdue 的安全修复。
八、命令行与基础设施
| 改进项 | 详情 |
|---|---|
-re/-readrate重设计 | 基于最慢流而非最快流限流,跳过已完成和未开始的流。解决了字幕轨道稀疏导致直播重流饿死的经典问题 |
| ffprobe 增强 | 打印 SMPTE 2094-50、IAMF mix gain / demixing / downmix 等新侧数据类型;新增-codec选项 |
| DNN + ONNX | 可直接在滤镜图中运行 ONNX 模型(超分辨率、去噪、背景移除),无需先转换为 TensorFlow 或 OpenVINO |
shared:协议 | 多个 FFmpeg 实例共享远程流缓存,避免重复下载 |
| checkasm 独立化 | 汇编测试用独立的 checkasm 库 —— 生于 x264,在 FFmpeg 重写,为 dav1d 重新授权,现在为所有人统一维护 |
开发平台迁移
FFmpeg 开发正式迁移到自己的Forgejo实例code.ffmpeg.org,与邮件列表并存。GitHub 上的 Pull Request“will be ignored”。
本周期还有一位特殊的贡献者 —— 一个自动化的 bug 发现机器人,提交了 9 个被接受的 demuxer 和协议安全加固补丁。OSS-Fuzz 持续提供 fuzzing 修复。
九、版本速查表
| 库 | 旧版本 (8.x) | 新版本 (9.0) |
|---|---|---|
| libavutil | 60 | 61 |
| libavcodec | 62 | 63 |
| libavformat | 62 | 63 |
| libavdevice | 62 | 63 |
| libavfilter | 11 | 12 |
| libswscale | 9 | 10 |
| libswresample | 6 | 7 |
十、总结与展望
FFmpeg 9.0 “Lei” 是一个「承前启后」的版本。
「启后」——swscale 的二十年架构重写、Vulkan GPU 加速体系的全面铺开、Dolby Vision 完整管线、ONNX Runtime 将 AI 推理引入滤镜图,这些都在为 FFmpeg 的下一个十年铺路。一个「解码-滤镜-AI推理-编码」全程 GPU 化的管线正在成型。
「承前」——大规模清理 legacy 代码(CELT、Sonic、NPP、OpenMAX、MMX 汇编),TLS 证书默认验证,开发平台迁移到自有 Forgejo 实例。FFmpeg 在变大的同时,也在变干净。
但这次发布真正让人记住的,不是某个 filter 或 codec,而是一个名字。
FFmpeg 的版本代号历史上写满了牛顿、傅里叶、香农这些改变人类知识边界的名字。而这一次,它选择记住一个让知识跨越语言障碍的人。
十年了。雷神的博客还在教人写代码。
而他的名字,现在被刻进了一个每天被数亿设备运行的、世界上最重要的多媒体框架里。
参考链接
- FFmpeg 官方下载
- 完整 Changelog
- Jean-Baptiste Kempf 技术博客(VideoLAN 主席)
- FFmpeg 8.0 发布公告
本文梳理自官方 Changelog、社区邮件列表讨论、以及 Jean-Baptiste Kempf 的详细技术分析。如有疏漏,欢迎指正。