🎬 第九章 AVFilter过滤器层理论及案例实战
📄 一句话概括

命令行是最快的滤镜试验场:一行参数就能看结果。 但本机没有 ffmpeg.exe,这一节的命令一条都没真跑。

📝 本节和前面几节的关系

9.3 讲的是 API 怎么搭图,这一节讲同样的图用命令行怎么说。 下一节 9.4.2 用 API 把同样的链路完整落成一个文件。

一、先查本机有没有这个程序

PyAV 有库,不等于有命令行程序。 命令 在哪


ffmpeg 没找到 ffprobe 没找到 ffplay 没找到

三个都没有。 PyAV 是把 FFmpeg 的库编进 Python 里,它不带命令行程序——库与程序是两套东西, 只是同源。 这条区别很重要:很多人以为装了 PyAV 就能跑 ffmpeg -i,结果在终端里找不到命令。 它们各自安装,互不包含。

二、要装得怎么装

两步,装完能出版本号就算成。 步 做什么 怎么验


一 下载 Windows 构建包并解压 bin 目录里有 exe 二 把 bin 加进 PATH 新开终端能跑 -version

要注意版本对齐:PyAV 里这套库是 8.x,命令行装的若是 5.x,同一串滤镜参数的行为可能不同, 甚至某些滤镜根本不存在。 所以排查问题时先看两边版本,别拿两个版本的行为互相印证。这一条在跨机器复现问题时更关键。 沙箱里不替人装程序:装什么、装哪一版是用户的选择, 把「没装、所以没跑」说清楚,比假装跑过有用。

三、这一节要体验的四条命令

四条命令覆盖了简单与复杂两类。 参数 干什么


-vf scale=80:60 缩放 -vf "hflip,vflip" 一条链上两个滤镜 -filter_complex "[0:v][1:v]overlay=10:10" 两路叠加 -vf "split[a][b];[a]hflip[c]" 分流成两条链

前两条用 -vf,后两条用 -filter_complex,分界就是 9.1.3 讲的「几进几出」。 第四条看起来像两条链,其实写起来有点绕:split 分出 a 与 b 两路,其中 a 翻了之后叫 c, b 原样不动。最后 -map 决定谁落到输出。

四、命令行与 API 的对照

认下这张表,看到命令就能想出代码怎么写。 命令行 API


逗号 同一个链上两次 link_to 分号 两条独立的链 方括号里的名字 哪个节点接到哪个输入口 -vf 只有一条链、一进一出 -filter_complex 多链或多进多出

命令行是「图的文本写法」,API 是「图的程序写法」,两者描述的是同一张图。 所以命令行不是另一套东西,它是把搭图那六步压成了一行参数。 看懂命令行的人,写 API 只差知道节点类的名字。

五、老实说清这一节能到哪

本机没有 ffmpeg.exe,所以这一节的命令一条都没真跑。 讲了 验了没


命令怎么写、参数什么含义 没验 命令行与 API 的对应关系 在 API 侧验过 同一套滤镜能不能跑出结果 验过

能验的只有后半截:PyAV 这边同一套滤镜确实跑出了结果,说明滤镜本身、参数写法、 图的结构都没问题。 不能验的是「命令行那一层的包装」:参数解析、默认值、-map 的行为,这些只有真跑才知道。 把这条界线划清楚,比含含糊糊地说「已验证」有用得多。 这也是整套笔记一直在守的一条规矩。

六、动手 Demo:命令行方式体验滤镜,以及本机为什么跑不了

先找三个命令行程序,再把命令行写法与 API 写法并排列出来对一遍。

import shutil

# 三个命令行程序在不在 PATH 里
for n in ["ffmpeg", "ffprobe", "ffplay"]:
    p = shutil.which(n)
    print(n, p if p else "没找到")

# 命令行与 API 的对照:同一条链的两种写法
pairs = [
    ("-vf scale=80:60",            "add('scale','80:60')"),
    ("-vf \"hflip,vflip\"",        "add('hflip')->add('vflip')"),
    ("-filter_complex overlay",   "两个 buffer 接一个 overlay"),
    ("-vf \"split[a][b]\"",       "add('split') 一进两出"),
]
for cmd, api in pairs:
    print(cmd, "=>", api)

实跑输出:

--------------------------------------------------------------------
命令行方式体验滤镜,以及本机为什么跑不了
--------------------------------------------------------------------

**① 先查本机有没有 ffmpeg 这个程序**

  命令        在哪
  ----------------------
  ffmpeg      没找到
  ffprobe     没找到
  ffplay      没找到

**三个都没有。** PyAV 是把 FFmpeg 的库编进 Python 里,**它不带命令行程序。**

**② 所以要体验命令行,得先装一个 ffmpeg.exe**

**装法只有两步**:下载 Windows 构建包,把 `bin` 目录加进 PATH。
装完再跑 `ffmpeg -version` 能出版本号就算成。

**要注意版本对齐**:PyAV 里这套库是 8.x,命令行装的若是 5.x,同一串滤镜参数行为可能不同。
**排查问题时先看两边版本。**

**③ 这一节要体验的四条命令**

  命令                                          干什么
  ------------------------------------------------------------------
  -vf scale=80:60                               缩放
  -vf "hflip,vflip"                             一条链上两个滤镜
  -filter_complex "[0:v][1:v]overlay=10:10"     两路叠加
  -vf "split[a][b];[a]hflip[c]"                 分流成两条链

**④ 命令行的写法与 API 的写法一一对得上**

  命令行              API
  ----------------------------------------------
  逗号                同一个链上两次 link_to
  分号                两条独立的链
  方括号里的名字      哪个节点接到哪个输入口
  -vf                 只有一条链、一进一出
  -filter_complex     多链或多进多出

**认下这张对照表,命令行与代码就不再是两套东西。** 看到一条命令,能直接想出 API 怎么写;
反过来也行。

**⑤ 老实说清这一节能到哪**

**本机没有 ffmpeg.exe,所以这一节的命令一条都没真跑。**
能验的只有「PyAV 这边同一套滤镜能跑出结果」。

**这不是偷懒**:装一个程序是用户的选择,沙箱里不该替人装。**把「没跑」标清楚,比假装跑过有用。**

三个程序全部「没找到」,PyAV 只带库、不带命令行。 对照表四行,命令行与 API 描述的是同一张图。

30 秒实验

  1. 用 shutil.which 找一下 python 与 pip,确认这个查法本身是对的。
  2. 把 -vf "hflip,vflip" 用 API 写出来,跑一遍。
  3. 查一下 PyAV 用的 FFmpeg 库版本(提示:av.__version__ 与 av.library_versions)。

常见误区

  1. 以为装了 PyAV 就有 ffmpeg 命令。 库与程序分开装。
  2. 拿旧版命令行的参数去套新版库。 版本不同,滤镜与行为都可能不同。
  3. 把「没跑」说成「跑通了」。 没验的部分要标清楚。
自测三问(点开对答案) 1. PyAV 与 ffmpeg 命令行是什么关系? —— 同源但独立:PyAV 封装了库,命令行程序要另外安装。 2. 命令行里逗号与分号分别对应 API 的什么? —— 逗号是同一条链上的两次 link_to,分号是图里的两条独立链。 3. 为什么这一节的命令没有实跑? —— 本机没有 ffmpeg.exe,装程序是用户的选择,沙箱里不替人装。

相关笔记