FFmpeg 命令行工具

Flying
2019-08-26 / 0 评论 / 133 阅读 / 正在检测是否收录...

1 概要

command.svg

ffmpeg命令的通用语法如下:

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

2 描述

ffmpeg 是一个非常快速的视频和音频转换器,也可以从实时音频/视频源。它也可以在任意样本之间转换使用高质量的多相滤镜即时调整视频速率和大小。

ffmpeg 从任意数量的输入“文件”中读取(可以是常规的文件、管道、网络流、抓取设备等),由选项指定,并写入任意数量的输出“文件”,它们是由纯输出 URL 指定。在命令行上找到的任何内容不能解释为选项被视为输出 URL。

原则上,每个输入或输出 URL 可以包含任意数量的流不同类型的(视频/音频/字幕/附件/数据)。允许的数量和/或流的类型可能受容器格式的限制。选择哪个输入将从中进入的流,输出是自动完成的或使用选项 -map(请参阅流选择一章)。

若要引用选项中的输入文件,必须使用其索引(从 0 开始)。例如第一个输入文件是 0,第二个是1,等等。同样,流在文件中由其索引引用。例如,2:3 指第三个输入文件中的第四个流。另请参阅流说明符一章。

作为一般规则,选项将应用于下一个指定的文件。因此,顺序很重要,您可以拥有相同的多次在命令行上选项。每次出现都是然后应用于下一个输入或输出文件。此规则的例外情况是全局选项(例如详细级别), 应首先指定。

不要混合输入和输出文件——首先指定所有输入文件,然后指定所有输出文件。也不要混合属于不同文件的选项。都选项仅适用于下一个输入或输出文件,并在文件之间重置。

  • 要将输出文件的视频比特率设置为 64 kbit/s,请执行以下操作:
ffmpeg -i input.avi -b:v 64k -bufsize 64k output.avi
  • 要将输出文件的帧速率强制为 24 fps:
ffmpeg -i input.avi -r 24 output.avi 
  • 强制输入文件的帧速率(仅对原始格式有效)到 1 fps,输出文件的帧速率为 24 fps:
ffmpeg -r 1 -i input.m2v -r 24 output.avi 

原始输入文件可能需要格式选项。

3 详细说明

每个输出的转码过程可以描述为下图:

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

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

然后将编码的数据包传递到解码器(除非选择了流复制有关流,请参阅进一步的说明)。解码器产生未压缩的帧(原始视频 /PCM 音频等),可通过以下方式进一步处理过滤(请参阅下一节)。滤镜处理后,帧将传递给编码器,对它们进行编码并输出编码的数据包。最后这些是传递给复用器,后者将编码的数据包写入输出文件。

3.1 滤镜处理

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

3.1.1 简单滤镜图

简单滤镜是那些只有一个输入和输出的滤镜,两者都是相同的类型。在上图中,它们可以通过简单地插入来表示解码和编码之间的附加步骤:

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

使用 -stream -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

复杂滤镜图的一个简单示例是 overlay 滤镜,它有两个视频输入和一个视频输出,包含一个叠加在顶部的视频的。它对应音频的 amix 滤镜。

3.2 流复制

流复制是通过向选项提供 copy 参数来选择的模式。它使 ffmpeg 省略了解码和编码步骤,以便它仅执行解复用和混用。它用于更改容器格式或修改容器级元数据。在这种情况下,上图将简化为:

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

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

4 流选择

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

4.1 描述

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

虽然尽一切努力准确反映程序的行为,但 FFmpeg 低于自撰写本文以来,持续开发并且代码可能已更改。

4.1.1 自动流选择

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

它将根据以下条件选择相应流:

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

在相同类型的多个流速率相等的情况下,选择具有最低速率索引的流。

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

4.1.2 手动流选择

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

4.1.3 复杂滤镜图

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

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

4.1.4 流处理

流处理与流选择无关,但下面所描述的字幕除外。流处理通过 -codec 选项到特定的输出文件的流设置寻址。特别是,在流选择后 ffmpeg 应用编解码器选项,因此不会影响后者。如果没有为流类型指定 -codec 选项,ffmpeg 将选择由输出文件 muxer 注册的默认编码器。

字幕是个例外。如果为输出文件指定了字幕编码器, 将包括找到的任何类型的(文本或图像)的第一个字幕流。ffmpeg 不验证如果指定的编码器可以转换所选流,或者转换后的流是否在输出格式中可接受。这通常也适用于:当用户手动设置编码器时, 流选择过程无法检查编码的流是否可以复用到输出文件中。 如果不能,ffmpeg 将中止,并且将无法处理所有输出文件。

4.2 示例

以下示例说明了 ffmpeg 流的行为、怪癖和限制选择方法。

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

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

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

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

示例:自动流选择

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

指定了三个输出文件,对于前两个,没有 -map 选项 ,因此 ffmpeg 将自动为这两个文件选择流。

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

