FFmpeg 官网之 FFmpe Document 翻译讲解

43 阅读1小时+

背景

ffmpeg 的知识非常繁杂,从ffmpeg的命令开始接收会简单一些,我们可以通过官网,获取一些介绍,可以初步理解ffmpeg具有的功能。

本篇博客主要讲FFmpeg Tools 之 FFmpeg , 讲解参考的官方文档地址为:

ffmpeg Documentation

内容

1 简介

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

2 说明

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

简单来说,就是将输入转换为输出

  • ffmpeg -i input.avi output.mp4

    上面的 -i input.avi 的含义就是指定输入文件为 input.avi, 后面 ouput.mp4 就是输出文件

  • ffmpeg -i input.avi -b:v 64k -bufsize 64k output.mp4

    在输出文件前,输入文件后的参数,就是指定输出文件的格式,这里(-b:v)就是指定输出文件视频的码率 64 kbit/s

  • ffmpeg -i input.avi -r 24 output.mp4

    将输出文件的帧率强制设置为 24 帧每秒。

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

    这里指定输入的帧率为1,输出的帧率为24

对于原始输入文件,可能需要使用格式选项。

3 详细介绍

ffmpeg 利用以下所列的组件构建出一条转码管道。然后,该程序的运行过程就包括输入数据块从数据源沿管道流向数据接收端(数据宿),同时在这个过程中被它们所遇到的组件进行转换。

以下这些类型的组件可供使用:

  • 解复用器(“demultiplexers” 的简称)读取一个输入源,以便提取:

    • 全局属性比如元数据,章数据
    • 基本流列表和它们的属性

    对于每一个 -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 ├────────────⮞
               │         │
               └─────────┘
    
  • 滤镜图(Filtergraph)用于处理和转换原始音频或视频帧。一个滤镜图由一个或者多个不同功能的滤镜构成。滤镜图有两种类型 —— 简单滤镜图和复杂滤镜图,分别通过 -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 ├─────────⮞
             │         │
             └─────────┘
  • 多路复用器从编码器或者直接从解复用器接收数据,作为基本流的编码数据包,对其进行交织(当有多个基本流时),然后将得到的字节数据输出到文件(或管道,网络等)

    多路复用器的示意图如下:

image.png

3.1 流拷贝(Streamcopy)

ffmpeg 中最简单的管道就是流拷贝,它赋值一个输入的基本流数据,不需要进行解码,过滤,或者编码操作。举个例子,输入一个INPUT.mkv的输入文件,其中有三个基本流,我们从中提取第二个,并将其写入OUPUT.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

  • 对输入文件,没有参数输入选项

  • 有一个简单的输出OUPUT.mp4

    • -map 0:1 选择输入流来使用-选择第输入文件索引0(即第一个文件)的流索引1(即第二个流)
    • -c copy 选择拷贝编码器,也就是流拷贝,不设及码和编码

流拷贝(Streamcopy) 可用于更改基本流的数量,容器合适和容器级别的元数据。因为它没有解码或编码,所以它非常快,而且没有质量损失。 但是有一些因素下,它不起作用,比如,目标容器所需要的信息在源中不可用。过滤器也是不能的,因为过滤器只对解码后的帧起作用。

还可以创建复杂的流拷贝场景,比如将两个输入文件中的流合并到一个输出中:

┌──────────┬────────────────────┐         ┌────────────────────┬───────────┐
│ 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 选项只有一个会选择拷贝这两个流。你也可以使用多个选项(Stream specifiers功能),来实现不同值到不同的流。下面部分会演示这种。

与上面例子相反的场景,将多个流从单个输入拆分为多个输出:

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

转码是对流进行解码,然后再次编码的过程。由于编码过程往往计算量很大,而且大多数情况会降低质量(有损编码),因此你应该在确定需要的时候才进行转码。通常需要转码的原因有:

  • 应用过滤器-例如调整大小,去隔行或叠加视频;音频重采样或混合音频
  • 你希望转把留提供给其他解码器,但是其他解码器不支持这种原始的格式

请注意,ffmpeg将对所有音频、视频和字幕流进行转码,除非您为它们指定了-c copy

考虑这样一个管道,它读取一个包含一个音频和一个视频的输入文件,转码视频和将音频拷贝到一个输出文件中。它的示意图如下:

┌──────────┬─────────────────────┐
│ demuxer  │                     │       audio packets
╞══════════╡ stream 0 (audio)    ├─────────────────────────────────────╮
│          │                     │                                     │
│INPUT.mkv ├─────────────────────┤ video    ┌─────────┐     raw        │
│          │                     │ packets  │  videovideo 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 滤镜(Filtering)

转码时,音频和视频流可以在编码前进行过滤,使用简单或复杂的滤镜

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 每个实例都会创建一个滤镜,并且可以有任意数量的滤镜。

一个简单的复杂滤镜例子,叠加滤镜,它有两个视频输入和一个视频输出。输入视频一个叠加在另外一个之上。相对应的是音频混音滤镜。

3.4 回环解码器(Loopback decoders)

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

解码相关的 AV 选项可以通过将它们置于 -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

