ffmpeg 文档

目录

1 概要

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

2 描述

ffmpeg 是一个通用的媒体转换器。它可以读取各种各样的输入 - 包括实时抓取/录制设备 - 过滤并将它们转码为大量的输出格式。

ffmpeg 从任意数量的输入读取(可以是常规文件,管道,网络流,抓取设备等),由 -i 选项指定,并写入任意数量的输出,这些输出由一个简单的输出 url 指定。命令行上发现的任何不能解释为选项的内容都被视为输出 url。

原则上,每个输入或输出都可以包含任意数量的不同类型的基本流(视频/音频/字幕/附件/数据),尽管允许的流计数和/或类型可能会受到容器格式的限制。从哪个输入选择哪些流进入哪个输出,要么是自动完成的,要么使用 -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 从下面列出的组件构建一个转码管道。然后,程序的操作包括输入数据块从源头沿着管道向下流向接收器,同时被沿途遇到的组件转换。

以下类型的组件可用

  • 解复用器(简称“解多路复用器”)读取输入源以提取
    • 全局属性,如元数据或章节;
    • 输入基本流及其属性列表

    为每个 -i 选项创建一个解复用器实例,并将编码的数据包发送到解码器复用器

    在其他文献中,解复用器有时被称为分割器,因为它们的主要功能是将文件分割成基本流(尽管有些文件只包含一个基本流)。

    解复用器的示意图如下所示

    ┌──────────┬───────────────────────┐
    │ 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.
         │
    
  • 解码器接收音频、视频或字幕基本流的编码(压缩)数据包,并将它们解码为原始(视频的像素数组,音频的 PCM)。解码器通常与解复用器中的基本流相关联(并接收其输入),但有时也可能独立存在(请参见 回环解码器)。

    解码器的示意图如下所示

              ┌─────────┐
     packets  │         │ raw frames
    ─────────►│ decoder ├────────────►
              │         │
              └─────────┘
    
  • 滤镜图处理和转换原始音频或视频。滤镜图由一个或多个链接成图的单独滤镜组成。滤镜图有两种类型 - 简单复杂,分别使用 -filter-filter_complex 选项配置。

    一个简单的滤镜图与一个输出基本流相关联;它从解码器接收要过滤的输入,并将过滤后的输出发送到该输出流的编码器

    执行去隔行(使用 yadif 去隔行器)然后调整大小(使用 scale 滤镜)的简单视频滤镜图如下所示

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

    复杂的滤镜图是独立的,不与任何特定的流相关联。它可能具有多个(或零个)输入,可能具有不同的类型(音频或视频),每个输入都从解码器或另一个复杂滤镜图的输出接收数据。它还具有一个或多个输出,这些输出馈送到编码器或另一个复杂滤镜图的输入。

    以下示例图表示具有 3 个输入和 2 个输出(全部为视频)的复杂滤镜图

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

    来自第二个输入的帧叠加在来自第一个输入的帧上。来自第三个输入的帧被重新缩放,然后复制成两个相同的流。其中一个叠加在组合的前两个输入上,结果作为滤镜图的第一个输出公开。另一个副本最终成为滤镜图的第二个输出。

  • 编码器接收原始音频、视频或字幕,并将它们编码成编码后的数据包。编码(压缩)过程通常是有损的——它会降低流的质量以使输出更小;一些编码器是无损的,但代价是输出大小要大得多。视频或音频编码器从某个过滤器图的输出接收输入,字幕编码器从解码器接收输入(因为尚不支持字幕过滤)。每个编码器都与某个复用器的输出基本流相关联,并将其输出发送给该复用器。

    编码器的示意图如下所示

                 ┌─────────┐
     raw frames  │         │ packets
    ────────────►│ encoder ├─────────►
                 │         │
                 └─────────┘
    
  • 复用器(简称 "multiplexers")从编码器(转码路径)或直接从解复用器(流复制路径)接收其基本流的编码数据包,将它们交错(当有多个基本流时),并将生成的字节写入输出文件(或管道、网络流等)。

    复用器的示意图如下所示

                           ┌──────────────────────┬───────────┐
     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 编码器,即不进行解码或编码的流复制。

流复制对于更改基本流计数、容器格式或修改容器级元数据非常有用。由于没有解码或编码,因此速度非常快,并且没有质量损失。但是,由于多种因素(例如,目标容器所需的某些信息在源中不可用),它在某些情况下可能不起作用。显然,应用过滤器也是不可能的,因为过滤器在解码后的帧上工作。

可以构建更复杂的流复制场景 - 例如,将来自两个输入文件的流组合到一个输出中

┌──────────┬────────────────────┐         ┌────────────────────┬───────────┐
│ 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 转码

转码是解码流然后再次编码的过程。由于编码往往是计算密集型的,并且在大多数情况下会降低流的质量(即它是有损的),因此您应该只在需要时进行转码,否则执行流复制。转码的典型原因是

  • 应用过滤器 - 例如,调整大小、去隔行扫描或叠加视频;重采样或混合音频;
  • 您希望将流馈送到无法解码原始编解码器的内容。

请注意,除非您为它们指定 -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 滤波

转码时,可以在编码之前使用简单复杂的过滤器图来过滤音频和视频流。

3.3.1 简单滤镜图

简单过滤器图是指只有一个输入和一个输出,并且类型相同(音频或视频)的过滤器图。它们使用每个流的 -filter 选项(以及 -filter:v (视频)和 -filter:a (音频)的别名 -vf-af)进行配置。请注意,简单过滤器图与其输出流绑定,因此例如,如果您有多个音频流,-af 将为每个流创建一个单独的过滤器图。

从上面的转码示例中,添加过滤(并为了清晰起见省略音频)使其看起来像这样

┌──────────┬───────────────┐
│ 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 复杂滤镜图

复杂过滤器图是那些不能简单地描述为应用于一个流的线性处理链的过滤器图。例如,当该图具有多个输入和/或输出,或者当输出流类型与输入不同时,就会出现这种情况。复杂过滤器图使用 -filter_complex 选项进行配置。请注意,此选项是全局的,因为复杂过滤器图本质上不能明确地与单个流或文件相关联。每个 -filter_complex 实例都会创建一个新的复杂过滤器图,并且可以有任意数量的过滤器图。

复杂过滤器图的一个简单示例是 overlay 过滤器,它有两个视频输入和一个视频输出,其中包含一个视频叠加在另一个视频之上。它的音频对应物是 amix 过滤器。

3.4 回环解码器

虽然解码器通常与解复用器流相关联,但也可以创建“环回”解码器,这些解码器解码来自某些编码器的输出,并允许将其反馈到复杂过滤器图。这是通过 -dec 指令完成的,该指令将应该解码的输出流的索引作为参数。每个这样的指令都会创建一个新的环回解码器,其索引从零开始递增。然后,应使用这些索引在复杂过滤器图链接标签中引用环回解码器,如 -filter_complex 的文档中所述。

可以通过将解码 AVOptions 放置在 -dec 之前传递给环回解码器,类似于输入/输出选项。

例如,以下示例

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 选项可分别用于跳过包含视频、音频、字幕和数据流,无论是手动映射还是自动选择的,但复杂过滤器图的输出流除外。

4.1 描述

以下小节描述了流选择中涉及的各种规则。下面的示例展示了如何在实践中应用这些规则。

虽然我们尽一切努力准确反映程序的行为,但 FFmpeg 正在不断开发中,并且自撰写本文以来,代码可能已更改。

4.1.1 自动流选择

在没有任何特定输出文件的映射选项的情况下,ffmpeg 会检查输出格式,以确定它可以包含哪些类型的流,即视频、音频和/或字幕。对于每种可接受的流类型,ffmpeg 将从所有输入中选择一个可用的流。

它将根据以下标准选择流:

  • 对于视频,选择分辨率最高的流;
  • 对于音频,选择通道数最多的流;
  • 对于字幕,选择找到的第一个字幕流,但有一个注意事项。输出格式的默认字幕编码器可以是基于文本的或基于图像的,并且只会选择相同类型的字幕流。

如果多个相同类型的流的优先级相同,则选择索引最低的流。

数据或附件流不会自动选择,只能使用 -map 包含。

