ffmpeg 文档

目录

1 概要

ffmpeg [全局选项] {[输入文件选项] -i输入网址} ... {[输出文件选项]输出地址} ...

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尝试通过跟踪任何活动输入流上的最低时间戳来保持它们同步。

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

3.1 Filtering

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

3.1.1 简单的过滤图

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

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

简单的过滤器图配置有每个流-筛选选项(与-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选项。请注意,此选项是全局的,因为复杂的过滤器图本质上不能与单个流或文件明确关联。

-拉夫菲选项相当于-filter_complex

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

3.2 Stream copy

流复制是通过copy-编解码器选项。它ffmpeg省略了指定流的解码和编码步骤,因此它只进行解复用和复用。它对于更改容器格式或修改容器级元数据非常有用。在这种情况下,上图将简化为:

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

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

4 码流选择

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

4.1 Description

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

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

4.1.1 自动码流选择

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

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

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

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

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

4.1.2 手动选择码流

使用时-map,仅用户映射的流包含在该输出文件中,但下面描述的过滤器图输出可能存在例外。

4.1.3 复杂的过滤图

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

带有标记的 pad 的复杂过滤图输出流必须映射一次且恰好一次。

4.1.4 流处理

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

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

4.2 Examples

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

他们假设以下三个输入文件。

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

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

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

示例:自动流选择

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

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

输出1.mkv是一个 Matroska 容器文件,接受视频、音频和字幕流,因此 ffmpeg 将尝试选择每种类型之一。
对于视频,它将stream 0选择B.mp4,在所有输入视频流中具有最高分辨率。
对于音频,它将stream 3选择B.mp4,因为它拥有最多的通道。
对于字幕,它将stream 2选择B.mp4,这是其中的第一个字幕流阿维病毒B.mp4

输出2.wav仅接受音频流,因此仅stream 3来自B.mp4被选中。

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

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

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

示例:自动字幕选择

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

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

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

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

此处使用该选项设置过滤器图-filter_complex,并由单个视频过滤器组成。该overlay过滤器恰好需要两个视频输入,但没有指定,因此使用前两个可用的视频流,即阿维病毒mkv。过滤器的输出板没有标签,因此被发送到第一个输出文件 输出1.mp4。因此,会跳过视频流的自动选择,这会在B.mp4。具有大多数通道的音频流,即。stream 3B.mp4,自动选择。然而,没有选择字幕流,因为 MP4 格式没有注册默认字幕编码器,并且用户没有指定字幕编码器。

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

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

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

覆盖过滤器需要两个视频输入,使用前两个未使用的视频流。这些是来自的流阿维病毒mkv。覆盖输出未标记,因此它被发送到第一个输出文件输出1.mp4,无论该-map选项是否存在。

aresample 过滤器发送第一个未使用的音频流,即阿维病毒。由于此过滤器输出也未标记,因此它也映射到第一个输出文件。的存在-an 仅抑制音频流的自动或手动流选择,而不抑制从过滤器发送的输出。这两个映射流都应排在映射流之前输出1.mp4

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

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

5 个选项

如果没有另外指定,所有数字选项都接受表示数字的字符串作为输入,该字符串后可能跟有 SI 单位前缀之一,例如:“K”、“M”或“G”。

如果将“i”附加到 SI 单位前缀,则完整的前缀将被解释为二进制倍数的单位前缀,它基于 1024 的幂而不是 1000 的幂。将“B”附加到 SI 单位前缀将乘以值除以 8。这允许使用例如:“KB”、“MiB”、“G”和“B”作为数字后缀。

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

5.1 Stream specifiers

某些选项适用于每个流,例如比特率或编解码器。流说明符用于精确指定给定选项所属的流。

流说明符是一个字符串,通常附加到选项名称并用冒号分隔。例如-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]

将流与具有指定值的元数据标签键相匹配。如果 未给出,则将包含给定标记的流与任何值进行匹配。

u

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

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

5.2 Generic options

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

-L

显示许可证。

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

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

arg的可能值为:

long

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

full

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

decoder=decoder_name

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

encoder=encoder_name

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

demuxer=demuxer_name

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

muxer=muxer_name

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

