[总结]FFMPEG命令行工具之ffmpeg详解

目录

0 前言

1 语法 Synopsis

2 描述 Description

3 详细描述 Detailed description

3.1 滤镜 Filtering

3.1.1 简单滤镜图 Simple filtergraphs

3.1.2 复杂滤镜图 Complex filtergraphs

3.2 流拷贝 Stream copy

4 流选取 Stream selection

4.1 描述 Description

4.1.1 自动流选取 Automatic stream selection

4.1.2 手动流选取 Manual stream selection

4.1.3 复杂滤镜图 Complex filtergraphs

4.1.4 流处理 Stream handing

4.2 示例

示例:自动流选取

示例:自动字幕选取

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

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

5 命令选项

5.1 流指定器 Stream specifiers

5.2 通用选项 Generic options

5.3 主要选项 Main options

5.4 AVOptions

6 示例

6.1 转封装

6.2 转编码

6.3 流媒体

6.4 设备采集

6.5 各种滤镜


0 前言


本文主要参考 ffmpeg documentation,以及《FFMPEG入门到精通》一书。

本文中的示例将尽量详尽,涉及转封装,转码,流媒体,设备采集,滤镜使用等许多方面,每个示例也将经过实测。

ffmpeg版本4.1 2019年3月1日记之。

1 语法 Synopsis


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

注意一点:可以有多个输入,多个输出

2 描述 Description


ffmpeg是一个非常快速的音频,视频转换器,不仅可以转换本地音视频,并且可以直接转换在线的音频视频源。还可以通过高质量的滤镜转换不同采样率的音频,不同分辨率的视频。

ffmpeg可以读取多个输入文件(可以是常规的磁盘文件,管道,网络流,采集设备),可以由选项-i来指定输入文件,并将结果写入多个输出文件,输出文件由输出url指定。任何命令行中的参数如果无法被解释为选项option将被当做输出文件url。

每个输入输出url原则上可以包含任意个数不同类型的流(视频,音频,字幕,数据,附属)。被允许的流个数和类型最终取决于封装容器格式。选择哪个输入流映射到哪个输出流要么是被ffmpeg自动处理,要么可以通过-map选项来指定

要命令行中选项中引用输入文件,可以使用它们的下标指数(从0开始,依次类推),比如第一个文件是0,第二个文件是1,等等。类似的,文件中的流的引用也可以使用下标指数。比如2:3引用了第3个输入文件中的第4个流。进一步可以查看 “流选择”章节内容。

作为一般化的规则,选项都作用于下一个特定的文件。顺序是非常重要的,因为同一个选项可以在一个命令行中出现多次。每次选项出现是作用于下一个输入文件或者是输出文件。特例是全局选项,这个应该在最开始指定。

不要混淆输入和输出文件 —— 一开始指定所有的输入文件,然后才是所有的输出文件。不要混淆作用于不同文件的选项。所有选项仅仅作用于下一个输入或者输出文件,然后就被重置了。

示例:

  • 设置视频的比特率为64kbit/s ffmpeg -i 1.mp4 -b:v 64k output.mp4
  • 强制视频的帧率为24fps ffmpeg -i 1.mp4 -r 24 output.mp4
  • 强制输入文件帧率为1fps,输出文件的帧率为24fps ffmpeg -r 1 -i 1.mp4 -r 24 output.mp4

3 详细描述 Detailed description


ffmpeg中的对于每个输出文件的转码过程可以使用下图表示:

[总结]FFMPEG命令行工具之ffmpeg详解

ffmpeg调用libavformat库(该库包含解封装器demuxers)去读取输入文件,获取文件中编码过的数据包。当存在多个输入文件时,ffmpeg将根据所有输入流中的最低时间戳来保持同步。

编码过的数据包将进一步被传递给解码器(除非采用流复制的方式,即不改变流的编码方式)。编码器将编码过的数据包packets解码后产生数据帧frames(包括原始的视频采样数据,音频pcm采样数据...),这些数据帧还可以进一步的被滤镜处理。滤镜处理后的数据帧将被传递给编码器,编码器对数据帧进行编码,形成新的编码后的数据包packets。最终编码后的数据包传递给封装器muxer,按照文件格式要求写入到输出文件中。

3.1 滤镜 Filtering


在原始音频帧数据被编码前,ffmpeg可以使用libavfilter中的滤镜对其进行处理。滤镜图(filtergraphs)由几个滤镜链(chained filters)组成,ffmpeg中区分两种类型的滤镜图:简单和复杂的

