教程菜单 本页目录

ffmpeg:ffmpeg 工具

1 概要

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

2 描述

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

ffmpeg 从 -i 选项指定的任意数量的输入“文件”(可以是常规文件、管道、网络流、抓取设备等)读取数据,并写入任意数量的输出“文件”,这些输出“文件”由纯输出 URL 指定。命令行上任何不能解释为选项的内容都被视为输出 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 中每个输出的转码过程可以用下图描述:

 _______              ______________
|       |            |              |
| input |  demuxer   | encoded data |   decoder
| file  | ---------> | packets      | -----+ 
|_______|            |______________|      |
                                           v
                                       _________
                                      |         |
                                      | decoded |
                                      | frames  |
                                      |_________|
 ________             ______________       |
|        |           |              |      |
| output | <-------- | encoded data | <----+ 
| file   |   muxer   | packets      |   encoder
|________|           |______________|

ffmpeg 调用 libavformat 库(包含解复用器)读取输入文件并从中获取包含编码数据的数据包。当有多个输入文件时,ffmpeg 会尝试通过跟踪任何活动输入流上的最低时间戳来保持它们同步。

然后将编码数据包传递给解码器(除非为流选择了 streamcopy,请参阅进一步的描述)。解码器生成未压缩的帧(原始视频/PCM 音频/...),可以通过过滤进一步处理(参见下一节)。过滤后,将帧传递给编码器,编码器对其进行编码并输出编码数据包。最后,将它们传递给复用器,复用器将编码数据包写入输出文件。

3.1 过滤

在编码之前,ffmpeg 可以使用 libavfilter 库中的过滤器处理原始音频和视频帧。几个链接的过滤器形成一个过滤器图。ffmpeg 区分两种类型的过滤器图:简单和复杂。

3.1.1 简单过滤器图

简单过滤器图是指只有一个输入和输出且类型相同的过滤器图。在上图中,它们可以通过在解码和编码之间简单地插入一个额外步骤来表示:

 _________                        ______________
|         |                      |              |
| decoded |                      | encoded data |
| frames  |\                   _ | packets      |
|_________| \                  /||______________|
             \   __________   /
  simple     _\||          | /  encoder
  filtergraph   | filtered |/
                | frames   |
                |__________|

简单过滤器图使用每个流的 -filter 选项配置(视频和音频分别使用 -vf 和 -af 别名)。视频的简单过滤器图可以如下所示:

 _______        _____________        _______        ________
|       |      |             |      |       |      |        |
| input | ---> | deinterlace | ---> | scale | ---> | output |
|_______|      |_____________|      |_______|      |________|

请注意,某些过滤器会更改帧属性但不更改帧内容。例如,上例中的 fps 过滤器会更改帧数,但不会影响帧内容。另一个示例是 setpts 过滤器,它仅设置时间戳,否则将不加改变地传递帧。

3.1.2 复杂过滤器图

复杂过滤器图不能简单地描述为应用于一个流的线性处理链。例如,当图具有多个输入和/或输出时,或者当输出流类型不同于输入时,就是这种情况。它们可以用下图表示:

 _________
|         |
| input 0 |\                    __________
|_________| \                  |          |
             \   _________    /| output 0 |
              \ |         |  / |__________|
 _________     \| complex | /
|         |     |         |/
| input 1 |---->| filter  |\
|_________|     |         | \   __________
               /| graph   |  \ |          |
              / |         |   \| output 1 |
 _________   /  |_________|    |__________|
|         | /
| input 2 |/
|_________|

复杂过滤器图使用 -filter_complex 选项配置。请注意,此选项是全局的,因为复杂过滤器图本质上不能明确地与单个流或文件相关联。

-lavfi 选项相当于 -filter_complex。

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

3.2 流复制

流复制是通过向 -codec 选项提供 copy 参数来选择的模式。它使 ffmpeg 省略指定流的解码和编码步骤,因此它只执行解复用和复用。它对于更改容器格式或修改容器级元数据很有用。在这种情况下,上图将简化为:

 _______              ______________            ________
|       |            |              |          |        |
| input |  demuxer   | encoded data |  muxer   | output |
| file  | ---------> | packets      | -------> | file   |
|_______|            |______________|          |________|

