ffmpeg中文版文档

at 10个月前  ca FFmpeg  pv 449  by touch  

1简介

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

2描述

ffmpeg是一个非常快速的视频和音频转换器,也可以从现场音频/视频源中获取。它还可以在任意采样率之间进行转换,并使用高质量的多相滤波器动态调整视频大小。

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

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

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

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

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

要将输出文件的视频比特率设置为64 kbit / s:

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

要强制输出文件的帧速率为24 fps:

ffmpeg -i input.avi -r 24 output.avi1

要强制输入文件的帧速率(仅对原始格式有效)为1 fps,输出文件的帧速率为24 fps:

ffmpeg -r 1 -i input.m2v -r 24 output.avi1

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

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过滤

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

3.1.1简单滤波器图

简单的过滤器图是那些只有一个输入和输出的过滤器图,它们都是相同的类型。 在上图中,只需在解码和编码之间插入一个额外的步骤即可表示它们:

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

简单的过滤器图使用per-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。

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

3.2流复制

流复制是通过将复制参数提供给-codec选项而选择的模式。 它使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时,只有用户映射的流包含在该输出文件中,下面描述了filtergraph输出的一个可能的例外。

4.1.3复杂滤波器图

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

带有标记焊盘的复杂滤波器输出流必须一次映射一次。

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.mov1

指定了三个输出文件,对于前两个,未设置-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:一个选项将从第二个输入B.mp4中选择所有音频流。此输出文件中不包含其他流。

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

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

示例:自动字幕选择

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

尽管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.srt1

此处使用-filter_complex选项设置过滤器图,该过滤器图由单个视频过滤器组成。 叠加滤波器只需要两个视频输入,但没有指定,因此使用前两个可用视频流,即A.avi和C.mkv。 过滤器的输出板没有标签,因此被发送到第一个输出文件out1.mp4。 因此,跳过自动选择视频流,这将选择B.mp4中的流。 大多数频道的音频流即。 自动选择B.mp4中的流3。 然而,没有选择字幕流,因为MP4格式没有注册默认字幕编码器,并且用户没有指定字幕编码器。

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

示例:标记的filtergraph输出

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

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

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

上面的命令也会失败,因为色调过滤器输出有一个标签[out],并且没有被映射到任何地方。
该命令应修改如下,

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

来自B.mp4的视频流被发送到色调过滤器,其输出使用分割滤波器克隆一次,并且两个输出都标记为。然后将每个副本映射到第一个和第三个输出文件。

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

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

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

out3.mkv包含来自色调过滤器的克隆视频输出和来自B.mp4的第一个音频流。

5选项

如果没有另外指定,所有数字选项接受表示数字作为输入的字符串,其后可以跟随SI单位前缀之一,例如:‘K’,‘M’或’G’。

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

不带参数的选项是布尔选项,并将相应的值设置为true。可以通过在选项名称前加上“no”来将它们设置为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]
使用具有指定值的元数据标记键匹配流。如果未给出value,则将包含给定标记的流与任何值匹配。

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

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

5.2通用选项
这些选项在ff *工具中共享。

-L
显示许可证。

-h, - ?, - help, - help [arg]
显示帮助。可以指定可选参数以打印关于特定项目的帮助。如果未指定参数,则仅显示基本(非高级)工具选项。

arg的可能值是:


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

充分
打印完整的选项列表,包括编码器,解码器,分路器,复用器,滤波器等的共享和专用选项。

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

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

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

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

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

-版
显示版本。

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

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

-muxers
显示可用的复用器。

-设备
显示可用设备。

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

请注意,本文档中使用术语“编解码器”作为更正确称为媒体比特流格式的快捷方式。

-decoders
显示可用的解码器。

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

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

-protocols
显示可用协议。

-filters
显示可用的libavfilter过滤器。

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

-sample_fmts
显示可用的样本格式。

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

-colors
显示已识别的颜色名称

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

ffmpeg -sources pulse,server=192.168.0.41

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

ffmpeg -sinks pulse,server=192.168.0.41

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

可选的标志前缀可以包含以下值:

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

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

