🎬 第十一章 体验FFmpeg 5.0
📄 一句话概括

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

  1. 在你的机器上跑 ffmpeg -encoders | wc -l:跟你以为的数量差多少。
  2. 试一次 --enable-libfreetype 的编译(哪怕失败):看报错里怎么提到 freetype。
  3. 拿验收用的那条 lavfi 命令跑一遍:看输出文件多大、能不能播。

常见误区

  1. 只敲 apt install ffmpeg 就以为齐了。发行版给你的是一份别人挑过的构建。
  2. 漏了 --enable-gpl。libx264 编不进来,后面所有命令都缺编码器。
  3. 验收只看 -version。版本对不对跟能不能用是两件事。
自测三问(点开对答案) 1. 为什么 `libx264` 要 `--enable-gpl` 才编得进来? —— 因为 x264 是 GPL 许可,FFmpeg 不开这个开关就不能把 GPL 组件链进来。 2. 验收命令为什么用 `lavfi` 造源? —— 这样不依赖任何素材文件,失败一定是软件问题,不是文件问题。 3. `ffmpeg -codecs` 输出里 `E` 和 `D` 分别是什么? —— `E` 是能编码,`D` 是能解码。能解不等于能编。

相关笔记