由于没有解码或编码,因此速度非常快并且没有质量损失。但是,由于许多因素,在某些情况下它可能不起作用。应用过滤器显然也是不可能的,因为过滤器对未压缩的数据起作用。

3.3 环回解码器

虽然解码器通常与解复用器流相关联,但也可以创建“环回”解码器,解码某些编码器的输出并将其反馈到复杂的过滤器图。这是通过 -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。

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 复杂过滤器图

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

带有标记 pad 的复杂滤镜图输出流必须映射一次,且只映射一次。

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 中选择流 0,因为它在所有输入视频流中具有最高的分辨率。

对于音频,它将从 B.mp4 中选择流 3,因为它具有最多的通道数。

对于字幕,它将从 B.mp4 中选择流 2,这是 A.avi 和 B.mp4 中的第一个字幕流。

out2.wav 仅接受音频流,因此仅选择来自 B.mp4 的流 3。

对于 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 的音频流选择。

示例:未标记的 filtergraph 输出

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

这里使用 -filter_complex 选项设置了一个过滤器图,它由一个视频过滤器组成。覆盖过滤器需要两个视频输入,但未指定任何输入,因此使用前两个可用的视频流,即 A.avi 和 C.mkv。过滤器的输出板没有标签,因此被发送到第一个输出文件 out1.mp4。因此,跳过了视频流的自动选择,这将选择 B.mp4 中的流。自动选择具有最多通道的音频流,即 B.mp4 中的流 3。但是,没有选择字幕流,因为 MP4 格式没有注册默认字幕编码器,并且用户没有指定字幕编码器。

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

示例:带标签的 filtergraph 输出

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

上述命令将失败,因为标有 [outv] 的输出 pad 已被映射两次。不应处理任何输出文件。

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 的视频流被发送到色调过滤器,其输出使用拆分过滤器克隆一次,并且两个输出都带标签。然后将每个副本映射到第一个和第三个输出文件。

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

aresample 过滤器会发送第一个未使用的音频流,即 A.avi。由于此过滤器输出也未标记,因此它也被映射到第一个输出文件。-an 的存在只会抑制音频流的自动或手动流选择,而不会抑制从 filtergraphs 发送的输出。这两个映射流都应在 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]

匹配具有指定值的元数据标签键的流。如果未指定值,则匹配包含给定标签且具有任意值的流。

u

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

请注意,在 ffmpeg 中,通过元数据匹配仅适用于输入文件。

5.2 通用选项

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

-L

显示许可证。

-h、-?、-help、--help [arg]

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

arg 的可能值为:

long

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

full

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

decoder=decoder_name

打印有关名为coder_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 的协议的详细信息。使用 -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

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

可选的标志前缀可以由以下值组成:

‘repeat’

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

‘level’

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

标志也可以单独使用,方法是添加 '+'/'-' 前缀来设置/重置单个标志,而不会影响其他标志或更改日志级别。当同时设置标志和日志级别时,最后一个标志值和日志级别之前应有一个 '+' 分隔符。

日志级别是一个字符串或数字,包含以下值之一:

'quiet, -8'

什么都不显示;保持沉默。

'panic, 0'

仅显示可能导致进程崩溃的致命错误,例如断言失败。目前不用于任何用途。

‘fatal, 8’

仅显示致命错误。这些错误会导致进程绝对无法继续。

‘error, 16’

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

‘warning, 24’

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

‘info, 32’

在处理过程中显示信息性消息。这是对警告和错误的补充。这是默认值。

‘verbose, 40’

与 info 相同,但更详细。

‘debug, 48’

显示所有内容,包括调试信息。

‘trace, 56’

例如,要启用重复日志输出,请添加级别前缀,并将 loglevel 设置为 verbose: ffmpeg -loglevel repeat+level+verbose -i input output

另一个启用重复日志输出而不影响级别前缀标志或 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(日志级别信息的别名)将报告输出到名为 ffreport.log 的文件: FFREPORT=file=ffreport.log:level=32 ffmpeg -i input output

解析环境变量时的错误并不严重,不会出现在报告中。

-hide_banner

禁止打印横幅。

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

-cpuflags flags (global)