标志也可以单独使用,添加’+’/’ - ‘前缀来设置/重置单个标志,而不会影响其他标志或更改日志级别。设置flags和loglevel时,最后一个标志值和loglevel之间需要一个’+'分隔符。

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

‘quiet, -8’
什么都不显示;安静。

‘panic, 0’
仅显示可能导致进程崩溃的致命错误,例如断言失败。目前还没有用于任何目的。

‘fatal, 8’
只显示致命错误。这些是错误,在此之后该过程绝对无法继续。

‘error, 16’
显示所有错误,包括可以从中恢复的错误。

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

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

‘verbose, 40’
与信息相同,除了更详细。

‘debug, 48’
显示所有内容,包括调试信息。

‘trace, 56’
例如,要启用重复日志输出,请添加级别前缀,并将loglevel设置为verbose:

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

另一个允许重复日志输出而不影响级别前缀标志或loglevel的当前状态的示例:

ffmpeg [...] -loglevel +repeat1

默认情况下,程序会记录到stderr。 如果终端支持着色,则使用颜色标记错误和警告。 可以禁用日志着色设置环境变量AV_LOG_FORCE_NOCOLOR或NO_COLOR,也可以强制设置环境变量AV_LOG_FORCE_COLOR。 不推荐使用环境变量NO_COLOR,将在以后的FFmpeg版本中删除。

-report
将完整命令行和控制台输出转储到当前目录中名为program-YYYYMMDD-HHMMSS.log的文件。 此文件可用于错误报告。 它还意味着-loglevel调试。

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

可识别以下选项:

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

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

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

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

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

-hide_banner
抑制打印横幅。

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

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

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

此选项的可能的flag是:

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

5.3 AVOptions

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

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

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

例如,要将ID3v2.3标头而不是默认ID3v2.4写入MP3文件,请使用MP3 muxer的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.mp41

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

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

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

5.4主要选择

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

-i url(输入)
输入文件网址

-y(glodal)
无需询问即可覆盖输出文件。

-n(glodal)
不要覆盖输出文件,如果已存在指定的输出文件,请立即退出。

-stream_loop号码(输入)
设置输入流的循环次数。 循环0表示无循环,循环-1表示无限循环。

-c [:stream_specifier]编解码器(输入/输出,每个流)
-codec [:stream_specifier]编解码器(输入/输出,每个流)
为一个或多个流选择编码器(在输出文件之前使用时)或解码器(在输入文件之前使用时)。 codec是解码器/编码器的名称或特殊值副本(仅输出),表示不重新编码流。

例如

ffmpeg -i INPUT -map 0 -c:v libx264 -c:a copy OUTPUT1

使用libx264对所有视频流进行编码并复制所有音频流。

对于每个流,应用最后一个匹配的c选项,因此

ffmpeg -i INPUT -map 0 -c copy -c:v:1 libx264 -c:a:137 libvorbis OUTPUT1

将复制除第二个视频(将使用libx264编码)和第138个音频(将使用libvorbis编码)之外的所有流。

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

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

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

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

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

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

-fs limit_size(输出)
设置文件大小限制,以字节为单位。 超出限制后不再写入更多的字节块。 输出文件的大小略大于请求的文件大小。

-ss position (输入/输出)

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

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

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

-sseof position (输入)

与-ss选项类似,但相对于“文件结束”。 这是负值在文件中较早,0表示在EOF。

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

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

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

-itsscale scale(输入,每个流)
重新调整输入时间戳。 scale应该是一个浮点数。

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

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

-metadata [:metadata_specifier] key = value(输出,每元数据)
设置元数据键/值对。

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

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

例如,要在输出文件中设置标题:

ffmpeg -i in.avi -metadata title="my title" out.flv1

要设置第一个音频流的语言:

ffmpeg -i INPUT -metadata:s:a:0 language=eng OUTPUT1

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

设置流的处置。

此选项会覆盖从输入流复制的处置。 也可以通过将其设置为0来删除处置。

以下dispositions被认可:

default
dub
original
comment
lyrics
karaoke
forced
hearing_impaired
visual_impaired
clean_effects
attached_pic
captions
descriptions
dependent
metadata

例如,要将第二个音频流设为默认流:

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