对于视频,它将从 B.mp4 中选择 stream 0,它所有输入视频流中具有最高的分辨率。

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

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

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

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

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

对于第三个输出,音频流的编解码器选项已设置为 copy,因此滤镜处理-编码-解码操作不会发生或可能发生。所选流的数据包应从输入文件传送并在输出中多路复用文件。

示例:自动选择字幕

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

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

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

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

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

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

示例:标记的滤镜图输出

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

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

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

上面的此命令也将失败,因为色调滤镜输出具有标签 [outv], 并且没有被映射到任何地方。

该命令应修改如下,

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

来自 B.mp4 的视频流被发送到色调滤镜,其输出被克隆一次拆分滤镜,两个输出都已标记。然后将每个副本映射到第一个和第三个输出文件。

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

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

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

out3.mkv 由来自色调滤镜的克隆视频输出和第一个来自 B.mp4 的音频流组成。

5 选项

所有数字选项(如果未另行指定)都接受字符串表示一个数字作为输入,后跟一个 SI 单位前缀,例如:“K”、“M”或“G”。如果将“i”附加到 SI 单位前缀,则完整的前缀将是解释为二进制倍数的单位前缀,其基于 1024 的幂而不是 1000 的幂。将“B”附加到 SI 单位前缀将值乘以 8。例如,这允许使用: “KB”、“MiB”、“G”和“B”作为数字后缀。

不接受参数的选项是布尔选项,并设置对应值为 true。可以通过前缀将它们设置为 false 带“否”的选项名称。例如使用“-nofoo” 将名称为“foo”的布尔选项设置为 false。

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 的流。否则,它将匹配指定的类型的流。

p:program_id[:additional_stream_specifier]
将程序中的流与 id program_id 匹配。如果使用了 additional_stream_specifier,那么它匹配的流既属于程序的一部分,又匹配 additional_stream_specifier

#stream_id or i:stream_id
按流 ID 匹配流(例如 MPEG-TS 容器中的 PID)。

m:key[:value]
匹配具有指定值的元数据标签 key 的流。如果没有指定 value,则匹配包含给定标签的流。

u
将流与可用配置匹配,必须定义编解码器,并且必须提供视频尺寸或音频采样率等基本信息。

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

5.2 通用选项

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

-L
显示许可证。

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

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

arg 的可能值为:

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

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

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

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

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

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

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

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

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

-version
显示版本。

-buildconf
显示生成配置,每行一个选项。

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

-demuxers
显示可用的解复用器。

-muxers
显示可用的复用器。

-devices
显示可用设备。

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

请注意,术语“codec”(编解码器)在本文档中用作快捷方式,对于更准确地称为媒体比特流格式的内容。

-decoders
显示可用的解码器。

-encoders
显示所有可用的编码器。

-bsfs
显示可用的比特流滤镜。

-protocols
显示可用的协议。

-filters
显示可用的 libavfilter 滤镜。

-pix_fmts
显示可用的像素格式。

-sample_fmts
显示可用的示例格式。

-layouts
显示通道名称和标准通道布局。

-dispositions
显示流处置。

-colors
显示可识别的颜色名称。

-sources device[,opt1=val1[,opt2=val2]...]
显示输入设备的自动检测源。 某些设备可能会提供无法自动检测的系统相关源名称。返回的列表不能假定始终完整。

ffmpeg -sources pulse,server=192.168.0.4 

-sinks device[,opt1=val1[,opt2=val2]...]
显示输出设备的自动检测接收器。 某些设备可能会提供无法自动检测的系统相关接收器名称。返回的列表不能假定始终完整。

ffmpeg -sinks pulse,server=192.168.0.4 

-loglevel [flags+]loglevel | -v [flags+]loglevel
设置库使用的日志记录级别和标志。

可选 flags 前缀可以包含以下值:

  • 'repeat'
    指示不应将重复的日志输出压缩到第一行并且“最后一条消息重复 n 次”行将被省略。
  • 'level'
    指示日志输出应向每条消息行添加前缀 [level]。这可以用作日志着色的替代方法,例如,在将日志整体输出到文件时。

flags 也可以通过添加“+”/“-”前缀来设置/重置单个标志,而不影响其他 flags 或更改 loglevel。同时设置 flagsloglevel 时,应在最后一个 flags 值和 loglevel 之前使用“+”分隔符。

loglevel 是包含以下值之一的字符串或数字:

  • 'quiet', -8
    什么都不显示;沉默。
  • 'panic', 0
    仅显示可能导致进程崩溃的致命错误,例如断言失败。这目前不用于任何内容。
  • 'fatal', 8
    仅显示致命错误。这些是错误,之后的过程绝对无法继续。
  • 'error', 16
    显示所有错误,包括可以从中恢复的错误。
  • 'warning', 24
    显示所有警告和错误。任何与可能相关的消息将显示不正确或意外的事件。
  • 'info', 32
    在处理过程中显示信息性消息。这是对警告和错误。这是默认值。
  • 'verbose', 40
    与 info 相同,只是更详细。
  • 'debug', 48
    显示所有内容,包括调试信息。
  • 'trace', 56
    例如,要启用重复日志输出,请添加前缀 level,并将 loglevel 设置为 verbose
