命令行是最快的滤镜试验场:一行参数就能看结果。 但本机没有 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 秒实验
- 用
shutil.which找一下python与pip,确认这个查法本身是对的。 - 把
-vf "hflip,vflip"用 API 写出来,跑一遍。 - 查一下 PyAV 用的 FFmpeg 库版本(提示:
av.__version__与av.library_versions)。
常见误区
- 以为装了 PyAV 就有 ffmpeg 命令。 库与程序分开装。
- 拿旧版命令行的参数去套新版库。 版本不同,滤镜与行为都可能不同。
- 把「没跑」说成「跑通了」。 没验的部分要标清楚。
自测三问(点开对答案)
1. PyAV 与 ffmpeg 命令行是什么关系? —— 同源但独立:PyAV 封装了库,命令行程序要另外安装。 2. 命令行里逗号与分号分别对应 API 的什么? —— 逗号是同一条链上的两次 link_to,分号是图里的两条独立链。 3. 为什么这一节的命令没有实跑? —— 本机没有 ffmpeg.exe,装程序是用户的选择,沙箱里不替人装。- ☐ (本节完,下一节 9.4.2 FFmpeg的API方式实现过滤器)