5.0 加了二十来个滤镜,本机这套 8.0 上一个不少;但同一批里也有五个一个都没编进来。 决定滤镜在不在的是编译开关,不是版本号。
第七章把常用特效过了一遍,第十章讲了滤镜链的顺序与可逆性, 这一节只做一件事:把「5.0 新增了什么」和「你手上有什么」分开看。
一、5.0 新增的那一批,逐个点名
5.0 一口气加了二十来个滤镜,下面是按官方公告梳理的, 在本机这套 8.0 上一个不缺:
滤镜 类型 常见用途
speechnorm 音频 语音自动增益 varblur 视频 按遮罩调模糊强度 huesaturation 视频 一次调色相和饱和度 colorspectrum 视频 生成彩条,可当测试源 morpho 视频 形态学:腐蚀、膨胀 scharr 视频 边缘检测算子 grayworld 视频 自动白平衡 blurdetect 视频 检测画面糊不糊 segment 输出 按时间切片 afwtdn 音频 时域降噪 adynamicequalizer 音频 动态均衡
这些名字不用全记,但要会查。
二十来个新滤镜里,日常真正用得上就那么几个:
speechnorm 把说话声拉齐、huesaturation 一次调两项、
segment 按时间切片、colorspectrum 当测试源。
剩下的多半是给专业场景准备的,知道「有这个东西」就够了。
二、同一批里也有五个,一个都没编进来
同样是 5.0 时期的产物,下面这五个在本机一个都没有:
滤镜 为什么本机没有
libplacebo 要编译时开 --enable-libplacebo hflip_vulkan 要 --enable-vulkan vflip_vulkan 要 --enable-vulkan flip_vulkan 要 --enable-vulkan yadif_videotoolbox 只在 macOS 上编得出来
这五个跟「5.0 还是 8.0」完全无关:
libplacebo 要开 --enable-libplacebo,Vulkan 那组要开 --enable-vulkan,
yadif_videotoolbox 更是只有 macOS 的框架下才存在。
所以「5.0 加了 libplacebo」这句话,准确说法是: 「5.0 开始支持把 libplacebo 编进来」——支持是一种能力,编进来是另一件事。 这一字之差,就是很多人「照着公告装了却用不了」的全部原因。
三、版本新 ≠ 功能全
把上面两张表放在一起看,结论就很清楚了: 同一个版本号下面,不同人装出来的东西可以差很多。
因为 apt install ffmpeg 装的是「打包的人替你选的构建」,
而不同发行版、不同镜像、不同年份的打包习惯都不一样。
有的为了体积砍掉一堆可选库,有的为了许可问题不带 GPL 组件——
于是同一句命令,在你机器上装出来的 ffmpeg 跟书上说的不是同一个东西。
这也解释了为什么「我的命令跟书上一模一样就是不管用」这种问题特别难查: 它根本不是命令的问题,是环境的问题。 而环境的差异,只有在查清单的时候才看得见。
四、先查清单,再写命令
这条习惯在这一节里最好养成:
ffmpeg -filters | grep -E "speechnorm|varblur|segment"
Python 里就是一行:"speechnorm" in av.filter.filters_available。
查到了再写命令,查到一半就少一半返工。
顺带说一句:滤镜清单还能当「能力索引」用。
想做某个效果但不知道叫什么,就在 468 个名字里翻一翻——
blurdetect、grayworld、morpho 这些名字本身就把用途写得很直白,
比按目录去猜快得多。
五、特效这块,跨版本真正要注意的
滤镜语法本身很稳:-vf、逗号分层、\, 转义,从 4.x 到 7.x 都没变。
会变的只有两类:
会变的 表现
某个滤镜被移除或改名 No such filter
某个滤镜的内部实现被重写 参数不变,但输出像素不一样了
第二类最难查,因为它不报错。
第十章那个「可逆性检验」在这种情况下就特别好用:
hflip 翻两次如果不再是 0.00 的差,说明中间有东西变了。
所以升级之后,凡是「滤镜链里算出来的东西」,都值得挑几个关键点重量一遍。 这跟 11.2 里「升级后要验体积」是同一条道理: 不报错的变化,才是真正需要主动去找的变化。
六、动手 Demo:点名 5.0 那批滤镜,看谁在谁不在
下面这段查两组:5.0 新增的那批,和需要特殊编译开关的那批。 两组的差别一眼就能看出来。
import av.filter
F = set(av.filter.filters_available)
NEW = ("speechnorm", "varblur", "huesaturation",
"colorspectrum", "morpho", "scharr", "segment")
for nm in NEW:
print(" %-14s %s" % (nm, "有" if nm in F else "没有"))
print("--- 需要特殊编译开关的")
for nm in ("libplacebo", "hflip_vulkan", "vflip_vulkan",
"flip_vulkan", "yadif_videotoolbox"):
print(" %-14s %s" % (nm, "有" if nm in F else "没有"))
实跑输出:
--------------------------------------------------------------------
11.4 使用 FFmpeg 5.0 实现音视频特效
--------------------------------------------------------------------
**① 5.0 新增的那一批滤镜,逐个点一次名**
**5.0 一口气加了二十来个滤镜,下面这些是按官方公告列的,**
**在本机这套 8.0 上一个不少:**
滤镜 类型 本机有吗 常见用途
--------------------------------------------------------------
speechnorm 音频 有 语音自动增益
varblur 视频 有 按遮罩调模糊强度
huesaturation 视频 有 一次调色相和饱和度
colorspectrum 视频 有 生成彩条,可当测试源
morpho 视频 有 形态学:腐蚀、膨胀
scharr 视频 有 边缘检测算子
grayworld 视频 有 自动白平衡
limitdiff 视频 有 —
blurdetect 视频 有 检测画面糊不糊
xcorrelate 视频 有 —
aspectralstats 音频 有 —
adynamicsmooth 音频 有 —
adynamicequalizer 音频 有 动态均衡
anlmf 音频 有 —
afwtdn 音频 有 时域降噪
adecorrelate 音频 有 —
atilt 音频 有 —
apsyclip 音频 有 —
asdr 音频 有 —
segment 输出 有 按时间切片
**这些名字不用全记,但要会查。**
**二十来个新滤镜里,真正日常会用到的就那么几个:**
**`speechnorm` 把说话声拉齐、`huesaturation` 一次调两项、**
**`segment` 按时间切片、`colorspectrum` 当测试源。**
**剩下的多半是给专业场景准备的,知道「有这个东西」就够了。**
**② 同一批里也有一个都没编进来的,原因跟版本没关系**
滤镜 为什么本机没有
------------------------------------------------------
libplacebo 要 --enable-libplacebo
hflip_vulkan 要 --enable-vulkan
vflip_vulkan 要 --enable-vulkan
flip_vulkan 要 --enable-vulkan
yadif_videotoolbox 只在 macOS 上编得出来
**这五个跟「5.0 还是 8.0」完全无关:**
**`libplacebo` 要编译时开 `--enable-libplacebo`,**
**`*_vulkan` 要开 `--enable-vulkan`,**
**`yadif_videotoolbox` 更是只在 macOS 上才编得出来。**
**这就把「版本新 ≠ 功能全」补完整了:**
**同一句 `apt install ffmpeg`,在不同发行版、不同镜像里装出来的东西可能差很多,**
**因为打包的人开的编译开关不一样。**
**所以「我装的是 5.0,书上这个滤镜怎么没有」这类问题,答案永远在编译选项里。**
**③ 查法:一句话,比翻手册快得多**
ffmpeg -filters | grep -E "speechnorm|varblur|huesaturation"
**Python 里就是一行:`"speechnorm" in av.filter.filters_available`。**
**养成「先查清单再写命令」的习惯,能省掉一大半试错。**
前七行全「有」,后三行全「没有」——这两组的差别不在版本,在编译。
前一组是 FFmpeg 自己实现的,源码树里就有; 后一组要外部库(libplacebo)或特定硬件后端(Vulkan), 不编就永远没有。
30 秒实验
- 把
segment换成segment之外的一个名字(比如xsegment):看报错长什么样。 - 数一数本机 468 个滤镜里,带
_vulkan后缀的有几个:验证「一个都没编进来」。 - 在 Linux 上开
--enable-libplacebo编译一次:看滤镜清单多出哪几行。
常见误区
- 把「5.0 支持了 X」理解成「5.0 一定带 X」。支持是能力,编进来是另一件事。
- 以为
No such filter是版本太旧。多半是编译时没带那个开关。 - 升级后只验「命令还跑得动」。滤镜实现被重写时不会报错,只会像素变了。
自测三问(点开对答案)
1. `libplacebo` 为什么本机没有? —— 编译时没开 `--enable-libplacebo`,跟 FFmpeg 版本无关。 2. 「5.0 支持了 libplacebo」准确说法应该是什么? —— 5.0 开始可以把 libplacebo 编进来;至于编没编,看你那份构建。 3. 滤镜实现被重写时,怎么发现? —— 不报错,只能靠比结果——比如第十章那个可逆性检验。- ☐ 11.4 完——下一节 11.5 使用 FFmpeg 5.0 实现流媒体及直播功能