4.1.2 手动流选择

使用 -map 时,只有用户映射的流才会包含在该输出文件中,但对于下面描述的滤镜图输出可能有一个例外。

4.1.3 复杂滤镜图

如果存在任何带有未标记衬垫的复杂滤镜图输出流,它们将被添加到第一个输出文件中。如果输出格式不支持该流类型,则会导致致命错误。在没有映射选项的情况下,包含这些流会导致跳过其类型的自动流选择。如果存在映射选项,这些滤镜图流将添加到映射的流中。

带有标记衬垫的复杂滤镜图输出流必须映射一次且仅映射一次。

4.1.4 流处理

流处理独立于流选择,但字幕除外,如下所述。流处理通过针对特定输出文件中的流的 -codec 选项进行设置。特别是,编解码器选项在流选择过程之后由 ffmpeg 应用,因此不会影响后者。如果没有为流类型指定 -codec 选项,ffmpeg 将选择输出文件混合器注册的默认编码器。

字幕存在一个例外。如果为输出文件指定了字幕编码器,则将包含找到的任何类型的第一个字幕流,无论是文本还是图像。 ffmpeg 不会验证指定的编码器是否可以转换所选的流,或者转换后的流是否在输出格式中可接受。这通常也适用:当用户手动设置编码器时,流选择过程无法检查编码的流是否可以混合到输出文件中。如果不能,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 容器文件,接受视频、音频和字幕流,因此 ffmpeg 将尝试选择每种类型的一个流。
对于视频,它将从 B.mp4 中选择 stream 0,该流在所有输入视频流中具有最高分辨率。
对于音频,它将从 B.mp4 中选择 stream 3,因为它具有最多的通道数。
对于字幕,它将从 B.mp4 中选择 stream 2,这是 A.aviB.mp4 中的第一个字幕流。

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

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

对于前两个输出,所有包含的流都将被转码。选择的编码器将是每个输出格式注册的默认编码器,这可能与所选输入流的编解码器不匹配。

对于第三个输出,音频流的编解码器选项已设置为 copy,因此不会发生或可以发生解码-过滤-编码操作。所选流的数据包应从输入文件传输并混合到输出文件中。

示例:自动字幕选择

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

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

示例:未标记的滤镜图输出

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

此处使用 -filter_complex 选项设置了一个滤镜图,该滤镜图由单个视频滤镜组成。overlay 滤镜需要正好两个视频输入,但没有指定,因此将使用前两个可用的视频流,即 A.aviC.mkv 的视频流。滤镜的输出衬垫没有标签,因此被发送到第一个输出文件 out1.mp4。因此,跳过了视频流的自动选择,否则将选择 B.mp4 中的流。具有最多通道数的音频流,即 B.mp4 中的 stream 3,将被自动选择。但是,不会选择字幕流,因为 MP4 格式没有注册默认的字幕编码器,并且用户没有指定字幕编码器。

第二个输出文件 out2.srt 仅接受基于文本的字幕流。因此,即使第一个可用的字幕流属于 C.mkv,它也是基于图像的,因此被跳过。所选流,即 B.mp4 中的 stream 2,是第一个基于文本的字幕流。

示例:带标签的滤镜图输出

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