ffmpeg -loglevel repeat+level+verbose -i input output

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

ffmpeg [...] -loglevel +repeat

默认情况下,程序会记录到 stderr。如果着色由终端支持,颜色用于标记错误和警告。设置环境变量 AV_LOG_FORCE_NOCOLOR可以禁用日志着色,也可以强制设置环境变量 AV_LOG_FORCE_COLOR

-report
将完整的命令行和日志输出转储到当前目录下名为 program-YYYYMMDD-HHMMSS.log 的文件。此文件可用于错误报告。这也意味着可以使用 -loglevel debug

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

可识别以下选项:

file
设置要用于报告的文件名; 已展开为名称的程序,被扩展为时间戳,被扩展到平原%p%t%%%

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

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

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

解析环境变量时的错误不是致命的,也不会显示在报告中。

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

-cpuflags flags (_global_)
允许设置和清除 CPU 标志。此选项适用于用于测试。除非您知道自己在做什么,否则不要使用它。

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

此选项的可能标志包括:

  • 'x86'

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

    • 'armv5te'
    • 'armv6'
    • 'armv6t2'
    • 'vfp'
    • 'vfpv3'
    • 'neon'
    • 'setend'
  • 'AArch64'

    • 'armv8'
    • 'vfp'
    • 'neon'
  • 'PowerPC'

    • 'altivec'
  • 'Specific Processors'

    • 'pentium2'
    • 'pentium3'
    • 'pentium4'
    • 'k6'
    • 'k62'
    • 'athlon'
    • 'athlonxp'
    • 'k8'

    -cpucount count (_global_)

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

ffmpeg -cpucount 2 

-max_alloc bytes

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

5.3 AVOption

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

generic

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

private

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

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

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

所有编解码器 AVOptions 都是按流的,因此是流说明符应该附在它们上:

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

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

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

注意:旧的未记录方式指定每个流 AVOptions 的方式由在选项名称前面加上 v/a/s 现已过时,将即将删除。

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 之前)时,限制从输入文件读取的数据的 duration

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

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

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

-to position (_input/output_)
停止写入输出或读取处的输入。 必须是持续时间规范, 参见 ffmpeg-utils(1) 手册中的 (ffmpeg-utils)的 duration 部分。positionposition
-to 和 -t 是互斥的,-t 具有优先级。

-fs limit_size (_output_)
设置文件大小限制,以字节表示。不会再写入字节块超过限制后。输出文件的大小略大于请求的文件大小。

-ss position (_input/output_)
用作输入选项(-i 之前)时,在此输入文件中查找到 position。请注意,在大多数格式中,不可能精确地搜索, 所以 ffmpeg 将寻找到前面最近的寻道点。 转码并启用 -accurate_seek(默认值)时,此寻道点和之间的额外段将被解码和丢弃。执行流复制或使用 -noaccurate_seek 时,它将被保存。

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

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

-sseof position (_input_)
与-ss 选项类似,但相对于“文件结尾”。这是负面的值位于文件中的较早位置,0 位于 EOF。

-isync input_index (_input_)
将输入分配为同步源。

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

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

默认值为 -1

-itsoffset offset (_input_)
设置输入时间偏移量。

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

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

-itsscale scale (_input,per-stream_)
重新缩放输入时间戳。scale 应为浮点数。

-timestamp date (_output_)
在容器中设置录制时间戳。

date 必须是日期规范,参见 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_)

设置流的处置。

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

value是由“+”或“-”分隔的项目序列。第一项可能也以“+”或“-”为前缀,在这种情况下,此选项会修改默认值。否则(第一项没有前缀)此选项将覆盖默认值。前缀“+”添加给定的处置,“-”将其删除。也可以通过将处置设置为 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:st=stream[:st=stream...] (_output_)
创建具有指定 title 的程序,并向其中添加 program_num 指定的 stream(s)

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

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

不过,只要您知道,您就可以指定其他选项,它们与标准不冲突,例如:

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

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

.VCD

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

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

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

SVCD

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

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

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

DVD

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

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

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

DV

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

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

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

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 的含义是编解码器依赖。 如果在没有 stream_specifier 的情况下使用 qscale,则仅适用对于视频流,这是为了保持与以前行为的兼容性并且为 2 个不同的编解码器指定相同的编解码器特定值,即音视频通常不是没有 stream_specifier 时所期望的使用。

-filter[:stream_specifier] filtergraph (_output,per-stream_)
创建由 filtergraph 指定的滤镜图并使用它来过滤流。

