🎬 第一章 FFmpeg入门简介
📄 一句话概括

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

  1. 看芯片:Mac 上敲 uname -m,arm64 是 Apple 芯片,x86_64 是 Intel。下静态包之前先看这个。
  2. 去隔离:静态包跑不起来时试 xattr -d com.apple.quarantine ./ffmpeg。这一步是去掉下载标记,不是改权限。
  3. 核开关:把 ffmpeg -version 第二行存成文本,用 grep -o -- '--enable-[a-z0-9-]*' 拆出每一项,和 -encoders 的输出对一遍。

常见误区

  1. 以为 macOS 上 brew 装的就没有许可证问题。brew 的 ffmpeg 通常带 GPL 组件,做闭源产品照样要注意。
  2. 把「文件已损坏」当真损坏。从网上下载的二进制带隔离属性,系统会误报。去掉 xattr 就行,不用重新下。
  3. 在 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 本身是否正常加载。开关只说明「编译时找到了」,运行期仍可能因为库版本不匹配而失败。所以验证要两级。

相关笔记