要使第二个字幕流成为默认流,并从第一个字幕流中删除默认处置:

ffmpeg -i in.mkv -c copy -disposition:s:0 0 -disposition:s:1 default out.mkv1

要添加嵌入式封面/缩略图:

ffmpeg -i in.mp4 -i IMAGE -map 0 -map 1 -c copy -c:v:1 png -disposition:v:1 attached_pic out.mp41

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

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

创建具有指定标题program_num的程序,并将指定的流添加到该程序。

-target type (输出)

指定目标文件类型(vcd,svcd,dvd,dv,dv50)。 类型可以使用pal-,ntsc-或film-作为前缀,以使用相应的标准。 然后自动设置所有格式选项(比特率,编解码器,缓冲区大小)。 你可以输入:

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

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

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

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

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

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

-frames [:stream_specifier] framecount(输出,每个流)
在framecount帧之后停止写入流。

-q [:stream_specifier] q(输出,每个流)
-qscale [:stream_specifier] q(输出,每个流)
使用固定质量标度(VBR)。 q / qscale的含义取决于编解码器。如果在没有stream_specifier的情况下使用qscale,那么它仅适用于视频流,这是为了保持与先前行为的兼容性,并且为2个不同的编解码器指定相同的编解码器特定值,音频和视频通常不是没有stream_specifier时的意图用来。

-filter [:stream_specifier] filtergraph(输出,每个流)
创建filtergraph指定的filtergraph并使用它来过滤流。

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

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

-filter_script [:stream_specifier] filename(输出,每个流)
此选项类似于-filter,唯一的区别是它的参数是要从中读取过滤器图形描述的文件的名称。

-filter_threads nb_threads(全局)
定义用于处理过滤器管道的线程数。每个管道都会产生一个线程池,这个线程可用于并行处理。默认值是可用CPU的数量。

-pre [:stream_specifier] preset_name(输出,每个流)
指定匹配流的预设。

-stats(全球)
打印编码进度/统计信息。默认情况下,要显式禁用它,您需要指定-nostats。

-progress url(全局)
将程序友好的进度信息发送到url。

大约每秒和编码过程结束时写入进度信息。它由“key = value”行组成。 key仅包含字母数字字符。一系列进度信息的最后一个键始终是“进度”。

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

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

-debug_ts(全球)
打印时间戳信息。它默认是关闭的。此选项主要用于测试和调试,输出格式可能会从一个版本更改为另一个版本,因此便携式脚本不应使用它。

另请参阅选项-fdebug ts。

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

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

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

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

-dump_attachment [:stream_specifier] filename(输入,每个流)
将匹配的附件流提取到名为filename的文件中。 如果filename为空,则将使用文件名元数据标记的值。

例如。 提取名为’out.ttf’的文件的第一个附件:

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

要提取由filename标记确定的文件的所有附件:

ffmpeg -dump_attachment:t "" -i INPUT1

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

-noautorotate
禁用基于文件元数据自动旋转视频。

5.5视频选项

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

-r [:stream_specifier] fps(输入/输出,每个流)
设置帧速率(Hz值,分数或缩写)。

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

作为输出选项,复制或丢弃输入帧以实现恒定的输出帧速率fps。

-s [:stream_specifier] size(输入/输出,每个流)
设置框架大小。

作为输入选项,这是video_size private选项的快捷方式,由一些分路器识别,其帧大小未存储在文件中或者是可配置的 - 例如,原始视频或视频采集卡。

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

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

-aspect [:stream_specifier] aspect(输出,每个流)
设置由aspect指定的视频显示宽高比。

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

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

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

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

-vcodec codec(输出)
设置视频编解码器。这是-codec:v的别名。

-pass [:stream_specifier] n(输出,每个流)
选择通行证号码(1或2)。它用于进行双通视频编码。视频的统计信息在第一次传递中记录到日志文件中(另请参见-passlog文件选项),在第二次传递中,该日志文件用于以精确请求的比特率生成视频。在第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(输出,每个流)
将两遍日志文件名前缀设置为前缀,默认文件名前缀为“ffmpeg2pass”。 完整的文件名将是PREFIX-N.log,其中N是特定于输出流的数字

