参考ffmpeg学习笔记五 - 知乎

5.7、音频选项(Audio Options)

-aframes number (output)

设置输出的音频帧数,这是-frames:a的别名,已不使用。

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

设置音频采样频率,对于输出流,默认情况下将其设置为相应输入流的频率。

对于输入流,此选项仅对音频捕获设备和原始demuxers有意义,

并映射到相应的demuxer选项。

-aq q (output)

设置音频质量(codec-specific, VBR),是-q:a的别名。

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

设置音频通道数,对于输出流,默认情况下将其设置为输入音频通道的数量。

对于输入流,此选项仅对音频捕获设备和原始demuxers有意义,并映射到

相应的demuxer选项。

-an (input/output)

作为输入选项,阻止文件的所有音频流被过滤、自动选择、或者映射。

请参阅-discard选项。

作为输出选项,禁用音频记录,即自动选择或映射任何音频流。 有关完整的手动

控制,请参见-map选项。

-acodec codec (input/output)

设置音频的codec,是-codec:a的别名。

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

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

-af filtergraph (output)

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

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

5.8、高级视频选项(Advanced Audio options)

-atag fourcc/tag (output)

设置音频fourcc/tag,这是-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,它是-codec:s的别名。

-sn (input/output)

作为输入选项,阻止文件的所有字幕流被过滤、自动选择、或者映射。

请参阅-discard选项。

作为输出选项,禁用字幕记录,即自动选择或映射任何音频流。

有关完整的手动控制,请参见-map选项。

-sbsf bitstream_filter

已丢弃,见-bsf。

5.10 高级字幕选项(Advanced Subtitle options)

-fix_sub_duration

修正字幕的持续时间,对于每个字幕,等待同一流中的下一个数据包,并调整

第一个数据包的持续时间,以避免重叠。

对于某些字幕编codecs是必要的,尤其是DVB字幕,,因为原始数据包中的持续时间

仅是一个粗略的估计,结尾实际上是由空白的字幕帧标记的。

未使用此选项可能会由于非单调时间戳而导致持续时间过长或者合并失败。

请注意,此选项将延迟所有数据的输出,直到下一个字幕包被解码为止:这可能会

大大增加内存消耗和延迟。

-canvas_size size

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

5.11、高级选项(Advanced options)

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

将一个或多个输入流指定为输出文件的源,每个输入流由输入文件索引input_file_id

和输入流索引input_stream_id标识,

两个索引均从0开始;如果指定sync_file_id:stream_specifier,则设置将哪个输入流用

作演示文稿同步参考。

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

依此类推。

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

字符“?”在流索引之后,该映射将是可选的:如果该映射不匹配任何流,则该映射

将被忽略而不是失败。

注意,如果使用了无效的输入文件索引,则映射仍将失败, 例如map了不存在的输入。

另一种[linklabel]格式会将复杂过滤器图形的输出(请参见-filter_complex选项

)映射到输出文件。 linklabel必须与图中定义的输出链接标签相对应。

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

ffmpeg -i INPUT -map 0 OUTPUT

例2,如果第一个输入文件中有两个音频流,这些流将由“0:0”和“0:1”标识,

您可以使用-map选择哪个流放置到输出文件中(如下,第一个文件中的第二个流):

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

例3从输入文件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

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

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

例5,选择除第二个音频流外的所有流。

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

例6,使用字符“?”从第一个输入文件中选择视频、音频流,如果输入文件中

没有音频流,则忽略选择音频流。

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

例7,选择英文音频流

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将被忽略而不是失败。

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

ffmpeg -i INPUT -map_channel 0.0.1 -map_channel 0.0.0 OUTPUT

例2,使第一个通道静音并保持第二个通道:

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

“ -map_channel”选项的顺序指定了输出流中通道的顺序。 根据映射的通道数猜测

输出通道的布局(如果是一个“ -map_channel”,则为单声道;如果是两个,则为

立体声,以此类推)。

如果输入和输出通道布局不匹配(例如,两个“-map_channel”选项和“ac 6”),

则结合使用“ -ac”和“ -map_channel”可以使通道增益级别得到更新。

例3,可以将输入的每个通道提取到特定的输出,下面命令将INPUT音频流的两个

通道(文件0,流0)提取到各自的OUTPUT_CH0和OUTPUT_CH1输出:

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

例4,将立体声输入的通道分成两个单独的流,并放入相同的输出文件中

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过滤器。 例如,如果您需

要将具有2个单声道音频流的媒体(此处为input.mkv)合并为一个立体声通道

音频流(并保留视频流),则可以使用以下命令:

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

例5,映射来自第一个输入文件的前两个音频通道并使用字符“?”,如果第一个

输入是单声道而不是立体声,则忽略音频通道映射:

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]

per-stream元数据,stream_spec是流说明符,如“Stream specifiers”一章中

所述, 在输入元数据说明符中,从中复制第一个匹配的流;在输出元数据说明符

中,所有匹配的流都被复制。

c:chapter_index

per-chapter元数据,chapter_index是从0开始的章节索引。

p:program_index