允许设置和清除 CPU 标志。此选项用于测试。除非您知道自己在做什么,否则请不要使用它。 ffmpeg -cpuflags -sse+mmx ...ffmpeg -cpuflags mmx ...ffmpeg -cpuflags 0 ...

此选项的可能标志为:

‘x86’
‘mmx’
‘mmxext’
‘sse’
‘sse2’
‘sse2slow’
‘sse3’
‘sse3slow’
‘ssse3’
‘atom’
‘sse4.1’
‘sse4.2’
‘avx’
‘avx2’
‘xop’
‘fma3’
‘fma4’
‘3dnow’
‘3dnowext’
‘bmi1’
‘bmi2’
‘cmov’
‘ARM’
‘armv5te’
‘armv6’
‘armv6t2’
‘vfp’
‘vfpv3’
‘neon’
‘setend’
‘AArch64’
‘armv8’
‘vfp’
‘neon’
‘PowerPC’
‘altivec’
‘特定处理器
‘pentium2’
‘pentium3’
‘pentium4’
‘k6’
‘k62’
‘athlon’
‘athlonxp’
‘k8’
-cpucount count (global)

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

-max_alloc 字节

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

5.3 AVOptions

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

通用

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

private

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

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

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

所有编解码器 AVOption 都是针对每个流的,因此应将流说明符附加到它们:

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 (input/output)

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

-i url (input)

输入文件网址

-y (global)

不询问的情况下覆盖输出文件。

-n (global)

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

-stream_loop number (input)

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

-recast_media (global)

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

-c[:stream_specifier] codec (input/output,per-stream)
-codec[:stream_specifier] codec (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 编码)和第 138 个音频(将使用 libvorbis 编码)之外的所有流。

-t duration (input/output)

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

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

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

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

-to position (input/output)

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

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

-fs limit_size (output)

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

-ss position (input/output)

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

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

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

-sseof position (input)

与 -ss 选项类似,但相对于“文件末尾”。即负值在文件中较早,0 位于 EOF。

-isync input_index (input)

将输入指定为同步源。

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

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

默认值为 -1。

-itsoffset offset (input)

设置输入时间偏移。

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

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

-itsscale scale (input,per-stream)

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

-timestamp date (output)

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

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

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

设置元数据键/值对。

可以给出可选的 metadata_specifier 来设置流、章节或程序的元数据。有关详细信息,请参阅 -map_metadata 文档。

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

例如,设置输出文件中的标题: ffmpeg -i in.avi -metadata title="my title" out.flv

要设置第一个音频流的语言: ffmpeg -i INPUT -metadata:s:a:0 language=eng OUTPUT

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

设置流的配置。

默认情况下,配置从输入流复制,除非此选项适用的输出流由复杂的过滤器图提供 - 在这种情况下,默认情况下未设置配置。

值是由“+”或“-”分隔的一系列项目。第一项也可以以“+”或“-”为前缀,在这种情况下此选项会修改默认值。否则(第一项没有前缀)此选项将覆盖默认值。“+”前缀添加给定的配置,“-”将其删除。也可以通过将其设置为 0 来清除配置。

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

-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

并非所有复用器都支持嵌入式缩略图,而那些支持的复用器仅支持少数格式,如 JPEG 或 PNG。

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

创建具有指定标题 program_num 的程序并向其添加指定的流。

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

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

类型可以是以下之一:

iamf_audio_element

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

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

audio_element_type

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

channel

可扩展通道音频表示

scene

Ambisonics 表示

demixing

用于重建可扩展通道音频表示的 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 混音演示引用

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

submix

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

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

parameter_id

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

parameter_rate

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

default_mix_gain

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

元素

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

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

stg

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

parameter_id

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

parameter_rate

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

default_mix_gain

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

注释

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

headphones_rendering_mode

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

支持以下值:

stereo
binaural
layout

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

它采用以下“:”分隔的键=值选项:

layout_type
扬声器

布局遵循 ITU-2051-3 的扬声器音响系统惯例。

双耳

布局为双耳。

sound_system

声道布局与 ITU-2051-3 的 A 至 J 声音系统之一以及 7.1.2 和 3.1.2 相匹配。如果 layout_type 设置为双耳,则此设置无效。

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。