-vf filtergraph(输出)
创建filtergraph指定的filtergraph并使用它来过滤流。

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

5.6高级视频选项

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

-sws_flags flags(输入/输出)
设置SwScaler标志。

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

-ilme
强制编码器中的隔行扫描支持(仅限MPEG-2和MPEG-4)。如果您的输入文件是隔行扫描并且您希望保持隔行扫描格式以获得最小损失,请使用此选项。另一种方法是使用-deinterlace对输入流进行去隔行,但是去隔行会引入损失。

-psnr
计算压缩帧的PSNR。

-vstats
将视频编码统计信息转储到vstats_HHMMSS.log。

-vstats_file文件
将视频编码统计转储到文件。

-vstats_version文件
指定要使用的vstats格式的版本。默认值为2。

version = 1:

frame =%5d q =%2.1f PSNR =%6.2f f_size =%6d s_size =%8.0fkB time =%0.3f br =%7.1fkbits / s avg_br =%7.1fkbits / s

版本> 1:

out =%2d st =%2d frame =%5d q =%2.1f PSNR =%6.2f f_size =%6d s_size =%8.0fkB time =%0.3f br =%7.1fkbits / s avg_br =%7.1fkbits / s

-top [:stream_specifier] n(输出,每个流)
top = 1 / bottom = 0 / auto = -1 field first

-dc precision
Intra_dc_precision。

-vtag fourcc / tag(输出)
强制视频标签/ fourcc。这是-tag:v的别名。

-qphist(global)
显示QP直方图

-vbsf bitstream_filter
不推荐见-bsf

-force_key_frames [:stream_specifier] time [,time …](输出,每个流)
-force_key_frames [:stream_specifier] expr:expr(输出,每个流)
在指定的时间戳强制关键帧,更准确地说是在每个指定时间后的第一帧。

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

如果其中一个时间是“chapters[delta]”,则将其扩展到文件中所有章节开始的时间,移动增量,表示为以秒为单位的时间。此选项可用于确保在章节标记或输出文件中的任何其他指定位置存在搜索点。

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

-force_key_frames 0:05:00,chapters-0.1

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

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

-copyinkf [:stream_specifier](输出,每个流)
进行流复制时,还要复制开头找到的非关键帧。

-init_hw_device type [= name] [:device [,key = value …]]
使用给定的设备参数初始化名为name的类型类型的新硬件设备。如果未指定名称,则将收到“type%d”形式的默认名称。

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

cuda
device是CUDA设备的编号。

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

vaapi
device是X11显示名称或DRM渲染节点。如果未指定,它将尝试打开默认的X11显示($ DISPLAY),然后打开第一个DRM渲染节点(/ dev / dri / renderD128)。

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

qsv
设备选择’MFX_IMPL_ *'中的值。允许的值是:

auto
sw
hw
auto_any
hw_any
wh2
hw3
hw4
如果未指定,则使用“auto_any”。 (注意,通过创建适合平台的子设备(‘dxva2’或’vaapi’)然后从中导出QSV设备,可能更容易实现QSV的预期结果。)

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

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

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

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

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

例子:
-init_hw_device opencl:0.1
在第一个平台上选择第二个设备。

-init_hw_device opencl:,device_name = Foo9000
选择名称中包含字符串Foo9000的设备。

-init_hw_device opencl:1,device_type = gpu,device_extensions = cl_khr_fp16
在支持cl_khr_fp16扩展的第二个平台上选择GPU设备。

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

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

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

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

-hwaccel [:stream_specifier] hwaccel(输入,每个流)
使用硬件加速来解码匹配的流。 hwaccel的允许值为:

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

auto
自动选择硬件加速方法。

vdpau
使用VDPAU(用于Unix的视频解码和Presentation API)硬件加速。

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

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

qsv
使用英特尔QuickSync视频加速进行视频转码。

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

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

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

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

-hwaccel_device [:stream_specifier] hwaccel_device(输入,每个流)
选择要用于硬件加速的设备。

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

-hwaccels
列出此ffmpeg构建中支持的所有硬件加速方法。

5.7音频选项

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