3.1.1 简单滤镜图 Simple filtergraphs


简单的滤镜图是指处理只有一个输入文件和一个输出文件,并且二者有同样类型。在上图中,简单滤镜图表演的角色就是在解码和编码之间插入一个额外的步骤:

[总结]FFMPEG命令行工具之ffmpeg详解

简单滤镜图配置为一个流一个filter选项(-vf视频滤镜,-af音频滤镜,-sf字幕滤镜)。一个视频的简单滤镜图像如下图展示的这样:

[总结]FFMPEG命令行工具之ffmpeg详解

注意一些滤镜会改变帧属性但是不会改变帧内容。比如fps滤镜将改变帧的数量,但是不会去修改一帧数据中存储的内容;又比如setpts滤镜,仅仅会修改帧的时间戳,然后就完成了这帧数据的处理而没有改变帧内数据。

3.1.2 复杂滤镜图 Complex filtergraphs


复杂滤镜图用于对一个流的处理不能使用简单线性处理链(即挨个使用滤镜就能完成的功能)。比如,当过滤图含有多个输入或者输出是,或者输出流的类型与输入不一致。复杂滤镜图可以用下图表示:

[总结]FFMPEG命令行工具之ffmpeg详解

注意这个选项是全局的,因为复杂滤镜图天然就是不会二义性的关联到单个流或者是文件。

选项-lavfi和-filter_complex是等价的。

用来展示复杂滤镜图的常用例子就是overlay滤镜,这个滤镜有两个视频输入和一个视频输出,这个视频输出就其中一个输入放置再另一个输出上面得来的。音频滤镜中相似的就是amix滤镜。

3.2 流拷贝 Stream copy


流拷贝是一种模式选择,可以通过选项-codec加参数copy实现。允许ffmpeg对特定的流跳过解码和编码的环节,只进行解封装和再封装。这种操作对于改变容器格式或者是改变容器级别的metadata非常有用。上面的流程图,在这种情况下,就可以简化为下图:

[总结]FFMPEG命令行工具之ffmpeg详解

既然不存在解码和编码,那么流拷贝将非常快,并且没有质量损失。然而,在某些情况下因为一些因素无法正常工作。总之,使用滤镜是非常重要的,因为滤镜工作于非压缩数据这个层级。

4 流选取 Stream selection


ffmpeg提供了-map选项来实现手动控制每个输入文件的流选龋用户也可以跳过-map选项让ffmpeg自动进行流选龋-vn/-an/-sn/-dn选项可以用来跳过包含的视频,音频,字母,数据流,不管是手动映射还是自动选取,除非这些流是作为复杂滤镜输出项。

4.1 描述 Description

下面的子章节将描述流选取中各种不同的规则。下面的例子将展示在实际中利用这些规则。每种效果精确的反应了软件的行为,而ffmpeg还处于持续的开发中,因此,代码会随着时间变化,以下描述也可能会有不同。

4.1.1 自动流选取 Automatic stream selection


在没有使用任何map选项时,ffmpeg会根据输出容器格式去检查流的类型看是否能被封装进来,视频,音频,字幕的格式将都被考虑到。对于所有能接受的流类型,ffmpeg将会从所有输入文件中选择其中一个可以获取的流。

选取流的规则基于以下标准:

  • 对于视频,将选择分辨率最高的流,
  • 对于音频,将选择通道数最多的流,
  • 对于字幕,将选择第一个被找到的字幕流,但是还有一个附加的说明。输出文件格式默认字幕编码器可以是基于文本的或者是基于图像的,只有字幕流是相同类型的才会被选龋
  • 当几个流类型相同,基本上无差别,那么将选取index最低的那个。
  • 数据和附加流不能被自动选择,只能使用-map来手动选择。

4.1.2 手动流选取 Manual stream selection


当使用-map选项时,只有映射中的流会被包含进输出文件,只有一种例外,下面将描述。

4.1.3 复杂滤镜图 Complex filtergraphs


如果复杂滤镜图的输出流没有标明归属,他们将被加入到第一个输出文件中。这种情况,如果输出文件格式不支持这种流格式的话将会导致致命错误。如果没有使用-map选项,这些流将被自动选择,根据他们的流类型是否合适进行跳过。如果使用了-map选项,这些滤镜图流将会跟映射的流一起被包含进去。

