macOS 上 brew 最省事,静态包最干净,源码编译最自由。 三个系统装法完全不同,但装完以后的验证方法是同一套。
1.2.1 讲 Windows,1.2.2 讲 Linux,这一节收尾。 1.3 开始拆开看这三个工具到底由什么组成。
一、三条路在 macOS 上的样子
情况和 Linux 类似,只是包管理器换成了 brew:
装法 一条命令 开关谁定
Homebrew brew install ffmpeg brew 的 formula 作者 官方静态包 下 macOS 的 tar.xz FFmpeg 官方 源码编译 ./configure && make 你自己
brew 的好处是把依赖也装齐,brew 的坏处也是它把依赖装齐了。 你多了一堆不认识的库,还不知道哪个是必要的。
brew 的 ffmpeg 通常带 x264 与 x265。 原因不是 brew 更慷慨,而是它不承担发行版那种许可证审计压力—— 它只是个公式仓库,装的是「用户自己要的东西」。
二、静态包在 macOS 上的两个坑
第一个是 Gatekeeper。 从网上下载并解压的二进制,第一次运行会被系统拦住,提示「无法验证开发者」。
现象 怎么处理
提示无法验证开发者 系统设置里允许,或 xattr 去掉隔离属性 提示文件已损坏 多半也是隔离属性,不是真损坏 能跑但没声音或没权限 到隐私设置里给麦克风/摄像头权限
第二个是架构。 Apple 芯片和 Intel 芯片的二进制不通用,下错了包的表现是「能解压、一跑就崩」。 下载页会分开列,选之前先看一眼自己是什么芯片。
brew 装的那份不会有这两个问题——它按你的机器架构自动选,也自带签名。 这就是「省事」的具体含义:省掉的不是步骤,是这两类坑。
三、三个系统,验证完全一样
装的方式差得远,装完以后要敲的东西一模一样:
系统 装法 第一条验证命令
Windows 解压加改 PATH where ffmpeg Linux apt 或静态包 which -a ffmpeg macOS brew 或静态包 which -a ffmpeg
第二条开始就完全统一了:ffmpeg -version、ffmpeg -formats、ffmpeg -filters。
这三个命令在任何系统上输出格式都一样。
这一点很有用:网上搜到的排障经验可以跨系统套用。 别人在 Mac 上说「查一下 -encoders 里有没有 libx264」,你在 Windows 上照做就行。
四、学会读 configuration 那一行
ffmpeg -version 的第二行是一串 --enable-xxx,那是这个构建的全家福。
几个关键开关值得记住:
看到这一项 意味着什么
--enable-gpl 整个构建按 GPL 分发 --enable-libx264 能压 H.264 --enable-libfreetype drawtext 文字水印能用 --enable-nonfree 不可分发,只能自己用 --enable-shared 编出 dll/so,可以给程序链接
反过来用也成立:想知道某个功能在不在,不用试,看这一行就知道。
比如要确认文字的跑马灯能不能做,搜 libfreetype 比试十次命令快。
要注意这一行只说明「编进去了」,不说明「编得对」。 库版本太老、依赖缺符号,都可能编进去了却跑不起来—— 所以验证永远要两级:先看开关,再真跑一次。
五、动手 Demo:三个系统,验证方法是同一套
这一段做两件事:把三个系统的验法并成一张表, 再把「configure 里写了什么,就能查到什么」逐个核一遍。
import av
libs = sorted([c for c in av.codecs_available if c.startswith(u"lib")])
for c in libs:
sw = u"--enable-" + c.replace(u"_", u"-")
print(u"%-28s %s" % (sw, c))
实跑输出:
--------------------------------------------------------------------
macOS 装 FFmpeg——三个系统,验证方法是同一套
--------------------------------------------------------------------
**① macOS 上有三条路,差别在谁替你拍板**
装法 一条命令 适合谁
---------------------------------------------------------
Homebrew brew install ffmpeg 日常用,图省事
官方静态包 下 macOS 的 tar.xz 不想装包管理器
源码编译 ./configure && make 要定制开关
**Homebrew 的好处是把依赖也给你装齐,坏处是它替你决定开关;**
**官方静态包的好处是开关是 FFmpeg 官方定的,坏处是想改就得自己编。**
**三条路没有优劣,只有「谁替你拍板」不一样。**
**② 三个系统装完,第一条命令完全一样**
系统 装法 验完该看到什么
--------------------------------------------------------------
Windows 解压 + 改 PATH 三个 exe 都在,where 有输出
Linux apt 或静态包 ffmpeg -version 有输出
macOS brew 或静态包 ffmpeg -version 有输出
**差异全在「怎么装上」,装完以后 ffmpeg -version 打出来的东西格式一模一样。**
**所以排障经验可以跨系统复用:只要你会读那一屏,Windows 和 Mac 没区别。**
**③ 学会读 -version 的第二行:那一串 --enable-xxx 就是能力清单**
**第二行长这样:configuration: --enable-gpl --enable-libx264 --enable-libx265 ...**
**每个 --enable- 后面跟的,就是一个编译进去的组件。**
**把它和 -encoders 的输出对一遍,就知道这个构建到底有没有骗你。**
**下面不誊抄别人的 configure 串,直接把本机这 13 个组件当开关名逐个核一遍:**
如果 configure 写了 对应组件 核得到 对不对得上
------------------------------------------------------------------------------------------
--enable-libdav1d libdav1d 核得到 一对一
--enable-libmp3lame libmp3lame 核得到 一对一
--enable-libopencore-amrnb libopencore_amrnb 核得到 一对一
--enable-libopencore-amrwb libopencore_amrwb 核得到 一对一
--enable-libopus libopus 核得到 一对一
--enable-libsvtav1 libsvtav1 核得到 一对一
--enable-libvpx libvpx 核得到 一对一
--enable-libvpx-vp9 libvpx-vp9 核得到 与 libvpx 共用一个开关
--enable-libwebp libwebp 核得到 一对一
--enable-libwebp-anim libwebp_anim 核得到 与 libwebp 共用
--enable-libx264 libx264 核得到 一对一
--enable-libx264rgb libx264rgb 核得到 与 libx264 共用
--enable-libx265 libx265 核得到 一对一
**十三行全对上,说明这一串开关不是装饰,写进去就真能查到。**
**但最后两列要注意:开关数比组件数少——libvpx 一个开关放出两个编码器,**
**libx264 一个开关放出两个,libwebp 一个开关放出两个。**
**所以「数 --enable- 的个数」和「数 -encoders 的行数」永远对不上,别拿这个判对错。**
**④ 三系统共同的坑,两条**
**一是路径里有空格或中文。ffmpeg 本身不怕,但你的脚本、批处理、某些滤镜会怕。**
**二是装了两份。PATH 里先命中的那个生效,另一份怎么改都没反应。**
**排这两条的办法都是同一个:where ffmpeg(Windows)或 which -a ffmpeg(Linux/Mac),**
**看它到底打出了几个路径。**
第一张表是三系统的装法对照,差别在「谁替你拍板」。
第二张表才是重点:三个系统装完以后,要敲的命令完全一样。 所以排障经验可以跨系统复用。
第三张表把 13 个组件当成 13 个 configure 开关逐个核了一遍。 十三行全对上,说明这一串开关不是装饰——写进去就真能查到。
但注意开关数比组件数少。 libvpx 一个开关放出两个编码器,libx264 一个放出两个,libwebp 一个放出两个。 所以「数 --enable- 的个数」和「数 -encoders 的行数」永远对不上,别拿这个判对错。
30 秒实验
- 看芯片:Mac 上敲
uname -m,arm64是 Apple 芯片,x86_64是 Intel。下静态包之前先看这个。 - 去隔离:静态包跑不起来时试
xattr -d com.apple.quarantine ./ffmpeg。这一步是去掉下载标记,不是改权限。 - 核开关:把
ffmpeg -version第二行存成文本,用grep -o -- '--enable-[a-z0-9-]*'拆出每一项,和-encoders的输出对一遍。
常见误区
- 以为 macOS 上 brew 装的就没有许可证问题。brew 的 ffmpeg 通常带 GPL 组件,做闭源产品照样要注意。
- 把「文件已损坏」当真损坏。从网上下载的二进制带隔离属性,系统会误报。去掉 xattr 就行,不用重新下。
- 在 Apple 芯片上下 x86_64 的包。能解压、一跑就崩,报错还很含糊。下之前先
uname -m。
自测三问(点开对答案)
1. Mac 上 `brew install ffmpeg` 和官方静态包,装出来的能力一样吗? —— 不一定。both 都可能带 x264,但具体带什么取决于 brew 的 formula 或官方打包时的开关。要看 `-version` 第二行确认。 2. 为什么说「开关数」和「组件数」对不上? —— 一个 `--enable-libvpx` 会同时放出 libvpx 和 libvpx-vp9 两个编码器,libx264 也是。所以组件数会比开关数多。 3. `ffmpeg -version` 第二行写着 `--enable-libfreetype`,就一定能用 drawtext 吗? —— 不一定。还要看 freetype 本身是否正常加载。开关只说明「编译时找到了」,运行期仍可能因为库版本不匹配而失败。所以验证要两级。- ☐ (本节完,下一节 1.3.1 工具)