注释

描述混音的 key=value 字符串,其中“key”是符合 BCP-47 的字符串,用于指定“value”字符串的语言。“key”必须与所有子混音元素注释中的 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 文件复制到 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

每个目标的参数设置如下。

VCDpal:-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 224kntsc:-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 224kfilm:-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

SVCDpal:-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 224kntsc:-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 224kfilm:-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

DVDpal:-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 448kntsc:-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 448kfilm:-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

DVpal:-f dv-s 720x576 -pix_fmt yuv420p -r 25-ar 48000 -ac 2ntsc:-f dv-s 720x480 -pix_fmt yuv411p -r 30000/1001-ar 48000 -ac 2film:-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[:stream_specifier] framecount (output,per-stream)

在 framecount 帧后停止写入流。

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

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

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

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

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

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

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

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

-filter_threads nb_threads (global)

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

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

指定匹配流的预设。

-stats (global)

打印编码进度/统计信息。默认情况下启用,要明确禁用它,您需要指定 -nostats。

-stats_period time (global)

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

-progress url (global)

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

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

更新周期使用 -stats_period 设置。

-stdin

启用标准输入上的交互。除非使用标准输入作为输入,否则默认情况下启用。要明确禁用交互,您需要指定 -nostdin。

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

-debug_ts (global)

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

另请参阅选项 -fdebug ts。

-attach filename (output)

将附件添加到输出文件。Matroska 等一些格式支持此功能,例如用于渲染字幕的字体。附件被实现为特定类型的流,因此此选项将向文件添加新流。然后可以以通常的方式对此流使用每个流选项。使用此选项创建的附件流将在所有其他流(即使用 -map 或自动映射创建的流)之后创建。

请注意,对于 Matroska,您还必须设置 mimetype 元数据标记: ffmpeg -i INPUT -attach DejaVuSans.ttf -metadata:s:2 mimetype=application/x-truetype-font out.mkv

(假设附件流将在输出文件中排在第三位)。

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

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

例如,将第一个附件提取到名为“out.ttf”的文件中: ffmpeg -dump_attachment:t:0 out.ttf -i INPUT

要将所有附件提取到由文件名标签确定的文件中: ffmpeg -dump_attachment:t "" -i INPUT

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

5.5 视频选项

-vframes number (output)

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

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

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

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

作为输出选项:

视频编码

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

视频流复制

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

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

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

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

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

设置帧大小。

作为输入选项,这是 video_size 私有选项的快捷方式,某些解复用器可以识别该选项,这些解复用器的帧大小不存储在文件中或可配置 - 例如原始视频或视频抓取器。

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

格式为“wxh”(默认 - 与源相同)。

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

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

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

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

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

设置视频旋转元数据。

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

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

如果给出了 -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_specifier] n (output,per-stream)

选择通道号(1 或 2)。它用于进行两通道视频编码。视频的统计数据在第一通道中记录到日志文件中(另请参阅选项 -passlogfile),在第二通道中,该日志文件用于以精确请求的比特率生成视频。在通道 1 中,您可以停用音频并将输出设置为 null,Windows 和 Unix 的示例: ffmpeg -i foo.mov -c:v libxvid -pass 1 -an -f rawvideo -y NULffmpeg -i foo.mov -c:v libxvid -pass 1 -an -f rawvideo -y /dev/null

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

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

-vf filtergraph (output)

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

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

-autorotate

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

-autoscale

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

5.6 高级视频选项

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

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

-sws_flags flags (input/output)

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

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

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

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

-vstats

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

-vstats_file 文件

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

-vstats_version 文件

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

-vtag fourcc/tag (output)

强制视频标签/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 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)

强制在最后一个强制关键帧的时间 5 秒后(从第 13 秒开始)设置关键帧: -force_key_frames expr:if(isnan(prev_forced_t),gte(t,13),gte(t,prev_forced_t+5))

source

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

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

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

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

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

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

设备的含义和以下参数取决于设备类型:

cuda

设备是 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

未指定设备时,使用此选项指定与所需设备关联的内核驱动程序的名称。仅当启用硬件加速方法 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 设备。

vdpau

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

qsv

