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

官网首页只有四个入口,每个入口对应一类问题。 看不懂那四个词,后面遇到「装哪个包」「为什么没这个功能」就只能瞎猜。

📝 本节和前面几节的关系

这是全课第一篇,先不碰命令,先把「去哪儿查」这件事定下来。 1.1.2 开始讲官网那个不太体面的页面。

一、官网首页就四个入口

ffmpeg.org 首页朴素得像个上世纪的个人主页,能点的其实只有四块:

入口 回答什么问题 本课哪一节用得上


Download 我该装哪个包、装哪一版 1.2 三系统安装 Documentation 某个参数怎么用、有没有这个功能 第三章开始每章都用 Bug Reports 报之前要先能复现,怎么给出复现步骤 1.4 常用功能 Hall of Shame 谁用了不认账 1.1.2 耻辱柱

这四个入口的顺序不是随便排的:先装、再用、再报错、最后才是维权。 新手最常犯的错是跳过第一个直接进第二个—— 装了一个残缺的构建,然后拿着文档查为什么参数不生效。

二、Documentation 那一页到底有多大

ffmpeg.org/documentation.html 底下挂着几份文档,最厚的两份是:

文档 厚度 什么时候翻它


ffmpeg.html 单页最长 只想查某个参数怎么用 ffmpeg-all.html 更大 连滤镜、编解码器、格式一起查 ffmpeg-filters.html 单独一份 查滤镜参数,第六章起天天用 ffprobe.html 较短 查它输出什么字段 ffplay.html 最短 查播放器快捷键

注意 ffmpeg-all 那一份:它不是「更全的 ffmpeg.html」, 而是把三个工具、所有滤镜、所有编解码器的说明拼在一起。 所以搜参数时用浏览器在 ffmpeg-all 里搜,命中率最高。

这些 HTML 在装好的机器上也有一份:源码目录 doc/ 下能 make 出来, 官方发行包里通常也带。断网时看本地那份就行。

三、三个命令,三种问法

命令行自己就能回答大部分「有没有」的问题,不用翻网页:

你想知道 敲什么 输出有多长


这个构建是哪一版 ffmpeg -version 两三行,含编译开关 认不认某种格式 ffmpeg -formats 几百行 有没有某个编码器 ffmpeg -encoders 几百行 有没有某个滤镜 ffmpeg -filters 几百行 某个参数什么意思 ffmpeg -h full 最长,建议重定向到文件

这五条里,第一条的信息量最大。它那一行 configuration 就是「这个构建的全家福」: 带没带 x264、带没带 freetype、是不是 GPL,全写在上面。

所以装完之后第一件事不是转个文件试试,是敲 ffmpeg -version 看一眼。 这一眼能省掉后面半小时的「为什么这个参数不认」。

四、版本号是有代际的

FFmpeg 的版本号有两套,混着看容易晕:

看到什么 是什么 在哪儿看到


ffmpeg version 8.0 发行版号,一看就懂 -version 第一行 libavcodec 62 库的接口版本,换代才涨 -version 后面几行 8.0.1 同一发行版里的小修 发行包文件名 git-2024xxxx 从源码编的,没有发行号 -version 第一行

发行版号涨得不快,可库的接口版本涨得慢得多—— libavcodec 从 58 走到 62 用了好几年。

记住一个用法就够了:看到教程说「这个参数 5.0 起才有」, 就去 -version 里找 libavcodec 的主版本,5.0 对应 59。 低于 59 就是没有,别在那儿试。

五、动手 Demo:七个库的版本号,本机是哪一个

沙箱里没有 ffmpeg.exe,但有 PyAV 绑定的同一套 libav*。 所以下面这些版本号是真的,只是通过 Python 拿到的。

import av
import av.filter

for k, v in sorted(av.library_versions.items()):
    print(u"%-14s %s" % (k, u".".join(str(x) for x in v)))

print(u"formats", len(av.formats_available))
print(u"codecs ", len(av.codecs_available))
print(u"filters", len(av.filter.filters_available))

实跑输出:

--------------------------------------------------------------------
FFmpeg 官网介绍——七个库的版本号,本机是哪一个
--------------------------------------------------------------------

**① 官网 Download 页列的不是一个版本号,是七个库各自的版本号**

  库                版本 tuple     主版本     管什么
  -------------------------------------------------------------------------------------
  libavcodec        62.28.102      62         编解码器总库,五百多个 codec 全在这儿
  libavdevice       62.3.102       62         采集设备,摄像头与声卡
  libavfilter       11.14.102      11         滤镜,四百多个都在这一层
  libavformat       62.12.102      62         封装与解封装,认得出 mp4、flv、ts
  libavutil         60.26.102      60         公共底座,内存、数学、像素格式
  libswresample     6.3.102        6          音频重采样
  libswscale        9.5.102        9          像素格式转换与缩放

