⚠️ 这是一个非官方翻译网站,与 FFmpeg 项目无关。准确信息请参阅原文(https://ffmpeg.org/ffmpeg.html)

ffmpeg 文档

1 概要

ffmpeg [global_options] {[input_file_options] -i input_url} ... {[output_file_options] output_url} ...

2 描述

ffmpeg 是一款通用的媒体转换器,可以读取种类繁多的输入——包括实时抓取/录制设备——将其过滤并转码为多种输出格式。

ffmpeg 可以从任意数量的输入(可以是普通文件、管道、网络流、抓取设备等)中读取数据,这些输入通过 -i 选项指定;也可以写入任意数量的输出,输出通过一个普通的输出 URL 指定。命令行中任何无法被解释为选项的内容都会被视为输出 URL。

原则上,每个输入或输出都可以包含任意数量、不同类型(视频/音频/字幕/附件/数据)的基本流,不过 container 格式可能会限制允许的流数量和/或类型。从哪些输入中选择哪些流进入哪个输出,既可以自动完成,也可以使用 -map 选项指定(参见“流选择”一章)。

在选项中引用输入/输出时,必须使用它们的索引(从 0 开始)。例如,第一个输入是 0,第二个是 1,依此类推。类似地,输入/输出中的流也通过索引来引用。例如,2:3 指的是第三个输入或输出中的第四个流。另请参见“流指定符”一章。

一般规则是,选项会应用于下一个被指定的文件。因此顺序很重要,同一个选项可以在命令行中出现多次,每次出现都会应用于下一个输入或输出文件。全局选项(例如详细程度)是这条规则的例外,应当放在最前面指定。

不要混用输入文件和输出文件——应先指定所有输入文件,再指定所有输出文件。也不要混用属于不同文件的选项。所有选项都只应用于紧随其后的输入或输出文件,并在文件之间重置。

下面是几个简单的示例。

  • 通过重新编码媒体流,将输入媒体文件转换为另一种格式:

    ffmpeg -i input.avi output.mp4
    
  • 将输出文件的视频比特率设为 64 kbit/s:

    ffmpeg -i input.avi -b:v 64k -bufsize 64k output.mp4
    
  • 强制将输出文件的帧率设为 24 fps:

    ffmpeg -i input.avi -r 24 output.mp4
    
  • 强制将输入文件(仅对原始格式有效)的帧率设为 1 fps,将输出文件的帧率设为 24 fps:

    ffmpeg -r 1 -i input.m2v -r 24 output.mp4
    

对于原始格式的输入文件,可能需要指定格式选项。

3 详细描述

ffmpeg 会用下面列出的组件搭建一条转码流水线。程序的运作方式是:输入数据块从源(source)沿着管道流向汇(sink),并在途中被经过的各个组件加以变换。

可用的组件种类如下:

  • Demuxer(“demultiplexer” 的缩写)读取输入源,以提取:
    • 元数据或章节等全局属性;
    • 输入基本流的列表及其属性

每个 -i 选项都会创建一个 demuxer 实例,并将编码后的 数据包 发送给 decoder 或 muxer。

在其他文献中,demuxer 有时被称为 分离器,因为它们的主要功能就是把一个文件拆分成若干基本流(不过有些文件只包含一个基本流)。

demuxer 的示意图如下所示:

┌──────────┬───────────────────────┐
│ demuxer  │                       │ packets for stream 0
╞══════════╡ elementary stream 0   ├──────────────────────►
│          │                       │
│  global  ├───────────────────────┤
│properties│                       │ packets for stream 1
│   and    │ elementary stream 1   ├──────────────────────►
│ metadata │                       │
│          ├───────────────────────┤
│          │                       │
│          │     ...........       │
│          │                       │
│          ├───────────────────────┤
│          │                       │ packets for stream N
│          │ elementary stream N   ├──────────────────────►
│          │                       │
└──────────┴───────────────────────┘
     ▲
     │
     │ read from file, network stream,
     │     grabbing device, etc.
     │
  • Decoder 接收音频、视频或字幕基本流的编码(压缩)数据包,并将其解码为原始 (视频为像素数组,音频为 PCM)。decoder 通常与 demuxer 中的某个基本流相关联(并从中接收输入),但有时也可以单独存在(参见“环回 decoder”)。

decoder 的示意图如下所示:

    ┌─────────┐
     packets  │         │ raw frames
    ─────────►│ decoder ├────────────►
              │         │
              └─────────┘
  • Filtergraph 用于处理和变换原始的音频或视频 。一个 filtergraph 由一个或多个单独的 滤镜 连接成图。filtergraph 分为两种类型——simplecomplex,分别通过 -filter 和 -filter_complex 选项配置。

simple filtergraph 与某个 输出基本流 相关联;它从 decoder 接收待过滤的输入,并将过滤后的输出发送给该输出流的 encoder。

一个先使用 yadif 去隔行器进行去隔行、再使用 scale 滤镜进行缩放的 simple 视频 filtergraph 大致如下:

    ┌────────────────────────┐
                 │  simple filtergraph    │
     frames from ╞════════════════════════╡ frames for
     a decoder   │  ┌───────┐  ┌───────┐  │ an encoder
    ────────────►├─►│ yadif ├─►│ scale ├─►│────────────►
                 │  └───────┘  └───────┘  │
                 └────────────────────────┘

complex filtergraph 是独立的,不与任何特定的流关联。它可以拥有多个(或零个)输入,各输入的类型可以不同(音频或视频),每个输入既可以来自某个 decoder,也可以来自另一个 complex filtergraph 的输出。它还拥有一个或多个输出,分别送入某个 encoder 或另一个 complex filtergraph 的输入。

下面的示例图展示了一个具有 3 个输入和 2 个输出(均为视频)的 complex filtergraph:

    ┌─────────────────────────────────────────────────┐
              │               complex filtergraph               │
              ╞═════════════════════════════════════════════════╡
     frames   ├───────┐  ┌─────────┐      ┌─────────┐  ┌────────┤ frames
    ─────────►│input 0├─►│ overlay ├─────►│ overlay ├─►│output 0├────────►
              ├───────┘  │         │      │         │  └────────┤
     frames   ├───────┐╭►│         │    ╭►│         │           │
    ─────────►│input 1├╯ └─────────┘    │ └─────────┘           │
              ├───────┘                 │                       │
     frames   ├───────┐ ┌─────┐ ┌─────┬─╯              ┌────────┤ frames
    ─────────►│input 2├►│scale├►│split├───────────────►│output 1├────────►
              ├───────┘ └─────┘ └─────┘                └────────┤
              └─────────────────────────────────────────────────┘

来自第二个输入的帧被叠加到第一个输入的帧之上。来自第三个输入的帧先被重新缩放,然后复制成两路相同的流。其中一路叠加到前两个输入合成后的结果之上,其输出即为该 filtergraph 的第一个输出;另一路副本则作为该 filtergraph 的第二个输出。

  • Encoder 接收原始的音频、视频或字幕 ,并将其编码为 数据包。编码(压缩)过程通常是 有损 的——它会降低流的质量以缩小输出体积;有些 encoder 是 无损 的,但代价是输出体积大得多。视频或音频 encoder 从某个 filtergraph 的输出接收输入,字幕 encoder 则从 decoder 接收输入(因为目前还不支持字幕滤镜)。每个 encoder 都与某个 muxer 的 输出基本流 相关联,并将输出发送给该 muxer。

encoder 的示意图如下所示:

    ┌─────────┐
     raw frames  │         │ packets
    ────────────►│ encoder ├─────────►
                 │         │
                 └─────────┘
  • Muxer(“multiplexer” 的缩写)从 encoder(转码 路径)或直接从 demuxer(流复制 路径)接收其各基本流的编码 数据包,将它们交织在一起(当基本流多于一个时),并将最终的字节写入输出文件(或管道、网络流等)。

muxer 的示意图如下所示:

    ┌──────────────────────┬───────────┐
     packets for stream 0  │                      │   muxer   │
    ──────────────────────►│  elementary stream 0 ╞═══════════╡
                           │                      │           │
                           ├──────────────────────┤  global   │
     packets for stream 1  │                      │properties │
    ──────────────────────►│  elementary stream 1 │   and     │
                           │                      │ metadata  │
                           ├──────────────────────┤           │
                           │                      │           │
                           │     ...........      │           │
                           │                      │           │
                           ├──────────────────────┤           │
     packets for stream N  │                      │           │
    ──────────────────────►│  elementary stream N │           │
                           │                      │           │
                           └──────────────────────┴─────┬─────┘
                                                        │
                         write to file, network stream, │
                             grabbing device, etc.      │
                                                        │
                                                        ▼

3.1 流复制

ffmpeg 中最简单的流水线是单流 流复制,即在不解码、不过滤、不编码的情况下,直接复制某个 输入基本流 的数据包。举例来说,假设有一个名为 INPUT.mkv、包含 3 个基本流的输入文件,我们取出其中第二个基本流并写入文件 OUTPUT.mp4。这样一条流水线的示意图如下所示:

┌──────────┬─────────────────────┐
│ demuxer  │                     │ unused
╞══════════╡ elementary stream 0 ├────────╳
│          │                     │
│INPUT.mkv ├─────────────────────┤          ┌──────────────────────┬───────────┐
│          │                     │ packets  │                      │   muxer   │
│          │ elementary stream 1 ├─────────►│  elementary stream 0 ╞═══════════╡
│          │                     │          │                      │OUTPUT.mp4 │
│          ├─────────────────────┤          └──────────────────────┴───────────┘
│          │                     │ unused
│          │ elementary stream 2 ├────────╳
│          │                     │
└──────────┴─────────────────────┘

上面的流水线可以用下面的命令行构建:

ffmpeg -i INPUT.mkv -map 0:1 -c copy OUTPUT.mp4

在这条命令行中

  • 只有一个输入 INPUT.mkv;
  • 该输入没有任何输入选项;
  • 只有一个输出 OUTPUT.mp4;
  • 该输出有两个输出选项:
    • -map 0:1 选择要使用的输入流——从索引为 0 的输入(即第一个输入)中选择索引为 1 的流(即第二个流);
    • -c copy 选择 copy encoder,即不进行解码或编码的流复制。

流复制适用于改变基本流数量、container 格式,或修改 container 级别的元数据。由于不需要解码或编码,它的速度非常快,也不会有任何质量损失。不过,由于种种原因(例如目标 container 所需的某些信息在源文件中并不存在),它在某些情况下可能无法工作。显然也无法应用滤镜,因为滤镜是对解码后的帧进行处理的。

还可以构建更复杂的流复制场景——例如,将两个输入文件中的流合并到一个输出中:

┌──────────┬────────────────────┐         ┌────────────────────┬───────────┐
│ demuxer 0│                    │ packets │                    │   muxer   │
╞══════════╡elementary stream 0 ├────────►│elementary stream 0 ╞═══════════╡
│INPUT0.mkv│                    │         │                    │OUTPUT.mp4 │
└──────────┴────────────────────┘         ├────────────────────┤           │
┌──────────┬────────────────────┐         │                    │           │
│ demuxer 1│                    │ packets │elementary stream 1 │           │
╞══════════╡elementary stream 0 ├────────►│                    │           │
│INPUT1.aac│                    │         └────────────────────┴───────────┘
└──────────┴────────────────────┘

可以用下面的命令行构建:

ffmpeg -i INPUT0.mkv -i INPUT1.aac -map 0:0 -map 1:0 -c copy OUTPUT.mp4

这里的输出 -map 选项使用了两次,在输出文件中创建了两个流——一个来自第一个输入,另一个来自第二个输入。单独一个 -c 选项实例就为这两个流都选择了流复制。你也可以像后面章节中演示的那样,配合流指定符多次使用该选项,为每个流分别设置不同的值。

相反的场景是把单个输入中的多个流拆分到多个输出中:

┌──────────┬─────────────────────┐          ┌───────────────────┬───────────┐
│ demuxer  │                     │ packets  │                   │ muxer 0   │
╞══════════╡ elementary stream 0 ├─────────►│elementary stream 0╞═══════════╡
│          │                     │          │                   │OUTPUT0.mp4│
│INPUT.mkv ├─────────────────────┤          └───────────────────┴───────────┘
│          │                     │ packets  ┌───────────────────┬───────────┐
│          │ elementary stream 1 ├─────────►│                   │ muxer 1   │
│          │                     │          │elementary stream 0╞═══════════╡
└──────────┴─────────────────────┘          │                   │OUTPUT1.mp4│
                                            └───────────────────┴───────────┘

用以下命令构建:

ffmpeg -i INPUT.mkv -map 0:0 -c copy OUTPUT0.mp4 -map 0:1 -c copy OUTPUT1.mp4

请注意,即使值相同,每个输出文件也都需要单独一个 -c 选项实例。这是因为非全局选项(大多数选项都是如此)只在紧随其后的那个文件的上下文中生效。

当然,这些示例还可以进一步推广为任意数量输入到任意数量输出之间的任意重映射。

3.2 转码

转码 是先解码一个流、再重新编码的过程。由于编码通常计算成本较高,并且在大多数情况下会降低流的质量(即它是 有损 的),因此只应在确有需要时才进行转码,其余情况下应执行流复制。转码的典型原因包括:

  • 需要应用滤镜——例如缩放、去隔行或叠加视频;重采样或混合音频;
  • 需要把流提供给无法解码原始 codec 的下游。

请注意,除非为音频、视频和字幕流指定 -c copy,否则 ffmpeg 会对它们全部进行转码。

考虑这样一条示例流水线:读取一个包含一路音频和一路视频流的输入文件,对视频进行转码,同时复制音频,输出到单个文件中。其示意图大致如下

┌──────────┬─────────────────────┐
│ demuxer  │                     │       audio packets
╞══════════╡ stream 0 (audio)    ├─────────────────────────────────────╮
│          │                     │                                     │
│INPUT.mkv ├─────────────────────┤ video    ┌─────────┐     raw        │
│          │                     │ packets  │  video  │ video frames   │
│          │ stream 1 (video)    ├─────────►│ decoder ├──────────────╮ │
│          │                     │          │         │              │ │
└──────────┴─────────────────────┘          └─────────┘              │ │
                                                                     ▼ ▼
                                                                     │ │
┌──────────┬─────────────────────┐ video    ┌─────────┐              │ │
│ muxer    │                     │ packets  │  video  │              │ │
╞══════════╡ stream 0 (video)    │◄─────────┤ encoder ├──────────────╯ │
│          │                     │          │(libx264)│                │
│OUTPUT.mp4├─────────────────────┤          └─────────┘                │
│          │                     │                                     │
│          │ stream 1 (audio)    │◄────────────────────────────────────╯
│          │                     │
└──────────┴─────────────────────┘

并用下面的命令行实现:

ffmpeg -i INPUT.mkv -map 0:v -map 0:a -c:v libx264 -c:a copy OUTPUT.mp4

请注意,这里使用了流指定符 :v:a 来选择输入流,并为它们分别应用不同的 -c 选项值;详情参见“流指定符”一节。

3.3 滤镜处理

在转码时,可以在编码之前用 simplecomplex filtergraph 对音频和视频流进行滤镜处理。

3.3.1 simple filtergraph

simple filtergraph 是指恰好只有一个输入和一个输出、且类型相同(音频或视频)的 filtergraph。它们通过按流设置的 -filter 选项配置(-vf 和 -af 分别是 -filter:v(视频)和 -filter:a(音频)的别名)。请注意,simple filtergraph 与其输出流是绑定的,因此例如当你有多路音频流时,-af 会为每一路都创建一个单独的 filtergraph。

以前面的转码示例为基础,加入滤镜处理后(为清晰起见省略音频),大致如下所示:

┌──────────┬───────────────┐
│ demuxer  │               │          ┌─────────┐
╞══════════╡ video stream  │ packets  │  video  │ frames
│INPUT.mkv │               ├─────────►│ decoder ├─────►───╮
│          │               │          └─────────┘         │
└──────────┴───────────────┘                              │
                                  ╭───────────◄───────────╯
                                  │   ┌────────────────────────┐
                                  │   │  simple filtergraph    │
                                  │   ╞════════════════════════╡
                                  │   │  ┌───────┐  ┌───────┐  │
                                  ╰──►├─►│ yadif ├─►│ scale ├─►├╮
                                      │  └───────┘  └───────┘  ││
                                      └────────────────────────┘│
                                                                │
                                                                │
┌──────────┬───────────────┐ video    ┌─────────┐               │
│ muxer    │               │ packets  │  video  │               │
╞══════════╡ video stream  │◄─────────┤ encoder ├───────◄───────╯
│OUTPUT.mp4│               │          │         │
│          │               │          └─────────┘
└──────────┴───────────────┘

3.3.2 complex filtergraph

complex filtergraph 是指那些无法简单描述为对单一流的线性处理链的 filtergraph。例如,当图具有一个以上的输入和/或输出,或者输出流类型与输入不同时,就属于这种情况。complex filtergraph 通过 -filter_complex 选项配置。请注意该选项是全局的,因为 complex filtergraph 就其本质而言,无法明确地与单个流或文件相关联。每使用一次 -filter_complex,就会创建一个新的 complex filtergraph,数量不限。

complex filtergraph 的一个简单例子是 overlay 滤镜,它有两路视频输入和一路视频输出,将一路视频叠加在另一路之上。其音频对应物是 amix 滤镜。

3.4 环回 decoder

虽然 decoder 通常与 demuxer 的流相关联,但也可以创建“环回”decoder,用于解码某个 encoder 的输出,并将其回馈给 complex filtergraph。这可以通过 -dec 指令实现,该指令的参数是应当被解码的输出流的索引。每一条这样的指令都会创建一个新的环回 decoder,并按照从零开始的连续整数编号。随后应使用这些索引,按照 -filter_complex 文档中所述的方式,在 complex filtergraph 的链接标签中引用这些环回 decoder。

可以像输入/输出选项那样,把解码用的 AVOptions 放在 -dec 之前,传递给环回 decoder。

例如,下面这个例子:

ffmpeg -i INPUT                                        \
  -map 0:v:0 -c:v libx264 -crf 45 -f null -            \
  -threads 3 -dec 0:0                                  \
  -filter_complex '[0:v][dec:0]hstack[stack]'          \
  -map '[stack]' -c:v ffv1 OUTPUT

读取一段输入视频,并且

  • (第 2 行)使用 libx264 以低质量对其进行编码;
  • (第 3 行)使用 3 个线程解码这段编码后的流;
  • (第 4 行)将解码后的视频与原始输入视频并排放置;
  • (第 5 行)将合成后的视频无损编码并写入 OUTPUT。

这样一条转码流水线可以用下面的图表示:

┌──────────┬───────────────┐
│ demuxer  │               │   ┌─────────┐            ┌─────────┐    ┌────────────────────┐
╞══════════╡ video stream  │   │  video  │            │  video  │    │ null muxer         │
│   INPUT  │               ├──►│ decoder ├──┬────────►│ encoder ├─┬─►│(discards its input)│
│          │               │   └─────────┘  │         │(libx264)│ │  └────────────────────┘
└──────────┴───────────────┘                │         └─────────┘ │
                                 ╭───────◄──╯   ┌─────────┐       │
                                 │              │loopback │       │
                                 │ ╭─────◄──────┤ decoder ├────◄──╯
                                 │ │            └─────────┘
                                 │ │
                                 │ │
                                 │ │  ┌───────────────────┐
                                 │ │  │complex filtergraph│
                                 │ │  ╞═══════════════════╡
                                 │ │  │  ┌─────────────┐  │
                                 ╰─╫─►├─►│   hstack    ├─►├╮
                                   ╰─►├─►│             │  ││
                                      │  └─────────────┘  ││
                                      └───────────────────┘│
                                                           │
┌──────────┬───────────────┐  ┌─────────┐                  │
│ muxer    │               │  │  video  │                  │
╞══════════╡ video stream  │◄─┤ encoder ├───────◄──────────╯
│  OUTPUT  │               │  │ (ffv1)  │
│          │               │  └─────────┘
└──────────┴───────────────┘

4 流选择

ffmpeg 提供 -map 选项,用于手动控制每个输出文件中的流选择。用户也可以不使用 -map,让 ffmpeg 按照下文所述执行自动流选择。-vn / -an / -sn / -dn 选项可分别用于跳过视频、音频、字幕和数据流的加入,无论这些流是手动映射的还是自动选择的,但作为 complex filtergraph 输出的流除外。

4.1 描述

接下来的小节将说明流选择所涉及的各种规则,随后的示例将展示这些规则在实际中的应用方式。

尽管我们已经尽力准确反映程序的行为,但 FFmpeg 处于持续开发之中,代码自本文撰写以来可能已发生变化。

4.1.1 自动流选择

如果某个输出文件没有任何 map 选项,ffmpeg 会检查该输出格式,确定其中可以包含哪些类型的流,即视频、音频和/或字幕。对于每种可接受的流类型,只要有可用的流,ffmpeg 就会从所有输入中挑选一个。

它会依据以下标准来选择该流:

  • 对于视频,是分辨率最高的流,
  • 对于音频,是声道数最多的流,
  • 对于字幕,是找到的第一个字幕流,但有一点需要注意:输出格式的默认字幕 encoder 可能是基于文本的,也可能是基于图像的,只有类型相同的字幕流才会被选中。

如果同一类型的多个流评分相同,则选择索引最小的那个流。

数据流或附件流不会被自动选择,只能通过 -map 显式加入。

4.1.2 手动流选择

使用 -map 时,该输出文件中只会包含用户手动映射的流,唯一可能的例外是下文所述的 filtergraph 输出。

4.1.3 complex filtergraph

如果存在带有未标记输出端的 complex filtergraph 输出流,它们会被加入第一个输出文件。如果输出格式不支持该流类型,就会导致致命错误。在没有 map 选项的情况下,加入这些流会导致跳过对应类型的自动流选择。如果存在 map 选项,这些 filtergraph 流会在已映射的流之外被额外加入。

带有标记输出端的 complex filtergraph 输出流必须被映射且只能映射一次。

4.1.4 流处理

流处理独立于流选择,但下文所述的字幕情况例外。流处理是通过针对特定 输出 文件内的流指定 -codec 选项来设置的。特别是,codec 选项是在流选择过程之后才由 ffmpeg 应用的,因此不会影响流选择本身。如果某个流类型没有指定 -codec 选项,ffmpeg 会选择由输出文件的 muxer 注册的默认 encoder。

字幕是一个例外。如果为某个输出文件指定了字幕 encoder,那么无论类型是文本还是图像,找到的第一个字幕流都会被加入。ffmpeg 不会验证指定的 encoder 是否能够转换所选的流,也不会验证转换后的流在输出格式中是否可被接受。这一点也具有普遍性:当用户手动设置 encoder 时,流选择过程无法检查编码后的流是否能够被封装进输出文件。如果不能,ffmpeg 会中止,并且 所有 输出文件都将处理失败。

4.2 示例

以下示例展示了 ffmpeg 流选择方式的行为、怪异之处和局限性。

它们假定有以下三个输入文件。

input file 'A.avi'
      stream 0: video 640x360
      stream 1: audio 2 channels

input file 'B.mp4'
      stream 0: video 1920x1080
      stream 1: audio 2 channels
      stream 2: subtitles (text)
      stream 3: audio 5.1 channels
      stream 4: subtitles (text)

input file 'C.mkv'
      stream 0: video 1280x720
      stream 1: audio 2 channels
      stream 2: subtitles (image)

示例:自动流选择

ffmpeg -i A.avi -i B.mp4 out1.mkv out2.wav -map 1:a -c:a copy out3.mov

这里指定了三个输出文件,前两个都没有设置 -map 选项,因此 ffmpeg 会为这两个文件自动选择流。

out1.mkv 是一个 Matroska container 文件,接受视频、音频和字幕流,因此 ffmpeg 会尝试为每种类型都选择一个。
对于视频,它会从 B.mp4 中选择 stream 0,因为它在所有输入视频流中分辨率最高。
对于音频,它会从 B.mp4 中选择 stream 3,因为它的声道数最多。
对于字幕,它会从 B.mp4 中选择 stream 2,这是 A.avi 和 B.mp4 中第一个字幕流。

out2.wav 只接受音频流,因此只会选中 B.mp4 中的 stream 3

对于 out3.mov,由于设置了 -map 选项,不会发生自动流选择。-map 1:a 选项会选中第二个输入 B.mp4 中的所有音频流,该输出文件中不会包含其他任何流。

对于前两个输出,所有被加入的流都会被转码。所选的 encoder 是各输出格式所注册的默认 encoder,可能与所选输入流的 codec 不一致。

对于第三个输出,音频流的 codec 选项已设置为 copy,因此不会——也 不能——发生解码、滤镜处理或编码操作。所选流的数据包会直接从输入文件传送并封装进输出文件。

示例:字幕的自动选择

ffmpeg -i C.mkv out1.mkv -c:s dvdsub -an out2.mkv

虽然 out1.mkv 是一个接受字幕流的 Matroska container 文件,但只会选中一路视频流和一路音频流。C.mkv 的字幕流是基于图像的,而 Matroska muxer 的默认字幕 encoder 是基于文本的,因此字幕的转码操作预计会失败,该流也就不会被选中。然而在 out2.mkv 中,命令里指定了字幕 encoder,因此除了视频流之外,字幕流也会被选中。-an 的存在会禁用 out2.mkv 的音频流选择。

示例:无标签的 filtergraph 输出

ffmpeg -i A.avi -i C.mkv -i B.mp4 -filter_complex "overlay" out1.mp4 out2.srt

这里通过 -filter_complex 选项设置了一个 filtergraph,其中只包含一个视频滤镜。overlay 滤镜恰好需要两路视频输入,但命令中并未指定,因此会使用前两个可用的视频流,也就是 A.avi 和 C.mkv 的流。该滤镜的输出端没有标签,因此会被送到第一个输出文件 out1.mp4。正因如此,视频流的自动选择被跳过,否则本应选中 B.mp4 中的流。声道数最多的音频流,即 B.mp4 中的 stream 3,则会被自动选中。不过没有字幕流被选中,因为 MP4 格式没有注册默认的字幕 encoder,用户也没有指定字幕 encoder。

第二个输出文件 out2.srt 只接受基于文本的字幕流。因此,尽管第一个可用的字幕流属于 C.mkv,但由于它是基于图像的,会被跳过。最终选中的流是 B.mp4 中的 stream 2,即第一个基于文本的字幕流。

示例:有标签的 filtergraph 输出

ffmpeg -i A.avi -i B.mp4 -i C.mkv -filter_complex "[1:v]hue=s=0[outv];overlay;aresample" \
       -map '[outv]' -an        out1.mp4 \
                                out2.mkv \
       -map '[outv]' -map 1:a:0 out3.mkv

上面的命令会失败,因为标签为 [outv] 的输出端被映射了两次。所有输出文件都不会被处理。

ffmpeg -i A.avi -i B.mp4 -i C.mkv -filter_complex "[1:v]hue=s=0[outv];overlay;aresample" \
       -an        out1.mp4 \
                  out2.mkv \
       -map 1:a:0 out3.mkv

上面这条命令同样会失败,因为 hue 滤镜的输出带有标签 [outv],却没有在任何地方被映射。

应当将命令修改如下,

ffmpeg -i A.avi -i B.mp4 -i C.mkv -filter_complex "[1:v]hue=s=0,split=2[outv1][outv2];overlay;aresample" \
        -map '[outv1]' -an        out1.mp4 \
                                  out2.mkv \
        -map '[outv2]' -map 1:a:0 out3.mkv

B.mp4 的视频流被送入 hue 滤镜,其输出通过 split 滤镜复制一份,两个输出都带有标签,然后各自的一份副本被分别映射到第一个和第三个输出文件。

overlay 滤镜需要两路视频输入,使用的是前两个尚未使用的视频流,也就是 A.avi 和 C.mkv 的流。overlay 的输出没有标签,因此无论是否存在 -map 选项,都会被送到第一个输出文件 out1.mp4。

aresample 滤镜接收的是第一个尚未使用的音频流,即 A.avi 的音频流。由于这个滤镜的输出同样没有标签,它也会被映射到第一个输出文件。-an 的存在只会抑制音频流的自动或手动选择,并不影响来自 filtergraph 的输出。这两个被映射的流在 out1.mp4 中的顺序都排在通过 -map 映射的流之前。

映射到 out2.mkv 的视频、音频和字幕流完全由自动流选择决定。

out3.mkv 由 hue 滤镜克隆出的视频输出,以及 B.mp4 中的第一路音频流组成。

5 选项

除非另有说明,所有数值选项都接受一个表示数字的字符串作为输入,其后可以跟随一个 SI 单位前缀,例如:’K’、’M’ 或 ’G’。

如果在 SI 单位前缀后面附加 ’i’,则整个前缀会被解释为二进制倍数的单位前缀,即以 1024 的幂而非 1000 的幂为基础。在 SI 单位前缀后附加 ’B’ 会使数值乘以 8。这样便可以使用例如 ’KB’、’MiB’、’G’ 和 ’B’ 之类的数字后缀。

不带参数的选项是布尔选项,会把对应的值设为 true。在选项名前加上 "no" 前缀可以将其设为 false。例如使用 "-nofoo" 会把名为 "foo" 的布尔选项设为 false。

带参数的选项支持一种特殊语法:命令行中给出的参数会被解释为一个文件路径,实际的参数值将从该文件中加载。要使用此功能,请在选项名之前(紧跟在前导短横线之后)加上一个正斜杠 ’/’。例如:

ffmpeg -i INPUT -/filter:v filter.script OUTPUT

这会从名为 filter.script 的文件中加载 filtergraph 描述。

5.1 流指定符

有些选项按流应用,例如 bitrate 或 codec。流指定符用于精确指定某个选项属于哪个(些)流。

流指定符通常是附加在选项名之后、以冒号分隔的字符串。例如 -codec:a:1 ac3 中包含 a:1 这个流指定符,它匹配第二个音频流。因此,这会为第二个音频流选择 ac3 codec。

流指定符可以匹配多个流,此时该选项会应用到所有这些流上。例如 -b:a 128k 中的流指定符匹配所有音频流。

空的流指定符匹配所有流。例如,-codec copy-codec: copy 会在不重新编码的情况下复制所有流。

流指定符可能采用以下形式:

stream_index

匹配具有该索引的流。例如 -threads:1 4 会把第二个流的线程数设为 4。如果 stream_index 被用作附加流指定符(见下文),则会从匹配到的流中选择第 stream_index 个流。流的编号基于 libavformat 检测到的流顺序,但如果同时指定了流组指定符或节目 ID,则例外,此时基于流在组或节目内的顺序。

stream_type[:additional_stream_specifier]

stream_type 可以是下列值之一:’v’ 或 ’V’ 表示视频,’a’ 表示音频,’s’ 表示字幕,’d’ 表示数据,’t’ 表示附件。’v’ 匹配所有视频流,’V’ 只匹配非附属图片、视频缩略图或封面图的视频流。如果使用了 additional_stream_specifier,则匹配同时具有该类型且匹配 additional_stream_specifier 的流;否则匹配指定类型的所有流。

g:group_specifier[:additional_stream_specifier]

匹配属于指定符为 group_specifier 的组的流。如果使用了 additional_stream_specifier,则匹配既属于该组、又匹配 additional_stream_specifier 的流。group_specifier 可以是下列值之一:

group_index

匹配具有该组索引的流。

#group_id or i:group_id

匹配具有该组 ID 的流。

p:program_id[:additional_stream_specifier]

匹配属于 ID 为 program_id 的节目的流。如果使用了 additional_stream_specifier,则匹配既属于该节目、又匹配 additional_stream_specifier 的流。

#stream_id or i:stream_id

按流 ID(例如 MPEG-TS container 中的 PID)匹配流。

m:key[:value]

匹配元数据标签 key 具有指定 value 的流。如果没有给出 value,则匹配包含该标签(不论其值)的流。key 或 value 中的冒号字符 ’:’ 需要用反斜杠转义。

disp:dispositions[:additional_stream_specifier]

匹配具有给定 disposition 的流。dispositions 是一个或多个 disposition(形式与 -dispositions 选项输出的一致)用 ’+’ 连接而成的列表。

u

匹配具有可用配置的流:codec 必须已定义,且视频尺寸或音频采样率等必要信息必须存在。

请注意,在 ffmpeg 中,按元数据匹配只对输入文件正常起作用。

5.2 通用选项

这些选项在各个 ff* 工具之间是共用的。

-L, -license

显示许可证。

-h, -?, -help, --help [arg]

显示帮助。可以指定一个可选参数,用于打印关于特定项目的帮助。如果未指定参数,则只显示基本(非高级)工具选项。

arg 可以取下列值:

long

除基本工具选项外,还打印高级工具选项。

full

打印选项的完整列表,包括 encoder、decoder、demuxer、muxer、滤镜等的共用选项和私有选项。

decoder=decoder_name

打印名为 decoder_name 的 decoder 的详细信息。可以用 -decoders 选项获取所有 decoder 的列表。

encoder=encoder_name

打印名为 encoder_name 的 encoder 的详细信息。可以用 -encoders 选项获取所有 encoder 的列表。

demuxer=demuxer_name

打印名为 demuxer_name 的 demuxer 的详细信息。可以用 -formats 选项获取所有 demuxer 和 muxer 的列表。

muxer=muxer_name

打印名为 muxer_name 的 muxer 的详细信息。可以用 -formats 选项获取所有 muxer 和 demuxer 的列表。

filter=filter_name

打印名为 filter_name 的滤镜的详细信息。可以用 -filters 选项获取所有滤镜的列表。

bsf=bitstream_filter_name

打印名为 bitstream_filter_name 的 bitstream 过滤器的详细信息。可以用 -bsfs 选项获取所有 bitstream 过滤器的列表。

protocol=protocol_name

打印名为 protocol_name 的 protocol 的详细信息。可以用 -protocols 选项获取所有 protocol 的列表。

-version

显示版本。

-buildconf

显示构建配置,每行一个选项。

-formats

显示可用的格式(包括设备)。

-demuxers

显示可用的 demuxer。

-muxers

显示可用的 muxer。

-devices

显示可用的设备。

-codecs

显示 libavcodec 已知的所有 codec。

请注意,本文档通篇将 ’codec’ 一词用作媒体 bitstream 格式这一更准确说法的简称。

-decoders

显示可用的 decoder。

-encoders

显示所有可用的 encoder。

-bsfs

显示可用的 bitstream 过滤器。

-protocols

显示可用的 protocol。

-filters

显示可用的 libavfilter 滤镜。

-pix_fmts

显示可用的 pixel format。

-sample_fmts

显示可用的 sample format。

-layouts

显示声道名称和标准声道布局。

-dispositions

显示流的 disposition。

-colors

显示可识别的颜色名称。

-sources device[,opt1=val1[,opt2=val2]...]

显示输入设备自动检测到的源。有些设备可能提供无法自动检测的系统相关源名称。不能假定返回的列表总是完整的。

ffmpeg -sources pulse,server=192.168.0.4

-sinks device[,opt1=val1[,opt2=val2]...]

显示输出设备自动检测到的汇。有些设备可能提供无法自动检测的系统相关汇名称。不能假定返回的列表总是完整的。

ffmpeg -sinks pulse,server=192.168.0.4

-loglevel [flags+]loglevel | -v [flags+]loglevel

设置库使用的日志级别和标志。

可选的 flags 前缀可以由下列值组成:

‘repeat’

表示重复的日志输出不应压缩到第一行,且 "Last message repeated n times" 这一行会被省略。

‘level’

表示应在每条消息行前添加 [level] 前缀。这可用作日志着色的替代方案,例如在把日志转储到文件时。

‘time’

表示日志行前应加上时间信息。

‘datetime’

表示日志行前应加上日期和时间信息。

flags 也可以通过添加 ’+’/’-’ 前缀单独使用,在不影响其他标志或不改变 loglevel 的情况下设置/重置单个标志。同时设置 flags 和 loglevel 时,最后一个 flags 值和 loglevel 之间需要有 ’+’ 分隔符。

loglevel 是一个字符串或数字,取值为下列之一:

‘quiet, -8’

什么都不显示,保持静默。

‘panic, 0’

只显示可能导致进程崩溃的致命错误,例如断言失败。目前尚未在任何地方使用。

‘fatal, 8’

只显示致命错误。这些是使进程绝对无法继续运行的错误。

‘error, 16’

显示所有错误,包括可以恢复的错误。

‘warning, 24’

显示所有警告和错误。任何与可能不正确或意外事件相关的消息都会显示。

‘info, 32’

在处理过程中显示信息性消息。这是在警告和错误之外附加显示的。这是默认值。

‘verbose, 40’

info 相同,只是更详细。

‘debug, 48’

显示一切内容,包括调试信息。

‘trace, 56’

例如,要启用重复日志输出、添加 level 前缀,并把 loglevel 设为 verbose

ffmpeg -loglevel repeat+level+verbose -i input output

另一个例子:在不影响 level 前缀标志或 loglevel 当前状态的情况下启用重复日志输出:

ffmpeg [...] -loglevel +repeat

默认情况下,程序会把日志输出到标准错误。如果终端支持着色,会用颜色标出错误和警告。设置环境变量 AV_LOG_FORCE_NOCOLOR 可以禁用日志着色,设置环境变量 AV_LOG_FORCE_COLOR 可以强制启用。

-report

把完整的命令行和日志输出转储到当前目录下一个名为 program-YYYYMMDD-HHMMSS.log 的文件中。这个文件对错误报告很有用。它还隐含指定了 -loglevel debug

把环境变量 FFREPORT 设为任意值也有相同的效果。如果该值是以 ’:’ 分隔的 key=value 序列,这些选项会影响报告;如果选项值中包含特殊字符或选项分隔符 ’:’,则必须进行转义(参见 ffmpeg-utils 手册中的 “Quoting and escaping” 小节)。

可识别以下选项:

file

设置用于报告的文件名;%p 会展开为程序名,%t 会展开为时间戳,%% 会展开为一个纯粹的 %

level

用数值设置日志的详细级别(参见 -loglevel)。

例如,要以日志级别 32(日志级别 info 的别名)把报告输出到名为 ffreport.log 的文件:

FFREPORT=file=ffreport.log:level=32 ffmpeg -i input output

解析环境变量时发生的错误不是致命的,也不会出现在报告中。

-hide_banner

禁止打印横幅信息。

所有 FFmpeg 工具通常都会显示版权声明、构建选项和库版本。这个选项可用于禁止打印这些信息。

-cpuflags flags (global)

允许设置和清除 CPU 标志。这个选项用于测试。除非你清楚自己在做什么,否则请勿使用。

ffmpeg -cpuflags -sse+mmx ...
ffmpeg -cpuflags mmx ...
ffmpeg -cpuflags 0 ...

此选项可用的标志如下:

‘x86’

‘mmx’ ‘mmxext’ ‘sse’ ‘sse2’ ‘sse2slow’ ‘sse3’ ‘sse3slow’ ‘ssse3’ ‘atom’ ‘sse4.1’ ‘sse4.2’ ‘avx’ ‘avx2’ ‘xop’ ‘fma3’ ‘fma4’ ‘3dnow’ ‘3dnowext’ ‘bmi1’ ‘bmi2’ ‘cmov’ ‘ARM’

‘armv5te’ ‘armv6’ ‘armv6t2’ ‘vfp’ ‘vfpv3’ ‘neon’ ‘setend’ ‘AArch64’

‘armv8’ ‘vfp’ ‘neon’ ‘PowerPC’

‘altivec’ ‘Specific Processors’

‘pentium2’ ‘pentium3’ ‘pentium4’ ‘k6’ ‘k62’ ‘athlon’ ‘athlonxp’ ‘k8’ -cpucount count (global)

覆盖对 CPU 数量的检测。这个选项用于测试。除非你清楚自己在做什么,否则请勿使用。

ffmpeg -cpucount 2

-max_alloc bytes

为 ffmpeg 的 malloc 系列函数在堆上分配的块设置最大大小上限。使用此选项时请格外小心。如果你不完全理解这样做的后果,请勿使用。默认值为 INT_MAX。

5.3 AVOptions

这些选项由 libavformat、libavdevice 和 libavcodec 库直接提供。要查看可用 AVOptions 的列表,请使用 -help 选项。它们分为两类:

generic

这些选项可以为任意 container、codec 或设备设置。generic 选项在 container/设备下列在 AVFormatContext options 中,在 codec 下列在 AVCodecContext options 中。

private

这些选项是给定 container、设备或 codec 特有的。private 选项列在其对应的 container/设备/codec 之下。

例如,要给 MP3 文件写入 ID3v2.3 头而不是默认的 ID3v2.4 头,请使用 MP3 muxer 的 id3v2_version private 选项:

ffmpeg -i input.flac -id3v2_version 3 out.mp3

所有 codec 的 AVOptions 都是按流应用的,因此应该为它们附加一个流指定符:

ffmpeg -i multichannel.mxf -map 0:v:0 -map 0:a:0 -map 0:a:0 -c:a:0 ac3 -b:a:0 640k -ac:a:1 2 -c:a:1 aac -b:2 128k out.mp4

在上面的例子中,一个多声道音频流被映射了两次以供输出。第一个实例用 codec ac3 和比特率 640k 编码。第二个实例被下混为 2 声道,并用 codec aac 编码。这里使用输出流的绝对索引为它指定了比特率 128k。

注意:布尔类型的 AVOptions 不能使用 -nooption 语法,请使用 -option 0/-option 1。

注意:通过在选项名前加上 v/a/s 来指定按流 AVOptions 的旧式未文档化方式现已过时,即将被移除。

5.4 主要选项

-f fmt (input/output)

强制指定输入或输出文件的格式。格式通常会为输入文件自动检测,为输出文件根据文件扩展名猜测,因此大多数情况下不需要此选项。

-i url (input)

输入文件的 URL。

-y (global)

不询问直接覆盖输出文件。

-n (global)

不覆盖输出文件,如果指定的输出文件已存在则立即退出。

-stream_loop number (input)

设置输入流循环的次数。循环 0 表示不循环,循环 -1 表示无限循环。

-recast_media (global)

允许强制使用与 demuxer 检测或指定的媒体类型不同的 decoder。用于解码作为数据流封装的媒体数据时很有用。

-c[:stream_specifier] codec (input/output,per-stream) -codec[:stream_specifier] codec (input/output,per-stream)

为一个或多个流选择 encoder(用在输出文件前时)或 decoder(用在输入文件前时)。codec 是 decoder/encoder 的名称,或特殊值 copy(仅限输出),表示该流不重新编码。

例如

ffmpeg -i INPUT -map 0 -c:v libx264 -c:a copy OUTPUT

使用 libx264 编码所有视频流,并复制所有音频流。

对每个流,应用最后一个匹配的 c 选项,因此

ffmpeg -i INPUT -map 0 -c copy -c:v:1 libx264 -c:a:137 libvorbis OUTPUT

会复制除第二个视频流(将用 libx264 编码)和第 138 个音频流(将用 libvorbis 编码)之外的所有流。

-t duration (input/output)

用作输入选项(在 -i 之前)时,限制从输入文件读取数据的时长。

用作输出选项(在输出 url 之前)时,当输出的时长达到 duration 后停止写入。

duration 必须是一个时间长度规范,参见 (ffmpeg-utils)ffmpeg-utils(1) 手册中的时间长度一节

-to 和 -t 互斥,-t 优先。

-to position (input/output)

在 position 处停止写入输出或读取输入。position 必须是时间长度的规范,参见 (ffmpeg-utils)the Time duration section in the ffmpeg-utils(1) manual

-to 和 -t 互斥,-t 优先。

-fs limit_size (output)

设置文件大小限制,以字节表示。超过限制后不再写入更多字节块。输出文件的大小会略微大于请求的文件大小。

-ss position (input/output)

用作输入选项(在 -i 之前)时,将此输入文件定位到 position。请注意,大多数格式无法精确定位,因此 ffmpeg 会定位到 position 之前最接近的定位点。转码时如果启用了 -accurate_seek(默认),定位点与 position 之间的这段额外区间会被解码并丢弃。进行流复制或使用 -noaccurate_seek 时,该区间会被保留。

用作输出选项(在输出 url 之前)时,会解码但丢弃输入,直到时间戳达到 position。

position 必须是时间长度的规范,参见 (ffmpeg-utils)the Time duration section in the ffmpeg-utils(1) manual

-sseof position (input)

-ss 选项类似,但相对于“文件末尾”。也就是说,负值表示文件中更靠前的位置,0 表示 EOF。

-isync input_index (input)

将某个输入指定为同步源。

这会取目标输入与参考输入起始时刻之差,并以该差值偏移目标文件的时间戳。为了得到预期结果,两个输入的源时间戳应来自同一个时钟源。如果设置了 copyts,则也必须设置 start_at_zero。如果任一输入没有起始时间戳,则不会进行同步调整。

可接受的值是指向有效 ffmpeg 输入索引的值。如果同步参考是目标索引本身或 -1,则不会对目标时间戳做任何调整。同步参考自身不能再同步到任何其他输入。

默认值为 -1。

-itsoffset offset (input)

设置输入的时间偏移量。

offset 必须是时间长度的规范,参见 (ffmpeg-utils)the Time duration section in the ffmpeg-utils(1) manual

该偏移量会加到输入文件的时间戳上。指定正的偏移量意味着相应的流会被延迟 offset 中指定的时长。

-itsscale scale (input,per-stream)

对输入时间戳重新缩放。scale 应为浮点数。

-timestamp date (output)

设置容器中的录制时间戳。

date 必须是日期规范,参见 (ffmpeg-utils)the Date section in the ffmpeg-utils(1) manual

-metadata[:metadata_specifier] key=value (output,per-metadata)

设置一个元数据键/值对。

可以给出可选的 metadata_specifier,用于为流、章节或节目设置元数据。详情参见 -map_metadata 的文档。

此选项会覆盖用 -map_metadata 设置的元数据。也可以通过使用空值来删除元数据。

例如,要设置输出文件中的标题:

ffmpeg -i in.avi -metadata title="my title" out.flv

要设置第一个音频流的语言:

ffmpeg -i INPUT -metadata:s:a:0 language=eng OUTPUT

-disposition[:stream_specifier] value (output,per-stream)

设置流的 disposition 标志。

默认值:默认情况下,所有 disposition 标志都从输入流复制而来,除非此选项所应用的输出流由 complex filtergraph 提供数据——在这种情况下,默认不设置任何 disposition 标志。

value 是以 ’+’ 或 ’-’ 分隔的一串 disposition 标志。前缀 ’+’ 表示添加给定的 disposition,’-’ 表示移除它。如果第一个标志也带有 ’+’ 或 ’-’ 前缀,则最终的 disposition 是在默认值基础上按 value 更新得到的结果。如果第一个标志没有前缀,则最终的 disposition 就是 value 本身。也可以通过将其设置为 0 来清除 disposition。

如果没有为输出文件指定任何 -disposition 选项,当输出文件中某种类型的流有多个、且尚未有该类型的流被标记为 default 时,ffmpeg 会自动在该类型的第一个流上设置 ’default’ disposition 标志。

-dispositions 选项会列出已知的 disposition 标志。

例如,要将第二个音频流设为默认流:

ffmpeg -i in.mkv -c copy -disposition:a:1 default out.mkv

要将第二个字幕流设为默认流,并移除第一个字幕流的 default disposition:

ffmpeg -i in.mkv -c copy -disposition:s:0 0 -disposition:s:1 default out.mkv

要添加内嵌的封面/缩略图:

ffmpeg -i in.mp4 -i IMAGE -map 0 -map 1 -c copy -c:v:1 png -disposition:v:1 attached_pic out.mp4

要在不移除第一个音频流其他 disposition 标志的前提下,添加 ’original’ 并移除 ’comment’ disposition 标志:

ffmpeg -i in.mkv -c copy -disposition:a:0 +original-comment out.mkv

要在不移除第一个音频流其他 disposition 标志的前提下,移除 ’original’ 并添加 ’comment’ disposition 标志:

ffmpeg -i in.mkv -c copy -disposition:a:0 -original+comment out.mkv

要仅在第一个音频流上设置 ’original’ 和 ’comment’ disposition 标志(并移除其他 disposition 标志):

ffmpeg -i in.mkv -c copy -disposition:a:0 original+comment out.mkv

要移除第一个音频流的所有 disposition 标志:

ffmpeg -i in.mkv -c copy -disposition:a:0 0 out.mkv

并非所有 muxer 都支持内嵌缩略图,即使支持,通常也只支持少数几种格式,如 JPEG 或 PNG。

-program [title=title:][program_num=program_num:]st=stream[:st=stream...] (output)

创建一个具有指定 title、program_num 的节目,并将指定的流添加到其中。

-stream_group [map=input_file_id=stream_group][type=type:]st=stream[:st=stream][:stg=stream_group][:id=stream_group_id...] (output)

创建指定 type 和 stream_group_id 的流组,或通过映射某个输入组来创建,并将指定的流和/或先前定义的 stream_group 添加到其中。

type 可以是以下之一:

iamf_audio_element

将属于同一个 IAMF Audio Element 的流分组。

对于这种组类型,可以使用以下选项

audio_element_type

Audio Element 的类型。支持以下值:

channel

可伸缩的声道音频表示。

scene

Ambisonics(全景声)表示。

demixing

用于重建可伸缩声道音频表示的解混(demixing)信息。此选项必须用 ’,’ 与其余部分分隔,并接受以下 key=value 选项

parameter_id

帧内参数块可能引用的标识符。

dmixp_mode

预定义的解混参数组合。

recon_gain

用于重建可伸缩声道音频表示的 recon gain 信息。此选项必须用 ’,’ 与其余部分分隔,并接受以下 key=value 选项

parameter_id

帧内参数块可能引用的标识符。

layer

在 Audio Element 中定义一个 Channel Layout 的层(layer)。此选项必须用 ’,’ 与其余部分分隔。可以定义多个以 ’,’ 分隔的条目,且至少必须设置一个。

它接受以下以 ":" 分隔的 key=value 选项

ch_layout

该层的声道布局。

flags

可用以下标志:

recon_gain

是否在帧内参数块中以元数据形式标示 recon_gain 是否存在。

output_gain output_gain_flags

output_gain 应用于哪些声道。可用以下标志:

FL FR BL BR TFL TFR ambisonics_mode

ambisonics 模式。如果 audio_element_type 设置为 channel,则此选项无效。

支持以下值:

mono

每个 ambisonics 声道在组中都编码为一个独立的单声道流。

default_w

默认权重值。

iamf_mix_presentation

将同一个 IAMF Mix Presentation 所引用的所有 IAMF Audio Element 所属的流分组。

对于这种组类型,可以使用以下选项

submix

Mix Presentation 中的一个子混音(sub-mix)。此选项必须用 ’,’ 与其余部分分隔。可以定义多个以 ’,’ 分隔的条目,且至少必须设置一个。

它接受以下以 ":" 分隔的 key=value 选项

parameter_id

帧内参数块可能引用的标识符,用于对混合后的音频信号进行后处理,以生成回放用的音频信号。

parameter_rate

帧内引用此 parameter_id 的参数块中的采样率与 duration 字段以此表示

default_mix_gain

当某一帧没有共享相同 parameter_id 的参数块时应用的默认混音增益值。

element

引用此 Mix Presentation 中用于生成最终输出回放音频信号的 Audio Element。此选项必须用 ’|’ 与其余部分分隔。可以定义多个以 ’|’ 分隔的条目,且至少必须设置一个。

它接受以下以 ":" 分隔的 key=value 选项:

stg

此子混音所引用的 Audio Element 的 stream_group_id。

parameter_id

帧内参数块可能引用的标识符,用于在与其他已处理的 Audio Element 相加之前,对所引用并渲染的 Audio Element 施加处理。

parameter_rate

帧内引用此 parameter_id 的参数块中的采样率与 duration 字段以此表示

default_mix_gain

当某一帧没有共享相同 parameter_id 的参数块时应用的默认混音增益值。

annotations

描述子混音元素的 key=value 字符串,其中 "key" 是符合 BCP-47 的字符串,用于指定 "value" 字符串的语言。"key" 必须与该混音 annotations 中的 key 相同

headphones_rendering_mode

指示在耳机上播放时,输入的基于声道的 Audio Element 是渲染到立体声扬声器,还是通过双耳(binaural)渲染器进行空间化处理。如果所引用 Audio Element 的 audio_element_type 设置为 channel,则此选项无效。

支持以下值:

stereo binaural layout

指定测量此子混音响度信息所依据的布局(layout)。此选项必须用 ’|’ 与其余部分分隔。可以定义多个以 ’|’ 分隔的条目,且至少必须设置一个。

它接受以下以 ":" 分隔的 key=value 选项:

layout_type

loudspeakers

该布局遵循 ITU-2051-3 的扬声器音响系统约定。

binaural

该布局为双耳(binaural)方式。

sound_system

与 ITU-2051-3 的 Sound System A 到 J 之一相匹配的声道布局,外加 7.1.2 和 3.1.2。如果 layout_type 设置为 binaural,则此选项无效。

integrated_loudness

按 ITU-1770-4 定义的节目综合响度信息。

digital_peak

按 ITU-1770-4 定义的音频信号数字(采样)峰值。

true_peak

按 ITU-1770-4 定义的音频信号真实峰值。

dialog_anchored_loudness

按 ITU-1770-4 定义的对白(Dialogue)响度信息。

album_anchored_loudness

按 ITU-1770-4 定义的专辑(Album)响度信息。

annotations

描述该混音的 key=value 字符串,其中 "key" 是符合 BCP-47 的字符串,用于指定 "value" 字符串的语言。"key" 必须与所有子混音元素 annotations 中的 key 相同。

例如,要从多个 WAV 输入文件创建一个可伸缩的 5.1 IAMF 文件:

ffmpeg -i front.wav -i back.wav -i center.wav -i lfe.wav
-map 0:0 -map 1:0 -map 2:0 -map 3:0 -c:a opus
-stream_group type=iamf_audio_element:id=1:st=0:st=1:st=2:st=3,
demixing=parameter_id=998,
recon_gain=parameter_id=101,
layer=ch_layout=stereo,
layer=ch_layout=5.1(side),
-stream_group type=iamf_mix_presentation:id=2:stg=0:annotations=en-us=Mix_Presentation,
submix=parameter_id=100:parameter_rate=48000|element=stg=0:parameter_id=100:annotations=en-us=Scalable_Submix|layout=sound_system=stereo|layout=sound_system=5.1(side)
-streamid 0:0 -streamid 1:1 -streamid 2:2 -streamid 3:3 output.iamf

要将一个具有四个流的输入 IAMF 文件中的两个流组(Audio Element 和 Mix Presentation)复制到 mp4 输出中:

ffmpeg -i input.iamf -c:a copy -stream_group map=0=0:st=0:st=1:st=2:st=3 -stream_group map=0=1:stg=0
-streamid 0:0 -streamid 1:1 -streamid 2:2 -streamid 3:3 output.mp4

-target type (output)

指定目标文件类型(vcdsvcddvddvdv50)。type 前面可以加 pal-ntsc-film- 前缀,以使用相应的制式。这样一来,所有格式选项(比特率、codec、缓冲区大小)都会自动设置。只需输入:

ffmpeg -i myfile.avi -target vcd /tmp/vcd.mpg

不过,只要你确定这些选项不会与制式冲突,仍然可以指定额外的选项,例如:

ffmpeg -i myfile.avi -target vcd -bf 2 /tmp/vcd.mpg

各目标制式所设置的参数如下。

VCD

pal:
-f vcd -muxrate 1411200 -muxpreload 0.44 -packetsize 2324
-s 352x288 -r 25
-codec:v mpeg1video -g 15 -b:v 1150k -maxrate:v 1150k -minrate:v 1150k -bufsize:v 327680
-ar 44100 -ac 2
-codec:a mp2 -b:a 224k

ntsc:
-f vcd -muxrate 1411200 -muxpreload 0.44 -packetsize 2324
-s 352x240 -r 30000/1001
-codec:v mpeg1video -g 18 -b:v 1150k -maxrate:v 1150k -minrate:v 1150k -bufsize:v 327680
-ar 44100 -ac 2
-codec:a mp2 -b:a 224k

film:
-f vcd -muxrate 1411200 -muxpreload 0.44 -packetsize 2324
-s 352x240 -r 24000/1001
-codec:v mpeg1video -g 18 -b:v 1150k -maxrate:v 1150k -minrate:v 1150k -bufsize:v 327680
-ar 44100 -ac 2
-codec:a mp2 -b:a 224k

SVCD

pal:
-f svcd -packetsize 2324
-s 480x576 -pix_fmt yuv420p -r 25
-codec:v mpeg2video -g 15 -b:v 2040k -maxrate:v 2516k -minrate:v 0 -bufsize:v 1835008 -scan_offset 1
-ar 44100
-codec:a mp2 -b:a 224k

ntsc:
-f svcd -packetsize 2324
-s 480x480 -pix_fmt yuv420p -r 30000/1001
-codec:v mpeg2video -g 18 -b:v 2040k -maxrate:v 2516k -minrate:v 0 -bufsize:v 1835008 -scan_offset 1
-ar 44100
-codec:a mp2 -b:a 224k

film:
-f svcd -packetsize 2324
-s 480x480 -pix_fmt yuv420p -r 24000/1001
-codec:v mpeg2video -g 18 -b:v 2040k -maxrate:v 2516k -minrate:v 0 -bufsize:v 1835008 -scan_offset 1
-ar 44100
-codec:a mp2 -b:a 224k

DVD

pal:
-f dvd -muxrate 10080k -packetsize 2048
-s 720x576 -pix_fmt yuv420p -r 25
-codec:v mpeg2video -g 15 -b:v 6000k -maxrate:v 9000k -minrate:v 0 -bufsize:v 1835008
-ar 48000
-codec:a ac3 -b:a 448k

ntsc:
-f dvd -muxrate 10080k -packetsize 2048
-s 720x480 -pix_fmt yuv420p -r 30000/1001
-codec:v mpeg2video -g 18 -b:v 6000k -maxrate:v 9000k -minrate:v 0 -bufsize:v 1835008
-ar 48000
-codec:a ac3 -b:a 448k

film:
-f dvd -muxrate 10080k -packetsize 2048
-s 720x480 -pix_fmt yuv420p -r 24000/1001
-codec:v mpeg2video -g 18 -b:v 6000k -maxrate:v 9000k -minrate:v 0 -bufsize:v 1835008
-ar 48000
-codec:a ac3 -b:a 448k

DV

pal:
-f dv
-s 720x576 -pix_fmt yuv420p -r 25
-ar 48000 -ac 2

ntsc:
-f dv
-s 720x480 -pix_fmt yuv411p -r 30000/1001
-ar 48000 -ac 2

film:
-f dv
-s 720x480 -pix_fmt yuv411p -r 24000/1001
-ar 48000 -ac 2

dv50 目标与 dv 目标相同,只是三种制式设置的 pixel format 均为 yuv422p

用户对上述任何参数设置的值都会覆盖目标预设值。在这种情况下,输出可能不再符合目标制式。

-dn (input/output)

用作输入选项时,会阻止文件的所有数据流被过滤,或被自动选择/映射到任何输出。要单独禁用某个流,请参见 -discard 选项。

用作输出选项时,会禁用数据记录,即禁用任何数据流的自动选择或映射。要完全手动控制,请参见 -map 选项。

-dframes number (output)

设置要输出的数据帧数。这是 -frames:d 的过时别名,应改用后者。

-frames[:stream_specifier] framecount (output,per-stream)

写入 framecount 帧后停止写入该流。

-q[:stream_specifier] q (output,per-stream) -qscale[:stream_specifier] q (output,per-stream)

使用固定质量标度(VBR)。q/qscale 的含义取决于 codec。如果 qscale 在不带 stream_specifier 的情况下使用,则只应用于视频流,这是为了保持与以往行为的兼容性;而且在不使用 stream_specifier 时,把同一个 codec 特定的值同时指定给音频和视频这两个不同的 codec,通常并非用户本意。

-filter[:stream_specifier] filtergraph (output,per-stream)

创建由 filtergraph 指定的 filtergraph,并用它对流进行过滤。

filtergraph 是应用于该流的 filtergraph 描述,且必须只有一个与该流类型相同的输入和一个输出。在 filtergraph 中,输入关联到标签 in,输出关联到标签 out。关于 filtergraph 语法的更多信息,请参见 ffmpeg-filters 手册。

如果想创建具有多个输入和/或输出的 filtergraph,请参见 -filter_complex 选项。

-reinit_filter[:stream_specifier] integer (input,per-stream)

这个布尔选项决定,当输入帧参数在流中途发生变化时,此流所送入的 filtergraph 是否要重新初始化。此选项默认启用,因为大多数视频滤镜和所有音频滤镜都无法处理输入帧属性的变化。重新初始化后,现有的滤镜状态会丢失,例如某些滤镜中可用的帧计数 n 引用。重新初始化时缓冲的任何帧也会丢失。会触发重新初始化的属性变化,对视频而言是帧分辨率或 pixel format;对音频而言是 sample format、采样率、声道数或声道布局。

-drop_changed[:stream_specifier] integer (input,per-stream)

这个布尔选项决定,流中途出现帧参数不同的帧时,是丢弃该帧,还是导致 filtergraph 重新初始化(因为那会导致滤镜状态丢失)。一般用于避免直播输入中出现已损坏但仍可解码的数据包。默认值为 false。

-filter_threads nb_threads (global)

定义处理一个滤镜流水线所使用的线程数。每条流水线都会产生一个具有这么多可用线程的线程池,用于并行处理。默认值是可用 CPU 的数量。

-filter_buffered_frames nb_frames (global)

定义 filtergraph 中允许缓冲的最大帧数。正常情况下,filtergraph 缓冲的帧数不应超过几帧,尤其是当帧以均衡的方式被送入并从中读出时(这正是 ffmpeg 中预期的行为)。话虽如此,此选项允许你限制 filtergraph 中所有链路上缓冲帧数的总和。如果生成的帧更多,过滤会被中止并返回错误。默认值为 0,表示不限制。

-pre[:stream_specifier] preset_name (output,per-stream)

为匹配的流指定预设(preset)。

-stats (global)

将编码进度/统计信息记录为 "info" 级别的日志(参见 -loglevel)。默认开启,要显式禁用需指定 -nostats

-stats_period time (global)

设置编码进度/统计信息更新的周期。默认为 0.5 秒。

-print_graphs (global)

以通过 -print_graphs_format 设置的格式,将执行图的详细信息输出到 stderr。

-print_graphs_file filename (global)

以通过 -print_graphs_format 设置的格式,将执行图的详细信息写入指定文件。

-print_graphs_format format (global)

设置输出格式(可用格式有:default、compact、csv、flat、ini、json、xml、mermaid、mermaidhtml)。默认格式是 json。

-progress url (global)

将便于程序处理的进度信息发送到 url。

进度信息会定期写入,并在编码过程结束时写入。它由 "key=value" 形式的行组成。key 仅由字母数字字符组成。一系列进度信息中的最后一个 key 始终是 "progress",其值为 "continue" 或 "end"。

更新周期通过 -stats_period 设置。

例如,将进度信息记录到标准输出:

ffmpeg -progress pipe:1 -i in.mkv out.mkv

-stdin

启用标准输入上的交互。默认开启,除非标准输入被用作某个输入。要显式禁用交互,需指定 -nostdin

禁用标准输入上的交互很有用,例如当 ffmpeg 处于后台进程组时。用 ffmpeg ... < /dev/null 也能达到大致相同的效果,但这需要一个 shell。

-debug_ts (global)

输出时间戳/延迟信息。默认关闭。此选项主要用于测试和调试,输出格式可能因版本而异,因此不应在可移植脚本中使用。

另请参见选项 -fdebug ts

-attach filename (output)

为输出文件添加一个附件。这由少数几种格式支持,例如 Matroska,用于渲染字幕时使用的字体等。附件是作为一种特定类型的流来实现的,因此此选项会为文件添加一个新流。之后就可以像平常一样对该流使用按流的选项。用此选项创建的附件流会在所有其他流(即由 -map 或自动映射创建的流)之后创建。

请注意,对于 Matroska,还需要设置 mimetype 元数据标签:

ffmpeg -i INPUT -attach DejaVuSans.ttf -metadata:s:2 mimetype=application/x-truetype-font out.mkv

(假设该附件流将是输出文件中的第三个流。)

-dump_attachment[:stream_specifier] filename (input,per-stream)

将匹配的附件流提取到名为 filename 的文件中。如果 filename 为空,则使用 filename 元数据标签的值。

例如,要将第一个附件提取到名为 ’out.ttf’ 的文件:

ffmpeg -dump_attachment:t:0 out.ttf -i INPUT

要将所有附件提取到由 filename 标签决定的文件:

ffmpeg -dump_attachment:t "" -i INPUT

技术说明——附件是作为 codec extradata 实现的,因此此选项实际上可以用来从任何流中提取 extradata,而不仅限于附件。

5.5 视频选项

-vframes number (output)

设置要输出的视频帧数。这是 -frames:v 的过时别名,应改用后者。

-r[:stream_specifier] fps (input/output,per-stream)

设置帧率(Hz 值、分数或缩写形式)。

用作输入选项时,会忽略文件中存储的任何时间戳,转而假定恒定帧率 fps 生成时间戳。这与 image2、v4l2 等某些输入格式所用的 -framerate 选项并不相同(在旧版本 FFmpeg 中两者曾经是相同的)。如果不确定,请使用 -framerate 而不是输入选项 -r。

用作输出选项时:

视频编码

在编码前紧接着复制或丢弃帧,以实现恒定的输出帧率 fps。

视频流复制

向 muxer 表明 fps 就是该流的帧率。此时不会丢弃或复制任何数据。如果 fps 与由数据包时间戳确定的实际流帧率不一致,可能会产生无效文件。另请参见 setts bitstream 过滤器。

-fpsmax[:stream_specifier] fps (output,per-stream)

设置最大帧率(Hz 值、分数或缩写形式)。

当输出帧率是自动设置且高于此值时,将其限制在此值以内。在批处理场景,或输入帧率被误检测为非常高时很有用。不能与 -r 同时设置。在流复制期间会被忽略。

-s[:stream_specifier] size (input/output,per-stream)

设置帧尺寸。

用作输入选项时,这是 video_size private 选项的快捷方式,被一些 demuxer 识别,用于帧尺寸未存储在文件中或可配置的情况——例如 raw video 或视频采集设备。

用作输出选项时,这会在相应 filtergraph 的_末尾_插入 scale 视频滤镜。若要将其插入开头或其他位置,请直接使用 scale 滤镜。

格式为 ‘wxh’(默认与源相同)。

-aspect[:stream_specifier] aspect (output,per-stream)

设置由 aspect 指定的视频显示宽高比。

aspect 可以是浮点数字符串,也可以是 num:den 形式的字符串,其中 num 和 den 分别是宽高比的分子和分母。例如 "4:3"、"16:9"、"1.3333"、"1.7777" 都是有效的参数值。

如果与 -vcodec copy 一起使用,它会影响容器层面存储的宽高比,但不会影响编码帧中存储的宽高比(如果存在的话)。

-display_rotation[:stream_specifier] rotation (input,per-stream)

设置视频旋转元数据。

rotation 是一个十进制数,指定视频在显示前应逆时针旋转的角度。

此选项会覆盖文件中存储的旋转/显示变换元数据(如果有的话)。当视频被转码(而非复制)且 -autorotate 已启用时,视频会在过滤阶段被旋转。否则,如果 muxer 支持,该元数据会被写入输出文件。

如果给出了 -display_hflip 和/或 -display_vflip 选项,它们会在此选项指定的旋转之后应用。

-display_hflip[:stream_specifier] (input,per-stream)

设置显示时图像是否应水平翻转。

更多详情请参见 -display_rotation 选项。

-display_vflip[:stream_specifier] (input,per-stream)

设置显示时图像是否应垂直翻转。

更多详情请参见 -display_rotation 选项。

-mastering_display[:stream_specifier] G(%u,%u)B(%u,%u)R(%u,%u)WP(%u,%u)L(%u,%u) (input,per-stream)

设置视频母版显示(mastering display)元数据。

G(%u,%u)B(%u,%u)R(%u,%u)WP(%u,%u)L(%u,%u) 是一个字符串,以 0.00002 为单位指定 GBR 通道和白点(WP)的 X,Y 显示基色,并以 0.0001 坎德拉每平方米为单位指定最大/最小亮度(L)值。这些值都是无符号整数,表示一个有理数的分子,其中 GBR 和(WP)的隐含分母为 50000,(L)的隐含分母为 10000。

此选项会覆盖文件中存储的母版显示元数据(如果有的话)。

-content_light[:stream_specifier] %u,%u (input,per-stream)

设置视频内容光照(content light)元数据。

%u,%u 是一个字符串,指定最大内容光照级别和最大画面平均光照级别。

此选项会覆盖文件中存储的内容光照元数据(如果有的话)。

-vn (input/output)

用作输入选项时,会阻止文件的所有视频流被过滤,或被自动选择/映射到任何输出。要单独禁用某个流,请参见 -discard 选项。

用作输出选项时,会禁用视频记录,即禁用任何视频流的自动选择或映射。要完全手动控制,请参见 -map 选项。

-vcodec codec (output)

设置视频 codec。这是 -codec:v 的别名。

-pass[:stream_specifier] n (output,per-stream)

选择遍数(1 或 2)。用于进行两遍(two-pass)视频编码。第一遍会将视频的统计信息记录到日志文件中(另请参见 -passlogfile 选项),第二遍则使用该日志文件,按精确要求的比特率生成视频。在第一遍中,只需停用音频并将输出设为 null 即可,以下是 Windows 和 Unix 的示例:

ffmpeg -i foo.mov -c:v libxvid -pass 1 -an -f rawvideo -y NUL
ffmpeg -i foo.mov -c:v libxvid -pass 1 -an -f rawvideo -y /dev/null

-passlogfile[:stream_specifier] prefix (output,per-stream)

将两遍编码日志文件名的前缀设置为 prefix,默认的文件名前缀是 “ffmpeg2pass”。完整的文件名将是 PREFIX-N.log,其中 N 是特定于该输出流的编号

-vf filtergraph (output)

创建由 filtergraph 指定的 filtergraph,并用它对流进行过滤。

这是 -filter:v 的别名,参见 -filter 选项。

-autorotate

根据文件元数据自动旋转视频。默认启用,使用 -noautorotate 可禁用。

-autoscale

根据第一帧的分辨率自动缩放视频。默认启用,使用 -noautoscale 可禁用。禁用 autoscale 后,滤镜图的所有输出帧可能不是同一分辨率,对某些 encoder/muxer 可能不适用。因此,除非你确实清楚自己在做什么,否则不建议禁用它。禁用 autoscale 需自行承担风险。

5.6 高级视频选项

-pix_fmt[:stream_specifier] format (input/output,per-stream)

设置 pixel format。使用 -pix_fmts 可显示所有支持的 pixel format。如果无法选中所选的 pixel format,ffmpeg 会打印一个警告,并选择 encoder 支持的最佳 pixel format。如果 pix_fmt 前面加了 +,当无法选中所请求的 pixel format 时,ffmpeg 会以错误退出,并且会禁用 filtergraph 内部的自动转换。如果 pix_fmt 只是一个单独的 +,ffmpeg 会选择与输入(或图输出)相同的 pixel format,并禁用自动转换。

-sws_flags flags (input/output)

为 libswscale 库设置默认标志。如果没有在 filtergraph 定义中被覆盖,这些标志会被自动插入的 scale 滤镜以及 simple filtergraph 内的 scale 滤镜使用。

scaler 选项的列表请参见 (ffmpeg-scaler)ffmpeg-scaler manual

-rc_override[:stream_specifier] override (output,per-stream)

针对特定区间的码率控制覆盖值,格式为以斜杠分隔的 "int,int,int" 列表。前两个值是起始和结束帧号,最后一个值为正时表示要使用的量化器,为负时表示质量系数。

-vstats

将视频编码统计信息导出到 vstats_HHMMSS.log。格式说明请参见 vstats 文件格式一节。

-vstats_file file

将视频编码统计信息导出到 file。格式说明请参见 vstats 文件格式一节。

-vstats_version file

指定要使用的 vstats 格式版本。默认为 2。格式说明请参见 vstats 文件格式一节。

-vtag fourcc/tag (output)

强制指定视频的 tag/fourcc。这是 -tag:v 的别名。

-force_key_frames[:stream_specifier] time[,time...] (output,per-stream) -force_key_frames[:stream_specifier] expr:expr (output,per-stream) -force_key_frames[:stream_specifier] source (output,per-stream) -force_key_frames[:stream_specifier] scd_metadata (output,per-stream)

force_key_frames 可以接受以下形式的参数:

time[,time...]

如果参数由时间戳组成,ffmpeg 会按 encoder 的时间基将指定的时间舍入到最近的输出时间戳,并在第一个时间戳大于或等于所计算时间戳的帧上强制插入 keyframe。请注意,如果 encoder 的时间基过于粗糙,keyframe 可能会在时间戳低于指定时间的帧上被强制插入。默认的 encoder 时间基是输出帧率的倒数,但也可以通过 -enc_time_base 设置为其他值。

如果某个时间是 "chapters[delta]",它会被展开为文件中所有章节起始时刻的集合,并按 delta(以秒表示的时间)进行偏移。此选项有助于确保在章节标记或输出文件中其他指定位置存在一个定位点。

例如,要在第 5 分钟插入一个 key frame,并在每个章节开始前 0.1 秒插入 key frame:

-force_key_frames 0:05:00,chapters-0.1

expr:expr

如果参数以 expr: 为前缀,字符串 expr 会被当作表达式解释,并针对每一帧求值。如果求值结果非零,就强制插入 key frame。

expr 中的表达式可以包含以下常量:

n

当前处理帧的编号,从 0 开始。

n_forced

被强制的帧数。

prev_forced_n

上一个被强制帧的编号;在尚未强制任何 keyframe 时为 NAN

prev_forced_t

上一个被强制帧的时间;在尚未强制任何 keyframe 时为 NAN

t

当前处理帧的时间。

例如,要每 5 秒强制插入一个 key frame,可以指定:

-force_key_frames expr:gte(t,n_forced*5)

要从第 13 秒开始,在上一次强制帧的时间之后 5 秒强制插入 key frame:

-force_key_frames expr:if(isnan(prev_forced_t),gte(t,13),gte(t,prev_forced_t+5))

source

如果参数是 source,当前正在编码的帧如果在其源中被标记为 key frame,ffmpeg 就会强制插入 key frame。如果这个特定的源帧必须被丢弃,则会强制让下一个可用的帧成为 key frame。

scd_metadata

如果参数是 scd_metadata,当前帧如果包含键为 lavfi.scd.time 的元数据条目,ffmpeg 就会强制插入 key frame。该元数据可以由 scdetscdet_vulkan 等滤镜添加。请避免在 scdet 之后插入会复制帧的滤镜,因为这会导致多个帧出现重复的元数据,并反复插入 key frame。

请注意,强制插入过多 keyframe 对某些 encoder 的前瞻(lookahead)算法非常有害:使用固定 GOP 选项等方式会更高效。

-apply_cropping[:stream_specifier] source (input,per-stream)

解码后根据文件元数据自动裁剪视频。默认为 all

none (0)

不应用任何裁剪元数据。

all (1)

同时应用 codec 层面和 container 层面的裁剪。这是默认模式。

codec (2)

应用 codec 层面的裁剪。

container (3)

应用 container 层面的裁剪。

-copyinkf[:stream_specifier] (output,per-stream)

进行流复制时,也复制开头出现的非 keyframe。

-init_hw_device type[=name][:device[,key=value...]]

使用给定的设备参数,初始化一个类型为 type、名为 name 的新硬件设备。如果没有指定 name,它会得到形如 "type%d" 的默认名称。

device 及后续参数的含义取决于设备类型:

cuda

device 是 CUDA 设备的编号。

可识别以下选项:

primary_ctx

如果设置为 1,则使用主设备上下文,而不是创建新的上下文。

示例:

-init_hw_device cuda:1

选择系统中的第二个设备。

-init_hw_device cuda:0,primary_ctx=1

选择第一个设备,并使用主设备上下文。

dxva2

device 是 Direct3D 9 显示适配器的编号。

d3d11va

device 是 Direct3D 11 显示适配器的编号。如果未指定,会尝试使用默认的 Direct3D 11 显示适配器,或者硬件 VendorId 由 ‘vendor_id’ 指定的第一个 Direct3D 11 显示适配器。

示例:

-init_hw_device d3d11va

在默认的 Direct3D 11 显示适配器上创建一个 d3d11va 设备。

-init_hw_device d3d11va:1

在索引为 1 指定的 Direct3D 11 显示适配器上创建一个 d3d11va 设备。

-init_hw_device d3d11va:,vendor_id=0x8086

在硬件 VendorId 为 0x8086 的第一个 Direct3D 11 显示适配器上创建一个 d3d11va 设备。

vaapi

device 可以是 X11 显示名、DRM 渲染节点,或者 DirectX 适配器索引。如果未指定,会先尝试打开默认的 X11 显示($DISPLAY),然后是第一个 DRM 渲染节点(/dev/dri/renderD128),在 Windows 上则是默认的 DirectX 适配器。

可识别以下选项:

kernel_driver

未指定 device 时,使用此选项指定与所需设备关联的内核驱动程序名称。此选项仅在硬件加速方式 drmvaapi 均已启用时可用。

vendor_id

未指定 device 和 kernel_driver 时,使用此选项指定与所需设备关联的 vendor id。此选项仅在硬件加速方式 drmvaapi 均已启用,且未指定 kernel_driver 时可用。

示例:

-init_hw_device vaapi

在默认设备上创建 vaapi 设备。

-init_hw_device vaapi:/dev/dri/renderD129

在 DRM 渲染节点 /dev/dri/renderD129 上创建 vaapi 设备。

-init_hw_device vaapi:1

在 DirectX 适配器 1 上创建 vaapi 设备。

-init_hw_device vaapi:,kernel_driver=i915

在与内核驱动程序 ‘i915’ 关联的设备上创建 vaapi 设备。

-init_hw_device vaapi:,vendor_id=0x8086

在与 vendor id ‘0x8086’ 关联的设备上创建 vaapi 设备。

vdpau

device 是 X11 显示名称。如果未指定,将尝试打开默认的 X11 显示($DISPLAY)。

qsv

device 用于在 ‘MFX_IMPL_*’ 中选择一个值。允许的取值为:

auto sw hw auto_any hw_any hw2 hw3 hw4

如果未指定,将使用 ‘auto_any’。(注意,对于 QSV,通过创建平台相应的子设备(‘dxva2’ 或 ‘d3d11va’ 或 ‘vaapi’),再从该子设备派生出 QSV 设备,可能更容易得到预期结果。)

可识别以下选项:

child_device

在 Linux 上指定 DRM 渲染节点,在 Windows 上指定 DirectX 适配器。

child_device_type

选择平台相应的子设备类型。在 Windows 上,配置时指定 --enable-libvpl 会使用 ‘d3d11va’ 作为默认子设备类型,指定 --enable-libmfx 会使用 ‘dxva2’ 作为默认子设备类型。在 Linux 上,用户只能将 ‘vaapi’ 用作子设备类型。

示例:

-init_hw_device qsv:hw,child_device=/dev/dri/renderD129

在 DRM 渲染节点 /dev/dri/renderD129 上创建带有 ‘MFX_IMPL_HARDWARE’ 的 QSV 设备。

-init_hw_device qsv:hw,child_device=1

在 DirectX 适配器 1 上创建带有 ‘MFX_IMPL_HARDWARE’ 的 QSV 设备。

-init_hw_device qsv:hw,child_device_type=d3d11va

选择类型为 ‘d3d11va’ 的 GPU 子设备,并创建带有 ‘MFX_IMPL_HARDWARE’ 的 QSV 设备。

-init_hw_device qsv:hw,child_device_type=dxva2

选择类型为 ‘dxva2’ 的 GPU 子设备,并创建带有 ‘MFX_IMPL_HARDWARE’ 的 QSV 设备。

-init_hw_device qsv:hw,child_device=1,child_device_type=d3d11va

在 DirectX 适配器 1 上以子设备类型 ‘d3d11va’ 创建带有 ‘MFX_IMPL_HARDWARE’ 的 QSV 设备。

-init_hw_device vaapi=va:/dev/dri/renderD129 -init_hw_device qsv=hw1@ va

在 /dev/dri/renderD129 上创建一个名为 ‘va’ 的 VAAPI 设备,然后从设备 ‘va’ 派生出一个名为 ‘hw1’ 的 QSV 设备。

opencl

device 以 platform_index.device_index 的形式选择平台和设备。

还可以使用键值对过滤设备集合,只找出与特定平台或设备字符串匹配的设备。

可用作过滤条件的字符串有:

platform_profile platform_version platform_name platform_vendor platform_extensions device_name device_vendor driver_version device_version device_profile device_extensions device_type

索引和过滤条件必须共同唯一确定一个设备。

示例:

-init_hw_device opencl:0.1

选择第一个平台上的第二个设备。

-init_hw_device opencl:,device_name=Foo9000

选择名称中包含字符串 Foo9000 的设备。

-init_hw_device opencl:1,device_type=gpu,device_extensions=cl_khr_fp16

选择第二个平台上支持 cl_khr_fp16 扩展的 GPU 设备。

vulkan

如果 device 是整数,则按系统相关设备列表中的索引选择设备。如果 device 是其他字符串,则选择名称中包含该字符串作为子串的第一个设备。

可识别以下选项:

debug

如果设置为 1,则在已安装验证层的情况下启用它。

linear_images

如果设置为 1,hwcontext 分配的图像将是线性的,并且可本地映射。

instance_extensions

以加号分隔的列表,列出要启用的额外实例扩展。

device_extensions

以加号分隔的列表,列出要启用的额外设备扩展。

示例:

-init_hw_device vulkan:1

选择系统上的第二个设备。

-init_hw_device vulkan:RADV

选择名称中包含字符串 RADV 的第一个设备。

-init_hw_device vulkan:0,instance_extensions=VK_KHR_wayland_surface+VK_KHR_xcb_surface

选择第一个设备,并启用 Wayland 和 XCB 实例扩展。

-init_hw_device type[=name]@source

初始化一个类型为 type、名为 name 的新硬件设备,从名为 source 的现有设备派生而来。

-init_hw_device list

列出此 ffmpeg 构建版本支持的所有硬件设备类型。

-filter_hw_device name

将名为 name 的硬件设备传递给任意 filtergraph 中的所有滤镜。可用于设置 hwupload 滤镜要上传到的设备,或 hwmap 滤镜要映射到的设备。其他滤镜在需要硬件设备时也可能使用此参数。注意,这通常只有在输入尚未处于硬件帧时才需要——如果输入已是硬件帧,滤镜会根据其接收到的输入帧的上下文自行推导所需设备。

这是一个全局设置,因此所有滤镜都会收到相同的设备。

-hwaccel[:stream_specifier] hwaccel (input,per-stream)

使用硬件加速解码匹配的流。hwaccel 允许的取值为:

none

不使用任何硬件加速(默认值)。

auto

自动选择硬件加速方式。

vdpau

使用 VDPAU(Video Decode and Presentation API for Unix)硬件加速。

dxva2

使用 DXVA2(DirectX Video Acceleration)硬件加速。

d3d11va

使用 D3D11VA(DirectX Video Acceleration)硬件加速。

vaapi

使用 VAAPI(Video Acceleration API)硬件加速。

qsv

使用 Intel QuickSync Video 加速进行视频转码。

与大多数其他取值不同,此选项启用的不是加速解码(只要选择了 qsv decoder 就会自动使用加速解码),而是无需将帧复制到系统内存即可完成的加速转码。

要使其生效,decoder 和 encoder 都必须支持 QSV 加速,且不得使用任何滤镜。

videotoolbox

使用 Video Toolbox 硬件加速。

如果所选的 hwaccel 不可用,或所选 decoder 不支持它,此选项将不起作用。

注意,大多数加速方式都是为播放而设计的,在现代 CPU 上并不会比软件解码更快。此外,ffmpeg 通常还需要将解码后的帧从 GPU 内存复制到系统内存,从而造成进一步的性能损失。因此,此选项主要用于测试。

-hwaccel_device[:stream_specifier] hwaccel_device (input,per-stream)

选择用于硬件加速的设备。

此选项仅在同时指定了 -hwaccel 选项时才有意义。它既可以按名称引用通过 -init_hw_device 创建的现有设备,也可以创建一个新设备,效果如同紧邻其前调用了 ‘-init_hw_device’ type:hwaccel_device。

-hwaccels

列出此 ffmpeg 构建版本中启用的所有硬件加速组件。实际运行时是否可用,取决于硬件及其相应驱动程序是否已安装。

-fix_sub_duration_heartbeat[:stream_specifier]

将某个特定的输出视频流设为心跳流,据此在收到随机访问包时对当前进行中的字幕进行切分并推送输出。

对于尚未收到结束包或后续字幕的字幕,这会降低其延迟。其代价是,为覆盖完整时长,这很可能导致字幕事件被重复,因此在字幕事件传递到输出的延迟无关紧要的用例中,不应使用此选项。

要使其生效,需要为相关输入字幕流设置 -fix_sub_duration,并且该输入字幕流必须直接映射到心跳流所在的同一个输出。

5.7 音频选项

-aframes number (output)

设置要输出的音频帧数。这是 -frames:a 的过时别名,应改用 -frames:a

-ar[:stream_specifier] freq (input/output,per-stream)

设置音频采样频率。对于输出流,默认设置为对应输入流的频率。对于输入流,此选项仅对音频采集设备和 raw demuxer 有意义,并会映射到相应的 demuxer 选项。

-aq q (output)

设置音频质量(codec 相关,VBR)。这是 -q:a 的别名。

-ac[:stream_specifier] channels (input/output,per-stream)

设置音频声道数。对于输出流,默认设置为输入音频的声道数。对于输入流,此选项仅对音频采集设备和 raw demuxer 有意义,并会映射到相应的 demuxer 选项。

-an (input/output)

作为输入选项时,阻止文件中所有音频流被过滤,或被自动选择、映射到任何输出。要单独禁用某个流,请参见 -discard 选项。

作为输出选项时,禁用音频录制,即禁止对任何音频流进行自动选择或映射。若需完全手动控制,请参见 -map 选项。

-acodec codec (input/output)

设置音频 codec。这是 -codec:a 的别名。

-sample_fmt[:stream_specifier] sample_fmt (output,per-stream)

设置音频 sample format。使用 -sample_fmts 获取支持的 sample format 列表。

-af filtergraph (output)

创建由 filtergraph 指定的 filtergraph,并用它对流进行过滤。

这是 -filter:a 的别名,请参见 -filter 选项。

5.8 高级音频选项

-atag fourcc/tag (output)

强制指定音频 tag/fourcc。这是 -tag:a 的别名。

-ch_layout[:stream_specifier] layout (input/output,per-stream)

-channel_layout 的别名。

-channel_layout[:stream_specifier] layout (input/output,per-stream)

设置音频声道布局。对于输出流,默认设置为输入的声道布局。对于输入流,它会覆盖输入的声道布局。并非所有 decoder 都会遵循被覆盖的声道布局。此选项还会为音频采集设备和 raw demuxer 设置声道布局,并会映射到相应的 demuxer 选项。

-guess_layout_max channels (input,per-stream)

如果某个输入的声道布局未知,仅当其对应的声道数不超过指定值时才尝试猜测。例如,指定 2 会让 ffmpeg 将 1 声道识别为单声道、2 声道识别为立体声,但不会将 6 声道识别为 5.1。默认情况下总会尝试猜测。使用 0 可禁用所有猜测。使用 -channel_layout 选项显式指定输入布局也会禁用猜测。

5.9 字幕选项

-scodec codec (input/output)

设置字幕 codec。这是 -codec:s 的别名。

-sn (input/output)

作为输入选项时,阻止文件中所有字幕流被过滤,或被自动选择、映射到任何输出。要单独禁用某个流,请参见 -discard 选项。

作为输出选项时,禁用字幕录制,即禁止对任何字幕流进行自动选择或映射。若需完全手动控制,请参见 -map 选项。

5.10 高级字幕选项

-fix_sub_duration

修正字幕时长。对于每条字幕,等待同一流中的下一个包,并调整前一条字幕的时长以避免重叠。对某些字幕 codec(尤其是 DVB 字幕)而言这是必要的,因为原始包中的时长只是粗略估计,实际结束由一个空字幕帧标记。必要时若不使用此选项,可能导致时长被夸大,或因时间戳非单调递增而导致封装失败。

注意,此选项会将所有数据的输出延迟到下一个字幕包被解码为止:这可能会大幅增加内存消耗和延迟。

-canvas_size size

设置用于渲染字幕的画布大小。

5.11 高级选项

-map [-]input_file_id[:stream_specifier][:view_specifier][:?] | [linklabel] (output)

在输出文件中创建一个或多个流。此选项有两种形式来指定数据源:第一种是从某个输入文件(通过 -i 指定)中选择一个或多个流,第二种是取某个 complex filtergraph(通过 -filter_complex 指定)的输出。

在第一种形式中,会为索引为 input_file_id 的输入文件中的每个流创建一个输出流。如果给出了 stream_specifier,则只使用与该指定符匹配的流(stream_specifier 的语法请参见“流指定符”一节)。

在流标识符前加上 - 字符会创建“负向”映射。它会禁用已创建映射中匹配的流。

在流指定符之后可以给出可选的 view_specifier,对于多视角视频,它指定要使用的视角。view specifier 可以是以下格式之一:

view:view_id

按 ID 选择视角;view_id 可设置为 ’all’,表示将所有视角交织到一个流中;

vidx:view_idx

按索引选择视角,即 0 为基础视角,1 为第一个非基础视角,依此类推。

vpos:position

按显示位置选择视角;position 可以是 leftright

转码时默认只使用基础视角,即等同于 vidx:0。对于流复制,不支持 view specifier,所有视角总是会被复制。

在流索引后加上尾随的 ? 可使该映射成为可选:如果该映射未匹配到任何流,则会被忽略而不是失败。注意,如果使用了无效的输入文件索引(例如该映射引用了不存在的输入),映射仍会失败。

另一种 [linklabel] 形式会将 complex filtergraph(参见 -filter_complex 选项)的输出映射到输出文件。linklabel 必须对应图中已定义的输出链接标签。

此选项可以多次指定,每次都会向输出文件添加更多流。任何给定的输入流也可以作为不同输出流的来源被多次映射,例如为了使用不同的编码选项和/或滤镜。输出中流的创建顺序与命令行上 -map 选项给出的顺序相同。

使用此选项会禁用该输出文件的默认映射。

示例:

map everything

要将第一个输入文件中的所有流映射到输出:

ffmpeg -i INPUT -map 0 output

select specific stream

如果第一个输入文件中有两个音频流,这些流由 0:0 和 0:1 标识。可以使用 -map 选择将哪些流放入输出文件。例如:

ffmpeg -i INPUT -map 0:1 out.wav

会将 INPUT 中的第二个输入流映射到 out.wav 中的(单个)输出流。

create multiple streams

要从输入文件 a.mov 中选择索引为 2 的流(由标识符 0:2 指定),从输入 b.mov 中选择索引为 6 的流(由标识符 1:6 指定),并将它们复制到输出文件 out.mov:

ffmpeg -i a.mov -i b.mov -c copy -map 0:2 -map 1:6 out.mov

create multiple streams 2

要从输入文件中选择所有视频流和第三个音频流:

ffmpeg -i INPUT -map 0:v -map 0:a:2 OUTPUT

negative map

要映射除第二个音频以外的所有流,可使用负向映射:

ffmpeg -i INPUT -map 0 -map -0:a:1 OUTPUT

optional map

要映射第一个输入的视频流和音频流,并通过尾随的 ?,在第一个输入中不存在音频流时忽略该音频映射:

ffmpeg -i INPUT -map 0:v -map 0:a? OUTPUT

map by language

要选取英语音频流:

ffmpeg -i INPUT -map 0:m:language:eng OUTPUT

-ignore_unknown

如果尝试复制类型未知的输入流,忽略这些流而不是失败。

-copy_unknown

如果尝试复制类型未知的输入流,允许复制这些流而不是失败。

-map_metadata[:metadata_spec_out] infile[:metadata_spec_in] (output,per-metadata)

从 infile 设置下一个输出文件的元数据信息。注意,这些是文件索引(从 0 开始),而不是文件名。可选的 metadata_spec_in/out 参数指定要复制哪些元数据。元数据指定符可以是以下形式之一:

g

全局元数据,即适用于整个文件的元数据

s[:stream_spec]

按流划分的元数据。stream_spec 是“流指定符”一章中描述的流指定符。在输入元数据指定符中,从第一个匹配的流复制;在输出元数据指定符中,会复制到所有匹配的流。

c:chapter_index

按章节划分的元数据。chapter_index 是从 0 开始的章节索引。

p:program_index

按节目划分的元数据。program_index 是从 0 开始的节目索引。

如果省略元数据指定符,则默认为全局。

默认情况下,全局元数据从第一个输入文件复制,按流和按章节的元数据会随流/章节一起复制。只要创建了相应类型的任何映射,这些默认映射就会被禁用。可以使用负的文件索引创建一个仅用于禁用自动复制的虚拟映射。

例如,要将输入文件第一个流的元数据复制为输出文件的全局元数据:

ffmpeg -i in.ogg -map_metadata 0:s:0 out.mp3

要反过来,即把全局元数据复制到所有音频流:

ffmpeg -i in.mkv -map_metadata:s:a 0:g out.mkv

注意,在这个例子中,简单地写 0 同样有效,因为默认会假定为全局元数据。

-map_chapters input_file_index (output)

将索引为 input_file_index 的输入文件中的章节复制到下一个输出文件。如果未指定章节映射,则会从至少含有一个章节的第一个输入文件复制章节。使用负的文件索引可禁用任何章节复制。

-benchmark (global)

在编码结束时显示基准测试信息,包括所用的实际时间、系统时间、用户时间以及最大内存消耗。并非所有系统都支持最大内存消耗的统计,若不支持通常会显示为 0。

-benchmark_all (global)

在编码过程中显示基准测试信息,包括各步骤(音频/视频编码/解码)所用的实际时间、系统时间和用户时间。

-timelimit duration (global)

在 ffmpeg 以 CPU 用户时间运行了 duration 秒后退出。

-dump (global)

将每个输入数据包转储到 stderr。

-hex (global)

转储数据包时,同时转储其负载数据。

-readrate speed (input)

限制输入的读取速度。

其值是一个正浮点数,表示每经过一秒挂钟时间应摄入的媒体最大时长(以秒为单位)。默认值为 0,表示不对摄入速度施加限制。值 1 表示实时速度,等同于 -re

主要用于(例如从文件读取时)模拟采集设备或实时输入流。当输入是真实的采集设备或实时流时,不应使用较低的值,否则可能导致丢包。

在输出包的流速很重要的场景(例如直播)中,此选项很有用。

-re (input)

以原生帧率读取输入。这等同于设置 -readrate 1

-readrate_initial_burst seconds

设置初始读取突发时间(以秒为单位),超过该时间后将强制应用 -re/-readrate。

-readrate_catchup speed (input)

如果输入或输出被阻塞,导致实际读取速度落后于指定的 readrate,则会启用此速率,直到输入追上指定的 readrate 为止。此值不得低于主 readrate。

-fps_mode[:stream_specifier] parameter (output,per-stream)

设置视频同步方式/帧率模式。

passthrough

每一帧都带着其时间戳,从 demuxer 直接传递到 muxer。

cfr

会通过复制和丢弃帧,精确实现所请求的恒定帧率。

vfr

帧会带着其时间戳被直接传递,或者被丢弃,以避免两帧具有相同的时间戳。

auto

根据 muxer 的能力在 cfr 和 vfr 之间选择。这是默认方式。

注意,在此之后,时间戳可能会被 muxer 进一步修改。例如格式选项 avoid_negative_ts 已启用的情况。

使用 -map 可以选择应从哪个流获取时间戳。可以让视频或音频其中之一保持不变,再将其余流同步到保持不变的那个流。

-frame_drop_threshold parameter

帧丢弃阈值,指定视频帧在被丢弃之前最多可以落后多少。以帧率为单位,因此 1.0 即为一帧。默认值为 -1.1。一种可能的用途是:在时间戳存在噪声时避免丢帧,或在时间戳精确时提高丢帧判定的精度。

-apad parameters (output,per-stream)

对输出音频流进行填充。这与应用 -af apad 效果相同。参数是与 apad 滤镜相同组成方式的滤镜参数字符串。要使此选项生效,必须为该输出设置 -shortest

-copyts

不处理输入时间戳,而是保留其原始值,不尝试对其进行整理。特别是不会去除初始起始时间偏移量。

注意,根据 fps_mode 选项或特定 muxer 处理方式(例如格式选项 avoid_negative_ts 已启用的情况),即使选择了此选项,输出时间戳也可能与输入时间戳不一致。

-start_at_zero

与 copyts 一起使用时,会平移输入时间戳,使其从 0 开始。

这意味着,例如使用 -ss 50 会使输出时间戳从 50 秒开始,无论输入文件原本从哪个时间戳开始。

-copytb mode

指定在流复制时如何设置 encoder 的时间基。mode 是一个整数数值,可以取以下值之一:

1

使用 demuxer 的时间基。

时间基会从对应的输入 demuxer 复制到输出 encoder。在复制可变帧率的视频流时,有时需要这样做以避免时间戳非单调递增。

0

使用 decoder 的时间基。

时间基会从对应的输入 decoder 复制到输出 encoder。

-1

尝试自动做出选择,以生成合理的输出。

默认值为 -1。

-enc_time_base[:stream_specifier] timebase (output,per-stream)

设置 encoder 的时间基。timebase 可以取以下值之一:

0

根据媒体类型指定一个默认值。

视频使用 1/framerate,音频使用 1/samplerate。

demux

使用 demuxer 的时间基。

filter

使用 filtergraph 的时间基。

正数

使用提供的数字作为时间基。

该字段可以用两个整数的比值形式给出(例如 1:24、1:48000),也可以用十进制数形式给出(例如 0.04166、2.0833e-5)

默认值为 0。

-bitexact (input/output)

为 (de)muxer 和 (de/en)coder 启用 bitexact 模式

-shortest (output)

在最短的输出流结束时完成编码。

注意,此选项可能需要缓冲帧,从而引入额外延迟。这一延迟的最大量可通过 -shortest_buf_duration 选项控制。

-shortest_buf_duration duration (output)

当至少有一个流是“稀疏”的(即帧之间存在较大间隙,字幕流通常如此)时,-shortest 选项可能需要缓冲相当多的数据。

此选项以秒为单位控制缓冲帧的最大时长。较大的值可能使 -shortest 选项产生更准确的结果,但会增加内存占用和延迟。

默认值为 10 秒。

-dts_delta_threshold threshold

时间戳不连续的增量阈值,以十进制秒数表示。

此选项启用的时间戳不连续校正,仅适用于接受时间戳不连续的输入格式(即启用了 AVFMT_TS_DISCONT 标志的格式,例如 MPEG-TS 和 HLS),并且在使用 -copyts 选项时会自动禁用(除非检测到环绕)。

如果检测到绝对值大于 threshold 的时间戳不连续,ffmpeg 会通过将当前 DTS 和 PTS 减小/增大相应的增量值来消除这一不连续。

默认值为 10。

-dts_error_threshold threshold

时间戳误差的增量阈值,以十进制秒数表示。

此选项启用的时间戳校正,仅适用于不接受时间戳不连续的输入格式(即未启用 AVFMT_TS_DISCONT 标志的格式)。

如果检测到绝对值大于 threshold 的时间戳不连续,ffmpeg 会丢弃该 PTS/DTS 时间戳值。

默认值为 3600*30(30 小时),这是一个任意选定且相当保守的值。

-muxdelay seconds (output)

设置最大的 demux-decode 延迟。

-muxpreload seconds (output)

设置初始的 demux-decode 延迟。

-streamid output-stream-index:new-value (output)

为输出流分配一个新的 stream-id 值。此选项应在其所适用的输出文件名之前指定。在存在多个输出文件的情况下,streamid 可以被重新赋予不同的值。

例如,要为一个输出 mpegts 文件将流 0 的 PID 设为 33、流 1 的 PID 设为 36:

ffmpeg -i inurl -streamid 0:33 -streamid 1:36 out.ts

-bsf[:stream_specifier] bitstream_filters (input/output,per-stream)

对匹配的流应用 bitstream 过滤器。该过滤器 会在每个数据包从 demuxer 接收到时应用(用作输入选项时),或在数据包被发送到 muxer 之前应用(用作输出选项时)。

bitstream_filters 是以逗号分隔的 bitstream 过滤器 规格列表,每一项的形式为

filter[=optname0=optval0:optname1=optval1:...]

若 ’,=:’ 中的任一字符需作为选项值的一部分,则需用反斜杠对其进行转义。

使用 -bsfs 选项获取 bitstream 过滤器 的列表。

例如

ffmpeg -bsf:v h264_mp4toannexb -i h264.mp4 -c:v copy -an out.h264

会将 h264_mp4toannexb bitstream 过滤器(用于将 MP4 封装的 H.264 流转换为 Annex B)应用到 输入 视频流。

另一方面,

ffmpeg -i file.mov -an -vn -bsf:s mov2textsub -c:s copy -f rawvideo sub.txt

会将 mov2textsub bitstream 过滤器(用于从 MOV 字幕中提取文本)应用到 输出 字幕流。不过需要注意,由于这两个示例都使用了 -c copy,将过滤器应用在输入还是输出上区别不大——如果发生转码,情况就会不同。

-tag[:stream_specifier] codec_tag (input/output,per-stream)

为匹配的流强制指定 tag/fourcc。

-timecode hh:mm:ssSEPff

指定要写入的 Timecode。对于 non-drop timecode,SEP 为 ’:’;对于 drop timecode,SEP 为 ’;’(或 ’.’)。

ffmpeg -i input.mpg -timecode 01:02:03.04 -r 30000/1001 -s ntsc output.mpg

-filter_complex filtergraph (global)

定义一个 complex filtergraph,即具有任意数量输入和/或输出的 filtergraph。对于简单的图——即只有一个输入和一个相同类型输出的图——请参见 -filter 选项。filtergraph 是对该 filtergraph 的描述,具体说明见 ffmpeg-filters 手册中的“Filtergraph syntax”一节。此选项可以多次指定——每次使用都会创建一个新的 complex filtergraph。

complex filtergraph 的输入可以来自不同类型的源,通过相应链接标签的格式加以区分:

  • 要连接一个输入流,使用 [file_index:stream_specifier](即与 -map 相同的语法)。如果 stream_specifier 匹配多个流,将使用第一个。对于多视角视频,流指定符后面可以跟 view specifier,其语法请参见 -map 选项的文档。
  • 要连接一个 loopback decoder,使用 [dec:dec_idx],其中 dec_idx 是要连接到给定输入的 loopback decoder 的索引。对于多视角视频,decoder 索引后面可以跟 view specifier,其语法请参见 -map 选项的文档。
  • 要连接另一个 complex filtergraph 的输出,使用其链接标签。例如下面这个例子:
    ffmpeg -i input.mkv \
      -filter_complex '[0:v]scale=size=hd1080,split=outputs=2[for_enc][orig_scaled]' \
      -c:v libx264 -map '[for_enc]' output.mkv \
      -dec 0:0 \
      -filter_complex '[dec:0][orig_scaled]hstack[stacked]' \
      -map '[stacked]' -c:v ffv1 comparison.mkv
    

读取一个输入视频,并

* (第 2 行)使用一个具有一个输入和两个输出的 complex filtergraph,将视频缩放为 1920x1080,并将结果复制到两个输出; 
* (第 3 行)用 `libx264` 编码其中一个缩放后的输出,并将结果写入 output.mkv; 
* (第 4 行)用 loopback decoder 解码该已编码流; 
* (第 5 行)将 loopback decoder 的输出(即经 `libx264` 编码的视频)与缩放后的原始输入并排放置; 
* (第 6 行)合成后的视频随后被无损编码并写入 comparison.mkv。

注意,这两个 filtergraph 不能合并为一个,因为那样会在转码流水线中形成一个环(filtergraph 的输出进入编码,再进入解码,然后又回到同一个 filtergraph),而这种环是不允许的。

未加标签的输入会被连接到第一个未使用的、类型匹配的输入流。

输出链接标签通过 -map 引用。未加标签的输出会被添加到第一个输出文件。

注意,使用此选项时,可以只使用 lavfi 源而不需要普通的输入文件。

例如,要将图像叠加到视频上

ffmpeg -i video.mkv -i image.png -filter_complex '[0:v][1:v]overlay[out]' -map
'[out]' out.mkv

这里 [0:v] 指第一个输入文件中的第一个视频流,它被链接到 overlay 滤镜的第一个(主)输入。类似地,第二个输入中的第一个视频流被链接到 overlay 的第二个(overlay)输入。

假设每个输入文件中只有一个视频流,就可以省略输入标签,因此上面的写法等同于

ffmpeg -i video.mkv -i image.png -filter_complex 'overlay[out]' -map
'[out]' out.mkv

此外还可以省略输出标签,此时该 filtergraph 的唯一输出会自动被添加到输出文件,因此可以简单地写成

ffmpeg -i video.mkv -i image.png -filter_complex 'overlay' out.mkv

作为一个特殊例外,可以将位图字幕流用作输入:它会被转换为一个视频,其尺寸与文件中最大的视频相同,若文件中没有视频则为 720x576。注意,这是一个实验性的临时解决方案,一旦 libavfilter 对字幕有了适当的支持,就会被移除。

例如,要将字幕硬编码到以 MPEG-TS 格式保存的 DVB-T 录制内容上,并将字幕延迟 1 秒:

ffmpeg -i input.ts -filter_complex \
  '[#0x2ef] setpts=PTS+1/TB [sub] ; [#0x2d0] [sub] overlay' \
  -sn -map '#0x2dc' output.mkv

(0x2d0、0x2dc 和 0x2ef 分别是视频、音频和字幕流的 MPEG-TS PID;使用 0:0、0:3 和 0:7 同样可行)

要使用 lavfi 的 color source 生成 5 秒纯红色视频:

ffmpeg -filter_complex 'color=c=red' -t 5 out.mkv

-filter_complex_threads nb_threads (global)

定义用于处理 filter_complex 图的线程数。与 filter_threads 类似,但仅用于 -filter_complex 图。默认值为可用 CPU 的数量。

-lavfi filtergraph (global)

定义一个 complex filtergraph,即具有任意数量输入和/或输出的 filtergraph。等同于 -filter_complex。

-accurate_seek (input)

此选项用于启用或禁用在输入文件中配合 -ss 选项进行的精确定位。默认启用,因此转码时的定位是精确的。使用 -noaccurate_seek 可禁用它,这在例如复制部分流而对其余流转码时可能有用。

-seek_timestamp (input)

此选项用于启用或禁用在输入文件中配合 -ss 选项按时间戳进行定位。默认禁用。如果启用,-ss 选项的参数会被视为一个实际的时间戳,不会按文件的起始时间进行偏移。这只对不从时间戳 0 开始的文件(例如 transport stream)才有意义。

-thread_queue_size size (input/output)

对于输入,此选项设置从文件或设备读取时排队数据包的最大数量。对于低延迟/高码率的实时流,如果未能及时读取,数据包可能会被丢弃;设置此值可强制 ffmpeg 使用单独的输入线程,并在数据包到达时立即读取。默认情况下,ffmpeg 只有在指定了多个输入时才会这样做。

对于输出,此选项指定可排队到每个 muxing 线程的数据包的最大数量。

-sdp_file file (global)

将输出流的 sdp 信息打印到 file。这样即便至少有一个输出不是 rtp 流,也可以转储 sdp 信息。(要求至少有一种输出格式为 rtp。)

-discard (input)

允许丢弃特定流或流中的帧。使用值 all 可以完全丢弃任意输入流,而从流中有选择地丢弃帧则发生在 demuxer 层,并非所有 demuxer 都支持。

none

不丢弃任何帧。

default

默认值,即不丢弃任何帧。

noref

丢弃所有非参考帧。

bidir

丢弃所有双向预测帧。

nokey

丢弃除 keyframe 之外的所有帧。

all

丢弃所有帧。

-abort_on flags (global)

在多种情况下停止并中止。可用的标志有:

empty_output

没有任何数据包被传递给 muxer,输出为空。

empty_output_stream

在部分输出流中,没有任何数据包被传递给 muxer。

-max_error_rate (global)

设置所有输入中解码失败帧所占的比例阈值,一旦超过该阈值,ffmpeg 将返回退出码 69。超过该阈值并不会终止处理。取值范围是 0 到 1 之间的浮点数。默认值为 2/3。

-xerror (global)

出错时停止并退出

-max_muxing_queue_size packets (output,per-stream)

在转码音频和/或视频流时,ffmpeg 要等到每个此类流都至少有一个数据包之后,才会开始写入输出。在等待的过程中,其他流的数据包会被缓冲。此选项以数据包为单位,为匹配的输出流设置该缓冲区的大小。

此选项的默认值对大多数用途来说应该已经足够大,因此只有在确定需要时才应修改此选项。

-muxing_queue_data_threshold bytes (output,per-stream)

这是一个最小阈值,在达到该阈值之前不会考虑 muxing queue 的大小。默认值为每个流 50 兆字节,依据的是传递给 muxer 的数据包的总大小。

-auto_conversion_filters (global)

在所有 filtergraph(包括由 -vf、-af、-filter_complex 和 -lavfi 定义的)中,启用自动插入格式转换滤镜。如果滤镜的格式协商需要转换,滤镜的初始化将会失败。仍然可以通过在该 filtergraph 中插入相应的转换滤镜(scale、aresample)来完成转换。此选项默认开启,要显式禁用它,需要指定 -noauto_conversion_filters

-bits_per_raw_sample[:stream_specifier] value (output,per-stream)

声明给定输出流中每个原始采样的比特数为 value。注意,此选项设置的是提供给 encoder/muxer 的信息,并不会让流去符合这个值。设置与流实际属性不符的值,可能导致编码失败或输出文件无效。

-stats_enc_pre[:stream_specifier] path (output,per-stream) -stats_enc_post[:stream_specifier] path (output,per-stream) -stats_mux_pre[:stream_specifier] path (output,per-stream)

将匹配流的逐帧编码信息写入 path 指定的文件。

-stats_enc_pre 会在原始视频或音频帧被发送去编码之前,写入关于它们的信息;而 -stats_enc_post 会在从 encoder 收到已编码的数据包时,写入关于这些数据包的信息。-stats_mux_pre 会在数据包即将被发送到 muxer 时,写入关于它们的信息。每一帧或每个数据包都会在指定文件中产生一行。该行的格式由 -stats_enc_pre_fmt / -stats_enc_post_fmt / -stats_mux_pre_fmt 控制。

当多个流的统计信息被写入同一个文件时,不同流对应的行会交错排列。这种交错的确切顺序未作规定,即使使用相同的选项,在程序的不同运行之间也不保证保持一致。

-stats_enc_pre_fmt[:stream_specifier] format_spec (output,per-stream) -stats_enc_post_fmt[:stream_specifier] format_spec (output,per-stream) -stats_mux_pre_fmt[:stream_specifier] format_spec (output,per-stream)

指定用 -stats_enc_pre / -stats_enc_post / -stats_mux_pre 写入的行的格式。

format_spec 是一个字符串,其中可以包含形式为 {fmt} 的指令。format_spec 使用反斜杠转义——要在输出中写入字面的 {、} 或 \,请分别使用 \{、\} 和 \\。

以 fmt 给出的指令可以是以下几种之一:

fidx

输出文件的索引。

sidx

该文件中输出流的索引。

n

帧号。编码前:目前为止已发送给 encoder 的帧数。编码后:目前为止已从 encoder 收到的数据包数。封装时:目前为止已为该流提交给 muxer 的数据包数。

ni

输入帧号。与该输出帧或数据包相对应的输入帧(即由 decoder 输出的帧)的索引。若不可用则为 -1。

tb

表示该帧/数据包时间戳所用的时间基,以分数 num/den 形式给出。注意,encoder 和 muxer 使用的时间基可能不同。

tbi

ptsi 所用的时间基,以分数 num/den 形式给出。当 ptsi 可用时可用,否则为 0/1。

pts

该帧或数据包的 presentation timestamp,为整数。应乘以时间基以计算 presentation time。

ptsi

输入帧(参见 ni)的 presentation timestamp,为整数。应乘以 tbi 以计算 presentation time。不可用时打印为 (2^63 - 1 = 9223372036854775807)。

t

该帧或数据包的 presentation time,为十进制数。等于 pts 乘以 tb。

ti

输入帧(参见 ni)的 presentation time,为十进制数。等于 ptsi 乘以 tbi。不可用时打印为 inf。

dts (packet)

该数据包的 decoding timestamp,为整数。应乘以时间基以计算 presentation time。

dt (packet)

该帧或数据包的 decoding time,为十进制数。等于 dts 乘以 tb。

sn (frame,audio)

目前为止已发送给 encoder 的音频采样数。

samp (frame,audio)

该帧中的音频采样数。

size (packet)

已编码数据包的大小,以字节为单位。

br (packet)

当前比特率,以每秒比特数表示。

abr (packet)

到目前为止整个流的平均比特率,以比特/秒为单位;如果此时无法确定,则为 -1。

key (packet)

如果数据包包含 keyframe,则字符为 ’K’;否则为 ’N’。

标记为 packet 的指令只能在 -stats_enc_post_fmt 和 -stats_mux_pre_fmt 中使用。

标记为 frame 的指令只能在 -stats_enc_pre_fmt 中使用。

标记为 audio 的指令只能用于音频流。

默认的格式字符串如下:

pre-encoding

{fidx} {sidx} {n} {t}

post-encoding

{fidx} {sidx} {n} {t}

将来,新的项可能会被添加到默认格式字符串的末尾。依赖格式保持完全一致的用户,应自行显式指定格式。

注意,写入同一文件的不同流的统计信息可能采用不同的格式。

5.12 预设文件

预设文件包含一系列 option=value 键值对,每行一个,用于指定一系列在命令行中书写起来会很麻烦的选项。以井号(’#’)字符开头的行会被忽略,用于提供注释。有关示例,请参阅 FFmpeg 源码树中的 presets 目录。

预设文件有两种类型:ffpreset 文件和 avpreset 文件。

5.12.1 ffpreset 文件

ffpreset 文件通过 vpreapresprefpre 选项指定。fpre 选项接受预设的文件名而非预设名称作为输入,可用于任意种类的 codec。对于 vpreaprespre 选项,预设文件中指定的选项会应用到当前选中的、与该预设选项类型相同的 codec。

传给 vpreaprespre 预设选项的参数会按照以下规则确定要使用的预设文件:

ffmpeg 首先按以下顺序查找名为 arg.ffpreset 的文件:$FFMPEG_DATADIR 目录(如果已设置)、$HOME/.ffmpeg 目录、配置时定义的 datadir(通常为 PREFIX/share/ffmpeg),或者在 win32 上位于可执行文件旁的 ffpresets 文件夹。例如,如果参数为 libvpx-1080p,则会查找文件 libvpx-1080p.ffpreset。

如果没有找到这样的文件,ffmpeg 会在上述目录中查找名为 codec_name-arg.ffpreset 的文件,其中 codec_name 是预设文件选项将要应用到的 codec 的名称。例如,如果你使用 -vcodec libvpx 选择了视频 codec,并使用 -vpre 1080p,则会查找文件 libvpx-1080p.ffpreset。

5.12.2 avpreset 文件

avpreset 文件通过 pre 选项指定。它们的工作方式与 ffpreset 文件类似,但只允许特定于 encoder 的选项。因此,不能使用指定 encoder 的 option=value 键值对。

指定 pre 选项后,ffmpeg 会按以下顺序在 $AVCONV_DATADIR 目录(如果已设置)、$HOME/.avconv 目录,以及配置时定义的 datadir(通常为 PREFIX/share/ffmpeg)中查找后缀为 .avpreset 的文件。

ffmpeg 首先会在上述目录中查找名为 codec_name-arg.avpreset 的文件,其中 codec_name 是预设文件选项将要应用到的 codec 的名称。例如,如果你使用 -vcodec libvpx 选择了视频 codec,并使用 -pre 1080p,则会查找文件 libvpx-1080p.avpreset。

如果没有找到这样的文件,ffmpeg 会在相同目录中查找名为 arg.avpreset 的文件。

5.13 vstats 文件格式

-vstats-vstats_file 选项用于启用生成包含所生成视频输出统计信息的文件。

-vstats_version 选项用于控制生成文件的格式版本。

版本 1 的格式为:

frame= FRAME q= FRAME_QUALITY PSNR= PSNR f_size= FRAME_SIZE s_size= STREAM_SIZEkB time= TIMESTAMP br= BITRATEkbits/s avg_br= AVERAGE_BITRATEkbits/s

版本 2 的格式为:

out= OUT_FILE_INDEX st= OUT_FILE_STREAM_INDEX frame= FRAME_NUMBER q= FRAME_QUALITYf PSNR= PSNR f_size= FRAME_SIZE s_size= STREAM_SIZEkB time= TIMESTAMP br= BITRATEkbits/s avg_br= AVERAGE_BITRATEkbits/s

各键对应的值说明如下:

avg_br

以 Kbits/s 表示的平均比特率

br

以 Kbits/s 表示的比特率

frame

已编码帧的数量

out

输出文件索引

PSNR

峰值信噪比

q

帧的质量

f_size

以字节数表示的已编码数据包大小

s_size

以 KiB 表示的流大小

st

输出文件流索引

time

数据包的时间

type

画面类型

另请参阅 -stats_enc 系列选项,了解显示编码统计信息的另一种方式。

6 示例

6.1 视频与音频采集

如果指定了输入格式和设备,ffmpeg 就可以直接采集视频和音频。

ffmpeg -f oss -i /dev/dsp -f video4linux2 -i /dev/video0 /tmp/out.mpg

或者使用 ALSA 音频源(单声道输入,卡 id 为 1)代替 OSS:

ffmpeg -f alsa -ac 1 -i hw:1 -f video4linux2 -i /dev/video0 /tmp/out.mpg

注意,在使用诸如 Gerd Knorr 编写的 xawtv 之类的电视查看器启动 ffmpeg 之前,必须先激活正确的视频源和频道。你还必须使用标准混音器正确设置音频录制电平。

6.2 X11 采集

通过以下方式使用 ffmpeg 采集 X11 显示:

ffmpeg -f x11grab -video_size cif -framerate 25 -i :0.0 /tmp/out.mpg

0.0 是你的 X11 服务器的 display.screen 编号,与 DISPLAY 环境变量相同。

ffmpeg -f x11grab -video_size cif -framerate 25 -i :0.0+10,20 /tmp/out.mpg

0.0 是你的 X11 服务器的 display.screen 编号,与 DISPLAY 环境变量相同。10 是采集的 x 偏移量,20 是 y 偏移量。

6.3 视频与音频文件格式转换

任何受支持的文件格式和协议都可以作为 ffmpeg 的输入:

示例:

  • 你可以使用 YUV 文件作为输入:
    ffmpeg -i /tmp/test%d.Y /tmp/out.mpg
    

这会使用以下文件:

    /tmp/test0.Y, /tmp/test0.U, /tmp/test0.V,
    /tmp/test1.Y, /tmp/test1.U, /tmp/test1.V, etc...

Y 文件的分辨率是 U、V 文件的两倍。它们是没有头的 raw 文件,可以由任何像样的视频 decoder 生成。如果 ffmpeg 无法猜出图像尺寸,你必须使用 -s 选项指定图像尺寸。

  • 你可以从 raw YUV420P 文件输入:
    ffmpeg -i /tmp/test.yuv /tmp/out.avi
    

test.yuv 是一个包含 raw YUV 平面数据的文件。每一帧由 Y 平面,加上垂直和水平分辨率均为一半的 U、V 平面组成。

  • 你可以输出到 raw YUV420P 文件:

    ffmpeg -i mydivx.avi hugefile.yuv
    
  • 你可以设置多个输入文件和输出文件:

    ffmpeg -i /tmp/a.wav -s 640x480 -i /tmp/a.yuv /tmp/a.mpg
    

将音频文件 a.wav 和 raw YUV 视频文件 a.yuv 转换为 MPEG 文件 a.mpg。

  • 你也可以同时进行音频和视频转换:
    ffmpeg -i /tmp/a.wav -ar 22050 /tmp/a.mp2
    

将 a.wav 转换为采样率 22050 Hz 的 MPEG 音频。

  • 你可以同时编码为多种格式,并定义从输入流到输出流的映射:
    ffmpeg -i /tmp/a.wav -map 0:a -b:a 64k /tmp/a.mp2 -map 0:a -b:a 128k /tmp/b.mp2
    

将 a.wav 以 64 kbits 转换为 a.mp2,以 128 kbits 转换为 b.mp2。’-map file:index’ 按输出流定义的顺序,指定每个输出流使用哪个输入流。

  • 你可以转码已解密的 VOB:
    ffmpeg -i snatch_1.vob -f avi -c:v mpeg4 -b:v 800k -g 300 -bf 2 -c:a libmp3lame -b:a 128k snatch.avi
    

这是一个典型的 DVD 翻录示例:输入是一个 VOB 文件,输出是包含 MPEG-4 视频和 MP3 音频的 AVI 文件。注意,此命令中使用了 B 帧,因此 MPEG-4 流与 DivX5 兼容;GOP 大小为 300,对于 29.97fps 的输入视频,这意味着每 10 秒有一个帧内帧。此外,音频流采用 MP3 编码,因此你需要在 configure 时传入 --enable-libmp3lame 来启用 LAME 支持。这种映射对于按需获取所需音频语言的 DVD 转码尤其有用。

注意:要查看支持的输入格式,请使用 ffmpeg -demuxers

  • 你可以从视频中提取图像,或者从多张图像创建视频:

从视频中提取图像:

    ffmpeg -i foo.avi -r 1 -s WxH -f image2 foo-%03d.jpeg

这会从视频中每秒提取一个视频帧,并输出到名为 foo-001.jpeg、foo-002.jpeg 等的文件中。图像会被重新缩放以适应新的 WxH 值。

如果你只想提取有限数量的帧,可以将上述命令与 -frames:v-t 选项结合使用,或者与 -ss 结合使用,从特定时间点开始提取。

从多张图像创建视频:

    ffmpeg -f image2 -framerate 12 -i foo-%03d.jpeg -s WxH foo.avi

语法 foo-%03d.jpeg 指定使用由三位数字组成、并用零填充的十进制数来表示序号。这与 C 语言 printf 函数所支持的语法相同,但只有接受普通整数的格式才适用。

在导入图像序列时,通过选择 image2 专属的 -pattern_type glob 选项,-i 在内部也支持展开类似 shell 的通配符模式(glob)。

例如,要从匹配 glob 模式 foo-*.jpeg 的文件名创建视频:

    ffmpeg -f image2 -pattern_type glob -framerate 12 -i 'foo-*.jpeg' -s WxH foo.avi
  • 你可以在输出中放入多个相同类型的流:
    ffmpeg -i test1.avi -i test2.avi -map 1:1 -map 1:0 -map 0:1 -map 0:0 -c copy -y test12.nut
    

生成的输出文件 test12.nut 将按逆序包含来自输入文件的前四个流。

  • 强制使用 CBR 视频输出:

    ffmpeg -i myfile.avi -b 4000k -minrate 4000k -maxrate 4000k -bufsize 1835k out.m2v
    
  • lmin、lmax、mblmin 和 mblmax 这四个选项使用 ’lambda’ 单位,但你可以使用 QP2LAMBDA 常量轻松地从 ’q’ 单位转换:

    ffmpeg -i src.ext -lmax 21*QP2LAMBDA dst.ext
    

7 参见

ffmpeg-all, ffplay, ffprobe, ffmpeg-utils, ffmpeg-scaler, ffmpeg-resampler, ffmpeg-codecs, ffmpeg-bitstream-filters, ffmpeg-formats, ffmpeg-devices, ffmpeg-protocols, ffmpeg-filters

8 作者

FFmpeg 的开发者们。

关于作者身份的详细信息,请参见项目的 Git 历史(https://git.ffmpeg.org/ffmpeg),例如在 FFmpeg 源代码目录中输入 git log 命令,或浏览在线仓库 https://git.ffmpeg.org/ffmpeg

各组件的维护者列在源代码树中的 MAINTAINERS 文件里。

主机托管由 telepoint.bg 提供