上面的命令也将失败,因为色调滤镜输出有一个标签 [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 中的视频流被发送到色调滤镜,该滤镜的输出使用 split 滤镜克隆一次,并且两个输出都已标记。然后,每个副本都会映射到第一个和第三个输出文件。

需要两个视频输入的 overlay 滤镜使用前两个未使用的视频流。这些流来自 A.aviC.mkv。覆盖输出未标记,因此无论是否存在 -map 选项,它都会被发送到第一个输出文件 out1.mp4

aresample 滤镜被发送到第一个未使用的音频流,即 A.avi 的音频流。由于此滤镜输出也未标记,因此它也被映射到第一个输出文件。-an 的存在仅禁止自动或手动选择音频流,而不是来自滤镜图的输出。这两个映射的流应在 out1.mp4 中映射的流之前排序。

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

out3.mkv 由色调滤镜的克隆视频输出和来自 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 的文件中加载一个滤镜图描述。

5.1 流指定符

某些选项是按流应用的,例如比特率或编解码器。流指定符用于精确指定给定选项属于哪个(哪些)流。

流指定符是一个字符串,通常附加到选项名称后,并用冒号分隔。例如,-codec:a:1 ac3 包含 a:1 流指定符,它匹配第二个音频流。因此,它将为第二个音频流选择 ac3 编解码器。

一个流指定符可以匹配多个流,以便将该选项应用于所有匹配的流。例如,-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 或 i:group_id

匹配具有此组 ID 的流。

p:program_id[:additional_stream_specifier]

匹配程序 ID 为 program_id 的程序中的流。如果使用 additional_stream_specifier,则它匹配既是程序的一部分又匹配 additional_stream_specifier 的流。

#stream_id 或 i:stream_id

通过流 ID 匹配流(例如 MPEG-TS 容器中的 PID)。

m:key[:value]

匹配元数据标签 key 具有指定值的流。如果未给出 value,则匹配包含具有任何值的给定标签的流。keyvalue 中的冒号字符“:”需要使用反斜杠进行转义。

disp:dispositions[:additional_stream_specifier]

匹配具有给定配置的流。dispositions 是一个或多个配置(如 -dispositions 选项打印的那样)用“+”连接的列表。

u

匹配具有可用配置的流,必须定义编解码器,并且必须存在诸如视频尺寸或音频采样率之类的基本信息。

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

5.2 通用选项

这些选项在 ff* 工具之间共享。

-L

显示许可证。

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

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

arg 的可能值是

long

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

full

打印完整的选项列表,包括编码器、解码器、解复用器、复用器、滤镜等的共享和私有选项。

decoder=decoder_name

打印有关名为 decoder_name 的解码器的详细信息。使用 -decoders 选项获取所有解码器的列表。

encoder=encoder_name

打印有关名为 encoder_name 的编码器的详细信息。使用 -encoders 选项获取所有编码器的列表。

demuxer=demuxer_name

打印有关名为 demuxer_name 的解复用器的详细信息。使用 -formats 选项获取所有解复用器和复用器的列表。

muxer=muxer_name

打印有关名为 muxer_name 的复用器的详细信息。使用 -formats 选项获取所有复用器和解复用器的列表。

filter=filter_name

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

bsf=bitstream_filter_name

打印有关名为 bitstream_filter_name 的比特流滤镜的详细信息。使用 -bsfs 选项获取所有比特流滤镜的列表。

protocol=protocol_name

打印有关名为 protocol_name 的协议的详细信息。使用 -protocols 选项获取所有协议的列表。

-version

显示版本。

-buildconf

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

-formats

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

-demuxers

显示可用的解复用器。

-muxers

显示可用的复用器。

-devices

显示可用设备。

-codecs

显示 libavcodec 已知的所有编解码器。

请注意,在本文档中,“编解码器”一词被用作更准确的媒体比特流格式的快捷方式。

-decoders

显示可用的解码器。

-encoders

显示所有可用的编码器。

-bsfs

显示可用的比特流滤镜。

-protocols

显示可用的协议。

-filters

显示可用的 libavfilter 滤镜。

-pix_fmts

显示可用的像素格式。

-sample_fmts

显示可用的采样格式。

-layouts

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

-dispositions

显示流的配置信息。

-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

指示不应将重复的日志输出压缩到第一行,并且将省略“最后消息重复 n 次”的行。

level

指示日志输出应向每条消息行添加 [level] 前缀。这可以用作日志着色的替代方法,例如,将日志转储到文件时。

标志也可以单独使用,通过添加“+”/“-”前缀来设置/重置单个标志,而不影响其他 flags 或更改 loglevel。当同时设置 flagsloglevel 时,预计最后一个 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

默认情况下,程序将日志记录到 stderr。如果终端支持着色,则使用颜色标记错误和警告。可以通过设置环境变量 AV_LOG_FORCE_NOCOLOR 来禁用日志着色,或者可以通过设置环境变量 AV_LOG_FORCE_COLOR 来强制启用着色。

-report

将完整的命令行和日志输出转储到当前目录中名为 program-YYYYMMDD-HHMMSS.log 的文件中。此文件对于错误报告很有用。它还暗示了 -loglevel debug

将环境变量 FFREPORT 设置为任何值具有相同的效果。如果该值是以 “:” 分隔的 key=value 序列,则这些选项将影响报告;如果选项值包含特殊字符或选项分隔符 “:”,则必须对选项值进行转义(请参阅 ffmpeg-utils 手册中的“引号和转义”部分)。

可识别以下选项

file

设置用于报告的文件名;%p 扩展为程序名称,%t 扩展为时间戳,%% 扩展为纯 %

level

使用数值设置日志详细程度级别(请参阅 -loglevel)。

例如,要使用 32 的日志级别(日志级别 info 的别名)将报告输出到名为 ffreport.log 的文件中

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

解析环境变量中的错误不是致命的,并且不会出现在报告中。

-hide_banner

禁止打印横幅。

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

-cpuflags flags (全局)

允许设置和清除 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 (全局)

覆盖 CPU 计数检测。此选项用于测试。除非您知道自己在做什么,否则不要使用它。

ffmpeg -cpucount 2
-max_alloc bytes

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

5.3 AVOptions

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

generic

可以为任何容器、编解码器或设备设置这些选项。通用选项列在容器/设备的 AVFormatContext 选项下,以及编解码器的 AVCodecContext 选项下。

private

这些选项特定于给定的容器、设备或编解码器。私有选项列在其对应的容器/设备/编解码器下。

例如,要将 ID3v2.3 头部而不是默认的 ID3v2.4 写入 MP3 文件,请使用 MP3 复用器的 id3v2_version 私有选项。

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

所有编解码器 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

在上面的示例中,一个多声道音频流被映射两次以进行输出。第一个实例使用编解码器 ac3 和比特率 640k 进行编码。第二个实例被下混到 2 个声道,并使用编解码器 aac 进行编码。使用输出流的绝对索引为其指定 128k 的比特率。

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

注意:以前通过在选项名称前添加 v/a/s 来指定每个流 AVOptions 的未文档记录方式现在已经过时,并将很快被删除。

5.4 主要选项

-f fmt (输入/输出)

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

-i url (输入)

输入文件 URL。

-y (全局)

覆盖输出文件而不询问。

-n (全局)

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

-stream_loop number (输入)

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

-recast_media (全局)

允许强制使用与解复用器检测或指定的媒体类型不同的解码器。对于解码作为数据流复用的媒体数据很有用。

-c[:stream_specifier] codec (输入/输出,每个流)
-codec[:stream_specifier] codec (输入/输出,每个流)

为一个或多个流选择编码器(在输出文件之前使用时)或解码器(在输入文件之前使用时)。codec 是解码器/编码器的名称,或特殊值 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 (输入/输出)

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

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

duration 必须是时间持续时间规范,请参阅(ffmpeg-utils)ffmpeg-utils(1) 手册中的时间持续时间部分

-to 和 -t 是互斥的,-t 具有优先级。

-to position (输入/输出)

position 停止写入输出或读取输入。position 必须是时间持续时间规范,请参阅(ffmpeg-utils)ffmpeg-utils(1) 手册中的时间持续时间部分

-to 和 -t 是互斥的,-t 具有优先级。

-fs limit_size (输出)

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

-ss position (输入/输出)

当用作输入选项(在 -i 之前)时,在此输入文件中搜索到 position。请注意,在大多数格式中,不可能精确搜索,因此 ffmpeg 将搜索到 position 之前的最接近的搜索点。在进行转码且启用 -accurate_seek(默认设置)时,搜索点和 position 之间的额外段将被解码并丢弃。在进行流复制或使用 -noaccurate_seek 时,将保留该段。

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

position 必须是时间持续时间规范,请参阅(ffmpeg-utils)ffmpeg-utils(1) 手册中的时间持续时间部分

-sseof position (输入)

类似于 -ss 选项,但相对于“文件末尾”。也就是说,负值在文件中较早,0 在 EOF。

-isync input_index (输入)

将输入分配为同步源。

这将获取目标和参考输入的开始时间之间的差异,并按该差异偏移目标文件的时间戳。两个输入的源时间戳应来自相同的时钟源才能获得预期的结果。如果设置了 copyts,则还必须设置 start_at_zero。如果任何一个输入没有起始时间戳,则不进行同步调整。

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

默认值为 -1

-itsoffset offset (输入)

设置输入时间偏移。

offset 必须是时间持续时间规范,请参阅(ffmpeg-utils)ffmpeg-utils(1) 手册中的时间持续时间部分

偏移量将添加到输入文件的时间戳中。指定正偏移量表示相应的流将延迟 offset 中指定的时间持续时间。

-itsscale scale (输入,每个流)

重新缩放输入时间戳。scale 应该是浮点数。

-timestamp date (输出)

在容器中设置记录时间戳。

date 必须是日期规范,请参阅(ffmpeg-utils)ffmpeg-utils(1) 手册中的日期部分

-metadata[:metadata_specifier] key=value (输出,每个元数据)

设置元数据键/值对。

可以给出可选的 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 (输出,每个流)

设置流的 disposition 标志。

默认值:默认情况下,所有 disposition 标志都从输入流复制,除非此选项适用的输出流由复杂的过滤器图提供 - 在这种情况下,默认情况下不会设置任何 disposition 标志。

value 是由“+”或“-”分隔的 disposition 标志序列。“+”前缀添加给定的 disposition,“-”删除它。如果第一个标志也带有“+”或“-”前缀,则生成的 disposition 是 value 更新的默认值。如果第一个标志没有前缀,则生成的 disposition 是 value。也可以通过将其设置为 0 来清除 disposition。

如果未为输出文件指定 -disposition 选项,则当输出文件中存在多个此类型的流且该类型的流尚未标记为默认时,ffmpeg 将自动在每种类型的第一个流上设置“default” disposition 标志。

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

例如,要使第二个音频流成为默认流:

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

要使第二个字幕流成为默认流并从第一个字幕流中删除默认 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

要从第一个音频流中添加“original”并删除“comment”disposition 标志,而不删除其其他 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

要在第一个音频流上仅设置“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

并非所有的复用器都支持嵌入缩略图,而且即使支持,也只支持少数几种格式,如 JPEG 或 PNG。

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

创建一个具有指定 titleprogram_num 的节目,并将指定的 stream 添加到其中。

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

创建一个具有指定 typestream_group_id 的流组,或者通过 map 映射一个输入组,将指定的 stream 和/或先前定义的 stream_group 添加到其中。

type 可以是以下之一

iamf_audio_element

将属于同一 IAMF 音频元素的 stream 分组

对于此组 type,可以使用以下选项

audio_element_type

音频元素类型。支持以下值

channel

可缩放通道音频表示

scene

Ambisonics 表示

demixing

用于重建可缩放通道音频表示的解混信息。此选项必须与其他选项用“,”分隔,并采用以下 key=value 选项

parameter_id

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

dmixp_mode

预定义的解混参数组合

recon_gain

用于重建可缩放通道音频表示的重建增益信息。此选项必须与其他选项用“,”分隔,并采用以下 key=value 选项

parameter_id

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

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 混音演示所引用的所有 IAMF 音频元素的 stream 分组

对于此组 type,可以使用以下选项

submix

混音演示中的子混音。此选项必须与其他选项用“,”分隔。可以定义多个用“,”分隔的条目,并且至少必须设置一个。

它采用以下用“:”分隔的 key=value 选项

parameter_id

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

parameter_rate

引用此 parameter_id 的帧中参数块中的采样率持续时间字段表示为

default_mix_gain

当给定帧没有共享相同 parameter_id 的参数块时,应用的默认混合增益值

element

引用此混音演示中用于生成最终输出音频信号以进行回放的音频元素。此选项必须与其他选项用“|”分隔。可以定义多个用“|”分隔的条目,并且至少必须设置一个。

它采用以下用“:”分隔的 key=value 选项

stg

此子混音引用的音频元素的 stream_group_id

parameter_id

帧中参数块可能引用的标识符,用于在与其他处理过的音频元素求和之前,对引用的和渲染的音频元素应用任何处理

parameter_rate

引用此 parameter_id 的帧中参数块中的采样率持续时间字段表示为

default_mix_gain

当给定帧没有共享相同 parameter_id 的参数块时,应用的默认混合增益值

annotations

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

headphones_rendering_mode

指示当在耳机上回放时,基于通道的输入音频元素是渲染到立体声扬声器还是用双耳渲染器进行空间化。如果引用的音频元素的 audio_element_type 设置为 channel,则此设置无效。

支持以下值

stereo
binaural
layout

指定此子混音上测量响度信息的布局。此选项必须与其他选项用“|”分隔。可以定义多个用“|”分隔的条目,并且至少必须设置一个。

它采用以下用“:”分隔的 key=value 选项

layout_type
loudspeakers

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

binaural

布局是双耳的。

sound_system

与 ITU-2051-3 的声音系统 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 中定义。

album_anchored_loudness

专辑响度信息,如 ITU-1770-4 中定义。

annotations

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

例如,要从几个 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,
-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
-streamid 0:0 -streamid 1:1 -streamid 2:2 -streamid 3:3 output.iamf

要将具有四个流的输入 IAMF 文件中的两个流组(音频元素和混音演示)复制到 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 (输出)

指定目标文件类型(vcdsvcddvddvdv50)。type 可以添加前缀 pal-ntsc-film- 以使用相应的标准。然后会自动设置所有格式选项(比特率、编解码器、缓冲区大小)。您可以只键入

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

除了所有三个标准的像素格式设置为 yuv422p 之外,dv50 目标与 dv 目标相同。

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

-dn (输入/输出)

作为输入选项,阻止文件的所有数据流被过滤或被自动选择或映射用于任何输出。请参阅 -discard 选项以单独禁用流。

作为输出选项,禁用数据记录,即自动选择或映射任何数据流。有关完全手动控制,请参阅 -map 选项。

-dframes number (输出)

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

-frames[:stream_specifier] framecount (输出,按流)

framecount 帧后停止写入流。

-q[:stream_specifier] q (输出,按流)
-qscale[:stream_specifier] q (输出,按流)

使用固定质量等级 (VBR)。q/qscale 的含义取决于编解码器。如果 qscale 在没有 stream_specifier 的情况下使用,则它仅应用于视频流,这是为了保持与以前行为的兼容性,并且因为在没有使用 stream_specifier 时,为两个不同的编解码器(即音频和视频)指定相同的编解码器特定值通常不是预期的行为。

-filter[:stream_specifier] filtergraph (输出,每流)

创建由 filtergraph 指定的滤镜图,并使用它来过滤流。

filtergraph 是要应用于流的滤镜图的描述,并且必须具有单个输入和单个输出,且它们的类型与流的类型相同。在滤镜图中,输入与标签 in 相关联,输出与标签 out 相关联。有关滤镜图语法的更多信息,请参阅 ffmpeg-filters 手册。

如果要创建具有多个输入和/或输出的滤镜图,请参阅 -filter_complex 选项

-reinit_filter[:stream_specifier] integer (输入,每流)

此布尔选项确定当输入帧参数在流中间发生更改时,是否重新初始化馈送此流的滤镜图。默认情况下启用此选项,因为大多数视频和所有音频滤镜都无法处理输入帧属性的偏差。重新初始化时,现有滤镜状态将丢失,例如某些滤镜中可用的帧计数 n 参考。重新初始化时缓冲的任何帧都将丢失。触发重新初始化的属性是:对于视频,帧分辨率或像素格式;对于音频,采样格式、采样率、通道数或通道布局。

-filter_threads nb_threads (全局)

定义用于处理滤镜管道的线程数。每个管道将生成一个线程池,其中有这么多线程可用于并行处理。默认值是可用 CPU 的数量。

-pre[:stream_specifier] preset_name (输出,每流)

指定匹配流的预设。

-stats (全局)

将编码进度/统计信息记录为“info”级别的日志(请参阅 -loglevel)。默认情况下启用此选项,要显式禁用它,你需要指定 -nostats

-stats_period time (全局)

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

-progress url (全局)

将程序友好的进度信息发送到 url

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

更新周期使用 -stats_period 设置。

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

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

启用标准输入上的交互。默认情况下启用,除非标准输入用作输入。要显式禁用交互,你需要指定 -nostdin

禁用标准输入上的交互很有用,例如,如果 ffmpeg 在后台进程组中。使用 ffmpeg ... < /dev/null 可以大致实现相同的结果,但它需要一个 shell。

-debug_ts (全局)

打印时间戳/延迟信息。默认情况下禁用。此选项主要用于测试和调试目的,并且输出格式可能因版本而异,因此不应被可移植脚本使用。

另请参阅选项 -fdebug ts

-attach filename (输出)

将附件添加到输出文件。一些格式(如 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 (输入,每流)

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

例如,将第一个附件提取到名为“out.ttf”的文件中

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

将所有附件提取到由 filename 标签确定的文件中

ffmpeg -dump_attachment:t "" -i INPUT

技术说明 – 附件被实现为编解码器额外数据,因此此选项实际上可用于从任何流中提取额外数据,而不仅仅是附件。

5.5 视频选项

-vframes number (输出)

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

-r[:stream_specifier] fps (输入/输出,每流)

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

作为输入选项,忽略文件中存储的任何时间戳,并假设恒定帧率 fps 生成时间戳。这与用于某些输入格式(如 image2 或 v4l2)的 -framerate 选项不同(它在旧版本的 FFmpeg 中曾经相同)。如有疑问,请使用 -framerate 而不是输入选项 -r

作为输出选项

视频编码

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

视频流复制

指示复用器 fps 是流帧率。在这种情况下,不会丢弃或复制任何数据。如果 fps 与数据包时间戳确定的实际流帧率不匹配,则可能会生成无效的文件。另请参阅 setts 比特流过滤器。

-fpsmax[:stream_specifier] fps (输出,每流)

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

当输出帧率自动设置且高于此值时,限制输出帧率。在批量处理或当输入帧率被错误地检测为非常高时很有用。它不能与 -r 一起设置。在流复制期间会被忽略。

-s[:stream_specifier] size (输入/输出,每流)

设置帧大小。

作为输入选项,这是 video_size 私有选项的快捷方式,该选项被一些解复用器识别,这些解复用器的帧大小要么未存储在文件中,要么是可配置的 – 例如原始视频或视频采集器。

作为输出选项,这会将 scale 视频过滤器插入到相应的滤镜图的末尾。请直接使用 scale 过滤器将其插入到开头或其他位置。

格式为 'wxh'(默认值 - 与源相同)。

-aspect[:stream_specifier] aspect (输出,每流)

设置由 aspect 指定的视频显示纵横比。

aspect 可以是浮点数字符串,或 num:den 形式的字符串,其中 numden 是纵横比的分子和分母。例如,“4:3”、“16:9”、“1.3333”和“1.7777”是有效的参数值。

如果与 -vcodec copy 一起使用,它将影响存储在容器级别的纵横比,而不是存储在编码帧中的纵横比(如果存在)。

-display_rotation[:stream_specifier] rotation (输入,每流)

设置视频旋转元数据。

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

此选项会覆盖文件中存储的旋转/显示变换元数据(如果有)。当视频正在转码(而不是复制)并且启用了 -autorotate 时,视频将在滤镜阶段旋转。否则,如果混流器支持,元数据将写入输出文件。

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

-display_hflip[:stream_specifier] (输入,每个流)

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

有关更多详细信息,请参阅 -display_rotation 选项。

-display_vflip[:stream_specifier] (输入,每个流)

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

有关更多详细信息,请参阅 -display_rotation 选项。

-vn (输入/输出)

作为输入选项,阻止文件的所有视频流被过滤或自动选择或映射到任何输出。请参阅 -discard 选项以单独禁用流。

作为输出选项,禁用视频录制,即自动选择或映射任何视频流。有关完全手动控制,请参阅 -map 选项。

-vcodec codec (输出)

设置视频编解码器。这是 -codec:v 的别名。

-pass[:stream_specifier] n (输出,每个流)

选择通道号(1 或 2)。它用于进行两遍视频编码。视频的统计信息在第一遍记录到日志文件中(另请参见选项 -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 (输出,每个流)

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

-vf filtergraph (输出)

创建由 filtergraph 指定的滤镜图,并使用它来过滤流。

这是 -filter:v 的别名,请参阅 -filter 选项

-autorotate

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

-autoscale

根据第一帧的分辨率自动缩放视频。默认启用,使用 -noautoscale 禁用它。禁用 autoscale 时,滤镜图的所有输出帧可能不具有相同的分辨率,并且可能不适合某些编码器/复用器。因此,除非您真的知道自己在做什么,否则不建议禁用它。禁用 autoscale 的风险由您自己承担。

5.6 高级视频选项

-pix_fmt[:stream_specifier] format (输入/输出,每个流)

设置像素格式。使用 -pix_fmts 显示所有支持的像素格式。如果无法选择所选的像素格式,ffmpeg 将打印警告并选择编码器支持的最佳像素格式。如果 pix_fmt+ 为前缀,如果无法选择请求的像素格式,ffmpeg 将退出并显示错误,并且禁用滤镜图内的自动转换。如果 pix_fmt 是单个 +,ffmpeg 将选择与输入(或图输出)相同的像素格式,并且禁用自动转换。

-sws_flags flags (输入/输出)

为 libswscale 库设置默认标志。如果未在滤镜图定义中覆盖,则这些标志由自动插入的 scale 滤镜和简单滤镜图中的滤镜使用。

有关缩放器选项的列表,请参阅 (ffmpeg-scaler)ffmpeg-scaler 手册

-rc_override[:stream_specifier] override (输出,每个流)

特定间隔的速率控制覆盖,格式为用斜杠分隔的“int,int,int”列表。前两个值是起始帧号和结束帧号,最后一个值是要使用的量化器(如果为正数)或质量因子(如果为负数)。

-vstats

将视频编码统计信息转储到 vstats_HHMMSS.log。有关格式描述,请参阅 vstats 文件格式部分。

-vstats_file file

将视频编码统计信息转储到 file。有关格式描述,请参阅 vstats 文件格式部分。

-vstats_version file

指定要使用的 vstats 格式的版本。默认为 2。有关格式描述,请参阅 vstats 文件格式部分。

-vtag fourcc/tag (输出)

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

-force_key_frames[:stream_specifier] time[,time...] (输出,每个流)
-force_key_frames[:stream_specifier] expr:expr (输出,每个流)
-force_key_frames[:stream_specifier] source (输出,每个流)

force_key_frames 可以采用以下形式的参数

time[,time...]

如果参数由时间戳组成,ffmpeg 将根据编码器时间基准将指定的时间舍入到最近的输出时间戳,并在第一个时间戳等于或大于计算时间戳的帧处强制一个关键帧。请注意,如果编码器时间基准太粗糙,则可能会在时间戳低于指定时间的帧上强制关键帧。默认的编码器时间基准是输出帧速率的倒数,但可以通过 -enc_time_base 设置其他值。

如果其中一个时间是 "chapters[delta]",它将扩展为文件中所有章节的开始时间,偏移 delta,以秒为单位表示。此选项对于确保在章节标记或输出文件中的任何其他指定位置存在查找点很有用。

例如,要在 5 分钟处插入一个关键帧,并在每个章节的开始时间前 0.1 秒插入关键帧

-force_key_frames 0:05:00,chapters-0.1
expr:expr

如果参数以 expr: 为前缀,则字符串 expr 将被解释为表达式,并针对每个帧进行求值。如果求值结果非零,则强制一个关键帧。

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

n

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

n_forced

强制帧的编号

prev_forced_n

前一个强制帧的编号,当尚未强制关键帧时,它为 NAN

prev_forced_t

前一个强制帧的时间,当尚未强制关键帧时,它为 NAN

t

当前处理帧的时间

例如,要每 5 秒强制一个关键帧,您可以指定

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

要从第 13 秒开始,在最后一个强制帧的时间后 5 秒强制一个关键帧

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

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

请注意,强制过多的关键帧对某些编码器的前瞻算法非常有害:使用固定的 GOP 选项或类似的方法会更有效。

-apply_cropping[:stream_specifier] source (输入,每个流)

根据文件元数据,在解码后自动裁剪视频。默认值为全部

none (0)

不应用任何裁剪元数据。

all (1)

应用编解码器和容器级别的裁剪。这是默认模式。

codec (2)

应用编解码器级别的裁剪。

container (3)

应用容器级别的裁剪。

-copyinkf[:stream_specifier] (输出,每个流)

在执行流复制时,也复制在开头找到的非关键帧。

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

初始化一个新的硬件设备,类型为 type,名为 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

当未指定 devicekernel_driver 时,使用此选项指定与所需设备关联的供应商 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

在与供应商 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 上创建一个使用 'MFX_IMPL_HARDWARE' 且子设备类型为 'd3d11va' 的 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 的硬件设备传递给任何滤镜图中的所有滤镜。 这可用于设置使用 hwupload 滤镜上传到的设备,或使用 hwmap 滤镜映射到的设备。 其他滤镜在需要硬件设备时也可能使用此参数。 请注意,这通常仅在输入不在硬件帧中时才需要 - 当输入在硬件帧中时,滤镜将从它们接收的输入帧的上下文中派生出它们需要的设备。

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

-hwaccel[:stream_specifier] hwaccel (输入,每流)

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

none

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

auto

自动选择硬件加速方法。

vdpau

使用 VDPAU (Unix 视频解码和演示 API) 硬件加速。

dxva2

使用 DXVA2 (DirectX 视频加速) 硬件加速。

d3d11va

使用 D3D11VA (DirectX 视频加速) 硬件加速。

vaapi

使用 VAAPI (视频加速 API) 硬件加速。

qsv

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

与大多数其他值不同,此选项不启用加速解码(在选择 qsv 解码器时会自动使用),而是加速转码,无需将帧复制到系统内存中。

要使其工作,解码器和编码器都必须支持 QSV 加速,并且不能使用任何滤镜。

如果所选的 hwaccel 不可用或所选的解码器不支持,则此选项无效。

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

-hwaccel_device[:stream_specifier] hwaccel_device (输入,每流)

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

仅当同时指定了 -hwaccel 选项时,此选项才有意义。 它可以引用使用 -init_hw_device 按名称创建的现有设备,也可以创建一个新设备,就像在之前立即调用了“-init_hw_devicetype:hwaccel_device 一样。

-hwaccels

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

-fix_sub_duration_heartbeat[:stream_specifier]

根据接收到随机访问数据包时要拆分和推送当前正在进行的字幕,将特定的输出视频流设置为心跳流。

这降低了尚未收到结束数据包或后续字幕的字幕的延迟。 缺点是,这很可能会导致字幕事件重复,以涵盖整个持续时间,因此在处理字幕事件传递到输出的延迟不相关的用例时,不应使用此选项。

需要为相关输入字幕流设置 -fix_sub_duration 才能产生任何影响,并且输入字幕流必须直接映射到心跳流所在的同一输出中。

5.7 音频选项

-aframes number (输出)

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

-ar[:stream_specifier] freq (输入/输出,每流)

设置音频采样频率。 对于输出流,默认设置为相应输入流的频率。 对于输入流,此选项仅对音频采集设备和原始解复用器有意义,并映射到相应的解复用器选项。

-aq q (输出)

设置音频质量(特定于编解码器,VBR)。 这是 -q:a 的别名。

-ac[:stream_specifier] channels (输入/输出,每流)

设置音频通道数。 对于输出流,默认设置为输入音频通道数。 对于输入流,此选项仅对音频采集设备和原始解复用器有意义,并映射到相应的解复用器选项。

-an (输入/输出)

作为输入选项,阻止文件的所有音频流被过滤或自动选择或映射到任何输出。 请参阅 -discard 选项以单独禁用流。

作为输出选项,禁用音频录制,即自动选择或映射任何音频流。 有关完全手动控制,请参阅 -map 选项。

-acodec codec (输入/输出)

设置音频编解码器。 这是 -codec:a 的别名。

-sample_fmt[:stream_specifier] sample_fmt (输出,每流)

设置音频采样格式。 使用 -sample_fmts 获取支持的采样格式列表。

-af filtergraph (输出)

创建由 filtergraph 指定的滤镜图,并使用它来过滤流。

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

5.8 高级音频选项

-atag fourcc/tag (输出)

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

-ch_layout[:stream_specifier] layout (输入/输出,每流)

-channel_layout 的别名。

-channel_layout[:stream_specifier] layout (输入/输出,每流)

设置音频通道布局。 对于输出流,默认设置为输入通道布局。 对于输入流,它会覆盖输入的通道布局。 并非所有解码器都尊重覆盖的通道布局。 此选项还为音频采集设备和原始解复用器设置通道布局,并映射到相应的解复用器选项。

-guess_layout_max channels (输入,每流)

如果某些输入通道布局未知,则仅当它对应的通道数最多为指定数量时才尝试猜测。 例如,2 告诉 ffmpeg 将 1 个通道识别为单声道,将 2 个通道识别为立体声,但不会将 6 个通道识别为 5.1。 默认情况下始终尝试猜测。 使用 0 禁用所有猜测。 使用 -channel_layout 选项显式指定输入布局也会禁用猜测。

5.9 字幕选项

-scodec codec (输入/输出)

设置字幕编解码器。 这是 -codec:s 的别名。

-sn (输入/输出)

作为输入选项,阻止对文件的所有字幕流进行过滤,或自动选择或映射到任何输出。请参阅 -discard 选项以单独禁用流。

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

5.10 高级字幕选项

-fix_sub_duration

修复字幕持续时间。对于每个字幕,等待同一流中的下一个数据包,并调整第一个数据包的持续时间以避免重叠。这对于某些字幕编解码器是必要的,特别是 DVB 字幕,因为原始数据包中的持续时间只是一个粗略的估计,结束实际上由一个空的字幕帧标记。如果必要时未能使用此选项,可能会导致持续时间过长或由于非单调时间戳而导致混流失败。

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

-canvas_size size

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

5.11 高级选项

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

在输出文件中创建一个或多个流。此选项有两种形式来指定数据源:第一种形式从某个输入文件(使用 -i 指定)中选择一个或多个流,第二种形式从某些复杂滤镜图(使用 -filter_complex 指定)中获取输出。

在第一种形式中,为来自索引为 input_file_id 的输入文件的每个流创建一个输出流。如果给定了 stream_specifier,则仅使用与该说明符匹配的流(有关 stream_specifier 语法,请参阅流说明符部分)。

流标识符之前的 - 字符创建一个“负”映射。它会禁用已创建的映射中匹配的流。

在流说明符之后可以给出可选的 view_specifier,它用于多视图视频,指定要使用的视图。视图说明符可以具有以下格式之一

view:view_id

按 ID 选择视图;view_id 可以设置为“all”以使用交错到一个流中的所有视图;

vidx:view_idx

按索引选择视图;即 0 是基本视图,1 是第一个非基本视图,依此类推。

vpos:position

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

对于转码,默认设置是仅使用基本视图,即等效于 vidx:0。对于流复制,不支持视图说明符,并且始终复制所有视图。

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

另一种 [linklabel] 形式将复杂滤镜图(请参阅 -filter_complex 选项)的输出映射到输出文件。linklabel 必须与图表中定义的输出链接标签相对应。

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

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

示例

映射所有内容

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

ffmpeg -i INPUT -map 0 output
选择特定流

如果第一个输入文件中有两个音频流,则这些流由 0:00:1 标识。您可以使用 -map 选择要放置在输出文件中的流。例如

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

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

创建多个流

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

ffmpeg -i a.mov -i b.mov -c copy -map 0:2 -map 1:6 out.mov
创建多个流 2

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

ffmpeg -i INPUT -map 0:v -map 0:a:2 OUTPUT
负映射

要映射除第二个音频之外的所有流,请使用负映射

ffmpeg -i INPUT -map 0 -map -0:a:1 OUTPUT
可选映射

要映射第一个输入中的视频和音频流,并使用尾随 ?,如果第一个输入中不存在音频流,则忽略音频映射

ffmpeg -i INPUT -map 0:v -map 0:a? OUTPUT
按语言映射

要选择英语音频流

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

如果尝试复制此类流,则忽略具有未知类型的输入流,而不是失败。

-copy_unknown

允许复制具有未知类型的输入流,而不是在尝试复制此类流时失败。

-map_metadata[:metadata_spec_out] infile[:metadata_spec_in] (输出,每个元数据)

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

g

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

s[:stream_spec]

每个流的元数据。stream_spec流说明符章节中所述的流说明符。在输入元数据说明符中,复制第一个匹配的流。在输出元数据说明符中,将复制所有匹配的流。

c:chapter_index

每个章节的元数据。chapter_index 是从零开始的章节索引。

p:program_index

每个程序的元数据。program_index 是从零开始的程序索引。

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

默认情况下,全局元数据从第一个输入文件复制,每个流和每个章节的元数据与流/章节一起复制。创建任何相关类型的映射都会禁用这些默认映射。可以使用负文件索引来创建仅禁用自动复制的虚拟映射。

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

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 (输出)

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

-benchmark (全局)

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

-benchmark_all (全局)

在编码期间显示基准测试信息。显示各个步骤(音频/视频编码/解码)中使用的实际时间、系统时间和用户时间。

-timelimit duration (全局)

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

-dump (全局)

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

-hex (全局)

在转储数据包时,同时转储有效载荷。

-readrate 速度 (输入)

限制输入读取速度。

其值是一个浮点正数,表示在实际时间的一秒内应摄取的最大媒体时长(以秒为单位)。默认值为零,表示对摄取速度没有强制限制。值 1 表示实时速度,等效于 -re

主要用于模拟捕获设备或实时输入流(例如,从文件读取时)。当输入是实际的捕获设备或实时流时,不应使用低值,因为它可能导致数据包丢失。

当输出数据包的流速很重要时,例如实时流式传输,这很有用。

-re (输入)

以原始帧速率读取输入。这等效于设置 -readrate 1

-readrate_initial_burst

设置初始读取突发时间(以秒为单位),之后将强制执行 -re/-readrate

-vsync 参数 (全局)
-fps_mode[:流指定符] 参数 (输出,每个流)

设置视频同步方法/帧率模式。vsync 应用于所有输出视频流,但可以通过设置 fps_mode 来覆盖流的 vsync。vsync 已被弃用,未来将被删除。

出于兼容性原因,vsync 的某些值可以指定为数字(在下表中以括号显示)。

passthrough (0)

每个帧都带着其来自解复用器的的时间戳传递到复用器。

cfr (1)

将重复和丢弃帧以实现精确的请求的恒定帧率。

vfr (2)

帧将带着时间戳传递或丢弃,以防止 2 个帧具有相同的时间戳。

auto (-1)

根据复用器的功能在 cfr 和 vfr 之间进行选择。这是默认方法。

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

使用 -map,您可以选择应从中获取时间戳的流。您可以保持视频或音频不变,并将剩余的流同步到不变的流。

-frame_drop_threshold 参数

帧丢弃阈值,指定视频帧在被丢弃之前可以落后多少。以帧率单位,因此 1.0 是一帧。默认值为 -1.1。一个可能的用例是避免在时间戳嘈杂的情况下丢帧,或在时间戳精确的情况下提高帧丢弃精度。

-apad 参数 (输出,每个流)

填充输出音频流。这与应用 -af apad 相同。参数是与 apad 滤镜相同的字符串,由滤镜参数组成。必须为此输出设置 -shortest 选项才能生效。

-copyts

不处理输入时间戳,而是保持其值,而不尝试清理它们。特别是,不要删除初始开始时间偏移值。

请注意,即使选择此选项,根据 vsync 选项或特定的复用器处理(例如,如果启用了格式选项 avoid_negative_ts),输出时间戳也可能与输入时间戳不匹配。

-start_at_zero

copyts 一起使用时,将输入时间戳移动,使其从零开始。

这意味着,例如,使用 -ss 50 将使输出时间戳从 50 秒开始,而不管输入文件从哪个时间戳开始。

-copytb 模式

指定在流复制时如何设置编码器时基。模式 是一个整数数值,可以采用以下值之一

1

使用解复用器时基。

时基从相应的输入解复用器复制到输出编码器。当复制具有可变帧率的视频流时,有时需要这样做,以避免时间戳非单调递增。

0

使用解码器时基。

时基从相应的输入解码器复制到输出编码器。

-1

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

默认值为 -1。

-enc_time_base[:流指定符] 时基 (输出,每个流)

设置编码器时基。时基 可以采用以下值之一

0

根据媒体类型分配默认值。

对于视频 - 使用 1/帧率,对于音频 - 使用 1/采样率。

demux

使用来自解复用器的时基。

filter

使用来自滤镜图的时基。

正数

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

此字段可以作为两个整数的比率(例如 1:24、1:48000)或作为十进制数(例如 0.04166、2.0833e-5)提供

默认值为 0。

-bitexact (输入/输出)

为(解)复用器和(解/编)码器启用位精确模式

-shortest (输出)

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

请注意,此选项可能需要缓冲帧,这会引入额外的延迟。此延迟的最大量可以使用 -shortest_buf_duration 选项进行控制。

-shortest_buf_duration 持续时间 (输出)

当至少有一个流是“稀疏的”(即帧之间存在较大间隔 – 这通常是字幕的情况)时,-shortest 选项可能需要缓冲大量数据。

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

默认值为 10 秒。

-dts_delta_threshold 阈值

时间戳不连续性 delta 阈值,以十进制秒数表示。

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

如果检测到时间戳不连续性的绝对值大于 阈值,则 ffmpeg 将通过将当前 DTS 和 PTS 减少/增加相应的 delta 值来消除不连续性。

默认值为 10。

-dts_error_threshold 阈值

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

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

如果检测到时间戳不连续性的绝对值大于 阈值,则 ffmpeg 将丢弃 PTS/DTS 时间戳值。

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

-muxdelay (输出)

设置最大解复用-解码延迟。

-muxpreload (输出)

设置初始解复用-解码延迟。

-streamid 输出流索引:新值 (输出)

为输出流分配新的流 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 (输入/输出,每流)

将比特流过滤器应用于匹配的流。过滤器在从解复用器接收到每个数据包时(当用作输入选项时)或在发送到复用器之前(当用作输出选项时)应用。

bitstream_filters 是一个以逗号分隔的比特流过滤器规范列表,每个规范的形式如下

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

任何要作为选项值一部分的“’,=:’字符都需要用反斜杠转义。

使用 -bsfs 选项获取比特流过滤器列表。

例如:

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

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

另一方面,

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

mov2textsub 比特流过滤器(从 MOV 字幕中提取文本)应用于输出字幕流。 但是请注意,由于这两个示例都使用 -c copy,因此过滤器是在输入还是输出上应用无关紧要 - 如果发生转码,情况将会改变。

-tag[:stream_specifier] codec_tag (输入/输出,每流)

强制匹配流的标签/四字符代码。

-timecode hh:mm:ssSEPff

指定要写入的时间码。SEP 对于非丢帧时间码为“:”,对于丢帧时间码为“;”(或“.”)。

ffmpeg -i input.mpg -timecode 01:02:03.04 -r 30000/1001 -s ntsc output.mpg
-filter_complex filtergraph (全局)

定义一个复杂的滤镜图,即具有任意数量的输入和/或输出的滤镜图。 对于简单的图——具有相同类型的一个输入和一个输出的图——请参阅 -filter 选项。filtergraph 是滤镜图的描述,如 ffmpeg-filters 手册的“滤镜图语法”部分所述。 此选项可以多次指定 - 每次使用都会创建一个新的复杂滤镜图。

复杂滤镜图的输入可以来自不同的源类型,通过相应链接标签的格式来区分

  • 要连接输入流,请使用 [file_index:stream_specifier] (即与 -map 相同的语法)。 如果 stream_specifier 匹配多个流,将使用第一个。 对于多视图视频,流指定符后面可以跟视图指定符,有关其语法,请参阅 -map 选项的文档。
  • 要连接环回解码器,请使用 [dec:dec_idx],其中 dec_idx 是要连接到给定输入的环回解码器的索引。 对于多视图视频,解码器索引后面可以跟视图指定符,有关其语法,请参阅 -map 选项的文档。
  • 要连接来自另一个复杂滤镜图的输出,请使用其链接标签。 例如,以下示例
    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 行)使用具有一个输入和两个输出的复杂滤镜图将视频缩放到 1920x1080,并将结果复制到两个输出;
    • (第 3 行)使用 libx264 编码一个缩放的输出,并将结果写入 output.mkv
    • (第 4 行)使用环回解码器解码此编码的流;
    • (第 5 行)将环回解码器的输出(即 libx264 编码的视频)与缩放的原始输入并排放置;
    • (第 6 行)然后将组合的视频无损编码并写入 comparison.mkv

    请注意,这两个滤镜图不能合并为一个,因为那样转码管道中会出现循环(滤镜图输出进入编码,从那里进入解码,然后再返回到同一图),并且不允许这样的循环。

未标记的输入将连接到匹配类型的第一个未使用的输入流。

输出链接标签用 -map 引用。 未标记的输出将添加到第一个输出文件。

请注意,使用此选项,可以仅使用 lavfi 源,而无需普通的输入文件。

例如,要在视频上覆盖图像

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

此处 [0:v] 指的是第一个输入文件中的第一个视频流,该视频流链接到叠加滤镜的第一个(主)输入。 类似地,第二个输入中的第一个视频流链接到叠加的第二个(叠加)输入。

假设每个输入文件中只有一个视频流,我们可以省略输入标签,因此上述内容等效于

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

此外,我们可以省略输出标签,滤镜图的单个输出将自动添加到输出文件中,因此我们可以简单地写

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 源生成 5 秒纯红色视频

ffmpeg -filter_complex 'color=c=red' -t 5 out.mkv
-filter_complex_threads nb_threads (全局)

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

-lavfi filtergraph (全局)

定义一个复杂的滤镜图,即具有任意数量的输入和/或输出的滤镜图。 等效于 -filter_complex

-accurate_seek (输入)

此选项使用 -ss 选项启用或禁用输入文件中的精确搜索。 默认情况下启用,因此转码时搜索是准确的。 使用 -noaccurate_seek 禁用它,例如,当复制某些流并转码其他流时,这可能很有用。

-seek_timestamp (输入)

此选项使用 -ss 选项启用或禁用按时间戳搜索输入文件。 默认情况下禁用。 如果启用,则 -ss 选项的参数将被视为实际的时间戳,并且不会被文件的开始时间偏移。 这仅对不从时间戳 0 开始的文件(例如传输流)有意义。

-thread_queue_size size (输入/输出)

对于输入,此选项设置从文件或设备读取时排队的数据包的最大数量。 对于低延迟/高速率实时流,如果未及时读取数据包,则可能会丢弃数据包; 设置此值可以强制 ffmpeg 使用单独的输入线程并在数据包到达后立即读取它们。 默认情况下,仅当指定多个输入时,ffmpeg 才会执行此操作。

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

-sdp_file file (全局)

将输出流的 sdp 信息打印到 file。 这允许在至少一个输出不是 rtp 流时转储 sdp 信息。 (要求至少有一个输出格式为 rtp)。

-discard (输入)

允许丢弃特定的流或流中的帧。 可以完全丢弃任何输入流,使用值 all,而从流中选择性丢弃帧发生在解复用器中,并且并非所有解复用器都支持。

none

不丢弃任何帧。

默认

默认值,不丢弃任何帧。

noref

丢弃所有非参考帧。

bidir

丢弃所有双向帧。

nokey

丢弃除关键帧外的所有帧。

all

丢弃所有帧。

-abort_on flags (全局)

在各种条件下停止并中止。 以下标志可用

empty_output

没有数据包传递给复用器,输出为空。

empty_output_stream

部分输出流中没有数据包传递给复用器。

-max_error_rate (全局)

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

-xerror (全局)

发生错误时停止并退出。

-max_muxing_queue_size 数据包 (输出,每个流)

当转码音频和/或视频流时,ffmpeg 将不会开始写入输出,直到每个这样的流都拥有一个数据包。在等待发生这种情况时,其他流的数据包会被缓冲。此选项设置匹配的输出流的此缓冲区大小(以数据包为单位)。

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

-muxing_queue_data_threshold 字节 (输出,每个流)

这是一个最小阈值,在此阈值之前,不会考虑复用队列的大小。默认值为每个流 50 兆字节,并且基于传递给复用器的数据包的总大小。

-auto_conversion_filters (全局)

启用在所有过滤器图中自动插入格式转换过滤器,包括由 -vf-af-filter_complex-lavfi 定义的过滤器图。如果过滤器格式协商需要转换,则过滤器的初始化将失败。仍然可以通过在图中插入相关的转换过滤器(scale、aresample)来执行转换。默认情况下启用,要显式禁用它,您需要指定 -noauto_conversion_filters

-bits_per_raw_sample[:流指定符] (输出,每个流)

声明给定输出流中每个原始样本的位数是 。请注意,此选项设置提供给编码器/复用器的信息,它不会更改流以符合此值。设置与流属性不匹配的值可能会导致编码失败或输出文件无效。

-stats_enc_pre[:流指定符] 路径 (输出,每个流)
-stats_enc_post[:流指定符] 路径 (输出,每个流)
-stats_mux_pre[:流指定符] 路径 (输出,每个流)

将有关匹配流的每帧编码信息写入由 路径 给定的文件。

-stats_enc_pre 在将原始视频或音频帧发送进行编码之前立即写入有关它们的信息,而 -stats_enc_post 在从编码器接收到编码后的数据包时写入有关它们的信息。-stats_mux_pre 写入有关即将发送到复用器的数据包的信息。每个帧或数据包在指定的文件中生成一行。此行的格式由 -stats_enc_pre_fmt / -stats_enc_post_fmt / -stats_mux_pre_fmt 控制。

当将多个流的统计信息写入单个文件时,与不同流对应的行将交错。此交错的精确顺序未指定,并且不保证在程序的不同调用之间保持稳定,即使使用相同的选项也是如此。

-stats_enc_pre_fmt[:流指定符] 格式指定 (输出,每个流)
-stats_enc_post_fmt[:流指定符] 格式指定 (输出,每个流)
-stats_mux_pre_fmt[:流指定符] 格式指定 (输出,每个流)

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

格式指定 是一个字符串,可以包含 {fmt} 形式的指令。格式指定 是反斜杠转义的,分别使用 \{, \}, 和 \\ 将文字 {, } 或 \ 写入输出。

使用 fmt 给出的指令可以是以下之一:

fidx

输出文件的索引。

sidx

文件中输出流的索引。

n

帧号。预编码:到目前为止发送到编码器的帧数。后编码:到目前为止从编码器接收到的数据包数。复用:到目前为止为此流提交给复用器的数据包数。

ni

输入帧号。与此输出帧或数据包对应的输入帧(即解码器输出的帧)的索引。如果不可用,则为 -1。

tb

表达此帧/数据包时间戳的时基,以有理数 num/den 表示。请注意,编码器和复用器可能使用不同的时基。

tbi

ptsi 的时基,以有理数 num/den 表示。当 ptsi 可用时可用,否则为 0/1

pts

帧或数据包的演示时间戳,以整数表示。应乘以时基以计算演示时间。

ptsi

输入帧的演示时间戳(参见 ni),以整数表示。应乘以 tbi 以计算演示时间。当不可用时,打印为 (2^63 - 1 = 9223372036854775807)。

t

帧或数据包的演示时间,以十进制数表示。等于 pts 乘以 tb

ti

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

dts (数据包)

数据包的解码时间戳,以整数表示。应乘以时基以计算演示时间。

dt (数据包)

帧或数据包的解码时间,以十进制数表示。等于 dts 乘以 tb

sn (帧,音频)

到目前为止发送到编码器的音频样本数。

samp (帧,音频)

帧中的音频样本数。

size (数据包)

编码数据包的大小(以字节为单位)。

br (数据包)

当前比特率,以每秒比特数为单位。

abr (数据包)

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

key (数据包)

如果数据包包含关键帧,则为字符 'K',否则为字符 'N'。

标记为 数据包 的指令只能与 -stats_enc_post_fmt-stats_mux_pre_fmt 一起使用。

标记为 的指令只能与 -stats_enc_pre_fmt 一起使用。

标记为 音频 的指令只能与音频流一起使用。

默认格式字符串为

预编码

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

后编码

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

将来,新的项目可能会添加到默认格式字符串的末尾。依赖于格式保持完全不变的用户应手动指定它。

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

5.12 预设文件

预设文件包含一系列 选项= 对,每行一个,用于指定在命令行中难以指定的选项序列。以井号('#')字符开头的行将被忽略,并用于提供注释。请查看 FFmpeg 源代码树中的 presets 目录以获取示例。

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

5.12.1 ffpreset 文件

ffpreset 文件使用 vpreapresprefpre 选项指定。fpre 选项接受预设文件的文件名作为输入,而不是预设名称,并且可以用于任何类型的编解码器。对于 vpreaprespre 选项,预设文件中指定的选项将应用于与预设选项类型相同的当前选定编解码器。

传递给 vpreaprespre 预设选项的参数根据以下规则标识要使用的预设文件

首先,ffmpeg 在目录 $FFMPEG_DATADIR (如果已设置)、$HOME/.ffmpeg 以及配置时定义的 datadir (通常为 PREFIX/share/ffmpeg)或 win32 上可执行文件旁边的 ffpresets 文件夹中按此顺序搜索名为 arg.ffpreset 的文件。例如,如果参数为 libvpx-1080p,它将搜索文件 libvpx-1080p.ffpreset

如果未找到此类文件,则 ffmpeg 将在上述目录中搜索名为 编解码器名称-arg.ffpreset 的文件,其中 编解码器名称 是应用预设文件选项的编解码器的名称。例如,如果使用 -vcodec libvpx 选择视频编解码器并使用 -vpre 1080p,则它将搜索文件 libvpx-1080p.ffpreset

5.12.2 avpreset 文件

avpreset 文件使用 pre 选项指定。它们的工作方式类似于 ffpreset 文件,但只允许编码器特定的选项。因此,不能使用指定编码器的 选项= 对。

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

首先,ffmpeg 在上述目录中搜索名为 编解码器名称-arg.avpreset 的文件,其中 编解码器名称 是应用预设文件选项的编解码器的名称。例如,如果使用 -vcodec libvpx 选择视频编解码器并使用 -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 文件的两倍。它们是原始文件,没有头文件。它们可以由所有体面的视频解码器生成。如果 ffmpeg 无法猜测图像的大小,则必须使用 -s 选项指定图像的大小。

  • 可以从原始 YUV420P 文件输入
    ffmpeg -i /tmp/test.yuv /tmp/out.avi
    

    test.yuv 是一个包含原始 YUV 平面数据的文件。每个帧都由 Y 平面组成,后跟垂直和水平分辨率减半的 U 和 V 平面。

  • 可以输出到原始 YUV420P 文件
    ffmpeg -i mydivx.avi hugefile.yuv
    
  • 可以设置多个输入文件和输出文件
    ffmpeg -i /tmp/a.wav -s 640x480 -i /tmp/a.yuv /tmp/a.mpg
    

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

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

    以 22050 Hz 的采样率将 a.wav 转换为 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 文件:索引”指定每个输出流使用哪个输入流,按照输出流的定义顺序。

  • 可以转码解密的 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 编码的,因此您需要通过传递 --enable-libmp3lame 来配置以启用 LAME 支持。映射对于 DVD 转码以获取所需的音频语言特别有用。

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

  • 可以从视频中提取图像,或从多个图像创建视频

    用于从视频中提取图像

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

    这将从视频中每秒提取一个视频帧,并将其输出到名为 foo-001.jpegfoo-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 函数支持的相同语法,但只有接受普通整数的格式才适用。

    导入图像序列时,-i 还支持通过选择特定于 image2 的 -pattern_type glob 选项在内部扩展类似 shell 的通配符模式(globbing)。

    例如,要从与 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 文件中。

本文档于 2025 年 1 月 21 日 使用 makeinfo 生成。

telepoint.bg 提供托管服务