**这七行不是七种版本,是同一份源码里七个模块各自的编号。**
**它们并不齐步走:codec 与 format 都是 62,可 filter 只有 11、swscale 只有 9。**
**每个库自己记自己的接口变更次数,改得多就涨得快。**

**② 拿 libavcodec 的主版本回查,就能知道你装的是哪一代 FFmpeg**

  libavcodec 主版本     对应发行版
  ------------------------------------------
  62                    FFmpeg 8.0 系
  61                    FFmpeg 7.0 / 7.1
  60                    FFmpeg 6.0 / 6.1
  59                    FFmpeg 5.0 / 5.1
  58                    FFmpeg 4.0 ~ 4.4
  57                    FFmpeg 3.0 ~ 3.4

**本机 libavcodec 是 62,所以它相当于 FFmpeg 8.0 系。**

**③ 官网 Documentation 页那张大表,条数在这里能数出来**

  计数器       本机条数     对应的官网命令
  ---------------------------------------------
  封装格式     414          ffmpeg -formats
  编解码器     557          ffmpeg -codecs
  滤镜         468          ffmpeg -filters

**这三个数就是官网文档 ffmpeg-all.html 的目录规模。**
**一个命令行工具能认识 414 种封装、557 种编解码器,靠的不是它自己,是这七个库。**

**④ 首页那四个入口,正好对应本章剩下的四节**

  官网入口          讲什么                       本章哪一节
  ---------------------------------------------------------------
  Download          七个库、三个工具,装哪个     1.2 安装
  Documentation     上面那三张表                 1.3 项目组成
  Bug Reports       报之前得先说清怎么复现       1.4 常用功能
  Hall of Shame     用了不认账,被挂出来         1.1.2 耻辱柱

看第一张表:七个库的主版本号并不齐步走。 codec 与 format 都是 62,可 filter 只有 11、swscale 只有 9。 每个库自己记自己的接口变更次数,改得多就涨得快。

第二张表是个对照尺:拿 libavcodec 的主版本回查,就知道这是哪一代。 本机是 62,落在 FFmpeg 8.0 那一档。

第三张表那三个数,就是官网 Documentation 的目录规模: 414 种格式、557 个编解码器、468 个滤镜。 一个命令行工具能认识这么多东西,靠的不是它自己,是上面那七个库。

最后一个表把官网四个入口和本章四节对应起来了。 这不是凑数——官网那四块本来就是按「你会遇到的四类问题」分的。

30 秒实验

  1. 查代际:在自己的机器上敲 ffmpeg -version,找到 libavcodec 后面那个数字,回本文的表里对一下是哪一代。
  2. 数条数:敲 ffmpeg -filters | wc -l(Linux/Mac)或 ffmpeg -filters | find /c /v ""(Windows),看跟本文的 468 差多少。差得多就说明构建被裁过。
  3. 找编译开关:把 -version 第二行复制到记事本里,数一数有几个 --enable-,那就是这个构建开了多少功能。

常见误区

  1. 把「FFmpeg 版本」当成一个数。它至少是三层:发行版号、库接口版本、小修号。问「你用的哪个版本」时,能说出 -version 第一行才是有效回答。
  2. 以为官网文档写的功能一定能用。文档描述的是源码能力,你的构建能不能用,取决于 configure 时开了什么。文档说有的参数,-h full 里查不到就是没有。
  3. 拿到别人的命令就直接跑。同一条命令在 5.0 和 8.0 上参数名可能已经变了。先看 -version,再看命令,这个顺序不能反。
自测三问(点开对答案) 1. 官网首页四个入口里,哪一个能回答「我这个构建为什么没有 drawtext」? —— 都不是直接的答案,但最接近的是 Documentation——查文档确认这个滤镜存在,再用 `-filters` 确认自己的构建没编它。真正的答案是 `-version` 第二行的编译开关。 2. libavcodec 的主版本号是 59,大概对应哪一代 FFmpeg? —— FFmpeg 5.0 / 5.1。这个对照不是官方强制的,但实践中一直很稳,可以当尺子用。 3. 为什么七个库的版本号不是一起涨的? —— 每个库单独维护自己的接口版本,只有接口发生不兼容变更时才涨主版本。libavfilter 改动少,所以主版本只有 11;libavcodec 加了大量新编码器,所以到了 62。

相关笔记