filter=filter_name

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

bsf=bitstream_filter_name

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

protocol=protocol_name

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

-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

指示重复的日志输出不应压缩到第一行,并且“Last message returned n times”行将被省略。

level

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

标志也可以单独使用,通过添加 '+'/'-' 前缀来设置/重置单个标志,而不影响其他标志或更改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前缀标志或日志级别当前状态的示例:

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)。

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

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

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

-hide_banner

禁止打印横幅。

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

-cpuflags flags (global)

允许设置和清除 cpu 标志。该选项用于测试。除非您知道自己在做什么,否则不要使用它。

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

此选项可能的标志是:

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

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

ffmpeg -cpucount 2
-max_alloc bytes

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

5.3 AVOptions

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

generic

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

private

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

例如,要将 ID3v2.3 标头而不是默认的 ID3v2.4 写入 MP3 文件,请使用id3v2_版本MP3 混合器的私有选项:

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 的比特率。

注:-无选项语法不能用于布尔 AVOptions,请使用-选项0/-选项1

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

5.4 Main options

-f fmt (input/output)

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

-i url (input)

输入文件网址

-y (global)

无需询问即可覆盖输出文件。

-n (global)

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

-stream_loop number (input)

设置输入流应循环的次数。Loop 0表示无循环,loop-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 之前),在其持续时间达到持续时间后停止写入输出。

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

-to 和 -t 是互斥的,并且 -t 具有优先权。

-to position (input/output)

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

-to 和 -t 是互斥的,并且 -t 具有优先权。

-fs limit_size (output)

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

-ss position (input/output)

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

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

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

-sseof position (input)

与选项类似-ss,但相对于“文件结尾”。也就是说,负值位于文件的较早位置,0 位于 EOF 处。

-isync input_index (input)

将输入指定为同步源。

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

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

默认值为-1

-itsoffset offset (input)

设置输入时间偏移。

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

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

-itsscale scale (input,per-stream)

重新调整输入时间戳。比例应该是浮点数。

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

设置流的处置。

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

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:][program_num=program_num:]st=stream[:st=stream...] (output)

创建具有指定titleprogram_num 的节目并向其中 添加指定的 流。

-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

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

光盘

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与目标相同。dvyuv422p

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

-dn (input/output)

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

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

-dframes number (output)

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

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

在帧数帧之后停止写入流。

-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并使用它来过滤流。

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

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

-filter_script[:stream_specifier] filename (output,per-stream)

该选项类似于-筛选,唯一的区别是它的参数是要从中读取过滤器图描述的文件的名称。

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

更新周期使用 来设置-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空,则将使用元数据标记 的值。

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

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

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

ffmpeg -dump_attachment:t "" -i INPUT

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

5.5 Video Options

-vframes number (output)

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

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

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

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

作为输出选项:

video encoding

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

video streamcopy

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

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

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

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

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

设置帧大小。

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

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

格式为 '宽x高'(默认 - 与源相同)。

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

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

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

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

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

设置视频旋转元数据。

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

此选项会覆盖文件中存储的旋转/显示变换元数据(如果有)。当视频正在转码(而不是复制)并-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)

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

-vf filtergraph (output)

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

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

-autorotate

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

-autoscale

根据第一帧的分辨率自动缩放视频。默认启用,使用-无自动缩放禁用它。当自动缩放被禁用时,过滤器图的所有输出帧可能不具有相同的分辨率,并且对于某些编码器/复用器来说可能不够。因此,除非您确实知道自己在做什么,否则不建议禁用它。禁用自动缩放的风险由您自行承担。

5.6 Advanced Video options

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

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

-sws_flags flags (input/output)

设置 libswscale 库的默认标志。scale这些标志由自动插入的过滤器和简单过滤器图表中的过滤器 使用,如果没有在过滤器图表定义中覆盖的话。

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

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

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

-psnr

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

-vstats

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

-vstats_file file

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

-vstats_version file

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

-vtag fourcc/tag (output)

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

-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可以采用以下形式的参数:

time[,time...]

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