device 选择‘MFX_IMPL_*’中的值。允许的值为:

auto
sw
hw
auto_any
hw_any
hw2
hw3
hw4

如果未指定,则使用‘auto_any’。 (请注意,通过创建适合平台的子设备(“dxva2”或“d3d11va”或“vaapi”),然后从中派生出 QSV 设备,可能更容易实现 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”的 QSV 设备,子设备类型为“d3d11va”。

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

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

opencl

设备选择平台和设备作为 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

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

可识别以下选项:

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

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

-init_hw_device list

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

-filter_hw_device name

将名为 name 的硬件设备传递给任何过滤器图中的所有过滤器。这可用于设置 hwupload 过滤器要上传到的设备,或 hwmap 过滤器要映射到的设备。其他过滤器在需要硬件设备时也可以使用此参数。请注意,这通常仅在输入尚未在硬件帧中时才需要 - 如果在硬件帧中,过滤器将从它们作为输入接收的帧的上下文中派生出它们所需的设备。

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

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

使用硬件加速解码匹配的流。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 (input,per-stream)

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

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

-hwaccels

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

-fix_sub_duration_heartbeat[:stream_specifier]

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

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

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

5.7 音频选项

-aframes number (output)

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

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

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

-aq q (output)

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

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

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

-an (input/output)

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

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

-acodec codec (input/output)

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

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

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

-af filtergraph (output)

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

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

5.8 高级音频选项

-atag fourcc/tag (output)

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

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

-channel_layout 的别名。

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

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

-guess_layout_max channels (input,per-stream)

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

5.9 字幕选项

-scodec codec (input/output)

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

-sn (input/output)

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

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

5.10 高级字幕选项

-fix_sub_duration

固定字幕持续时间。对于每个字幕,等待同一流中的下一个数据包并调整第一个数据包的持续时间以避免重叠。这对于某些字幕编解码器(尤其是 DVB 字幕)是必要的,因为原始数据包中的持续时间只是粗略估计,结尾实际上由空字幕帧标记。在必要时未能使用此选项可能会导致由于非单调时间戳而导致的夸大持续时间或多路复用失败。

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

-canvas_size size

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

5.11 高级选项

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

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

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

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

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

另一种 [linklabel] 形式将把复杂过滤器图(参见 -filter_complex 选项)的输出映射到输出文件。linklabel 必须对应于图中定义的输出链接标签。

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

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

示例:

映射所有内容

将第一个输入文件中的所有流映射到输出 ffmpeg -i INPUT -map 0 output

选择特定流

如果第一个输入文件中有两个音频流,则这些流由 0:0 和 0: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] (output,per-metadata)

设置来自 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 (output)

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

-benchmark (global)

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

-benchmark_all (global)

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

-timelimit duration (global)

ffmpeg 在 CPU 用户时间中运行数秒后退出。

-dump (global)

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

-hex (global)

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

-readrate speed (input)

限制输入读取速度。

其值是一个浮点正数,表示应在挂钟时间的一秒内摄取的媒体的最大持续时间(以秒为单位)。默认值为零,表示对提取速度没有限制。值 1 表示实时速度,相当于 -re。

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

当输出数据包的流速很重要时(例如实时流),它很有用。

-re (input)

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

-readrate_initial_burst 秒

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

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

设置视频同步方法/帧速率模式。vsync 适用于所有输出视频流,但可以通过设置 fps_mode 覆盖某个流。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 parameters (output,per-stream)

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

-copyts

不处理输入时间戳,但保留其值而不尝试对其进行清理。特别是,不要删除初始开始时间偏移值。

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

-start_at_zero

与 copyts 一起使用时,将输入时间戳移至零开始。

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

-copytb 模式

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

1

使用解复用器时基。

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

0

使用解码器时基。

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

-1

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

默认值为 -1。

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

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

0

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

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

解复用器

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

过滤器

使用来自过滤器图的时间基。

正数

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

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

默认值为 0。

-bitexact (input/output)

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

-shortest (output)

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

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

-shortest_buf_duration duration (output)

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

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

默认值为 10 秒。

-dts_delta_threshold 阈值

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

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

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

默认值为 10。

-dts_error_threshold 阈值

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

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

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

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