filtergraph 是对将应用于的滤镜图的流的说明 ,并且必须具有单个输入和单个输出流的类型相同。在滤镜图中,输入是关联的到标签 in ,并输出到标签 out

看 ffmpeg 滤镜手册,了解有关滤镜图语法的更多信息。

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

-filter_script[:stream_specifier] filename (_output,per-stream_)
此选项类似于 -filter,唯一的区别是其参数是要从中滤镜图描述读取的文件名称。

-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 仅由字母数字字符组成。序列的最后一个 key 进度信息始终是“进度”。

更新周期是使用-stats_period 来设置的。

-stdin
启用对标准输入的交互。默认情况下打开,除非标准输入为用作输入。要显式禁用交互,您需要指定 -nostdin

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

-debug_ts (_global_)
打印时间戳信息。默认情况下处于关闭状态。此选项是主要用于测试和调试目的,以及输出格式可能会从一个版本更改为另一个版本,因此不应由可移植脚本使用。

另请参阅 -fdebug ts 选项 。

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

请注意,对于 Matroska,您还必须设置 mimetype 元数据标记:

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

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

-dump_attachment[:stream_specifier] filename (_input,per-stream_)
将匹配的附件流提取到名为 filename 的文件中。如果 filename 为空,则元数据标记的 filename 值将被使用。
例如,将第一个附件提取到名为“out.ttf”的文件中:

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

要提取由 filename 标记确定的文件的所有附件,请执行以下操作:

ffmpeg -dump_attachment:t "" -i INPUT

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

5.5 视频选项

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

-r[:stream_specifier] fps (_input/output,per-stream_)
设置帧速率(Hz 值、分数或缩写)。

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

作为输出选项:
video encoding
在编码之前复制或丢弃帧以实现恒定输出 fps(帧率)。

video streamcopy
向复用器指示流帧率。没有数据是在这种情况下删除或重复。如果与数据包时间戳确定的实际流帧率不匹配,则可能会生成无效文件。 另请参阅 setts 比特流滤镜。

-fpsmax[:stream_specifier] fps (_output,per-stream_)
设置最大帧速率(Hz 值,分数或缩写)。

当输出帧率是自动设置的并且高于此值时,箝位输出帧率。在批处理或输入帧率被错误检测为非常高时有用。它不能和 -r 一起设置。它在流复制期间被忽略。

-s[:stream_specifier] size (_input/output,per-stream_)
设置帧大小。

作为输入选项,这是 video_size 选项私有的快捷方式,由某些帧大小不存储在文件中或可配置——例如 .raw 视频或视频采集卡。

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

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

-aspect[:stream_specifier] aspect (_output,per-stream_)
设置由 aspect 指定的视频显示纵横比。

aspect 可以是浮点数字符串,也可以是格式 num :den,该格式下 numden 是纵横比的分子和分母。例如“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 NUL
ffmpeg -i foo.mov -c:v libxvid -pass 1 -an -f rawvideo -y /dev/null

-passlogfile[:stream_specifier] prefix (_output,per-stream_)
将两次传递日志文件名前缀设置为,默认文件名前缀是“ffmpeg2pass”。完整的文件名将是 prefixPREFIX-N.log,其中 N 是特定于输出的数字流。

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

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

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

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

5.6 高级视频选项

-pix_fmt[:stream_specifier] format (_input/output,per-stream_)

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

-sws_flags flags (_input/output_)
设置 SwScaler 标志。

-rc_override[:stream_specifier] override (_output,per-stream_)
特定时间间隔的速率控制覆盖,格式为“int,int,int” 列表用斜杠分隔。前两个值是开头和结束帧数,最后一个是量化器,如果为正数或质量,则使用因子(如果为负)。

-psnr
计算压缩帧的 PSNR。此选项已弃用,请改用 -flags +psnr 给编码器传递 PSNR。

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

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

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

-top[:stream_specifier] n (_output,per-stream_)
顶部=1/ 底部=0/ 自动=-1 字段优先

-vtag fourcc/tag (_output_)
强制视频标签/四边形。这是 -tag:v 的别名。

-qphist (_global_)
显示 QP 直方图

-vbsf bitstream_filter
已弃用的请参见 -bsf

-force_key_frames[:stream_specifier] time[,time...] (_output,per-stream_)
-force_key_frames[:stream_specifier] expr:expr (_output,per-stream_)
-force_key_frames[:stream_specifier] source (_output,per-stream_)
-force_key_frames[:stream_specifier] source_no_drop (_output,per-stream_)

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

time[,time...]

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

如果其中一个时间是“章节[delta]”,则将其扩展为文件中所有章节的开头时间,以秒为单位进行偏移。此选项可用于确保在章节标记或输出文件中的任何其他指定位置存在寻道点。

例如,在 5 分钟处插入关键帧,加上 0.1 秒的关键帧在每章开始之前:

-force_key_frames 0:05:00,chapters-0.1

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 将强制一个关键帧。

source_no_drop
如果参数为 source_no_drop ,ffmpeg 将强制一个关键帧,如果正在编码的当前帧在其源中标记为关键帧。 在必须删除此特定源帧的情况下,强制下一个可用帧改为成为关键帧。

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

-copyinkf[:stream_specifier] (_output,per-stream_)
在进行流复制时,也复制开始时发现的非关键帧。

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

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

cuda
device 是 CUDA 设备的编号。

可识别以下选项:

primary_ctx

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

例子:
-init_hw_device CUDA: 1

选择系统上的第二个设备。
-init_hw_device CUDA: 0,primary_ctx=1

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

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

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

vaapi
device 是 X11 显示名称或 DRM 呈现节点。 如果未指定,它将尝试打开默认 X11 显示 (_$DISPLAY_) 然后是第一个 DRM 渲染节点(/_dev/dri/renderD128_)。

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

qsv
device 在 'MFX_IMPL_*' 中选择一个值。允许的值为:

auto
sw
hw
auto_any
hw_any
hw2
hw3
hw4

如果未指定,则使用“auto_anyd”。 (请注意,通过创建适合平台的子设备(“xva2”或“d3d11va”或“vaapi”),然后派生 QSV 设备从那开始。

或者,“hild_device_type”有助于选择适合平台的子设备类型。 在 Windows 上,“cd3d11va”用作默认子设备类型。
例子:

-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 设备。
opencl

device 选择平台和设备作为 _platform_index.device_index_。

也可以使用键值对设备集进行滤镜处理,以仅查找与特定平台或设备字符串匹配的设备。

可用作滤镜的字符串包括:

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

索引和滤镜必须一起唯一地选择一个设备。

例子:

-init_hw_device 开放:0.1

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

-init_hw_device opencl:,device_name=Foo9000

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

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

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

vulkan

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

可识别以下选项:

debug
如果设置为 1,则启用验证层(如果已安装)。

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

instance_extensions
要启用的其他实例扩展的加号分隔列表。

device_extensions
要启用的其他设备扩展的加号分隔列表。

例子:
init_hw_device vulkan:1

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

-init_hw_device vulkan:RADV
选择名称包含字符串 RADV 的第一个设备。

-init_hw_device vulkan:0,instance_extensions=VK_KHR_wayland_surface+VK_KHR_xcb_surface
选择第一个设备并启用 Wayland 和 XCB 实例扩展。

-init_hw_device type[=name]@source
初始化名为 typenamesource 的新硬件设备,从使用该名的现有设备派生它。

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

-filter_hw_device name
将名为 name 的硬件设备传递给任何滤镜图中的所有滤镜。这可以用来设置使用 hwpload 滤镜上传到的设备,或者使用 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
使用英特尔快速同步视频加速进行视频转码。

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

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

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

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

-hwaccel_device[:stream_specifier] hwaccel_device (_input,per-stream_)
选择用于硬件加速的设备。

只有指定- hwaccel 选项时,该选项才有意义。它既可以通过名称引用由-init_hw_device 创建的现有设备,也可以创建一个新设备,就像 '-init_hw_device' 类型 : hwaccel_device 之前被立即调用过一样。

typehwaccel_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 指定的滤镜图并使用它来过滤流。

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

5.8 高级音频选项

-atag fourcc/tag (_output_)
强制音频 tag/fourcc。这是 -tag:a 的别名。

-absf bitstream_filter
已弃用,请参见 -bsf

-guess_layout_max channels (_input,per-stream_)
如果某些输入通道布局未知,请尝试仅在以下情况下进行猜测最多对应于指定的通道数。例如,2 告诉 ffmpeg 将 1 个通道识别为单声道,将 2 个通道识别为立体声,但不是 6 声道 5.1。默认设置是始终尝试猜测。用 0 表示禁用所有猜测。

5.9 字幕选项

-scodec codec (_input/output_)
设置字幕编解码器。这是 -codec:s 的别名。

-sn (_input/output_)
作为输入选项,阻止滤镜处理文件的所有字幕流或自动选择或映射任何输出。请参阅单独禁用流 -discard 选项。
作为输出选项,禁用字幕录制,即自动选择或任何字幕流的映射。有关完全手动控制,请参阅 -map 选项。

-sbsf bitstream_filter
已弃用,请参见 -bsf

5.10 高级字幕选项

-fix_sub_duration
修复字幕时长。对于每个字幕,等待下一个数据包相同的流并调整第一个的持续时间以避免重叠。这是某些字幕编解码器是必要的,尤其是 DVB 字幕,因为原始数据包中的持续时间只是一个粗略的估计,结尾是实际上由一个空的字幕框标记。在以下情况下无法使用此选项必要可能导致持续时间过长或复用失败,原因如下非单调时间戳。

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

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

5.11 高级选项

-map [-]input_file_id:stream_specifier | [linklabel] (_output_)

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

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

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

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

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

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

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

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

ffmpeg -i INPUT -map 0 output

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

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

将第二个输入流映射到(单个)INPUTout.wa 输出流。

创建多个流
从输入文件 a.mov 中选择索引为 2 的流(由0: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_channel input_file_id.stream_specifier.channel_id|-1[:output_file_id.stream_specifier]
此选项已弃用,将被删除。它可以被滤镜替换。在某些情况下,使用 channelsplit、channelmap 或 amerge 滤镜的某种组合可能更容易。

将音频通道从给定输入映射到输出。如果 output_file_idstream_specifier 未设置,音频通道将映射到所有音频流上。

使用“-1”代替 input_file_idstream_specifierchannel_id 将映射静音通道。

尾随 ? 将允许 map_channel 可选:如果 map_channel 与没有通道匹配,则将忽略 map_channel 的失败。

例如,假设 INPUT 是一个立体声音频文件,您可以切换使用以下命令的两个音频通道:

ffmpeg -i INPUT -map_channel 0.0.1 -map_channel 0.0.0 OUTPUT

如果要将第一个通道静音并保留第二个通道:

ffmpeg -i INPUT -map_channel -1 -map_channel 0.0.1 OUTPUT 

“-map_channel”选项的顺序指定通道的顺序输出流。输出通道布局由数量猜测映射的声道(如果一个“-map_channel”则为单声道,如果两个为立体声,依此类推)。使用“-ac” 组合“-map_channel”使通道增益电平在以下情况下更新输入和输出通道布局不匹配(例如两个“-map_channel” 选项和“-ac 6”)。

您还可以将输入的每个通道提取到特定输出;以下命令分别提取 INPUT 音频流的两个通道(文件 0、流 0)到 OUTPUT_CH0 和 OUTPUT_CH1 输出:

ffmpeg -i INPUT -map_channel 0.0.0 OUTPUT_CH0 -map_channel 0.0.1 OUTPUT_CH1 

以下示例将立体声输入的通道拆分为两个单独的通道流,放入同一输出文件中:

ffmpeg -i stereo.wav -map 0:0 -map 0:0 -map_channel 0.0.0:0.0 -map_channel 0.0.1:0.1 -y out.ogg 
请注意,目前每个输出流只能包含来自单个的通道输入流;例如,您不能使用“-map_channel”来选择多个输入不同流中包含的音频通道(来自相同或不同的文件) 并将它们合并为单个输出流。因此目前不是例如,可以将两个单独的单声道流转换为单个立体声流。但是,将立体声流拆分为两个单声道单声道流是可能的。

如果需要此功能,可能的解决方法是使用 amerge 滤镜。例如,如果您需要将媒体(此处是 input.mkv )与 2 合并单声道音频流成一个立体声道音频流(并保持视频流),您可以使用以下命令:

ffmpeg -i input.mkv -filter_complex "[0:1] [0:2] amerge" -c:a pcm_s16le -c:v copy output.mkv 

要从第一个输入映射前两个音频通道,并使用 ? 尾随,如果第一个输入为单声道而不是立体声:

ffmpeg -i INPUT -map_channel 0.0.0 -map_channel 0.0.1? OUTPUT 

-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_)
在 CPU 用户时间内运行 ffmpeg duration 秒钟后退出。

-dump (_global_)
将每个输入数据包转储到 stderr。

-hex (_global_)
转储数据包时,还要转储有效负载。
-readrate speed (_input_)

限制输入读取速度。

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

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

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

-re (_input_)
以本机帧速率读取输入。这等效于设置 -readrate 1

-vsync parameter (_global_)
-fps_mode[:stream_specifier] parameter (_output,per-stream_)
设置视频同步方法/帧速率模式。垂直同步应用于所有输出视频流但可以通过设置 fps_mode 来覆盖流。vsync 已弃用,将来会删除。

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

passthrough (0)
每个帧都带有从解复用器到复用器的时间戳。

cfr (1)
帧将被复制和删除,以完全达到请求恒定帧速率。

vfr (2)
帧与其时间戳一起传递或丢弃,以便防止 2 帧具有相同的时间戳。

drop
作为直通,但销毁所有时间戳,使复用器生成基于帧速率的新时间戳。

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

请注意,在此之后,复用器可能会进一步修改时间戳。 例如,在启用 avoid_negative_ts 格式选项的情况下。
使用 -map,您可以选择时间戳应该来自哪个流采取。您可以保持视频或音频不变并同步剩余流到未更改的流。

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

-adrift_threshold time
设置要触发的时间戳和音频数据之间的最小差异(以秒为单位) 添加/删除样本以使其与时间戳匹配。此选项实际上是在硬补偿(添加/删除)和软补偿(挤压/拉伸)之间进行选择的阈值。 -async 必须设置为正值。

-apad parameters (_output,per-stream_)
填充输出音频流。这与应用 -af apad相同。参数是一串滤镜参数,其组成与滤镜 apad 相同。必须为此输出设置-shortest,选项才能生效。

-copyts
不处理输入时间戳,但不尝试保留其值对它们进行消毒。特别是,不要删除初始开始时间偏移值。

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

-start_at_zero
与 copyts 一起使用时,将输入时间戳移位,以便它们从零开始。

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

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

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

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

尝试自动做出选择,以生成合理的输出。
默认值为 -1。

-enc_time_base[:stream_specifier] timebase (_output,per-stream_)

设置编码器时基。 timebase 是一个浮点数, 并且可以采用以下值之一:
0

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

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

-1
尽可能使用输入流时基。

如果输入流不可用,将使用默认时基。

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

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

默认值为 0。

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

-shortest (_output_)
在最短输出流结束时完成编码。

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

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

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

默认值为 10 秒。

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

此选项启用的时间戳不连续性更正仅应用于接受时间戳不连续性的输入格式(对于 AV_FMT_DISCONT 标志已启用),例如 .MPEG-TS 和 HLS,以及使用 -copy_ts 选项时自动禁用 (除非检测到包装)。

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

默认值为 10。
-dts_error_threshold threshold
时间戳错误增量阈值,以十进制数表示秒。

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

如果检测到时间戳不连续性,其绝对值为大于 threshold ,ffmpeg 将删除 PTS/DTS 时间戳价值。
默认值为 3600*30(30 小时),这是任意的挑选了,而且相当保守。

-muxdelay seconds (_output_)
设置最大解复用解码延迟。

-muxpreload seconds (_output_)
设置初始解复用解码延迟。

-streamid output-stream-index:new-value (_output_)
为输出流分配新的流 ID 值。此选项应为在应用它的输出文件名之前指定。 对于存在多个输出文件的情况,流可以重新分配给其他值。

例如,要将流 0 PID 设置为 33,将流 1 PID 设置为 36 输出 MPEGTS 文件:

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

-bsf[:stream_specifier] bitstream_filters (_output,per-stream_)
为匹配流设置比特流滤镜。 bitstream_filters是以逗号分隔的比特流滤镜列表。使用 -bsfs 选项以获取比特流滤镜的列表。

ffmpeg -i h264.mp4 -c:v copy -bsf:v h264_mp4toannexb -an out.h264 
ffmpeg -i file.mov -an -vn -bsf:s mov2textsub -c:s copy -f rawvideo sub.txt 

-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_)
定义一个复杂的滤镜,即具有任意数量的输入和/或输出。对于简单的图形 ——具有一个输入和一个输出的图形类型——请参阅-filterfiltergraph 选项。 是滤镜图,如 ffmpeg 滤镜手册。