如果其中一个时间为“ chapters[ de​​lta ]”,则将其扩展为文件中所有章节的开始时间,移位 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

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 渲染节点或 DirectX 适配器索引。如果未指定,它将尝试打开默认的 X11 显示 ( $DISPLAY ),然后打开第一个 DRM 渲染节点 ( /dev/dri/renderD128 ),或 Windows 上的默认 DirectX 适配器。

vdpau

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

qsv

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

auto
sw
hw
auto_any
hw_any
hw2
hw3
hw4

如果没有指定,'自动_任意' 用来。(请注意,通过创建适合平台的子设备('dxva2' 或者 'd3d11va' 或者 '瓦皮'),然后从中派生出 QSV 设备。)

或者, '子设备类型' 有助于选择适合平台的子设备类型。在 Windows 上d3d11va' 用作默认子设备类型。

例子:

-init_hw_device qsv:hw,child_device_type=d3d11va

选择类型为 ' 的 GPU 子设备d3d11va' 并使用 ' 创建 QSV 设备MFX_IMPL_硬件'。

-init_hw_device qsv:hw,child_device_type=dxva2

选择类型为 ' 的 GPU 子设备dxva2' 并使用 ' 创建 QSV 设备MFX_IMPL_硬件'。

opencl

device选择平台和设备作为platform_index.device_index

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

可用作过滤器的字符串有:

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

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

例子:

-init_hw_device opencl:0.1

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

-init_hw_device opencl:,device_name=Foo9000

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

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

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

vulkan

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

可以识别以下选项:

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的新硬件设备,从名称为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 视频加速进行视频转码。

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

为了使其正常工作,解码器和编码器都必须支持 QSV 加速,并且不得使用任何滤波器。

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

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

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

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

此选项仅在以下情况下才有意义-hwaccel还指定了选项。它可以引用使用创建的现有设备-init_硬件设备 按名称,或者它可以创建一个新设备,就像'-init_硬件设备' type : hwaccel_device 之前被调用。

-hwaccels

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

-fix_sub_duration_heartbeat[:stream_specifier]

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

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

需要-fix_sub_duration为相关输入字幕流设置,以使其产生任何效果,以及输入字幕流必须直接映射到心跳流所在的同一输出。

5.7 Audio Options

-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 Advanced Audio options

-atag fourcc/tag (output)

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

-absf bitstream_filter

已弃用,请参阅 -bsf

-guess_layout_max channels (input,per-stream)

如果某些输入通道布局未知,则仅尝试猜测它是否最多对应于指定数量的通道。例如,2 指示ffmpeg将 1 个通道识别为单声道,将 2 个通道识别为立体声,但不将 6 个通道识别为 5.1。默认设置是始终尝试猜测。使用 0 禁用所有猜测。

5.9 Subtitle options

-scodec codec (input/output)

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

-sn (input/output)

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

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

-sbsf bitstream_filter

已弃用,请参阅 -bsf

5.10 Advanced Subtitle options

-fix_sub_duration

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

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

-canvas_size size

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

5.11 Advanced options

-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命令行上给出的选项的顺序相同。

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

例子:

map everything

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

ffmpeg -i INPUT -map 0 output
select specific stream

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

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

将映射第二个输入流输入到(单个)输出流输出.wav

create multiple streams

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

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

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

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

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

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

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

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

选择英语音频流:

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

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

-copy_unknown

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

-map_channel [input_file_id.stream_specifier.channel_id|-1][?][:output_file_id.stream_specifier]

此选项已弃用并将被删除。可用 盘式过滤器代替。在某些情况下,使用channelsplitchannelmapamerge过滤器的某种组合可能更容易 。

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

使用“-1”代替 input_file_id流说明符channel_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”则为单声道,如果有两个则为立体声,等等)。如果输入和输出通道布局不匹配(例如两个“-map_channel”选项和“-ac 6”),则将“-ac”与“-map_channel”组合使用可以更新通道增益级别。

您还可以将输入的每个通道提取到特定的输出;以下命令将INPUT音频流的两个通道(文件 0、流 0)提取到相应的OUTPUT_CH0OUTPUT_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”来选择不同流中包含的多个输入音频通道(来自相同或不同的文件)并将它们合并到单个输出流中。因此,例如,当前不可能将两个单独的单声道流转换为单个立体声流。然而,将立体声流分成两个单通道单声道流是可能的。