复杂滤镜图中带标签的输出流必须被映射一次且只能被映射一次。

4.1.4 流处理 Stream handing


流的处理和流的选取是独立的,除了字幕。通过-codec选项对指定流进行处理并存储到指定输出文件。特别的,当-codec选项紧跟着流选取,将不会影响到后续的命令行部分。如果对于某个类型的流没有使用-codec选项,ffmpeg将选择输出文件封装器注册的默认编码器。

字幕的处理将会是个例外。如果字幕的编码器被指定,那么第一个字幕流,不管是基于文本还是基于图像的,将被包含进来。ffmpeg不会去验证指定编码器是否能转换选择的流或者转换后的流是否被输出文件封装格式所接受。对于这种应用场景也是一样:当用户手动设置编码器,选取的流处理也不会去验证编码后的流是否能被封装进输出文件。如果不能,ffmpeg将终止运行,所有输出文件的处理将以失败告终。

4.2 示例


下面所示例子展示了一般性行为,特殊情况,以及ffmpeg流选取的一些限制。

示例中三个输入文件情况如下:

[总结]FFMPEG命令行工具之ffmpeg详解

示例:自动流选取


[总结]FFMPEG命令行工具之ffmpeg详解

命令行中有三个输出文件,对于前两个输出文件,没有使用-map,因此ffmpeg将会为这两个输出文件自动选取流。

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

对于视频,将会选择B.mp4文件的stream 0,因为在两个文件的所有视频流中它的分辨率是最高的。

对于音频,将会选择B.mp4文件的stream 3,因为在两个文件的所有音频流中它的通道数是最多的。

对于字幕,将会选择B.mp4文件的stream 2,因为它是两个文件中第一个字幕流。

out2.wav仅接受音频流,因此B.mp4文件的stream 3将被选龋

对于out3.mov,因为使用了-map选项,因此ffmpeg将不会自动选取流。-map 1:a指明选取第二个文件的所有音频流,其他流将不会被包含进输出文件。

对于前两个输出,所有包含的流将会被转码。编码器的选择使用输出文件格式所注册默认编码器,可能和选取的输入流的编解码器不一样。

对于第三个输出,编解码器选项-c:a已经被指定为copy,因此不会有解码-滤镜-编码操作过程。选取流中编码数据包将从输入文件直接封装进输出文件。

示例:自动字幕选取


[总结]FFMPEG命令行工具之ffmpeg详解

尽管out1.mkv是Matroska容器文件,可以容纳字幕流,但是上述操作只有视频流和视频流会被选择并存入out1.mkv文件。C.mkv中的字幕流是image-based,而Matroska容器文件中默认的字幕流编码器是text-based,转码操作将会不成功,因此C.mkv中的字幕流将不会被选龋对于out2.mkv,由于字幕编码器通过-c:s dvdsub选定,因此输入文件中的字幕流将被选取,视频流也会被选取,但是音频流由于存在-an选项,因此不会被选龋

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


[总结]FFMPEG命令行工具之ffmpeg详解

这个命令行中使用了-filter_complex选项,由单个视频滤镜组成。“overlay”滤镜需要2个视频输出流,但是上述命令行中没有被指定,因此前两个可以使用的视频流将被使用,即A.avi的stream 0和C.mkv的stream 0。由于“overlay”滤镜的输出部分没有label标识,因此滤镜的输出将输送到第一个输出文件out1.mp4中。视频流的自动选择因上述原因将被跳过,否则自动选择会选择到B.mp4中的视频流(因其分辨率在所有流中是最大的)。音频流将被自动选择,由于B.mp4文件中的stream 3有最多的通道数而被选择。因为mp4文件格式没有注册默认的字幕编码器,而此命令行中又没有指定一个字幕编码器,因此字幕流将不会被选择。

对于第二个输出文件,out2.srt,只接受text-based字幕。因此即便第一个可获取的字幕流是C.mkv中的stream 2,但由于是image-based 因而被跳过。而B.mp4文件中的字幕流stream 2是第一个text-based字幕流而被选择。

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


[总结]FFMPEG命令行工具之ffmpeg详解

上述命令将执行失败,因为[outv]这个标识的流被映射了两次。将不会产生任何输出文件

[总结]FFMPEG命令行工具之ffmpeg详解

上述命令也将执行失败,原因在于滤镜“hue”有输出标识[outv],但是没有被映射到任何文件中去。