输入链接标签必须使用 [file_index:stream_specifier] 语法引用输入流(即与 use 相同)。如果 -mapstream_specifier 匹配多个流,则第一个流将是使用。未标记的输入将连接到匹配类型。

输出链路标签使用 -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 格式,字幕延迟 1 秒:

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

(0x2d0、0x2dc 和 0x2ef 分别是视频的 MPEG-TS PID,音频和字幕流;0:0、0:3 和 0:7 也可以工作)
要使用 lavfi color 源生成 5 秒的纯红色视频:

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

-filter_complex_threads nb_threads (_global_)

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

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

-filter_complex_script filename (_global_)

此选项类似于-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 信息打印到 file。 这允许在至少一个输出不是 RTP 流。(要求至少一种输出格式为 rtp)。

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

none
不丢弃任何帧。

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

noref
放弃所有非参考框架。

bidir
丢弃所有双向帧。

nokey
放弃除关键帧之外的所有帧。

all
丢弃所有帧。

-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 MB,基于整体大小传递到复用器的数据包。

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

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

-stats_enc_pre[:stream_specifier] path (_output,per-stream_)
-stats_enc_post[:stream_specifier] path (_output,per-stream_)
-stats_mux_pre[:stream_specifier] path (_output,per-stream_)
将有关匹配流的每帧编码信息写入 path 下的文件。