-muxdelay seconds (output)

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

-muxpreload seconds (output)

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

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

为输出流分配一个新的 stream-id 值。应在应用该选项的输出文件名之前指定此选项。对于存在多个输出文件的情况,可以将 streamid 重新分配给不同的值。

例如,要将输出 mpegts 文件的流 0 PID 设置为 33,将流 1 PID 设置为 36: ffmpeg -i inurl -streamid 0:33 -streamid 1:36 out.ts

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

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

bitstream_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 流转换为附件 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 (input/output,per-stream)

强制使用标签/fourcc 匹配流。

-timecode hh:mm:ssSEPff

指定写入的时间码。SEP 为非丢弃时间码的“:”和丢弃的“;”(或“。”)。 ffmpeg -i input.mpg -timecode 01:02:03.04 -r 30000/1001 -s ntsc output.mpg

-filter_complex filtergraph (global)

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

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

  • 要连接输入流,请使用 [file_index:stream_specifier](即与 -map 相同的语法)。如果 stream_specifier 匹配多个流,则将使用第一个流。
  • 要连接环回解码器,请使用 [dec:dec_idx],其中 dec_idx 是要连接到给定输入的环回解码器的索引。
  • 要连接另一个复杂过滤器图的输出,请使用其链接标签。例如以下示例: 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 行)使用编码一个缩放输出并将结果写入 libx264output.mkv;
    • (第 4 行)使用环回解码器解码此编码流;
    • (第 5 行)将环回解码器的输出(即 -编码的视频)与缩放的原始输入并排放置;libx264
    • (第 6 行)然后对组合视频进行无损编码并写入。比较.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 颜色源生成 5 秒的纯红色视频: ffmpeg -filter_complex 'color=c=red' -t 5 out.mkv

-filter_complex_threads nb_threads (global)

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

-lavfi filtergraph (global)

定义一个复杂的 filtergraph,即具有任意数量的输入和/或输出的 filtergraph。相当于 -filter_complex。

-accurate_seek (input)

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

-seek_timestamp (input)

此选项使用 -ss 选项启用或禁用输入文件中按时间戳查找。默认情况下禁用。如果启用,-ss 选项的参数将被视为实际时间戳,并且不会因文件的开始时间而偏移。这仅适用于不从时间戳 0 开始的文件,例如传输流。

-thread_queue_size size (input/output)

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

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

-sdp_file file (global)

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

-discard (input)

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

none

不丢弃任何帧。

default

默认,不丢弃任何帧。

noref

丢弃所有非参考帧。

bidir

丢弃所有双向帧。

nokey

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

全部

丢弃所有帧。

-abort_on flags (global)

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

empty_output

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

empty_output_stream

在某些输出流中没有数据包传递给复用器。

-max_error_rate (global)

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

-xerror (global)

出错时停止并退出

-max_muxing_queue_size packets (output,per-stream)

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

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

-muxing_queue_data_threshold bytes (output,per-stream)

这是不考虑多路复用队列大小的最小阈值。默认为每流 50 兆字节,并且基于传递给多路复用器的数据包的总体大小。

-auto_conversion_filters (global)

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

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

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

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

将匹配流的每帧编码信息写入路径指定的文件中。

-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[:stream_specifier] format_spec (output,per-stream)
-stats_enc_post_fmt[:stream_specifier] format_spec (output,per-stream)
-stats_mux_pre_fmt[:stream_specifier] format_spec (output,per-stream)

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

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

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

fidx

输出文件的索引。

sidx

文件中输出流的索引。

n

帧数。编码前:迄今为止发送到编码器的帧数。编码后:迄今为止从编码器接收到的数据包数。多路复用:迄今为止提交给此流的多路复用器的数据包数。

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 (packet)

数据包的解码时间戳,整数形式。应乘以时间基数以计算显示时间。

dt (packet)

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

sn (frame,audio)

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

samp (frame,audio)

帧中的音频样本数。

size (packet)

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

br (packet)

当前比特率(以比特/秒为单位)。

abr (packet)

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

key (packet)

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

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

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

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

默认格式字符串为:

预编码

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

后编码

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

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

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

5.12 预设文件

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

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

5.12.1 ffpreset 文件

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