上述命令将被修改成如下所示,

[总结]FFMPEG命令行工具之ffmpeg详解

B.mp4的视频流将由滤镜“hue”处理,其输出被“split”滤镜克隆为[outv1]和[outv2]两个标签。然后各自被映射到out1.mp4和out3.mkv中去。

“overlay”滤镜需要有两个输入视频流——使用前两个没有被使用过的。由于B.mp4中的视频流已经被“hue”和“spilt”滤镜处理,因此“overlay”滤镜将处理A.avi stream 0和C.mkv stream 0。因为“overlay”滤镜的输出没有使用标签,因此将其输出将被输送到第一个输出文件out1.mp4,忽略掉了-map选项的存在。

“aresample”滤镜使用了第一个没有被处理的音频流,即A.avi的stream 0。由于此滤镜也没有输出标签,因此其输出也将被输送到第一个输出文件out1.mp4中。-an选项只能处理自动或者手动选择音频流,不能处理由滤镜图的输出。所有这些被映射的流将在映射到out1.mp4前被排序。

输出文件out2.mkv中的视频,音频,字幕流全部都取决于自动流选取机制。即B.mp4 stream 0, B.MP4 stream 3,B.MP4 stream 2

输出文件out3.mkv包含了经过“hue”滤镜处理过的视频流[outv2]和B.mp4第一个音频流 stream 1

5 命令选项


所有数字选项,如果没有特别指明的话,接受一个字符串来替代数字作为输入,一般是数字后跟随一个SI单位,比如‘K’,‘M’,‘G’。

如果‘i’跟随在SI单位之后出现,那么数字大小将被解释为以1024为基础的而非1000。如果'B'跟随在SI单位后出现,那么值将乘以8。将会出现‘KB’, ‘MiB’, ‘G’ 和 ‘B’作为数字的后缀。

没有参数的选项是bool选项,将设置相关的参数为true。相关参数可以被设置为false,通过在相应的选项前加个‘no’。比如,使用‘-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_type[:additional_stream_specifier] stream_type是指:音频流类型使用'a',字幕流类型使用's',数据流类型使用'd',附加类型使用't',视频流类型使用'v'或者'V',小'v'匹配所有的视频流,大'V'仅匹配非附加图片,视频缩略图,艺术封面图。当additional_stream_specifier被使用的,那么将匹配type:index一致的单个流,如果不使用additional_stream_specifier,那么将匹配所有和type一致的流。
  • p:program_id[:additional_stream_specifier] 匹配节目id相应的流。
  • #stream_id or i:stream_id 匹配流通过流id(比如MPEG-TS容器中的PID)
  • m:key[:value] 匹配流的metadata中相应tag(key)含有指定值的流。如果value没有给出,那么匹配所有含有指定tag的所有流
  • u 匹配具有可用配置的流,必须定义编解码器,并且必须提供诸如视频维度或音频采样率等基本信息。

注意,在ffmpeg中匹配meatdata只会对输入文件工作正常。

5.2 通用选项 Generic options


通用选项部分参见ffmpeg documentation 以及 [总结]FFMPEG命令行工具之ffprobe详解

5.3 主要选项 Main options


5.3.1 -f fmt (input/output)

Force input or output file format. The format is normally auto detected for input files and guessed from the file extension for output files, so this option is not needed in most cases.

5.3.2 -i url (input)

input file url

5.3.3 -y (global)

Overwrite output files without asking.

5.3.4 -n (global)

Do not overwrite output files, and exit immediately if a specified output file already exists.

5.3.5 -stream_loop number (input)

Set number of times input stream shall be looped. Loop 0 means no loop, loop -1 means infinite loop.

5.3.6 -c[:stream_specifier] codec (input/output,per-stream)

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

Select an encoder (when used before an output file) or a decoder (when used before an input file) for one or more streams. codec is the name of a decoder/encoder or a special value copy (output only) to indicate that the stream is not to be re-encoded.

For example

[总结]FFMPEG命令行工具之ffmpeg详解

encodes all video streams with libx264 and copies all audio streams.

For each stream, the last matching c option is applied, so

[总结]FFMPEG命令行工具之ffmpeg详解

will copy all the streams except the second video, which will be encoded with libx264, and the 138th audio, which will be encoded with libvorbis.

5.3.7 -t duration (input/output)

When used as an input option (before -i), limit the duration of data read from the input file.