输入 INPUT 视频:

  • (行 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 流选择(Stream selection)

ffmpeg 提供了 -map 选项,用于手动控制每个输出文件中的流选择。用户可以跳过 -map 选项,让 FFmpeg 按照以下描述进行自动流选择。-vn / -an / -sn / -dn选项可用于分别跳过视频、音频、字幕和数据流的包含,无论是手动映射还是自动选择,但由复杂滤镜图输出的流除外。

4.1 描述(Description)

下面小结描述了流选择中涉及的各种规则。以下的例子展示了这些规则是如何在实践中应用的。尽管努力准确反映程序的行为,但是FFmpeg在不断地更新中,有些可能代码发生了变化。

4.1.1 自动流选择(Automatic stream selection)

在指定输出文件上没有任何的选项,ffmpeg 会检查输出格式,从而判断哪些类型的流可以包含在其中,即视频,音频 和/或 字幕。ffmpeg会从所有可用的输入中选择一个流。

它选择流的依据如下:

  • 对于视频,它是分辨率最高的流
  • 对于音频,它是声道最多的流
  • 对于字幕,就是第一个找到的字幕。但是注意,输出格式的默认字幕可以是或基于图像的,只会选择类型相同的字幕流。

在同一类型的多个流评分相同的情况下,会选择索引最低的流。

数据或者附件流不能自动选择,只能使用 -map 选项来选择。

4.1.2 手动流选择(Automatic stream selection)

当使用 -map 选项时,该输出文件中仅包含用户映射的流,但对于下面所描述的滤镜图输出可能存在一个例外情况。

4.1.3 复杂滤镜(Complex filtergraphs)

如果存在任何带有未标记输出端口的复杂滤镜图输出流,它们将被添加到第一个输出文件中。如果输出格式不支持该流类型,这将导致致命错误。若没有使用 map 选项,包含这些流会使同类型流的自动选择被跳过。若存在 map 选项,除了已映射的流之外,这些滤镜图流也会被包含在内。

带有标记输出端口的复杂滤镜图输出流必须且只能被映射一次。

4.1.4 流处理(Stream handling)

流的处理与流的选择相互独立,但以下所描述的字幕情况除外。流处理是通过针对特定输出文件内的流所使用的 -codec 选项来设置的。具体而言,FFmpeg 会在流选择过程之后应用编解码器选项,因此这些选项不会对后者(即流选择过程)产生影响。如果没有 -code 选项指定到一个流类型,ffmpeg会选择默认的合出文件的注册的编码器。

字幕情况存在例外。如果为某个输出文件指定了字幕编码器,那么找到的任意类型(文本或图像)的第一条字幕流都将被包含在内。ffmpeg不会验证指定编码器是否能转换选择的流和转换后的流在输出格式内是否可接受。同理,当用户手动设置编码器,流选择过程无法检查编码流是否可以复用到输出文件中。

4.2 例子(Examples)

以下示例展示了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选项,所有会为这两个输出自动选择流。

out1.mkv 是Matroska容器格式文件,接收视频,音频和字幕,因此ffmpeg将尝试选择每种类型中的一种。

视频: 选择 B.mp4 的 stream 0,因为它在输入文件中,分辨率最高。 音频: 选择 B.mp4 的 stream 3, 因为它与 最多的通道(channel) 字幕: 选择 B.mp4 的 stream 2, 因为它是几个字幕编码流中的第一个

out2.wav 输出文件是能接收音频流,所有只 B.mp4 的 stream3 选择

对于 out3.mov,因为它设置了 -map 选项,就不是流自动选择了。 -map 1:a 选项 会选择B.mp4 里面所有的音频流。其他流不会包含到输出流。

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

对于第三个输出,音频的编码选项已经设置为拷贝,所有没有 解码-滤镜-编码这个过程。数据应该是是从输入中文件中转换然后复用到输出文件中。

例子: 自动字幕选择

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.avi 和 C.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

上面的命令也会失败,因为hua过滤器输出有一个标签[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 过滤器,然后过滤器的输出使用分割器过滤克隆一次,两个输出都标记。然后一个克隆的映射到第一个输出,一个克隆映射到第三个输出。

叠加滤镜,需要两路视频输入,使用前两个没有被使用的视频流。覆盖滤镜没有标记,因此无论是否存在-map 选项,它都会被送到第一个输出文件out1.mp4。

第一个没有使用的音频流(A.avi) 发送给areasample滤镜。由于这个滤镜输出没有标记,所以它被映射到第一个输出文件。-an选项只会抑制音频流的自动/手动选择,不会影响从滤镜发送出来的。这两路流在流入output1.mp4之前会做排序处理。

映射到out2.mkv的视频流,音频流,字幕流全都是靠自动流选择的。

out3.mkv 由 hue滤镜输出视频的赋值流,B.mp4的第一路音频流组成

5 选项(Options)

所有的数字选项,没有特别规定,都是接受一个数字类型的字符串输入,后面可能跟着一个国际单位的前缀,比如:'K','M','G'。

如果标准国际单位后加了'i',那整个前缀将被解释为二级制倍数的单位前缀,它是基于1024幂的,而不是基于1000幂。 如果标准国际单位后加了'B'那么值要乘以8,表示8为。还可以循序其他的比如'KB','G','B','MiB'。

选项不带参数就是使用布尔类型,将相应值设置为true。通过加no前缀来设置false。比如使用 ‘-nofoo’ 会设置 foo选项为false。

带参数选项支持一个特殊语法,命令指定的参数解析为一个路径,这哦路径执行实际要加载的参数。要使用这个功能,添加一个正斜杠在选项名称之前,比如:

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

会从filter.script 里面加载滤镜描述。

5.1 流指示符(Stream specifiers)

一些选项是应用每一个流的,比如 码率 和 编码。流指示符是用于精确指定选项属于的流。

流指示符是一个附加在选项名称后面的字符串,并且使用冒号分割。比如 -codec:a:1 ac3 包含了 a:1 流标识符,它匹配第二个音频流。因此,它会选择第二个音频流使用ac3 编码。

流标识符可以匹配多个流,那么相应的选项应用所有匹配的。比如 -b:a 128k 匹配了所有的音频流。

没有流标识的将匹配所有的流。比如 -codec copy-code: copy 将会拷贝所有的流而无需编码。

流标识的形式有:

  • stream_index

    使用索引。比如 -threads:1 4 将会设置第二个流的线程数为4。如果用作流的额外指示,那么它选择匹配流的指定索引的流。流的索引编号是基于libavformat检测的流顺序。例外是指定流组或者程序id被,这种情况的序号是基于从这一组或者程序中的顺序。

  • stream_type[:additional_stream_specifier]

    stream_type 可能会以下的值。'V'或 'v' 用于视频的,'a'用于音频,'s'用于字幕,'d' 用于数据,'t'用于附件。 'v' 匹配所有的视频流,'V'仅匹配未附加图片,视频缩略图或封面艺术的视频流。如果 additional_stream_specifier 有用到,那他要匹配两个条件。

  • g:group_specifier[:additional_stream_specifier]

    匹配组group_specifier类型,如果有additional_stream_specifier的使用,那也要匹配。additional_stream_specifier可能有以下情况:

    • group_index

      匹配组索引

    • #group_id 或 i:group_id

      匹配指定的组id

  • p:program_id[:additional_stream_specifier]

匹配项目id为program_id的流,如果有additional_stream_specifier,就再匹配过滤一下

  • #stream_id or i:stream_id

    匹配stream_id(比如MPEG-TS 容器)

  • m:key[:value]

    匹配流的指定元数据标签。没有value值,就是匹配所有包含key这个标签的。key或者valu里面包含":"字符的,需要使用反斜杠转义。

  • disp:dispositions[:additional_stream_specifier]

    指定流的位置。可以指定一个或多个位置。指定多个位置的时候,多个位置之间用'+'连接。

  • u

指定流的可用配置信息,必须指定编码器,并且有基本信息,比如视频的尺寸或者音频的采样率。

注意:元数据匹配仅适用于输入文件。

5.2 通用选项(Generic options)

以下选项在 ff* 工具之间共享

  • L 许可证显示

  • -h, -?, -help, --help [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 选项获取协议列表。

  • -versoin

    显示版本信息

  • -buildconf

显示库编译构件的配置信息

  • -formats

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

  • -demuxers

显示可用解复用器

  • -muxers

显示可用的复用器

  • -devices

显示可用的设备

  • -codec

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

  • -decoders

显示所有可能解码器

  • -encoders

显示所有可用编码器

  • --bsfs

显示所有可用比特流过滤器

  • -protocols

显示所有可用协议

  • -filters

显示所有可用过滤器

  • -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

    这个级别的日志输出会重复显示上一个日志消息,直到出现新的日志消息

    level

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

    flags 也可以单独使用,通过添加'+'/'-'前缀来设置/重置,它不会影响其他标志或更改日志级别。当使flag和loglevel一起使用时候,他们他们之间使用'+'分隔符。

    loglevel 可以包含以下的字符串或数字:

    quiet, -8

    静默状态,不显示日志

    panic,0

    只显示可能导致进程崩溃的致命错误,例如断言失败。目前还没有被使用。

    fatal, 8

    仅仅显示致命错误。这些错误过后之后,程序无法继续。

    error, 16

    显示所有错误,包括可以追回的错误

    warning, 24

    显示所有错误和警告信息

    info, 32

    显示普通展示消息,包含警告信息和错误信息,它也是默认的日志设置

    verbose, 40

    和info相同,只是更加的详细

    debug, 48

    显示调试以上信息

    trace, 56

    实例,启用日志重复输出,添加level前缀,设置verbose级别。

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

    另外一个例子,设置日志重复,没有日志级别前缀

    ffmpeg [...] -loglevel +repeat
    

    默认程序日志记录到stderr(标准错误输出),如果终端支持着色,则会使用颜色标记错误和警。 环境变量AV_Log_FORCE_NOCOLOR可以禁用日志着色。也可以设置环境变量 AV_LOG_FORCE_COLOR。

  • -report

    将完整的命令行和日志转存到一个命名格式为 program-YYYYMMDD-HHMMSS.log 的文件中,文件存放在当前目录。设置FFREPORT环境变量也可以达到这个命令的效果。如果设置的值是用":"分割的 key=value 键值对,这些选项对报告也是生效的。如果选项值包含特殊字符或者":",那么需要做转义操作。(参考ffmpeg-utils 中的转义和引用部分)。

    以下这些选项是可以被接受的:

    file

    设置报告输出的文件名称,%p 扩展为程序的名称,%t扩展为时间搓,%% 扩展为单纯的%

    level

    设置日志的详细节,使用数字类型参数(详细参考 -loglevel)

    例如,要输出的日志文件名称为 ffreport.log 日志级别为32(info 日志级别的别名) ,

    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个数。选项是为了用于测试。除非理解它,否则不要设置它。

  • max_alloc bytes

    设置在使用的ffmpeg的malloc家族方法在堆上分配内存的最大限制。使用此选项要极其小心。如果你不了解这样的全部后果,就不要使用它,默认为 INT_MAX。

5.3 AV选项(AVOptions)

这些选项由libavformat、libavdevice和libavcodec库直接提供。 要详所有可用的选项,使用 -help 选项 。他们分为两类:

generic

这类选项可用于一些容器,编解码器,和设备。通用选项包括 AVFormatContext 选项用于容器/设备的,AVCodecContext 下用于编解码的。

private

这类选项用于特定的容器,设备,和编解码器。相关的私有选项会在它们对应的容器、设备或编解码器下进行说明。

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

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

所有的AV选项都是按流的,所以要具体指定流标识。

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。第二个实例混音到两个信道,并且使用aac编码,然后使用输出绝对索引(-b:2),来指定第二路音频流码率 128k。

注意: -nooption 这种设置布尔值的语法对AVOptions不适用。要使用 -option 0 / -option 1。

注意: 通过选项前加上 v/a/s来指定每个流的AVOptions的旧方式已经过时,后面会删除

5.4 主选项(Main options)

  • -f fmt (input/output)

    强制输入/输出文件的格式。输入文件的格式通常自动检测。输出文件通过文件后缀来推测。所以这个选项通常不需要。

  • -i url (input)

输入文件地址

  • -y (global)

静默方式覆盖输出文件

  • -n (global)

非静默方式覆盖文件,如果指定的输出文件已经存在,则立即退出

  • -stream_loop number (input)

设置输入文件的循环次数。0 标识不循环,-1 标识无限循环。

  • -recast_media (global)

允许强制制定一个解码器,尽管它与解复用器检测或指定的媒体格式不同。它在解码媒体数据到一个数据流的时候,很有用。

  • -c[:stream_specifiercodec (input/output,per-stream)
  • -codec[:stream_specifiercodec (input/output,per-stream)

选择一个解码器(当用于输出文件前)或 编码器(当用于输入文件)。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 编码,第137路音频使用 libvorbis 编码。

  • -t duration (input/output)

当用于输入选项(-i 之前),限制从输入文件读取的时长在 durations 之内。

当用于输出选项(输出地址之前),当写入到输出的时长达到 durations后,停止写入。

durations 必须是一个时间范围标识。

-to 和 -t 是互斥的。 -t的优先级更高。

  • -to position (input/output)

positions 位置停止写输出和读输入。position 必须是一个时间范围的位置参数。

  • -fs limit_size (output)

设置文件大小限制,字节为单位,当超过限制,不会在写入字节块。输出文件会略高于要求的限定。

  • -ss position (input/output)

当作为输入选项(-i 之前), 含义是跳转到输入文件的 position 位置。对于大多数封装格式 position 位置是不能直接跳转到的,这个时候会跳转到 postion 之前最接近的位置。当启用转码和 -accurate_seek时(默认设置),目标位置和需要seek的位置之间的这一段数据会被解码,但是最终会被丢弃不会被保存到输出文件。在进行流复制或使用-noaccurate_seek时,中间的这一段会被保留到输出文件。

当用做输出选项(输出地址 之前),会一直解码,但是这个位置点前的输入文件会丢弃,直到到了位置才会写入输出文件。

position 必须是一个时间段的表示

  • -sseof position (input)

和 -ss 使用类似,但是它的位置是相对于文件尾部位置向前的时间,0就是文件结尾。一般是负值,表示向前,如果是正值,则表示文件开始向后,但是这个时候,一般用 -ss了。

  • -isync input_index (input)

指定一个输入为同步源。

计算目标的起始时间和指定的input的启始时间的差异,并且根据弥补调整一下目标的时间。还要调整的输入和参考的输入要使用同一时钟源,才能达到预期的效果。另外,copyts 选项和 start_at_zero 选项必须一起配套使用。如果有两个输入中,任意一个没有开始时间戳,那么同步失效。

输入的是要是有效的索引。如果指定的同步源索引是自己或者-1。则不会有时间戳的调整。

  • -itsoffset offset (input)

设置输入流的时间戳。

offset 是一个时间单位表示。

一个正数的偏移量表示指定输入流的开始时间往后偏移指定的时间。

  • -itsscale scale (input,per-stream)

缩放输入源的时间戳 scale应该是一个浮点数。

  • -timestamp date (output)

设置容器的时间戳。主要是容器的元数据

date 需要是一个时间表示。

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

设置一个 key/value 对的元数据。

可以通过设置 metadata_specifier 来指定元数据使用的选项使用在流,章节或程序。

选项可以用于覆盖元数据。指定一个空的的key/value可以删除元数据。

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

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)

设置一个流的处置标志。

默认: 所有的处置标准会从输入流复制到输出,除非该选项适用的输出流是由复杂过滤图(complex filtergraph)生成的

value 是多个处置标志的组合,过个标志用'+'或'-'组合。'+'表示添加处置标志 ,'-' 表示删除处置标志。如果第一个标志前有'+'或'-',那么就是在原有设置基础上修改。反之,就是说直接开始设置所有。也可以通过设置0,来清空所有的处置标志。

如果没有给输出文件指定 -disposition,而输入文件有一个或者多个流时候,并且没有被流也没有被表示为default,那么就会用第一路流作为默认。

-dispositions 包含所有的处置标志。

例如:

设置第二路音频流为默认流:

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

删除第一路字幕流的默认表示,并且设置第二路字幕流为默认。

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'处置标志。但是不会移除原有的什么标志。

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

对第一路音频流添加了'coment'处置标志,删除了'original'处置标志。但是不会移除原有的什么标志。

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

对第一路音频流设置了'coment'和'original'处置标志。而且移除了其他所有标志。

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

移除第一路流的所有处置标志。

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...] (output)

    创建一个节目,包含指定标题和节目标识,以及指定的流。

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

    创建一个指定id和类型的流组,或者通过映射一个输入组,将制定的流或者之前定义过的流组添加到里面。

    type 可以是以下类型:

    • iamf_audio_element

      同一种 IAMF(3D空间音频技术) 类型音频元素的流组

      这个组类型,可以有以下选项可用:

      • audio_element_type

        音频元素类型,支持以下:

        • channel

          表示可扩展通道的音频

        • scene

          表示环境声音

      • demixing

        用于重建可扩展通道音频的分层信息。这个选项与其他啊选项要用','分割,并携带以下key/value 结构选项:

        • parameter_id

          帧中的标识符参数块可能指向

        • dmixp_mode

          预定义的分层参数的组合

      • recon_gain

        用于重建可扩展通道音频的侦查增益信息。这个选项与其他啊选项要用','分割,并携带以下key/value 结构选项:

        • parameter_id

          帧中的标识符参数块可能指向

      • layer

        定义音频元素的布局的层。这个选项必须与其他选项用','隔开。必须顶一个到多个。

        它携带以下 ":"-separated key=value 的选项

        • ch_layout

          这个 layer指定的层的通道布局

        • flags

          以下这些 flags 可用:

          • recon_gain

            如果recon_gain作为元数据存在于帧内的参数块中,则是否发送出信号。

          • output_gain

          • ouput_gain_flags

            output_gain 适用于那些通道,以下标志可用:

            FL FR BL BR TFL TFR

          • ambisonics_mode

            环绕立体声模式,audio_element_type 设置为 通道,那么是不会生效的

            支持以下参数:

            mono

            每个立体声通道都是一个独立的个体通道流

      • default_w

        默认权重值

    • iamf_mix_presentation

      将所有属于同一 IAMF 混合呈现(IAMF Mix Presentation)引用的 IAMF 音频元素(Audio Element)分组。

      对于此组合类型,可以有以下选项:

      • submix

        混合呈现(Mix Presentation)中的一个子混合(sub-mix)。此选项必须用“,”与其他选项分隔。可以定义多个用“,”分隔的条目,并且必须至少设置一个。

        它接受以下用“:”分隔的 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 相关的采样率时长字段表示为……

          • parameter_rate

            帧中参数块内与该 parameter_id 相关的采样率时长字段表示为……

          • default_mix_gain

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

          • annotations

            一个描述子混音元素的 key=value 字符串,其中“key”是符合 BCP-47 标准的字符串,用于指定“value”字符串的语言。“key”必须与混音注释中的 key 保持一致。

          • 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。如果布局类型设置为双耳(binaural),则此设置无效integrated_loudness

          • integrated_loudness

            该程序集成了符合 ITU-1770-4 标准定义的响度信息。

          • digital_peak

            根据 ITU-1770-4 标准定义,音频信号的数字(采样)峰值。

          • true_peak

            根据 ITU-1770-4 标准定义,音频信号的真峰值(True Peak)。

          • dialog_anchored_loudness

            根据 ITU-1770-4 标准定义,对话响度信息。

          • album_anchored_loudness

            根据 ITU-1770-4 标准定义,专辑响度信息。

      • annotations

        一个 key=value 格式的字符串,用于描述混音,其中 “key” 是符合 BCP-47 标准的字符串,指定 “value” 字符串的语言。 “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,
    -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 文件中的两个流组(音频元素和混音呈现)从包含四个流的 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  (output)

    指定目标文件类型(vcd、svcd、dvd、dv、dv50)。类型前可以加上 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

      -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 目标相同,不同之处在于对于所有三种标准,其像素格式均设置为 yuv422p

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

  • -dn (input/output)

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

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

  • -dframes number (output)

    设置要输出的数据帧数。这是 -frames:d 的废弃别名,建议使用 -frames:d 代替。

  • -frames[:stream_specifierframecount (output,per-stream)

    在写入 framecount 帧后停止向流写入数据。

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

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

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

  • -*filter[:stream_specifierfiltergraph (output,per-stream)

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

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

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

  • -reinit_filter[:stream_specifierinteger (input,per-stream)

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

  • -filter_threads nb_threads (global)

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

  • -pre[:stream_specifierpreset_name (output,per-stream)

    制定流使用 preset_name 预设的参数组合

  • -stats (global)

    以 "info" 级别日志记录编码进度和统计信息(参见 -loglevel)。该选项默认启用,如需显式禁用,需要指定 -nostats

  • -stats_period time (global)

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

  • -progress url (global)

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

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

更新周期使用 -stats_period 进行设置。

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

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

    在标准输入上启用交互。默认开启,除非标准输入被用作输入源。要明确禁用交互,需要指定 -nostdin

    禁用标准输入上的交互在某些情况下很有用,例如当 FFmpeg 处于后台进程组时。类似的效果可以通过 ffmpeg ... < /dev/null 实现,但这需要使用 shell。

  • -debug_ts (global)

    打印时间戳/延迟信息。默认关闭。此选项主要用于测试和调试,且其输出格式可能会随版本变化,因此不应在可移植的脚本中使用。

  • -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_specifierfilename (input,per-stream)

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

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

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

    提取所有附件,并将它们保存到由 filename 标签确定的文件中:

     ffmpeg -dump_attachment:t "" -i INPUT
    

    技术说明——附件是通过编解码器的额外数据(extradata)实现的,因此此选项实际上可用于从任何流中提取额外数据,而不仅仅是附件。

5.5 视频选项(Video Options)

  • -vframes number (output)

    设置输出的视频帧数。这是 -frames:v 的一个过时别名,建议使用 -frames:v 替代。

  • -r[:stream_specifierfps (input/output,per-stream)

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

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

    作为输出选项:

    • 视频编码:

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

    • 视频流复制(streamcopy) :

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

  • -fpsmax[:stream_specifierfps (output,per-stream)

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

    当输出帧率自动设置且高于此值时,限制输出帧率。在批处理中,或者输入帧率被误检测为极高时,此设置很有用。它不能与 -r 同时设置。在流复制过程中,此设置将被忽略。

  • -s[:stream_specifiersize (input/output,per-stream)

    设置帧尺寸。

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

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

    格式为 “宽 x 高”(默认值 - 与源视频相同)。

  • -aspect[:stream_specifieraspect (output,per-stream)

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

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

    若与 “-vcodec copy” 一同使用,它将影响存储在容器层面的宽高比,但不会影响编码帧中存储的宽高比(前提是编码帧中存在宽高比信息)。

  • -display_rotation[:stream_specifierrotation (input,per-stream)

    设置视频旋转元数据。

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

    此选项会覆盖文件中存储的旋转 / 显示变换元数据(若存在)。当对视频进行转码(而非复制)且启用了 -autorotate 时,视频将在滤镜阶段进行旋转。另外,如果复用器支持,元数据将被写入输出文件。

    如果指定了 '-display_hflip' 和 / 或 '-display_vflip' 选项,它们将在通过此选项指定的旋转操作之后应用。

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

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

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

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

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

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

  • -vn (input/output)

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

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

  • -vcodec codec (output)

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

  • -pass[:stream_specifiern (output,per-stream)

    选择编码遍数(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_specifierprefix (output,per-stream)

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

  • -vf filtergraph (output)

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

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

  • -autorotate

    根据文件元数据自动旋转视频。此功能默认启用,使用 -noautorotate 选项可将其禁用。

  • -autoscale

    根据第一帧的分辨率自动缩放视频。此功能默认启用,使用 -noautoscale 选项可将其禁用。当自动缩放功能被禁用时,滤镜图的所有输出帧可能不会具有相同的分辨率,这对于某些编码器 / 复用器来说可能不合适。因此,除非你确实清楚自己在做什么,否则不建议禁用该功能。自行承担禁用自动缩放功能的风险。

5.6 高级视频选项 (Advanced Video options)

  • -pix_fmt[:stream_specifierformat (input/output,per-stream)

    设置像素格式。使用 -pix_fmts 来显示所有支持的像素格式。如果无法选择所选的像素格式,FFmpeg 会打印一条警告信息,并选择编码器支持的最佳像素格式。如果 pix_fmt 以 + 作为前缀,若无法选择所请求的像素格式,FFmpeg 将报错退出,并且会禁用滤镜图内的自动转换。如果 pix_fmt 仅为一个 +,FFmpeg 会选择与输入(或滤镜图输出)相同的像素格式,同时禁用自动转换。

  • -sws_flags flags (input/output)

    为 libswscale 库设置默认标志。这些标志会被自动插入的缩放滤镜以及简单滤镜图中的缩放滤镜使用,前提是在滤镜图定义中未对其进行覆盖。

  • -rc_override[:stream_specifieroverride (output,per-stream)

    针对特定区间进行码率控制覆盖,其格式为以斜杠分隔的 “整数,整数,整数” 列表。前两个值分别是起始帧号和结束帧号,若最后一个值为正数,则表示要使用的量化器;若为负数,则表示质量因子

  • -vstats

将视频编码统计信息转储到 vstats_HHMMSS.log 文件中。请参阅 vstats file format 部分。

  • -vstats_version file

指定要使用的 vstats 格式的版本。默认版本为 2。请参阅 vstats file format 部分。

  • -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(强制关键帧)可以接受以下形式的参数:

    • time[,time...]

      如果参数包含时间戳,FFmpeg 会根据编码器的时间基,将指定的时间四舍五入到最接近的输出时间戳,并在时间戳等于或大于计算所得时间戳的第一帧强制插入一个关键帧。需要注意的是,如果编码器的时间基精度太低,那么关键帧可能会被强制插入到时间戳小于指定时间的帧上。默认情况下,编码器的时间基是输出帧率的倒数,但也可以通过 -enc_time_base 选项另行设置。

      如果其中一个时间设置为 “chapters [delta]”,它会被扩展为文件中所有章节起始时刻加上偏移量 delta(以秒为单位表示的时间)所对应的时间。此选项在确保输出文件的章节标记处或其他指定位置存在搜索点时非常有用。

      例如,要在 5 分钟处插入一个关键帧,并且在每个章节开始前 0.1 秒插入关键帧,可以使用以下方式指定 force_key_frames 参数。

         -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 秒强制插入一个关键帧,可以使用以下方式(以 FFmpeg 为例):

        -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_specifiersource (input,per-stream)

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

    • none (0)

      不要应用任何裁剪元数据。

    • all (1)

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

    • codec (2)

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

    • container (3)

      应用容器级别的裁剪。

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

    在执行流复制时,同时复制起始位置找到的非关键帧。

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

    使用给定的设备参数,初始化一个名为 name、类型为 type 的新硬件设备。如果未指定名称,该设备将获得一个默认名称,格式为 “type% d” 。

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

    • cuda

      device 指的是 CUDA 设备的编号

      以下选项是可识别的:

      • primary_ctx

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

        Examples:

        • -init_hw_device cuda:1 选择系统中的第二个设备。

        • -init_hw_device cuda:0,primary_ctx=1 选择第一个设备并使用主设备上下文。

    • dxva2

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

    • d3d11va

      device 指 Direct3D 11 显示适配器的编号。若未指定,程序将尝试使用默认的 Direct3D 11 显示适配器,或者使用硬件供应商 ID(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 在硬件供应商 ID 为 0x8086 的第一个 Direct3D 11 显示适配器上创建一个 D3D11VA 设备。
    • vaapi

      device 可以是一个 X11 显示名称、一个 DRM 渲染节点或者一个 DirectX 适配器索引。如果未指定该参数,程序将尝试打开默认的 X11 显示(由环境变量 $DISPLAY 指定),若失败则尝试打开第一个 DRM 渲染节点(/dev/dri/renderD128);在 Windows 系统上则会尝试打开默认的 DirectX 适配器。

      以下选项是可识别的:

      • kernel_driver

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

      • vendor_id

        当未指定设备和内核驱动程序时,使用此选项来指定与所需设备相关联的供应商 ID。此选项仅在启用了硬件加速方法 drm 和 vaapi 且未指定内核驱动程序时可用。

        示例:

        • -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

        Create a QSV device with MFX_IMPL_HARDWARE’ on DirectX adapter 1.

        -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_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,由硬件上下文分配的图像将是线性的,并且可在本地进行映射。

      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

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

  • -init_hw_device list

    列出此版本 FFmpeg 支持的所有硬件设备类型

  • -filter_hw_device name

    将名为 name 的硬件设备传递给任何滤镜图中的所有滤镜。这可用于通过 hwupload 滤镜设置要上传到的设备,或者通过 hwmap 滤镜设置要映射到的设备。当其他滤镜需要硬件设备时,它们也可能会使用此参数。请注意,通常只有当输入尚未处于硬件帧的状态时才需要这样做 —— 当输入已经是硬件帧时,滤镜会从它们接收到的作为输入的帧的上下文信息中推导出所需的设备。

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

  • -hwaccel[:stream_specifierhwaccel (input,per-stream)

    使用硬件加速对匹配的流进行解码。hwaccel 的允许取值如下:

    none

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

    auto

    自动选择硬件加速方法。
    

    vdpau

    使用 VDPAU(面向 Unix 系统的视频解码与呈现应用程序编程接口)硬件加速。
    

    dxva2

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

    d3d11va

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

    vaapi

    使用 VAAPI(视频加速应用程序编程接口)硬件加速。
    

    qsv

     使用英特尔快速同步视频(Intel QuickSync Video)加速进行视频转码。
    
     与大多数其他取值不同的是,此选项并非启用加速解码(只要选择了 QSV 解码器,加速解码就会自动启用),而是启用加速转码,且无需将帧复制到系统内存中。
    
     要使其正常工作,解码器和编码器都必须支持 QSV 加速,并且不能使用任何滤镜。
    

    如果所选的硬件加速方式不可用,或者所选解码器不支持该硬件加速方式,那么此选项将不起作用。

    请注意,大多数加速方法是为播放而设计的,并且在现代中央处理器(CPU)上,其速度不会比软件解码更快。此外,FFmpeg(一个开源的音视频处理工具)通常需要将已解码的帧从图形处理器(GPU)内存复制到系统内存中,这会进一步导致性能损失。因此,这个选项主要用于测试。

  • -hwaccel_device[:stream_specifierhwaccel_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 音频选项 (Audio-Options)

  • -aframes number (output)

    设置要输出的音频帧数。这是 -frames:a 选项的已过时别名,你应该使用 -frames:a 选项来替代它。

  • -ar[:stream_specifierfreq (input/output,per-stream)

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

  • -aq q (output)

    设置音频质量(特定编解码器下的可变比特率 VBR)。这是 -q:a 选项的别名

  • -ac[:stream_specifierchannels (input/output,per-stream)

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

  • -an (input/output)

    作为输入选项,该选项会阻止文件中的所有音频流被过滤,也阻止其被自动选择或映射到任何输出。若要逐个禁用流,请参考 -discard 选项。

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

  • -acodec codec (input/output)

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

  • -sample_fmt[:stream_specifiersample_fmt (output,per-stream)

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

  • -af filtergraph (output)

    创建由 filtergraph(滤镜图)指定的滤镜图,并使用它来对音频流进行过滤处理。

    这是 -filter:a 的别名,具体可参考 -filter 选项。

5.8 高级音频选项 (Advanced Audio options)

  • -atag *fourcc/tag (*output)

    强制指定音频标签 / 四字符代码(FourCC)。这是 -tag:a 选项的别名。

  • -channel_layout[:stream_specifierlayout (input/output,per-stream)

    设置音频声道布局。对于输出流,其默认设置为输入声道布局。对于输入流,该选项会覆盖输入的声道布局,但并非所有解码器都会遵循被覆盖后的声道布局。此选项还能为音频采集设备和原始解复用器设置声道布局,并会映射到相应解复用器的选项。

  • -guess_layout_max channels (input,per-stream)

    如果某些输入声道布局未知,仅当该布局对应的声道数量至多为指定数量时,才尝试进行猜测。例如,设置为 2 表示让 FFmpeg 将 1 个声道识别为单声道,将 2 个声道识别为立体声,但不会将 6 个声道识别为 5.1 声道。默认情况下,FFmpeg 会始终尝试进行猜测。使用 0 可以禁用所有猜测。使用 -channel_layout 选项显式指定输入布局也会禁用猜测。

5.9 字幕选项 (Subtitle options)

  • -scodec codec (input/output)

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

  • -sn (input/output)

    作为输入选项,该选项会阻止文件中的所有字幕流被过滤,也禁止其被自动选择或映射到任何输出。若要逐个禁用流,请参考 -discard 选项。

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

5.10 高级字幕选项 (Advanced Subtitle options)

  • -fix_sub_duration

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

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

  • -canvas_size size

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

5.11 高级选项 (Advanced options)

。。。。。。

5 示例(Example)

6.1 视频和音频采集(Video and Audio grabbing)

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

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

或者使用一个高级 Linux 声音架构(ALSA)音频源(单声道输入,声卡 ID 为 1)来替代开放声音系统(OSS)

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

请注意,在使用诸如格尔德・克诺尔开发的 xawtv 等任何电视观看软件启动 ffmpeg 之前,你必须激活正确的视频源和频道。你还必须使用标准混音器正确设置音频录制电平。

6.2 X11 屏幕抓取(X11 grabbing)

通过以下方式使用 FFmpeg 抓取 X11 桌面画面

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

“0.0” 是你 X11 服务器的显示编号和屏幕编号,它与 DISPLAY 环境变量的值相同

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

“0.0” 是你 X11 服务器的显示编号和屏幕编号,与 DISPLAY 环境变量的值相同。“10” 是抓取区域的 X 轴偏移量,“20” 是抓取区域的 Y 轴偏移量。

6.3 视频和音频文件格式转换 (Video and Audio file format conversion)

任何受支持的文件格式和协议都可以作为 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 平面数据组成,其后紧接着垂直和水平分辨率均为 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
    

    将 a.wav 文件转换为采样率为 22050 赫兹的 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 kbps 的 a.mp2 文件,同时转换为比特率为 128 kbps 的 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 编码,因此你需要在运行 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 等的文件。图像将被重新缩放以适配新的宽 × 高数值。

    如果你只想提取有限数量的帧,你可以将上述命令与 -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 的通配符模式(即文件通配)。

    例如,要从符合通配符模式 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
    
  • lminlmaxmblmin 和 mblmax 这四个选项使用 “λ(lambda)” 单位,但你可以使用 QP2LAMBDA 常量轻松地从 “Q(量化参数)” 单位进行转换。

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