传递给 vpre、apre 和 spre 预设选项的参数根据以下规则标识要使用的预设文件:

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

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

5.12.2 avpreset 文件

avpreset 文件使用 pre 选项指定。它们的工作原理与 ffpreset 文件类似,但它们仅允许使用特定于编码器的选项。因此,不能使用指定编码器的 option=value 对。

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

首先,ffmpeg 在上述目录中搜索名为 codec_name-arg.avpreset 的文件,其中 codec_name 是将应用预设文件选项的编解码器的名称。例如,如果您使用 -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

out 文件索引

PSNR

峰值信噪比比率

q

帧的质量

f_size

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

s_size

以 KiB 表示的流大小

st

输出文件流索引

时间

数据包的时间

类型

图片类型

另请参阅 -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.avitest.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将 a.wav 转换为采样率为 22050 Hz 的 MPEG 音频。
  • 您可以同时编码为几种格式,并定义从输入流到输出流的映射: ffmpeg -i /tmp/a.wav -map 0:a -b:a 64k /tmp/a.mp2 -map 0:a -b:a 128k /tmp/b.mp2将 a.wav 转换为 64 kbits 的 a.mp2 和 128 kbits 的 b.mp2。’-map file:index’ 指定每个输出流使用哪个输入流,按照输出流定义的顺序。
  • 您可以对解密的 VOB 进行转码: ffmpeg -i snatch_1.vob -f avi -c:v mpeg4 -b:v 800k -g 300 -bf 2 -c:a libmp3lame -b:a 128k snatch.avi这是一个典型的 DVD 翻录示例;输入是 VOB 文件,输出是带有 MPEG-4 视频和 MP3 音频的 AVI 文件。请注意,在此命令中我们使用 B 帧,因此 MPEG-4 流与 DivX5 兼容,并且 GOP 大小为 300,这意味着对于 29.97fps 的输入视频,每 10 秒会出现一个帧内帧。此外,音频流是 MP3 编码的,因此您需要通过将 --enable-libmp3lame 传递给 configure 来启用 LAME 支持。该映射对于 DVD 转码以获得所需的音频语言特别有用。 注意:要查看支持的输入格式,请使用 ffmpeg -demuxers。
  • 您可以从视频中提取图像,或从多幅图像创建视频: 从视频中提取图像:ffmpeg -i foo.avi -r 1 -s WxH -f image2 foo-%03d.jpeg这将从视频中提取每秒一个视频帧,并将其输出到名为 foo-001.jpeg、foo-002.jpeg 等的文件中。图像将重新缩放以适应新的 WxH 值。如果您只想提取有限数量的帧,您可以将上述命令与 -frames:v 或 -t 选项结合使用,或与 -ss 结合使用以从某个时间点开始提取。从多幅图像创建视频:ffmpeg -f image2 -framerate 12 -i foo-%03d.jpeg -s WxH foo.avi语法 foo-%03d.jpeg 指定使用由三位数字填充零组成的十进制数来表示序列号。它与 C printf 函数支持的语法相同,但只有接受普通整数的格式才适用。导入图像序列时,-i 还支持在内部扩展类似 shell 的通配符模式(通配符),方法是选择特定于 image2 的 -pattern_type glob 选项。例如,从与 glob 模式 foo-*.jpeg 匹配的文件名创建视频:ffmpeg -f image2 -pattern_type glob -framerate 12 -i 'foo-*.jpeg' -s WxH foo.avi
  • 您可以在输出中放入许多相同类型的流: ffmpeg -i test1.avi -i test2.avi -map 1:1 -map 1:0 -map 0:1 -map 0:0 -c copy -y test12.nut生成的输出文件 test12.nut 将包含输入文件中的前四个流(以相反的顺序排列)。
  • 要强制 CBR 视频输出: ffmpeg -i myfile.avi -b 4000k -minrate 4000k -maxrate 4000k -bufsize 1835k out.m2v
  • 四个选项 lmin、lmax、mblmin 和 mblmax 使用“lambda”单位,但您可以使用 QP2LAMBDA 常数轻松地从“q”单位转换: ffmpeg -i src.ext -lmax 21*QP2LAMBDA dst.ext
本页目录