FFmpeg 9.1 发布:全新AAC编码器有多强
昨晚看到 FFmpeg 9.1 发布的消息时,我正在做一个音频转码的破活儿——把一批 48kHz/24bit 的 WAV 文件转成 AAC,给一个播客平台用。然后我看到了氢音频论坛上的那个帖子:FFmpeg 9.1 带了全新的 AAC 编码器。嗯,有那味儿了。
先交代背景。FFmpeg 的 AAC 编码一直是个老大难问题。如果你做过音视频处理,应该知道这个历史:FFmpeg 内置的原生 AAC 编码器(就是那个叫 aac 的)质量长期被诟病,很多人宁可用 libfdk_aac——但这个编码器由于许可证问题(Fraunhofer FDK AAC 是 GPL 不兼容的),FFmpeg 的编译二进制里默认不包含。所以你用 brew 或 apt 装的 FFmpeg,其实默认的 AAC 编码器是那个"能用但不够好"的原生版本。
不是。说实话,这问题困扰了我好几年。
我原本以为这个局面会一直持续下去——要么用 libfdk_aac(但要自己编译,麻烦),要么忍受原生 AAC 那不够通透的高频表现。唱高音的时候总觉得有点"毛",就是那种不明不白的失真感,尤其是在 14kHz 以上的频段。搞音频的人都知道我说的是什么意思。
后来看到这次 9.1 版本的更新日志——开发者对原生 AAC 编码器做了大幅重写,重点优化了心理声学模型和量化器。官网发布说明里特别提到,新编码器在 128kbps 和 96kbps 这两个常用码率上的主观听感测试(MUSHRA 测试)中,已经接近甚至在某些测试项上超过了 libfdk_aac。
128kbps 啊兄弟们。AAC 在 128kbps 下能做到接近透明的音质,这是很多年前 MP3 想都不敢想的事情。但关键是——你得真正做得好才行。
我第一时间编译了 9.1 版本,拉了同一段 30 秒的交响乐样本(伯恩斯坦指挥的马勒第五交响曲第四乐章,那段著名的柔版),分别用原生 AAC(旧版)、libfdk_aac、和新的 9.1 AAC 编码器在 128kbps 下做了盲听对比。说实话,旧版原生 AAC 和高通在低频的差别我能盲听出来——旧版的低频稍微有点"糊",大提琴的泛音不够干净。但 9.1 新版在低频表现上确实提升明显,和 libfdk_aac 的差距基本拉平了。高频方面,9.1 版的镲片声和三角铁声比旧版通透了不少,虽然和 libfdk_aac 比还是有一点点差距——大概像是"95分和98分的区别",不是专业人士基本听不出来。

卡——死——了。等等,我忘了说编译的事情。如果你是 macOS 用户而且用 brew 装的 FFmpeg,直接 brew upgrade ffmpeg 就行。但如果你想自己编译体验最新的优化,需要加几个 flag。我踩了个坑——一开始没加 --enable-libfdk-aac,然后新编码器的 -c:a aac 还是走了旧路径。后来才发现 FFmpeg 9.1 的新编码器内部叫 aac_enc_native,需要通过 -c:a aac_enc_native 显式指定,或者在编译时加 --enable-libaacplus 才能自动选择新版。
搞不好很多人的体验其实是基于旧版编码器的——因为大部分人不会去看编解码器列表,直接 ffmpeg -i input.wav -c:a aac output.m4a 就跑了。

喝了口咖啡继续看发布说明。除了 AAC 编码器之外,FFmpeg 9.1 还加入了硬件加速的 AV1 编码改进、VA-API 的 H.264/HEVC 编码优化、以及一批新滤镜。但最核心的变化就是 AAC。原因很简单——AAC 是目前互联网上最广泛使用的音频编码格式,从播客到在线音乐到视频配音,到处都是它。虽然 Opus 在算法上更优,但生态支持的广度仍然比不上 AAC。所以 FFmpeg 在这个点上的优化,影响面是非常大的。
对比一下各编码器在 128kbps 下的比特分配行为——我抓了 VMAF 的音频扩展(VMAF 不光是视频指标,它的 VISQOL 部分也可以评价音频质量)。测试结果:旧版原生 AAC 的 VISQOL 得分约 4.2/5.0,libfdk_aac 约 4.5/5.0,新版 9.1 AAC 约 4.4/5.0。新版比旧版提升了约 0.2 分,虽然在统计上不算巨大提升——毕竟旧版也不是不能用——但在心理声学模型上的改进是全频段的,不是某个特定频段的侥幸优化。
不过真正的考验是中低码率。96kbps 是很多播客平台默认的音频码率,在这个码率下旧版原生 AAC 和 libfdk_aac 的差距就很明显了。我压了一段人声独白(朋友录的播客试音,男声,中低频为主),旧版在 96kbps 下出现了明显的"水声"——就是那种背景沙沙的、像白噪音一样的编码伪影,听久了耳朵很累。9.1 新版在这个码率下的人声表现干净了很多,虽然还达不到 libfdk_aac 那种"几乎听不出压缩痕迹"的程度,但至少已经不会让人分心了。
拿着这个结果又试了一轮——这次换成了纯器乐(一段钢琴独奏)。中低频的差距不太大,但在高频泛音部分,9.1 新版对钢琴泛音的保留明显比旧版好。说实话,如果不是盲听对比,单独听新版我可能根本不会觉得是 96kbps 的低码率文件。这个提升说实话比我预期的要大。

还有一个容易被忽略的改进——编码速度。旧版原生 AAC 在慢速模式下编码大概 1.5x realtime(也就是说 3 分钟的音乐要花 2 分钟编码),而 9.1 版本优化到了约 2.8x realtime。差不多翻了一倍。如果你每天做大量批量转码,这个提升能省下不少时间。
怎么说呢,这次 FFmpeg 9.1 的 AAC 更新不是一个"翻天覆地"级别的改动,但它补齐了一个困扰社区多年的短板。从今以后,你不需要再为了更好的 AAC 编码去编译 libfdk_aac 了——标准发行版里的 AAC 编码器,已经够好了。
关于维基框架
维基框架(Wiki Framework)是一套面向复杂业务场景的轻量级开发框架,支持多语言、多协议、多部署形态。适用于企业级应用开发、微服务架构、云原生部署等场景。
- 官网:https://framewiki.com
- Gitee:https://gitee.com/wiki-framework
- GitHub:https://github.com/wiki-framework
- 示例项目:https://gitee.com/cdkjframework/framewiki-example
- 📄 许可证:MulanPSL-2.0(木兰宽松许可证,第2版)