如果您需要此功能,可能的解决方法是使用合并 过滤器。例如,如果您需要合并媒体(此处输入.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

请注意,在此示例中,simple0也适用,因为默认情况下假定全局元数据。

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

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

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

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

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

passthrough (0)

每个帧及其时间戳从解复用器传递到复用器。

cfr (1)

帧将被复制和丢弃,以准确实现所请求的恒定帧速率。

vfr (2)

帧会连同其时间戳一起通过或丢弃,以防止 2 个帧具有相同的时间戳。

drop

作为直通,但会破坏所有时间戳,使复用器根据帧速率生成新的时间戳。

auto (-1)

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

请注意,在此之后,复用器可能会进一步修改时间戳。例如,如果格式选项避免负面的ts 已启用。

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

-frame_drop_threshold parameter

丢帧阈值,指定视频帧在丢帧之前可以落后多少。在帧速率单位中,1.0 是一帧。默认值为-1.1。一种可能的用例是在时间戳有噪声的情况下避免帧丢失,或者在时间戳精确的情况下提高帧丢失精度。

-apad parameters (output,per-stream)

填充输出音频流。这与申请相同-af apad。Argument 是一串过滤器参数,组成与过滤器相同apad-shortest必须为此输出设置才能使选项生效。

-copyts

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

请注意,根据垂直同步选项或特定复用器处理(例如,如果格式选项避免负面的ts 启用)即使选择此选项,输出时间戳也可能与输入时间戳不匹配。

-start_at_zero

当与复制品,移动输入时间戳,使它们从零开始。

这意味着使用eg-ss 50将使输出时间戳从50 秒开始,无论输入文件从哪个时间戳开始。

-copytb mode

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

1

使用多路分配器时基。

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

0

使用解码器时基。

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

-1

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

默认值为-1。

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

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

0

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

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

demux

使用多路分配器中的时基。

filter

使用过滤图中的时基。

a positive number

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

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

默认值为 0。

-bitexact (input/output)

为(解)复用器和(解/编码)编码器启用 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(除非检测到回绕)。

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

默认值为 10。

-dts_error_threshold threshold

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

此选项启用的时间戳校正仅适用于不接受时间戳不连续性的输入格式( AV_FMT_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 (output,per-stream)

将比特流过滤器应用于匹配的流。

bitstream_filters是比特流过滤器规范的逗号分隔列表。指定的比特流过滤器按照写入的顺序应用于编码数据包。每个比特流过滤器规范的形式为

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

任何要成为选项值一部分的 ',=:' 字符都需要使用反斜杠进行转义。

使用该-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)

强制使用 tag/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)

定义一个复杂的滤波器图,即具有任意数量的输入和/或输出的滤波器图。对于简单图(具有相同类型的一个输入和一个输出的图),请参阅-筛选选项。filtergraph是filtergraph的描述,如ffmpeg-filters手册的“Filtergraph语法”部分所述。

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

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

请注意,使用此选项可以仅使用 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秒的纯红色视频color

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 流时,这允许转储 sdp 信息。(要求至少一种输出格式为rtp)。

-discard (input)

允许丢弃特定流或流中的帧。任何输入流都可以使用值完全丢弃,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-拉夫菲。如果过滤器格式协商需要转换,则过滤器的初始化将失败。仍然可以通过在图表中插入相关转换过滤器(scale、aresample)来执行转换。默认情况下打开,要显式禁用它,您需要指定 -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_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。仅后编码。

用数据包标记的指令只能与 -stats_enc_post_fmt-stats_mux_pre_fmt

带有框架标记的指令只能与 -stats_enc_pre_fmt

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

默认格式字符串为:

pre-encoding

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

post-encoding

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

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

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

5.12 Preset files