When used as an output option (before an output url), stop writing the output after its duration reaches duration.

duration must be a time duration specification, see (ffmpeg-utils)the Time duration section in the ffmpeg-utils(1) manual.

-to and -t are mutually exclusive and -t has priority.

5.3.8 -to position (input/output)

Stop writing the output or reading the input at position. position must be a time duration specification, see (ffmpeg-utils)the Time duration section in the ffmpeg-utils(1) manual.

-to and -t are mutually exclusive and -t has priority.

5.3.9 -fs limit_size (output)

Set the file size limit, expressed in bytes. No further chunk of bytes is written after the limit is exceeded. The size of the output file is slightly more than the requested file size.

5.3.10 -ss position (input/output)

When used as an input option (before -i), seeks in this input file to position. Note that in most formats it is not possible to seek exactly, so ffmpeg will seek to the closest seek point before position. When transcoding and -accurate_seek is enabled (the default), this extra segment between the seek point and position will be decoded and discarded. When doing stream copy or when -noaccurate_seek is used, it will be preserved.

When used as an output option (before an output url), decodes but discards input until the timestamps reach position.

position must be a time duration specification, see (ffmpeg-utils)the Time duration section in the ffmpeg-utils(1) manual.

5.3.11 -sseof position (input)

Like the -ss option but relative to the "end of file". That is negative values are earlier in the file, 0 is at EOF.

5.3.12 -itsoffset offset (input)

Set the input time offset.

offset must be a time duration specification, see (ffmpeg-utils)the Time duration section in the ffmpeg-utils(1) manual.

The offset is added to the timestamps of the input files. Specifying a positive offset means that the corresponding streams are delayed by the time duration specified in offset.

5.3.13 -timestamp date (output)

Set the recording timestamp in the container.

date must be a date specification, see (ffmpeg-utils)the Date section in the ffmpeg-utils(1) manual.

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

Set a metadata key/value pair.

An optional metadata_specifier may be given to set metadata on streams, chapters or programs. See -map_metadata documentation for details.

This option overrides metadata set with -map_metadata. It is also possible to delete metadata by using an empty value.

For example, for setting the title in the output file:

[总结]FFMPEG命令行工具之ffmpeg详解

To set the language of the first audio stream:

[总结]FFMPEG命令行工具之ffmpeg详解

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

Sets the disposition for a stream.

This option overrides the disposition copied from the input stream. It is also possible to delete the disposition by setting it to 0.

The following dispositions are recognized:

default, dub,original,comment,lyrics,karaoke,forced,hearing_impaired,visual_impaired,clean_effects

attached_pic,captions,descriptions,dependent,metadata。

For example, to make the second audio stream the default stream:

[总结]FFMPEG命令行工具之ffmpeg详解

To make the second subtitle stream the default stream and remove the default disposition from the first subtitle stream:

[总结]FFMPEG命令行工具之ffmpeg详解

To add an embedded cover/thumbnail:

[总结]FFMPEG命令行工具之ffmpeg详解

Not all muxers support embedded thumbnails, and those who do, only support a few formats, like JPEG or PNG.

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

Creates a program with the specified title, program_num and adds the specified stream(s) to it.

5.3.17-target type (output)

Specify target file type (vcd, svcd, dvd, dv, dv50). type may be prefixed with pal-, ntsc- or film- to use the corresponding standard. All the format options (bitrate, codecs, buffer sizes) are then set automatically. You can just type:

[总结]FFMPEG命令行工具之ffmpeg详解

Nevertheless you can specify additional options as long as you know they do not conflict with the standard, as in:

[总结]FFMPEG命令行工具之ffmpeg详解

5.3.18 -dn (input/output)

As an input option, blocks all data streams of a file from being filtered or being automatically selected or mapped for any output. See -discard option to disable streams individually.

As an output option, disables data recording i.e. automatic selection or mapping of any data stream. For full manual control see the -map option.

5.3.19 -dframes number (output)

Set the number of data frames to output. This is an obsolete alias for -frames:d, which you should use instead.

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

Stop writing to the stream after framecount frames.

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

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

Use fixed quality scale (VBR). The meaning of q/qscale is codec-dependent. If qscale is used without a stream_specifier then it applies only to the video stream, this is to maintain compatibility with previous behavior and as specifying the same codec specific value to 2 different codecs that is audio and video generally is not what is intended when no stream_specifier is used.

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