per-program元数据,program_index是从0开始的节目索引。

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

默认情况下,将从第一个输入文件复制全局元数据,per-stream和per-chapter元

数据同streams/chapters一起复制。

通过创建任何相关类型的映射,可以禁用这些默认映射。负文件索引可用于创建禁用

自动复制的虚拟映射。

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

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

反之亦然,即将全局元数据复制到所有音频流:

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

请注意,在此示例中,简单的0也将有效,因为默认情况下假定是全局元数据。

-map_chapters input_file_index (output)

将章节从索引为input_file_index的输入文件复制到下一个输出文件。 如果未指定章节

映射,将从第一个至少包含一个章节的输入文件中复制。 使用负文件索引来禁用任何

章节复制。

-benchmark (global)

在编码末尾显示基准测试信息,显示实际、系统和用户使用的时间以及最大内存

消耗, 并非所有系统都支持最大内存消耗,如果不支持,通常将显示为0。

-benchmark_all (global)

在编码过程中显示基准信息,显示各个步骤(音频/视频编码/解码)中使用的实际、

系统和用户时间。

-timelimit duration (global)

ffmpeg在运行了持续秒数后退出。

-dump (global)

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

-hex (global)

转储数据包时,还转储有效负载。

-re (input)

以原始帧速率读取输入,主要用于模拟抓拍设备或实时输入流(例如,从文件

读取时),不应与实际的抓取设备或实时输入流一起使用(这可能会导致数据

包丢失)。

默认情况下,ffmpeg会尽可能快的读取输入,此选项会将输入的读取速度减慢到

输入的原始帧速率,对于实时输出(例如实时流式传输)很有用。

-vsync parameter

视频同步方法,出于兼容性原因,旧值可以为数字,新增加的值必须指定为字符串。

0, passthrough

每个帧都根据时间戳从demuxer传递到muxer。

1, cfr

帧将被复制和丢弃以精确达到所需的恒定帧率。

2, vfr

帧根据时间戳传递或丢弃,以避免2个帧具有相同的时间戳。

drop

传递破坏了所有时间戳,使用muxer根据帧率生成新的时间戳.

-1, auto

根据muxer功能在1到2之间选择,这是默认方法.

注意,muxer可以进一步修改时间戳,例如,在启用格式选项prevent_negative_ts的

情况下。

使用-map,您可以选择从哪个流中获取时间戳,也可以保留视频或音频不变,并将

其余的流同步到未更改的流。

-frame_drop_threshold parameter

丢帧阈值,指定丢掉多少视频帧,以帧率为单位,因此1.0是一帧,默认值为-1.1。

一种可能的用例是在嘈杂的时间戳下避免丢帧,或者在确切的时间戳记下提高

丢帧精度。

-async samples_per_second

音频同步方法,“Stretches/squeezes”音频流以匹配时间戳,参数是每秒更改

音频的最大样本数。 -async 1是一种特殊情况,其中仅对音频流的开始进行校正,

而无需进行任何后续的校正。

注意,muxer可以进一步修改时间戳。 例如,在启用格式选项prevent_negative_ts

的情况下。

这个选项已经被丢弃,请使用aresample代替。

-copyts

不处理输入时间戳,保留它们的值而不是试图清理它们,特别是,请勿删除初始

开始时间偏移值。

注意,根据vsync选项或特定的muxer处理(例如,在启用格式选项void_negative_ts

的情况下),即使选择了此选项,输出时间戳也可能与输入时间戳不匹配。

-start_at_zero

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

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

开始。

-copytb mode

指定在流复制时如何设置encoder时间基, mode是一个整数值,可以是以下值之一:

1

使用demuxer时间基。

时间基从相应的输入demuxer复制到输出encoder。 在复制具有可变帧率的

视频流时,有时需要避免非单调增加时间戳。

0

使用decoder时间基。

时间基从相应的输入decoder复制到输出encoder。

-1

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

默认值是-1.

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

设置encoder时间基,timebase是浮点数,可以是下面值之一:

0

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

对于视频-使用1/framerate(帧率),对于音频-使用1/samplerate(采样率)。

-1

尽可能使用输入流时间基。

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

>0

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

该字段可以以两个整数的比例(例如1:24、1:48000)或浮点数

(例如0.04166、2.0833e-5)的形式提供.

默认值是0。

-bitexact (input/output)

为(de)muxer 和 (de/en)coder 启用位精确模式。

-shortest (output)

最短的输入流终点,结束编码。

-dts_delta_threshold

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

-dts_error_threshold seconds

时间戳记错误增量阈值, 此阈值用于丢弃疯狂的/损坏的时间戳,默认值为30小时,

它是任意选择的,非常保守。

-muxdelay seconds (output)

设置最大demux-decode延迟。

-muxpreload seconds (output)

设置初始demux-decode延迟。

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

将新的stream-id值分配给输出流,该选项应在其应用的输出文件名之前指定,对于

存在多个输出文件的情况,可以将stream-id重新分配其它值。

例,将索引为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是以逗号分隔开的比特流过滤器

列表。 使用-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

