🎬 第十一章 体验FFmpeg 5.0
📄 一句话概括

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 秒实验

  1. 把 segment 换成 segment 之外的一个名字(比如 xsegment):看报错长什么样。
  2. 数一数本机 468 个滤镜里,带 _vulkan 后缀的有几个:验证「一个都没编进来」。
  3. 在 Linux 上开 --enable-libplacebo 编译一次:看滤镜清单多出哪几行。

常见误区

  1. 把「5.0 支持了 X」理解成「5.0 一定带 X」。支持是能力,编进来是另一件事。
  2. 以为 No such filter 是版本太旧。多半是编译时没带那个开关。
  3. 升级后只验「命令还跑得动」。滤镜实现被重写时不会报错,只会像素变了。
自测三问(点开对答案) 1. `libplacebo` 为什么本机没有? —— 编译时没开 `--enable-libplacebo`,跟 FFmpeg 版本无关。 2. 「5.0 支持了 libplacebo」准确说法应该是什么? —— 5.0 开始可以把 libplacebo 编进来;至于编没编,看你那份构建。 3. 滤镜实现被重写时,怎么发现? —— 不报错,只能靠比结果——比如第十章那个可逆性检验。

相关笔记