-ar [:stream_specifier] freq(输入/输出,每个流)
设置音频采样频率。对于输出流,默认情况下将其设置为相应输入流的频率。对于输入流,此选项仅对音频抓取设备和原始分路器有意义,并映射到相应的分路器选项。

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

-ac [:stream_specifier]通道(输入/输出,每个流)
设置音频通道的数量。对于输出流,默认设置为输入音频通道的数量。对于输入流,此选项仅对音频抓取设备和原始分路器有意义,并映射到相应的分路器选项。

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

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

-acodec编解码器(输入/输出)
设置音频编解码器。这是-codec的别名:a。

-sample_fmt [:stream_specifier] sample_fmt(输出,每个流)
设置音频样本格式。使用-sample_fmts获取支持的样本格式列表。

-af filtergraph(输出)
创建filtergraph指定的filtergraph并使用它来过滤流。

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

5.8高级音频选项

-atag fourcc / tag(输出)
强制音频标签/ fourcc。 这是-tag:a的别名。

-absf bitstream_filter
不推荐使用,请参阅-bsf

-guess_layout_max channels(输入,每个流)
如果某些输入通道布局未知,请尝试仅猜测它是否对应于最多指定数量的通道。 例如,2告诉ffmpeg将1声道识别为单声道,将2声道识别为立体声而不是6声道识别为5.1。 默认是总是试图猜测。 使用0禁用所有猜测。

5.9字幕选项

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

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

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

-sbsf bitstream_filter
不推荐使用,请参阅-bsf

5.10高级字幕选项

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

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

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

5.11高级选项

-map [ - ] input_file_id [:stream_specifier] [?] [,sync_file_id [:stream_specifier]] | [linklabel](输出)
将一个或多个输入流指定为输出文件的源。每个输入流由输入文件索引input_file_id和输入文件中的输入流索引input_stream_id标识。两个索引都从0开始。如果指定,sync_file_id:stream_specifier设置哪个输入流用作表示同步参考。

命令行中的第一个-map选项指定输出流0的源,第二个-map选项指定输出流1的源,等等。

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

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

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

例如,将所有流从第一个输入文件映射到输出

ffmpeg -i INPUT -map 0 output

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

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

将由“0:1”标识的INPUT中的输入流映射到out.wav中的(单个)输出流。

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

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

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

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

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

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]
将音频通道从给定输入映射到输出。 如果未设置output_file_id.stream_specifier,则音频通道将映射到所有音频流。

使用“-1”而不是input_file_id.stream_specifier.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”,立体声,如果是两个,等等)。 如果输入和输出通道布局不匹配,则使用“-ac”组合“-map_channel”可以更新通道增益级别(例如两个“-map_channel”选项和“-ac 6”)。

您还可以将输入的每个通道提取到特定输出; 以下命令将INPUT音频流(file0,stream0)的两个通道提取到相应的OUTPUT_CH0和OUTPUT_CH1输出:

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

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

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

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

s [:stream_spec]
每个流元数据。 stream_spec是Stream说明符章节中描述的流说明符。 在输入元数据说明符中,复制第一个匹配流。 在输出元数据说明符中,将所有匹配的流复制到。

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

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

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

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

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

ffmpeg -i in.ogg -map_metadata 0:s:0 out.mp

要反过来,即将全局元数据复制到所有音频流:

ffmpeg -i in.mkv -map_metadata:s:a 0:g out.mkv

请注意,简单0在此示例中也可以正常工作,因为默认情况下采用全局元数据。

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

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

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

-timelimit duration(全局)
ffmpeg运行持续时间秒后退出。

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

-hex(全局)
转储数据包时,也会转储有效负载。

-re(输入)
以本机帧速率读取输入。主要用于模拟抓取设备或实时输入流(例如,从文件读取时)。不应与实际的抓取设备或实时输入流一起使用(它可能导致数据包丢失)。默认情况下,ffmpeg尝试尽可能快地读取输入。此选项将减慢输入读取到输入的本机帧速率。它对于实时输出(例如直播)很有用。

-vsync参数
视频同步方法。出于兼容性原因,旧值可以指定为数字。必须始终将新添加的值指定为字符串。

0,passthrough
每个帧都以其从分路器到复用器的时间戳传递。