指定写入timecode。 SEP是“:”代表非掉线timecode,是“;”(或“.”)代表

掉线timecode.

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

-filter_complex filtergraph (global)

定义一个复杂过滤器图,即一个具有任意数量的输入和/或输出的过滤器图。 对应的

是简单过滤器图,具有一个输入和一个相同类型的输出的过滤器图。

filtergraph是对过滤器图的描述,如ffmpeg-filters手册中的“Filtergraph syntax”

部分所述。

输入链接标签必须使用[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]此处是指第一个输入文件中的第一个视频流,该视频流链接到overlay过滤器的第一个(主)输入;类似地,第二个输入中的第一个视频流链接到第二个(覆盖)输入。

假设每个输入文件中只有一个视频流,我们可以省略输入标签,因此上述等效于:

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

从文件或设备读取时,此选项设置排队的数据包的最大数量。在低延迟/高速率的

实时流中,如果未及时读取数据包,则可能会丢弃这些数据包;

设置此值可以强制ffmpeg使用单独的输入线程,并在数据包到达时立即读取它们。

默认情况下,ffmpeg仅在指定了多个输入的情况下才这样做。

-sdp_file file (global)

将输出流的sdp信息打印到文件中, 这样,当至少一个输出不是rtp流时,就可以

转储sdp信息(要求至少一种输出格式为rtp)。

-discard (input)

允许丢弃特定的流或流中的帧,可以使用all将所有输入全部丢弃,而从流中选择性

丢弃帧发生在demuxer上,并非所有demuxer都支持。

none

不丢弃任何帧。

default

默认, 不丢弃任何帧.

noref

丢弃所有非参考帧。

bidir

丢弃所有双向帧.

nokey

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

all

丢弃所有帧。

-abort_on flags (global)

在某种情况下停止并中止,以下值可用:

empty_output

没有数据包传递到muxer,输出为空。

empty_output_stream

在某些输出流中,没有数据包传递到muxer。

-xerror (global)

遇到错误停止和退出。

-max_muxing_queue_size packets (output,per-stream)

在对音频或视频流进行代码转换时,这些流每个都至少有一个数据包后,ffmpeg才

开始写入输出,在等待发生这种情况时,会缓冲其他流的数据包,此选项设置此缓冲

区的大小(以包为单位)。

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

-muxing_queue_data_threshold bytes (output,per-stream)

这是一个最小阈值,直到未考虑混合队列大小为止。 默认为每个流50兆字节,

并基于传递给muxer的数据包的整体大小。

-auto_conversion_filters (global)

在所有过滤器图中启用自动插入格式转换过滤器,包括由-vf,-af,

-filter_complex和-lavfi定义的那些。

如果过滤器格式协商需要转换,则过滤器的初始化将失败。 仍然可以通过插入

相关的转换过滤器(比例,面积样本)来执行转换。

默认情况下为开,要禁用它,指定-noauto_conversion_filters。

有一个特殊的例外,可以使用位图字幕流作为输入:它将转换为与文件中最大视频

大小相同的视频,如果没有视频,则为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 预设文件(Preset files)

预设文件包含一系列的option=value对,每行一对,指定了一系列在命令行上的选项

序列。 以井号('#')开头的行将被忽略,并用于提供注释。

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

5.12.1 ffpreset files

ffpreset文件使用vpre、apre、spre、、fpre选项指定,fpre选项将预设的文件名而

不是预设名称作为输入,并且可以用于任何类型的编解码器。

对于vpre、apre、spre选项,预设文件中指定的选项将应用于与预设选项相同类型的

当前选定编解码器。

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

ffmpeg 将在下面目录中顺序搜索名为arg.ffpreset的文件,$FFMPEG_DATADIR

目录(如果已设置)、$HOME/.ffmpeg目录、以及在配置时定义的datadir(通常

是PREFIX / share / ffmpeg)、

或者ffpresets文件夹中的目录。 如果参数为libvpx-1080p,它将搜索文件

libvpx-1080p.ffpreset。

如果找搜索此类文件,则ffmpeg将在上述目录中搜索名为codec_name-arg.ffpreset

的文件,其中codec_name是将对其应用预设文件选项的编解码器的名称。

例如,如果选择带有-vcodec libvpx的视频编解码器并使用-vpre 1080p,则它将

搜索文件libvpx-1080p.ffpreset。

5.12.2 avpreset files

使用pre选项指定avpreset文件, 它们的工作方式与ffpreset文件类似,但是它们仅允许

特定encoder-选项, 因此,不能使用指定编码器的“选项=值”对。

指定pre选项后,ffmpeg将顺序在$ AVCONV_DATADIR目录(如果已设置)

和$ HOME / .avconv目录中以及配置时定义的datadir(通常为

PREFIX / share / ffmpeg)中查找后缀为.avpreset的文件。

首先,ffmpeg在上述目录中搜索名为codec_name-arg.avpreset的文件,

其中codec_name是将对其应用预设文件选项的编解码器的名称。

例如,如果您使用-vcodec libvpx选择视频编解码器并使用-pre 1080p,则它将

搜索文件libvpx-1080p.avpreset。

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