Linux 上装 FFmpeg 有三条路,差别不在「能不能用」,在「带没带你需要的开关」。 装完必须验收四步,前三步只证明清单里有,第四步才证明真能跑。
上一节讲的是「5.0 改了什么」,这一节讲「怎么弄到一份能用的 5.0」。 沙箱里没有 Linux 也没有 ffmpeg 可执行文件,所以能实测的只有「装完怎么验收」。
一、三条路,各有各的代价
Linux 上装 FFmpeg 就三条路:
装法 版本新旧 可定制性 适合谁
发行版仓库 apt/yum 往往落后一两版 没得选 只想先跑起来 官方或第三方静态包 新,但要挑对源 没得选 要新版又不想编译 自己源码编译 要哪版有哪版 完全可控 要特定滤镜或编码器
「版本新旧」不是关键,「可定制性」才是。
因为决定你能不能用 drawtext、能不能用 libx264 的,是编译时开的开关,不是版本号。
发行版仓库装出来的那份,别人替你做了选择——
而别人的选择往往跟你手上的活不一样。
二、编译时那几个开关,决定你能干什么
自己编的时候,下面这几个基本是必开的:
开关 开了才能用
--enable-gpl libx264、libx265(GPL 许可) --enable-libx264 H.264 软件编码 --enable-libx265 H.265 软件编码 --enable-libfreetype drawtext 画字 --enable-libass subtitles/ass 烧字幕 --enable-libfdk-aac 高质量的 AAC 编码
--enable-gpl 这一条最容易漏,也最容易被误伤:
libx264 是 GPL 许可,不给 --enable-gpl 就编不进来。
所以「装完发现没有 libx264」这件事,八成不是装错,是编译时没开这个开关。
--enable-libfreetype 和 --enable-libass 是另一组:
不开这两个,drawtext 和 subtitles 就根本不在滤镜清单里。
这不是「参数写错」,是「这个功能压根没编进来」——
11.3 会用实测把这件事摆清楚。
三、装完先问三个数
不管用哪条路装的,装完第一件事是问三个数:
查什么 命令 它是什么
滤镜 ffmpeg -filters 你能用哪些效果 格式 ffmpeg -formats 你能开哪些容器与设备 编解码器 ffmpeg -codecs 你能编能解哪些编码
本机这三张清单分别是 468、414、557 条。 这三个数就是「这套二进制能干什么」的完整边界—— 后面所有「为什么这个滤镜用不了」「为什么这个格式开不了」, 答案全在三张清单里,不在任何一篇教程里。
顺便说一句:ffmpeg -codecs 输出里每行前面有几个字母标记,
E 是能编、D 是能解、V 是视频、A 是音频。
要找「能编 H.264 的」,就筛含 EV 的那一行——比记编码器全名快。
四、四步验收,第四步最容易跳
装完按这四步走一遍,能省掉后面一大半「装是装了但不管用」的麻烦:
验收什么 敲什么 看到什么算过
版本对不对 ffmpeg -version 第一行有版本号与构建信息 编码器在不在 ffmpeg -encoders | grep x264 列出 libx264 滤镜在不在 ffmpeg -filters | grep drawtext 列出 drawtext 真能出片 一条最小转码命令 输出文件大于 0 且能播
第四步最容易被跳过,因为它「看起来多余」——前三步都说有了,还验什么? 但前三步只证明「清单里有」,第四步才证明「真能跑」。 这跟第九章那条「打开成功跟能用是两件事」是一个道理, 只是这一次发生在装完软件的第一分钟。
五、一条最小转码命令怎么选
验收用的那条命令,越简单越好,但要覆盖两件事:读得进来、写得出去。
ffmpeg -f lavfi -i testsrc=size=320x240:rate=25 \
-t 2 -c:v libx264 -crf 28 out.mp4
-f lavfi -i testsrc 是「自己造一段画面」,不依赖任何素材文件——
这一点很重要:验收命令不该因为「找不到输入」而失败,
那样你分不清是「装坏了」还是「文件不在」。
-t 2 限两秒,免得手一抖等半天;-crf 28 让文件小一点。
跑完看输出文件大小,再看能不能播——两步都过,这套 FFmpeg 就算立住了。
六、动手 Demo:三个数 + 编解码器抽查
沙箱这套二进制能实测的三张清单,下面一次列全。
编解码器抽查那几个,是日常最常用的八个;libx264 不在就等于没法干活。
import av
import av.filter
print("滤镜 %d 个" % len(av.filter.filters_available))
print("格式 %d 个" % len(av.formats_available))
print("编解码器 %d 个" % len(av.codecs_available))
for nm in ("libx264", "libx265", "aac", "libsvtav1",
"libvpx-vp9", "libopus"):
print(" %-12s %s" % (nm, "在" if nm in av.codecs_available else "没有"))
实跑输出:
--------------------------------------------------------------------
11.1.2 FFmpeg 5.0 的安装
--------------------------------------------------------------------
**① 装完先问三个数**
**沙箱是 Windows,没有 Linux 发行版也没有 ffmpeg 这个可执行文件,**
**所以「怎么装」这一段只能给清单。但「装完怎么验收」是可以实测的——**
**下面这三个数就是一套 FFmpeg 的能力边界:**
查什么 本机有多少 命令行里怎么查
------------------------------------------------------------
滤镜 468 个 ffmpeg -filters
格式 414 个 ffmpeg -formats
编解码器 557 个 ffmpeg -codecs
**这三个数是「你这套二进制能干什么」的完整答案。**
**后面所有「为什么这个滤镜用不了」「为什么这个格式开不了」,**
**答案全在三张清单里,不在任何一篇教程里。**
**② 编解码器抽查:常用的是不是都在**
编解码器 本机 它管什么
----------------------------------------------------------
libx264 有 H.264 软件编码,最常用
libx265 有 H.265 软件编码
libsvtav1 有 AV1 编码
libvpx-vp9 有 VP9 编码
aac 有 FFmpeg 自带 AAC 编码
libmp3lame 有 MP3 编码
libopus 有 Opus 编码
dnxhd 有 广播级中间格式
**注意「最常用」这四个字:`libx264` 不是 FFmpeg 自带的,**
**它是外部库,必须在编译时 `--enable-libx264` 才会在。**
**所以「装了 FFmpeg 却没有 libx264」是完全可能的——**
**尤其在某些精简发行版和 Docker 镜像里,这种情况很常见。**
**③ 装完的四步验收**
验收什么 敲什么 看到什么算过
----------------------------------------------------------------------------
版本对不对 ffmpeg -version 第一行有版本号与构建信息
编码器在不在 ffmpeg -encoders | grep x264 列出 libx264
滤镜在不在 ffmpeg -filters | grep drawtext 列出 drawtext
真能出片 一条最小转码命令 输出文件大于 0 且能播
**四步里最容易跳过的是第四步。**
**前三步只证明「清单里有」,第四步才证明「真能跑」——**
**这跟第九章那条「打开成功不等于能用」是同一个道理,**
**只是发生在装完软件的第一分钟。**
三个数字里,libx264 那一行最要紧:没有它,这一整套课里大半命令都跑不了。
「编解码器 557 个」这个数看着很多,其实里面一大半是解码器;
真正能用来编码的,筛 E 开头那一列就少得多——
这也是为什么「能放」和「能压」永远是两件事。
30 秒实验
- 在你的机器上跑
ffmpeg -encoders | wc -l:跟你以为的数量差多少。 - 试一次
--enable-libfreetype的编译(哪怕失败):看报错里怎么提到 freetype。 - 拿验收用的那条 lavfi 命令跑一遍:看输出文件多大、能不能播。
常见误区
- 只敲
apt install ffmpeg就以为齐了。发行版给你的是一份别人挑过的构建。 - 漏了
--enable-gpl。libx264编不进来,后面所有命令都缺编码器。 - 验收只看
-version。版本对不对跟能不能用是两件事。
自测三问(点开对答案)
1. 为什么 `libx264` 要 `--enable-gpl` 才编得进来? —— 因为 x264 是 GPL 许可,FFmpeg 不开这个开关就不能把 GPL 组件链进来。 2. 验收命令为什么用 `lavfi` 造源? —— 这样不依赖任何素材文件,失败一定是软件问题,不是文件问题。 3. `ffmpeg -codecs` 输出里 `E` 和 `D` 分别是什么? —— `E` 是能编码,`D` 是能解码。能解不等于能编。- ☐ 11.1.2 完——下一节 11.2 使用 FFmpeg 5.0 实现音视频转码