1,cfr
将复制和删除帧以实现所要求的恒定帧速率。

2,vfr
帧以其时间戳传递或丢弃,以防止2帧具有相同的时间戳。

drop
作为passthrough但是会破坏所有时间戳,使muxer根据帧速率生成新的时间戳。

-1,auto
根据复用器功能选择1到2之间。这是默认方法。

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

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

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

-async samples_per_second
音频同步方法。 “拉伸/挤压”音频流以匹配时间戳,参数是音频更改的每秒最大采样数。 -async 1是一种特殊情况,其中仅校正音频流的开始而不进行任何后续校正。

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

此选项已被弃用。请改用aresample音频过滤器。

-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(输出,每个流)
设置编码器时基。 timebase是一个浮点数,可以采用以下值之一:

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

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

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

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

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

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

默认值为0。

-bitexact(输入/输出)
为(de)muxer和(de / en)编码器启用bitexact模式

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

-dts_delta_threshold
时间戳不连续性增量阈值。

-muxdelay秒(输出)
设置最大解复用 - 解码延迟。

-muxpreload seconds(输出)
设置初始demux-decode延迟。

-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(输出,每个流)
设置用于匹配流的比特流过滤器。 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(输入/输出,每个流)
强制标记/ fourcc用于匹配流。

-timecode hh:mm:ssSEPff
指定写入的时间码。 对于非丢弃时间码,SEP为’:’,对于丢弃,SEP为’;’(或’.’)。

ffmpeg -i input.mpg -timecode 01:02:03.04 -r 30000/1001 -s ntsc output.mpg

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

输入链接标签必须使用[file_index:stream_specifier]语法引用输入流(即与-map使用相同)。 如果stream_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

使用lavfi颜色源生成5秒纯红色视频:

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

-filter_complex_threads nb_threads(全局)
定义用于处理filter_complex图的线程数。与filter_threads类似,但仅用于-filter_complex图。默认值是可用CPU的数量。

-lavfi filtergraph(全局)
定义复杂的滤波器图形,即具有任意数量的输入和/或输出的滤波器图形。相当于-filter_complex。

-filter_complex_script filename(全局)
此选项类似于-filter_complex,唯一的区别是它的参数是要从中读取复杂filtergraph描述的文件的名称。

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

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

-thread_queue_size大小(输入)
此选项设置从文件或设备读取时排队的最大数据包数。对于低延迟/高速率直播流,如果不及时读取数据包,则可以丢弃数据包;提高这个价值可以避免它。

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

-discard(输入)
允许从流中丢弃特定的流或帧。任何输入流都可以使用全部值完全丢弃,而来自流的帧的选择性丢弃在解复用器处发生,并且不被所有解复用器支持。

none
不丢弃任何帧。

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

noref
丢弃所有非参考帧。

bidir
丢弃所有双向帧。

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

all
丢弃所有帧。

-abort_on标志(全局)
在各种条件下停止并中止。可以使用以下标志:

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

-xerror(全局)
出错时停止并退出

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

对于大多数用途,此选项的默认值应足够高,因此如果您确定需要,请仅触摸此选项。

作为特殊例外,您可以使用位图字幕流作为输入:它将转换为与文件中最大视频大小相同的视频,如果没有视频则转换为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也可以工作)

5.12预设文件

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

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

5.12.1 ffpreset文件

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

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

首先,ffmpeg在F F M P E G D A T A D I R ( 如 果 设 置 ) 和 FFMPEG_DATADIR(如果设置)和FFMPEGDATADIRHOME / .ffmpeg目录中搜索名为arg.ffpreset的文件,并在配置时定义的datadir(通常为PREFIX/share/ ffmpeg)或沿ffpresets文件夹中搜索按顺序在win32上执行。例如,如果参数是libvpx-1080p,它将搜索文件libvpx-1080p.ffpreset。

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

5.12.2 avpreset文件

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

当指定pre选项时,ffmpeg将在目录A V C O N V D A T A D I R ( 如 果 设 置 ) 和 AVCONV_DATADIR(如果设置)和AVCONVDATADIRHOME/ .avconv中查找带有后缀.avpreset的文件,并在配置时定义的datadir中查找(通常为PREFIX / share / ffmpeg) , 以该顺序。

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