预设文件包含一系列选项=值对,每行一个,指定一系列选项,这在命令行上指定是很困难的。以井号(“#”)字符开头的行将被忽略并用于提供注释。检查预设FFmpeg 源代码树中的目录作为示例。

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

5.12.1 ffpreset 文件

vpreffpreset 文件用、aprespre和选项指定fpre。该fpre选项采用预设的文件名而不是预设名称作为输入,并且可用于任何类型的编解码器。对于vpreapre、 和 spre选项,预设文件中指定的选项将应用于当前选择的与预设选项类型相同的编解码器。

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

首先 ffmpeg在目录中搜索名为arg .ffpreset的文件$FFMPEG_DATADIR(如果设置),以及$HOME/.ffmpeg,并在配置时定义的 datadir 中(通常前缀/共享/ffmpeg)或在一个ff预设按照 win32 上的可执行文件的顺序放置文件夹。例如,如果参数是libvpx-1080p,它将搜索文件libvpx-1080p.ffpreset

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

5.12.2 av预设文件

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

当指定该pre选项时,ffmpeg将在目录中查找后缀为.avpreset的文件$AVCONV_DATADIR(如果设置),以及 $HOME/.avconv,并在配置时定义的 datadir 中(通常 前缀/共享/ffmpeg), 以该顺序。

首先,ffmpeg在上述目录中搜索名为codec_name - arg .avpreset 的文件,其中codec_name是将应用预设文件选项的编解码器的名称。例如,如果您选择视频编解码器并-vcodec libvpx使用-pre 1080p,那么它将搜索该文件libvpx-1080p.avpreset

如果没有找到这样的文件,那么 ffmpeg 将在同一目录中 搜索名为arg .avpreset的文件 。

5.13 vstats file format

和选项可以生成包含有关所生成-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

每个key对应的value说明如下:

avg_br

平均比特率以 Kbits/s 表示

br

比特率以 Kbits/s 表示

frame

编码帧数

out

输出文件索引

PSNR

峰值信噪比

q

框架质量

f_size

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

s_size

流大小以 KiB 表示

st

输出文件流索引

time

数据包的时间

type

图片类型

另请参阅-stats_enc 选项以了解显示编码统计信息的替代方法。

6 示例

6.1 Video and Audio grabbing

如果指定输入格式和设备,那么 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 grabbing

使用 ffmpeg 抓取 X11 显示

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

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

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

0.0.0 是 X11 服务器的 display.screen 编号,与 DISPLAY 环境变量相同。10 是抓取的 x 偏移量,20 是 y 偏移量。

6.3 Video and Audio file format conversion

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

例子:

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

    它将使用以下文件:

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

    Y 文件使用 U 和 V 文件分辨率的两倍。它们是原始文件,没有标题。它们可以由所有合适的视频解码器生成。您必须使用指定图像的大小-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
    

    将 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配置来启用 LAME 支持。该映射对于 DVD 转码以获得所需的音频语言特别有用。

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

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

    从视频中提取图像:

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

    这将从视频中每秒提取一个视频帧,并将其输出到名为foo-001.jpeg,foo-002.jpeg等。图像将重新缩放以适应新的宽x高值。

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

    要从许多图像创建视频:

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

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

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

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

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

    生成的输出文件test12.nut将按相反顺序包含输入文件中的前四个流。

  • 强制 CBR 视频输出:
    ffmpeg -i myfile.avi -b 4000k -minrate 4000k -maxrate 4000k -bufsize 1835k out.m2v
    
  • 四个选项 lmin、lmax、mblmin 和 mblmax 使用“lambda”单位,但您可以使用 QP2LAMBDA 常量轻松从“q”单位转换:
    ffmpeg -i src.ext -lmax 21*QP2LAMBDA dst.ext
    

7 另请参阅

ffmpeg-allffplayffprobeffmpeg-utilsffmpeg-scalerffmpeg-resamplerffmpeg-codecsffmpeg-bitstream-filters、 ffmpeg -formatsffmpeg-devicesffmpeg-protocolsffmpeg-filters

8 位作者

FFmpeg 开发人员。

git log有关作者身份的详细信息,请参阅项目的 Git 历史记录 (https://git.ffmpeg.org/ffmpeg),例如通过在 FFmpeg 源目录中键入命令 ,或浏览https://git 的在线存储库。 ffmpeg.org/ffmpeg

文件中列出了特定组件的维护者 维护者在源代码树中。

本文档于2023 年 11 月 16 日使用makeinfo 生成。

由telepoint.bg提供的托管