-stats_enc_pre 正确写入有关原始视频或音频帧的信息在发送它们进行编码之前,而 -stats_enc_post 写入有关从编码器接收的编码数据包的信息。 在数据包即将写入时写入有关数据包的信息被发送到复用器。每个帧或数据包在指定的文件。此行的格式由 -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_spe 是反斜杠转义的 — 使用 {、} 和 \ 将文本 {、} 或 \ 分别写入输出。

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

fidx
输出文件的索引。

sidx
文件中输出流的索引。

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

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

tb
编码器时基,作为有理数 num/den。请注意,这可能是与复用器使用的时基不同。

tbi
的时基,作为有理数 num/den。ptsi 可用时可用,否则 0/1 时不可用。

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

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

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

ti
输入帧的显示时间(请参阅 ni),以十进制数表示。平等 pts 乘以 tbi。不可用时打印为 inf。

dts
将数据包的时间戳解码为整数。应乘以用于计算演示时间的时基。仅限后编码。

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

sn
到目前为止发送到编码器的音频样本数。仅限音频和预编码。

samp
帧中的音频样本数。仅限音频和预编码。

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

br
当前比特率(以位/秒为单位)。仅限后编码。

abr
到目前为止,整个流的平均比特率,以每秒比特为单位,如果不能,则为 -1 此时确定。仅限后编码。
默认格式字符串为:
pre-encoding
{fidx}{SIDx}{n} {t}
post-encoding
{fidx}{SIDx}{n} {t}

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

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