Create the filtergraph specified by filtergraph and use it to filter the stream.

filtergraph is a description of the filtergraph to apply to the stream, and must have a single input and a single output of the same type of the stream. In the filtergraph, the input is associated to the label in, and the output to the label out. See the ffmpeg-filters manual for more information about the filtergraph syntax.

See the -filter_complex option if you want to create filtergraphs with multiple inputs and/or outputs.

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

This option is similar to -filter, the only difference is that its argument is the name of the file from which a filtergraph description is to be read.

5.3.24 -filter_threads nb_threads (global)

Defines how many threads are used to process a filter pipeline. Each pipeline will produce a thread pool with this many threads available for parallel processing. The default is the number of available CPUs.

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

Specify the preset for matching stream(s).

5.3.26 -stats (global)

Print encoding progress/statistics. It is on by default, to explicitly disable it you need to specify -nostats.

5.3.27 -progress url (global)

Send program-friendly progress information to url.

Progress information is written approximately every second and at the end of the encoding process. It is made of "key=value" lines. key consists of only alphanumeric characters. The last key of a sequence of progress information is always "progress".

5.3.28 -stdin

Enable interaction on standard input. On by default unless standard input is used as an input. To explicitly disable interaction you need to specify -nostdin.

Disabling interaction on standard input is useful, for example, if ffmpeg is in the background process group. Roughly the same result can be achieved with ffmpeg ... < /dev/null but it requires a shell.

5.3.29 -debug_ts (global)

Print timestamp information. It is off by default. This option is mostly useful for testing and debugging purposes, and the output format may change from one version to another, so it should not be employed by portable scripts.

See also the option -fdebug ts.

5.3.30 -attach filename (output)

Add an attachment to the output file. This is supported by a few formats like Matroska for e.g. fonts used in rendering subtitles. Attachments are implemented as a specific type of stream, so this option will add a new stream to the file. It is then possible to use per-stream options on this stream in the usual way. Attachment streams created with this option will be created after all the other streams (i.e. those created with -map or automatic mappings).

Note that for Matroska you also have to set the mimetype metadata tag:

[总结]FFMPEG命令行工具之ffmpeg详解

(assuming that the attachment stream will be third in the output file).

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

Extract the matching attachment stream into a file named filename. If filename is empty, then the value of the filename metadata tag will be used.

E.g. to extract the first attachment to a file named ’out.ttf’:

[总结]FFMPEG命令行工具之ffmpeg详解

To extract all attachments to files determined by the filename tag:

[总结]FFMPEG命令行工具之ffmpeg详解

Technical note – attachments are implemented as codec extradata, so this option can actually be used to extract extradata from any stream, not just attachments.

5.3.32 -noautorotate

Disable automatically rotating video based on file metadata.

5.4 AVOptions

这些选项是libavformat,libavdevice,libavcodec库直接提供的。使用-help option查看可用的AVOption选项。分为两个部分:

通用选项 generic

通用选项可以作用于所有容器,编解码器,设备。通用选项列举在AVFormatContext(作用于容器和设备) 选项下方以及AVCodecContext (作用于编解码器)选项下方。

私有选项 private

私有选项作用于特定的容器,编解码器,设备。列举在对应的容器,编解码器,设备下方。

例如,使用ID3V2.3头取代mp3文件默认的ID3V2.4,使MP3封装器私有的id3v2_version 选项:

[总结]FFMPEG命令行工具之ffmpeg详解

所有编解码器AVOptions作用于每个流,因此一个使用流指定器来指定流很有必要:

[总结]FFMPEG命令行工具之ffmpeg详解

在上面这个示例中,一个多通道的音频流被映射了2次。第一个实例使用ac3编码为比特率为640k的流。第二个实例被降到2个通道并使用aac编码,并且通过输出流下标方式的流指定器指定并设置比特率为128k。

注意:-nooption语法不能作为布尔类型的AVOptions,而是使用-option 0/-option 1。

注意:旧文档中描述的使用在选项名字前加v/a/s方式指定AVOption选项的方式将被弃用。

6 示例


目前示例这块儿将会在后续慢慢完善

6.1 转封装


预计在看完mp4 mov flv mpeg-ts m3u8后将会在此长篇叙述。目前且空留此处~~~~fighting,切不可懈怠~~~~~~2019.3.1记之。

6.2 转编码


6.3 流媒体


6.4 设备采集


6.5 各种滤镜