如果未找到此类文件,则ffmpeg将在相同目录中搜索名为arg.avpreset的文件。

6 例子

6.1视频和音频抓取

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

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

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

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

请注意,在使用任何电视查看器(例如Gerd Knorr的xawtv)启动ffmpeg之前,您必须激活正确的视频源和频道。 您还必须使用标准混音器正确设置音频录制电平。

6.2 X11抓取

用ffmpeg via抓取X11显示器

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

0.0是X11服务器的display.screen number,与DISPLAY环境变量相同。

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

0.0是X11服务器的display.screen number,与DISPLAY环境变量相同。 10是x偏移,20是y偏移,用于抓取。

6.3视频和音频文件格式转换

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

例子:

您可以使用YUV文件作为输入:

ffmpeg -i /tmp/test%d.Y /tmp/out.mpg

它将使用这些文件:

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

Y文件使用U和V文件分辨率的两倍。 它们是原始文件,没有标题。 它们可以由所有体面的视频解码器生成。 如果ffmpeg无法猜测,则必须使用-s选项指定图像的大小。

您可以从原始YUV420P文件输入:

ffmpeg -i /tmp/test.yuv /tmp/out.avi

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

您可以输出到原始YUV420P文件:

ffmpeg -i mydivx.avi hugefile.yuv

您可以设置多个输入文件和输出文件:

ffmpeg -i /tmp/a.wav -s 640x480 -i /tmp/a.yuv /tmp/a.mpg

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

您还可以同时进行音频和视频转换:

ffmpeg -i /tmp/a.wav -ar 22050 /tmp/a.mp2

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

您可以同时编码为多种格式,并定义从输入流到输出流的映射:

ffmpeg -i /tmp/a.wav -map 0:a -b:a 64k /tmp/a.mp2 -map 0:a -b:a 128k /tmp/b.mp2

将a.wav转换为64 kbits的a.mp2和128 kbits的b.mp2。 '-map file:index’按输出流定义的顺序指定每个输出流使用哪个输入流。

您可以转码解密的VOB:

ffmpeg -i snatch_1.vob -f avi -c:v mpeg4 -b:v 800k -g 300 -bf 2 -c:a libmp3lame -b:a 128k snatch.avi

这是一个典型的DVD翻录示例; 输入是一个VOB文件,输出一个带有MPEG-4视频和MP3音频的AVI文件。 请注意,在此命令中,我们使用B帧,因此MPEG-4流与DivX5兼容,GOP大小为300,这意味着对于29.97fps输入视频,每10秒一帧内帧。 此外,音频流是MP3编码的,因此您需要通过传递–enable-libmp3lame来启用LAME支持。 该映射对于DVD转码特别有用,以获得所需的音频语言。

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

您可以从视频中提取图像,也可以从许多图像中创建视频:
用于从视频中提取图像:

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

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

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

要从许多图像创建视频:

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

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

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

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

ffmpeg -f image2 -pattern_type glob -framerate 12 -i 'foo-*.jpeg' -s WxH foo.avi

您可以在输出中放置许多相同类型的流:

ffmpeg -i test1.avi -i test2.avi -map 1:1 -map 1:0 -map 0:1 -map 0:0 -c copy -y test12.nut

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

强制CBR视频输出:

ffmpeg -i myfile.avi -b 4000k -minrate 4000k -maxrate 4000k -bufsize 1835k out.m2v

四个选项lmin,lmax,mblmin和mblmax使用’lambda’单位,但您可以使用QP2LAMBDA常数轻松转换’q’单位:

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

7另见

ffmpeg-all, ffplay, ffprobe, ffmpeg-utils, ffmpeg-scaler, ffmpeg-resampler, ffmpeg-codecs, ffmpeg-bitstream-filters, ffmpeg-formats, ffmpeg-devices, ffmpeg-protocols, ffmpeg-filters


版权声明

本文仅代表作者观点,不代表码农殇立场。
本文系作者授权码农殇发表,未经许可,不得转载。

 

扫一扫在手机阅读、分享本文

已有0条评论