5.12 预设文件

预设文件(presets )包含一系列 option = value 对, 每行一个,指定一系列选项,即在命令行上指定很尴尬。以哈希开头的行 ('#') 字符将被忽略,并用于提供注释。检查例如,FFmpeg 源代码树中的目录。

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

5.12.1 ff 预设文件

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

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

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

ffmpegffpresetslibvpx-1080plibvpx-1080p.ffpreset

如果没有找到这样的文件,那么 ffmpeg 将在上面提到的目录中搜索一个名为 codec_name-arg.ffpreset 的文件,其中codec_name 是编解码器的名称,将应用预设文件选项。例如,如果选择视频编解码器使用 -vcodec libvpx-vpre-1080p,然后它将搜索文件 libvpx-1080p.ffpreset。

[5.12.2 平均预设文件]

使用选项指定 avpreset 文件。它们的工作方式类似于 FFpreset 文件,但它们只允许编码器特定的选项。因此,不能使用指定编码器的 = 对。preoptionvalue
指定该选项后,ffmpeg 将查找具有后缀 .avpreset 在目录(如果设置)和 ,以及在配置时定义的 datadir 中(通常为 ),按该顺序排列。pre$AVCONV_DATADIR$HOME/.avconvPREFIX/share/ffmpeg
第一个 ffmpeg 搜索名为 -.avpreset 的文件上述目录,其中是编解码器的名称将应用预设文件选项。例如,如果选择视频编解码器与和使用,那么它将搜索文件 。codec_nameargcodec_name-vcodec libvpx-pre 1080plibvpx-1080p.avpreset
如果未找到此类文件,则 ffmpeg 将在同一目录中搜索名为 .avpreset 的文件。arg

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
以千比特/秒表示的平均比特率

br
比特率以千比特/秒表示

frame
编码帧数

out
输出文件索引

PSNR
峰值信噪比

q
框架质量

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

s_size
流大小以 KiB 表示

st
输出文件流索引

time

数据包的时间
type

图片类型
另请参阅 -stats_enc 选项以获取替代方法以显示编码统计信息。

6 示例

6.1 视频和音频抓取

如果您指定输入格式和设备,则 ffmpeg 可以抓取视频和音频直接。

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

或者使用 ALSA 音频源(单声道输入,卡 ID 1)而不是 OSS:

ffmpeg -f alsa -ac 1 -i hw:1 -f video4linux2 -i /dev/video0 /tmp/out.mpg 
请注意,您必须在激活正确的视频源和频道之前使用任何电视查看器启动 ffmpeg,例如 Gerd Knorr 的xawtv。您也必须使用标准混合器。

6.2 X11 抓取

通过 ffmpeg 抓取带有 ffmpeg 的 X11 显示屏

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

0.0 是 X11 服务器的显示屏幕编号,与显示环境变量。

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

0.0 是 X11 服务器的显示屏幕编号,与显示环境相同变量。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 文件的两倍。他们是原始文件,不带标头。它们可以由所有体面的视频生成解码器。您必须使用-s 选项指定图像的大小,如果 ffmpeg 猜不到。

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

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

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

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

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

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

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

在 2 kbit 时将 a.wav 转换为 a.mp64,在 2 kbit 时转换为 b.mp128。'-映射 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,这意味着每 10 秒一个帧内帧,速度为 29.97fps 输入视频。此外,音频流是 MP3 编码的,因此您需要通过传递 --enable-libmp3lame 到配置来启用 LAME 支持。 映射对于 DVD 转码特别有用以获得所需的音频语言。

注意:要查看支持的输入格式,请使用 -demuxers ffmpeg
  • 您可以从视频中提取图像,也可以从多个图像创建视频:要从视频中提取图像:
ffmpeg -i foo.avi -r 1 -s WxH -f image2 foo-%03d.jpeg`

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

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

要从许多图像创建视频:

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

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

导入图像序列时,-i 还支持扩展内部类似外壳的通配符模式(通配),通过选择特定于图像 2 的 -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`

7 参考

8 Authors

  • FFmpeg 开发人员
  • Flying 译
1

评论 (0)

取消