1 在命令行上找到的任何不能被解释为选项的东西都被认为是输出 url
2 在选项中引用输入文件,您必须使用它们的索引(从 0 开始)。例如。第一个输入文件是 0,第二个是 1,
依此类推。类似地,文件中的流由它们的索引引用。例如。 2:3 指的是第三个输入文件中的第四个流
3 选项应用于下一个指定文件。
4 ffmpeg -i input.avi -b:v 64k -bufsize 64k output.avi #将输出文件的视频比特率设置为 64 kbit/s
5. ffmpeg -i input.avi -r 24 output.avi #输出文件的帧速率强制为 24 fps
6. ffmpeg -r 1 -i input.m2v -r 24 output.avi #强制输入文件的帧速率(仅对原始格式有效)为 1 fps,输出文件的帧速率为 24 fps
7. 在编码之前,ffmpeg 可以使用 libavfilter 库中的过滤器处理原始音频和视频帧。ffmpeg 区分两种类型的过滤器图:简单和复杂
8. 简单的过滤器图是那些只有一个输入和输出的,两者都是相同的类型
9. 使用 per-stream-filter 选项配置简单的过滤器图(分别为视频和音频使用 -vf 和 -af 别名)。一个简单的视频过滤图可以看起来像这样:缩放、去隔行
10. 复杂的过滤器图不能简单地描述为应用于一个流的线性处理链。例如,当图形具有多个输入和/或输出,或者输出流类型与输入不同时,就是这种情况
11 复杂过滤器图使用 -filter_complex 选项进行配置。请注意,此选项是全局的,因为复杂的过滤器图就其性质而言,不能明确地与单个流或文件相关联。
12 -lavfi 选项等效于 -filter_complex。
13复杂过滤器图的一个简单示例是叠加过滤器,它有两个视频输入和一个视频输出,其中一个视频叠加在另一个之上。它的音频对应物是 amix 过滤器。
14 流复制是通过将copy参数提供给 -codec 选项来选择的模式。它使ffmpeg省略了指定流的解码和编码步骤
15 所以它只做解复用和复用。它对于更改容器格式或修改容器级元数据很有用
16 于没有解码或编码,所以速度非常快,没有质量损失。但是,由于许多因素,它在某些情况下可能不起作用。应用过滤器显然也是不可能的,因为过滤器适用于未压缩的数据
17 ffmpeg 提供了 -map 选项,用于手动控制每个输出文件中的流选择。用户可以跳过 -map 并让 ffmpeg 执行自动流选择,如下所述。 -vn / -an / -sn / -dn
选项可用于分别跳过包含视频、音频、字幕和数据流,无论是手动映射还是自动选择,但那些作为复杂过滤器图输出的流除外
18 自动流选择:在特定输出文件没有任何map选项的情况下,ffmpeg 检查输出格式以检查其中可以包含哪种类型的流,即。视频、音频和/或字幕
对于每种可接受的流类型,ffmpeg 将从所有输入中选择一个流(如果可用)
它将根据以下标准选择该流:
对于视频,它是最高分辨率的流
对于音频,它是具有最多通道的流
对于字幕,它是找到的第一个字幕流,但有一个警告。输出格式的默认字幕编码器可以是基于文本或基于图像的,并且只会选择相同类型的字幕流。
在相同类型的多个流速率相同的情况下,选择具有最低索引的流。
数据或附件流不会自动选择,只能使用 -map 包含在内。
19 自动流选择:使用 -map 时,该输出文件中仅包含用户映射的流,但下面描述的 filtergraph 输出可能有一个例外。
20 复杂的过滤器:xx
21 流处理独立于流选择,下面描述的字幕除外。流处理是通过 -codec 选项设置的,该选项针对特定输出文件中的流。
特别是,ffmpeg 在流选择过程之后应用编解码器选项,因此不会影响后者。如果没有为流类型指定 -codec 选项,ffmpeg 将选择输出文件复用器注册的默认编码器
22 字幕存在例外。如果为输出文件指定了字幕编码器,则将包含找到的任何类型、文本或图像的第一个字幕流。 ffmpeg 不验证指定的编码器是否可以转换选定的流,
或者转换后的流在输出格式中是否可接受。这通常也适用:当用户手动设置编码器时,流选择过程无法检查编码流是否可以复用到输出文件中。如果不能,ffmpeg 将中止,并且所有输出文件都将无法处理
23:example
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
out1.mkv out2.wav自动流选择
out1.mkv
video B.mp4-stream 0 #分辨率最大
audio B.mp4-stream 3#通道数最多
subtitles B.mp4-stream 2#第一个字幕
out2.wav
audio B.mp4-stream 3#通道数最多
out3.mov
-map 1:a 选择B.mp4中的所有音频流 a:all
-c:a copy -codec:a copy,不用编解码
-----------------------------------------------
ffmpeg -i C.mkv out1.mkv -c:s dvdsub -an out2.mkv
out1.mkv
C.mkv的字幕流默认是图像的,默认的是基于文本的,所以转码会失败,这个流不被选择
out2.mkv -c:s -codec:s 字幕编码器被指定,因此字幕流被选择,视频被选择
-an 音频被禁止
------------------------------
ffmpeg -i A.avi -i C.mkv -i B.mp4 -filter_complex "overlay" out1.mp4 out2.srt
overlay:需要两个准确的视频输入,没有指定选择前2个
输出pad没有指定,就输出到out1.mp4,自定选择视频和音频
mp4没有默认的字幕编码器,用户也没有指定,所有不包含字幕
out2.srt:只接收基于文本的字幕,所以C.mkv被忽略,选择B.mp4的字幕
----------------------------------
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 的视频流被发送到hue色调过滤器,其输出被使用分割过滤器克隆一次,并且两个输出都被标记。然后将每个副本映射到第一个和第三个输出文件。
需要两个视频输入的覆盖过滤器使用前两个未使用的视频流。这些是来自 A.avi 和 C.mkv 的流。覆盖输出没有标记,因此无论是否存在 -map 选项,它都会发送到第一个输出文件 out1.mp4。
aresample 过滤器发送第一个未使用的音频流,即 A.avi 的音频流。由于此过滤器输出也未标记,因此它也被映射到第一个输出文件。 -an 的存在仅抑制音频流的自动或手动流选择,而不是从过滤器图发送的输出。这两个映射流都应在 out1.mp4 中的映射流之前排序。
映射到 out2.mkv 的视频、音频和字幕流完全由自动流选择决定
out3.mkv 包含来自色调过滤器的克隆视频输出和来自 B.mp4 的第一个音频流。
24 每个流都应用了一些选项,例如比特率或编解码器。流说明符用于精确指定给定选项属于哪个流
流说明符是通常附加到选项名称并用冒号分隔的字符串。例如。 -codec:a:1 ac3 包含 a:1 流说明符,它匹配第二个音频流。因此,它将为第二个音频流选择 ac3 编解码器
流说明符可以匹配多个流,以便将选项应用于所有流。例如。 -b:a 128k 中的流说明符匹配所有音频流。all
空流说明符匹配所有流。例如, -codec copy 或 -codec: copy 将复制所有流而不重新编码
流说明符的可能形式有:
stream_index:将流与此索引匹配。例如。 -threads:1 4 将第二个流的线程计数设置为 4。如果 stream_index 用作附加流说明符(见下文),则它从匹配流中选择流编号 stream_index。
流编号基于 libavformat 检测到的流的顺序,除非还指定了程序 ID。在这种情况下,它基于程序中流的顺序
stream_type[:additional_stream_specifier]:“v”或“V”表示视频,“a”表示音频,“s”表示字幕,“d”表示数据,“t”表示附件。 'v' 匹配所有视频流,'V' 仅匹配没有附加图片、
视频缩略图或封面艺术的视频流。如果使用了附加流说明符,则它匹配既具有这种类型又匹配附加流说明符的流。否则,它匹配指定类型的所有流。
p:program_id[:additional_stream_specifier]:匹配程序中 ID 为 program_id 的流。如果使用了附加流说明符,则它匹配既是程序的一部分又匹配附加流说明符的流。
#stream_id or i:stream_id:通过流 id 匹配流(例如 MPEG-TS 容器中的 PID)
m:key[:value]:将流与具有指定值的元数据标记键匹配。如果未给出 value,则匹配包含给定标签的流和任何值
u:将流与可用配置匹配,必须定义编解码器,并且必须提供视频尺寸或音频采样率等基本信息。 请注意,在 ffmpeg 中,元数据匹配仅适用于输入文件。
25 通用选项,ff*共享 --help [arg]
long 除基本工具选项外,还可打印高级工具选项。
full 打印完整的选项列表,包括编码器、解码器、解复用器、复用器、过滤器等的共享和私有选项
decoder=decoder_name
encoder=encoder_name
demuxer=demuxer_name
muxer=muxer_name
filter=filter_name
bsf=bitstream_filter_name
protocol=protocol_name
-protocols
-version
-buildconf
-formats
-filters
-bsfs
-encoders
-decoders
-demuxers
-muxers
-codecs
-devices
-pix_fmts
-sample_fmts
-layouts 显示频道名称和标准频道布局。
-dispositions 显示流配置
-colors
-sources device[,opt1=val1[,opt2=val2]...] 显示输入设备的自动检测来源。某些设备可能会提供无法自动检测的与系统相关的源名称。不能假定返回的列表总是完整的
-sinks device[,opt1=val1[,opt2=val2]...] 显示输出设备的自动检测接收器。某些设备可能会提供无法自动检测的与系统相关的接收器名称。不能假定返回的列表总是完整的。
-loglevel [flags+]loglevel | -v [flags+]loglevel:可选flags前缀可以包含以下值
repeat 表示不应该将重复的日志输出压缩到第一行,并且将省略“最后一条消息重复n次”行。
level 指示日志输出应为每个消息行添加 [level] 前缀。这可以用作日志着色的替代方法,例如将日志转储到文件时。
标志也可以单独使用,通过添加'+'/'-'前缀来设置/重置单个标志,而不影响其他标志或更改日志级别。当同时设置标志和日志级别时,在最后一个标志值和日志级别之前需要一个“+”分隔符。
loglevel 是包含以下值之一的字符串或数字
‘quiet, -8’Show nothing at all; be silent.
‘panic, 0’仅显示可能导致进程崩溃的致命错误,例如断言失败。这目前不用于任何事情
‘fatal, 8’ 只显示致命错误。这些是错误,之后该过程绝对无法继续。
‘error, 16’显示所有错误,包括可以从中恢复的错误
‘warning, 24’示所有警告和错误。将显示与可能不正确或意外事件相关的任何消息。
‘info, 32’在处理过程中显示信息性消息。这是对警告和错误的补充。这是默认值。
‘verbose, 40’与 info 相同,但更详细。
‘debug, 48’显示所有内容,包括调试信息。
‘trace, 56’
例如要启用重复的日志输出,添加级别前缀,并将日志级别设置为详细
ffmpeg -loglevel repeat+level+verbose -i input output
默认情况下,程序记录到 stderr。如果终端支持着色,则使用颜色来标记错误和警告。设置环境变量 AV_LOG_FORCE_NOCOLOR 可以禁用日志着色,
也可以强制设置环境变量 AV_LOG_FORCE_COLOR
-repeat 将完整的命令行和日志输出转储到当前目录中名为 program-YYYYMMDD-HHMMSS.log 的文件中。此文件可用于错误报告。它还暗示 -loglevel debug
将环境变量 FFREPORT 设置为任何值都具有相同的效果。如果 value 是一个 ':' 分隔的 key=value 序列,这些选项会影响报告;
如果选项值包含特殊字符或选项分隔符“:”,则必须对其进行转义(请参阅 ffmpeg-utils 手册中的“引用和转义”部分)
可识别以下选项:
file 设置用于报告的文件名; %p 扩展为程序名称,%t 扩展为时间戳,%% 扩展为普通 %
level 等级 使用数值设置日志详细级别(请参阅 -loglevel)。
例如,要使用日志级别 32(日志级别信息的别名)将报告输出到名为 ffreport.log 的文件:
FFREPORT=file=ffreport.log:level=32 ffmpeg -i input output
解析环境变量的错误不是致命的,也不会出现在报告中。
-----------------------------------------
-hide_banner 所有 FFmpeg 工具通常都会显示版权声明、构建选项和库版本。此选项可用于禁止打印此信息
-cpuflags flags (global) 允许设置和清除 cpu 标志。此选项用于测试。除非您知道自己在做什么,否则不要使用它
ffmpeg -cpuflags -sse+mmx ...
ffmpeg -cpuflags mmx ...
ffmpeg -cpuflags 0 ...
Possible flags for this option are:
‘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 计数的检测
5.3 AVOptions
这些选项由 libavformat、libavdevice 和 libavcodec 库直接提供。要查看可用 AVOptions 的列表,请使用 -help 选项。它们分为两类:
generic These options can be set for any container, codec or device. Generic options are listed under AVFormatContext options for containers/devices and under AVCodecContext options for codecs.
private These options are specific to the given container, device or codec. Private options are listed under their corresponding containers/devices/codecs.
For example to write an ID3v2.3 header instead of a default ID3v2.4 to an MP3 file, use the id3v2_version private option of the MP3 muxer:
ffmpeg -i input.flac -id3v2_version 3 out.mp3
所有编解码器 AVOptions 都是每个流的,因此应该将流说明符附加到它们
ffmpeg -i multichannel.mxf -map 0:v:0 -map 0:a:0 -map 0:a:0 -c:a:0 ac3 -b:a:0 640k -ac:a:1 2 -c:a:1 aac -b:2 128k out.mp4
在上面的示例中,多声道音频流被映射两次以进行输出。第一个实例使用编解码器 ac3 和比特率 640k 进行编码。第二个实例被缩混为 2 个通道并使用编解码器 aac 进行编码。使用输出流的绝对索引为其指定 128k 的比特率。
-nooption 语法不能用于布尔 AVOptions,请使用 -option 0/-option 1。
5.4 Main options
-f fmt (input/output) 强制输入或输出文件格式。通常会自动检测输入文件的格式,并根据输出文件的文件扩展名猜测格式,因此在大多数情况下不需要此选项。
-i url (input) input file url
-y (global) Overwrite output files without asking
-n (global) Do not overwrite output files, and exit immediately if a specified output file already exists.\
-stream_loop number (input) 设置输入流应循环的次数。循环 0 表示无循环,循环 -1 表示无限循环。
-recast_media (global) 允许强制使用与解复用器检测或指定的媒体类型不同的解码器。对于解码混合为数据流的媒体数据很有用。
-c[:stream_specifier] codec (input/output,per-stream)
-codec[:stream_specifier] codec (input/output,per-stream)
ffmpeg -i INPUT -map 0 -c:v libx264 -c:a copy OUTPUT
对于每个流,最后一个匹配的 c 选项被应用,所以
ffmpeg -i INPUT -map 0 -c copy -c:v:1 libx264 -c:a:137 libvorbis OUTPUT
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.
-t duration (input/output)
当用作输入选项时(在 -i 之前),限制从输入文件读取数据的持续时间。
当用作输出选项时(在输出 url 之前),在其持续时间达到持续时间后停止写入输出。
duration 必须是持续时间规范,请参阅 (ffmpeg-utils) ffmpeg-utils(1) 手册中的持续时间部分。
-to 和 -t 互斥,-t 具有优先级。
-to position (input/output)停止在位置写入输出或读取输入。位置必须是持续时间规范
-fs limit_size (output) 设置文件大小限制,以字节表示。超出限制后不再写入更多字节块。输出文件的大小略大于请求的文件大小
-ss position (input/output) 当用作输入选项时(在 -i 之前),在此输入文件中查找位置。请注意,在大多数格式中,不可能精确查找,
因此 ffmpeg 将查找位置之前最近的查找点。当转码和 -accurate_seek 启用(默认)时,搜索点和位置之间的这个额外段将被解码并丢弃。在进行流复制或使用 -noaccurate_seek 时,它将被保留。
当用作输出选项时(在输出 url 之前),解码但丢弃输入,直到时间戳到达位置。
-sseof position (input) 与 -ss 选项类似,但相对于“文件结尾”。也就是说,负值在文件中较早,0 在 EOF 处。
-isync input_index (input) 将输入分配为同步源
这将获取目标和参考输入的开始时间之间的差异,并将目标文件的时间戳偏移该差异。两个输入的源时间戳应来自相同的时钟源以获得预期结果。如果设置了 copyts,则还必须设置 start_at_zero。如果任一输入没有起始时间戳,则不进行同步调整。
可接受的值是那些引用有效 ffmpeg 输入索引的值。如果同步引用是目标索引本身或 -1,则不对目标时间戳进行任何调整。同步参考本身可能不会同步到任何其他输入。
Default value is -1.
-itsoffset offset (input) 偏移量被添加到输入文件的时间戳中。指定一个正的偏移量意味着相应的流被延迟了偏移量中指定的持续时间。
-itsscale scale (input,per-stream) Rescale input timestamps. scale should be a floating point number.
-timestamp date (output) 在容器中设置录制时间戳。
-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 To set the language of the first audio stream:
-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)
创建具有指定标题 program_num 的程序并将指定的流添加到其中。
-target type (output)
指定目标文件类型(vcd、svcd、dvd、dv、dv50)。 type 可以以 pal-、ntsc- 或 film- 为前缀以使用相应的标准。然后自动设置所有格式选项(比特率、编解码器、缓冲区大小)。您只需键入
ffmpeg -i myfile.avi -target vcd /tmp/vcd.mpg
-dn 输入选项,阻止文件的所有数据流被过滤或被自动选择或映射以用于任何输出。请参阅 -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 的含义取决于编解码器。如果 qscale 在没有 stream_specifier 的情况下使用,则它仅适用于视频流,这是为了保持与先前行为的兼容性,并且为 2 个不同的编解码器指定相同的编解码器特定值,即音频和视频通常不是没有 stream_specifier 时的预期用来。
-filter[:stream_specifier] filtergraph (output,per-stream)
创建由 filtergraph 指定的 filtergraph 并使用它来过滤流
filtergraph 是对要应用于流的过滤器图的描述,并且必须具有相同类型的流的单个输入和单个输出。在 filtergraph 中,输入与标签 in 相关联,输出与标签 out 相关联。有关 filtergraph 语法的更多信息,请参阅 ffmpeg-filters 手册
如果要创建具有多个输入和/或输出的过滤器图,请参阅 -filter_complex 选项。
-filter_script[:stream_specifier] filename (output,per-stream)
此选项类似于 -filter,唯一的区别是它的参数是要从中读取 filtergraph 描述的文件的名称
-reinit_filter[:stream_specifier] integer (input,per-stream)
此布尔选项确定当输入帧参数在中途更改时是否重新初始化此流所馈送的过滤器图。默认情况下启用此选项,因为大多数视频和所有音频过滤器都无法处理输入帧属性中的偏差。重新初始化后,现有的过滤器状态会丢失,例如某些过滤器中可用的帧计数 n 参考。在重新初始化时缓冲的任何帧都将丢失。对于视频、帧分辨率或像素格式,更改触发重新初始化的属性是;用于音频、采样格式、采样率、通道数或通道布局
-filter_threads nb_threads (global)
定义用于处理过滤器管道的线程数。每个管道将生成一个线程池,其中有这么多线程可用于并行处理。默认值是可用 CPU 的数量。
-pre[:stream_specifier] preset_name (output,per-stream)
指定匹配流的预设。
-stats (global) 打印编码进度/统计信息。默认情况下它处于启用状态,要显式禁用它,您需要指定 -nostats
-stats_period time (global) 设置更新编码进度/统计信息的周期。默认值为 0.5 秒。
-progress url (global) 将程序友好的进度信息发送到 url。
进度信息会定期写入并在编码过程结束时写入。它由“key=value”行组成。 key 仅包含字母数字字符。进度信息序列的最后一个键始终是“进度”。
使用 -stats_period 设置更新周期。
-stdin 在标准输入上启用交互。默认情况下打开,除非标准输入用作输入。要显式禁用交互,您需要指定 -nostdin。
禁用标准输入上的交互很有用,例如,如果 ffmpeg 在后台进程组中。使用 ffmpeg ... < /dev/null 可以实现大致相同的结果,但它需要一个 shell。
-debug_ts (global) 打印时间戳信息。默认情况下它是关闭的。此选项主要用于测试和调试目的,并且输出格式可能会从一个版本更改为另一个版本,因此可移植脚本不应使用它。
See also the option -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 的文件中。如果文件名为空,则将使用文件名元数据标记的值。
ffmpeg -dump_attachment:t:0 out.ttf -i INPUT 将第一个附件提取到名为“out.ttf”的文件中
ffmpeg -dump_attachment:t "" -i INPUT 提取由文件名标签确定的文件的所有附件:
5.5 Video Options
-frames:v number (output) 设置要输出的视频帧数
-fpsmax[:stream_specifier] fps (output,per-stream) 设置最大帧速率(Hz 值、分数或缩写)
当输出帧率自动设置且高于此值时,钳制输出帧率。在批处理或输入帧速率被错误地检测为非常高时很有用。它不能与-r 一起设置。它在流复制期间被忽略。
-s[:stream_specifier] size (input/output,per-stream) Set frame size
作为输入选项,这是 video_size 私有选项的快捷方式,被一些解复用器识别,其帧大小未存储在文件中或可配置 - 例如原始视频或视频采集器。
作为输出选项,这会将scale视频过滤器插入到相应过滤器图的末尾。请直接使用scale过滤器将其插入开头或其他位置
-aspect[:stream_specifier] aspect (output,per-stream) 设置 aspect 指定的视频显示宽高比
aspect 可以是浮点数字符串,也可以是 num:den 形式的字符串,其中 num 和 den 是纵横比的分子和分母。例如,“4:3”、“16:9”、“1.3333”和“1.7777”是有效的参数值。
如果与 -vcodec copy 一起使用,它将影响存储在容器级别的纵横比,但不会影响存储在编码帧中的纵横比(如果存在)
-vn (input/output) 作为输入选项,阻止文件的所有视频流被过滤或被自动选择或映射以用于任何输出。请参阅 -discard 选项以单独禁用流。
作为输出选项,禁用视频录制,即自动选择或映射任何视频流。如需完全手动控制,请参阅 -map 选项。
-vcodec codec (output) Set the video codec. This is an alias for -codec:v
-pass[:stream_specifier] n (output,per-stream)
选择pass number(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”。完整的文件名将是 PREFIX-N.log,其中 N 是特定于输出流的数字
-vf filtergraph (output) 创建由 filtergraph 指定的 filtergraph 并使用它来过滤流
This is an alias for -filter:v, see the -filter option
-autorotate 根据文件元数据自动旋转视频。默认启用,使用 -noautorotate 禁用它。
-autoscale 简体)
根据第一帧的分辨率自动缩放视频。默认启用,使用 -noautoscale 禁用它。禁用自动缩放时,过滤器图的所有输出帧可能不具有相同的分辨率,并且可能不适用于某些编码器/复用器。因此,除非您真的知道自己在做什么,否则不建议禁用它。禁用自动缩放需要您自担风险。
5.6 Advanced Video options
-pix_fmt[:stream_specifier] format (input/output,per-stream)
设置像素格式。使用 -pix_fmts 显示所有支持的像素格式。如果选择的像素格式无法选择,ffmpeg会打印警告并选择编码器支持的最佳像素格式。如果 pix_fmt 以 + 为前缀,如果请求的像素格式无法选择,ffmpeg 将退出并报错,并且过滤器图内的自动转换被禁用。如果 pix_fmt 是单个 +,则 ffmpeg 选择与输入(或图形输出)相同的像素格式并禁用自动转换。
-sws_flags flags (input/output) 设置 缩放器标志
-rc_override[:stream_specifier] override (output,per-stream)
特定间隔的速率控制覆盖,格式为“int,int,int”列表,用斜杠分隔。两个第一个值是开始和结束帧号,最后一个是量化器,如果为正,则为质量因子,如果为负
-ilme 强制在编码器中支持隔行扫描(仅限 MPEG-2 和 MPEG-4)。如果您的输入文件是隔行扫描的,并且您希望保持隔行扫描格式以减少损失,请使用此选项。另一种方法是使用 yadif 或 bwdif 等过滤器对输入流进行去隔行处理,但去隔行处理会带来损失。
-psnr 计算压缩帧的 PSNR
-vstats 将视频编码统计信息转储到 vstats_HHMMSS.log。
-vstats_file file 将视频编码统计信息转储到文件中
-vstats_version file 指定要使用的 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
version > 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 (output,per-stream) top=1/bottom=0/auto=-1 field first
-dc precision Intra_dc_precision.
-vtag fourcc/tag (output) Force video tag/fourcc. This is an alias for -tag:v.
-qphist (global) Show QP histogram
-copyinkf[:stream_specifier] (output,per-stream) 在进行流复制时,还要复制开头找到的非关键帧。
-init_hw_device type[=name][:device[,key=value...]] 使用给定的设备参数初始化一个名为 name 类型的新硬件设备。如果未指定名称,它将收到格式为“type%d”的默认名称。
-hwaccel[:stream_specifier] hwaccel (input,per-stream) 使用硬件加速来解码匹配的流
-hwaccel_device[:stream_specifier] hwaccel_device (input,per-stream) 选择用于硬件加速的设备
仅当还指定了 -hwaccel 选项时,此选项才有意义。它可以通过名称引用使用 -init_hw_device 创建的现有设备,也可以创建一个新设备,就像之前立即调用了'-init_hw_device' type:hwaccel_device 一样。
-hwaccels 列出此 ffmpeg 版本中启用的所有硬件加速组件。实际运行时可用性取决于所安装的硬件及其合适的驱动程序。
5.7 Audio Options
-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) Set the audio codec. This is an alias for -codec:a
-sample_fmt[:stream_specifier] sample_fmt (output,per-stream) 设置音频样本格式。使用 -sample_fmts 获取支持的示例格式列表。
-af filtergraph (output) This is an alias for -filter:a
5.8 Advanced Audio options
-atag fourcc/tag (output) Force audio tag/fourcc. This is an alias for -tag:a
-guess_layout_max channels (input,per-stream)
如果某些输入通道布局未知,则仅在最多对应于指定数量的通道时尝试猜测。例如,2 告诉 ffmpeg 将 1 个通道识别为单声道,将 2 个通道识别为立体声,但不将 6 个通道识别为 5.1。默认设置是始终尝试猜测。使用 0 禁用所有猜测
5.9 Subtitle options
-scodec codec (input/output) This is an alias for -codec:s
-sn (input/output) 作为输入选项,阻止文件的所有字幕流被过滤或自动选择或映射以用于任何输出。请参阅 -discard 选项以单独禁用流。
作为输出选项,禁用字幕录制,即自动选择或映射任何字幕流。如需完全手动控制,请参阅 -map 选项
5.10 Advanced Subtitle options
-fix_sub_duration 修复字幕持续时间。对于每个字幕,等待同一流中的下一个数据包并调整第一个数据包的持续时间以避免重叠。这对于一些字幕编解码器是必要的,尤其是 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 设置哪个输入流用作演示同步参考。
The first -map option on the command line specifies the source for output stream 0, the second -map option specifies the source for output stream 1, etc.
流标识符前的 - 字符创建“负”映射。它从已创建的映射中禁用匹配流。
尾随 ?在流索引之后将允许映射是可选的:如果映射不匹配任何流,则映射将被忽略而不是失败。请注意,如果使用了无效的输入文件索引,映射仍然会失败;例如如果map引用了一个不存在的输入
另一种 [linklabel] 表单会将复杂过滤器图的输出(请参阅 -filter_complex 选项)映射到输出文件。 linklabel 必须对应于图中定义的输出链接标签
将第一个输入文件中的所有流映射到输出
ffmpeg -i INPUT -map 0 output
例如,如果您在第一个输入文件中有两个音频流,则这些流由“0:0”和“0:1”标识。您可以使用 -map 选择要放置在输出文件中的流。例如:
ffmpeg -i INPUT -map 0:1 out.wav INPUT 中由“0:1”标识的输入流映射到 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
要映射除第二个音频之外的所有流,请使用负映射
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”是单声道,如果是两个则为立体声等)。如果输入和输出通道布局不匹配(例如两个“-map_channel”选项和“-ac 6”),则将“-ac”与“-map_channel”结合使用可以更新通道增益级别
您还可以将输入的每个通道提取到特定的输出;以下命令将 INPUT 音频流(文件 0,流 0)的两个通道提取到各自的 OUTPUT_CH0 和 OUTPUT_CH1 输出:
ffmpeg -i INPUT -map_channel 0.0.0 OUTPUT_CH0 -map_channel 0.0.1 OUTPUT_CH1
以下示例将立体声输入的通道拆分为两个单独的流,并将它们放入同一个输出文件中
ffmpeg -i stereo.wav -map 0:0 -map 0:0 -map_channel 0.0.0:0.0 -map_channel 0.0.1:0.1 -y out.ogg
-map_metadata[:metadata_spec_out] infile[:metadata_spec_in] (output,per-metadata)
从 infile 设置下一个输出文件的元数据信息。请注意,这些是文件索引(从零开始),而不是文件名。可选的 metadata_spec_in/out 参数指定要复制的元数据。元数据说明符可以具有以下形式:
g 全局元数据,即适用于整个文件的元数据
s[:stream_spec] 每个流元数据。 stream_spec 是流说明符,如流说明符一章中所述。在输入元数据说明符中,复制第一个匹配流。在输出元数据说明符中,所有匹配的流都被复制到。
c:chapter_index 每章元数据。 chapter_index 是从零开始的章节索引。
p:program_index 每个程序的元数据。 program_index 是从零开始的节目索引。
如果省略元数据说明符,则默认为全局。
默认情况下,全局元数据从第一个输入文件复制,每个流和每个章节的元数据与流/章节一起复制。通过创建相关类型的任何映射来禁用这些默认映射。负文件索引可用于创建仅禁用自动复制的虚拟映射。
例如,将元数据从输入文件的第一个流复制到输出文件的全局元数据
ffmpeg -i in.ogg -map_metadata 0:s:0 out.mp3
做相反的事情,即将全局元数据复制到所有音频流:
ffmpeg -i in.mkv -map_metadata:s:a 0:g out.mkv
请注意,简单的 0 在此示例中也可以正常工作,因为默认情况下假定为全局元数据。
-map_chapters input_file_index (output) 将索引为 input_file_index 的输入文件中的章节复制到下一个输出文件。如果未指定章节映射,则从包含至少一个章节的第一个输入文件中复制章节。使用负文件索引禁用任何章节复制。
-benchmark (global) 在编码期间显示基准测试信息。显示在各个步骤(音频/视频编码/解码)中使用的真实时间、系统时间和用户时间
-benchmark_all (global) 在编码期间显示基准测试信息。显示在各个步骤(音频/视频编码/解码)中使用的真实时间、系统时间和用户时间
-timelimit duration (global) 在 ffmpeg 在 CPU 用户时间内运行了 duration 秒后退出。
-dump (global) 将每个输入数据包转储到 stderr。
-hex (global) 转储数据包时,还转储有效负载。
-readrate speed (input) 限制输入读取速度。它的值是一个浮点正数,表示媒体的最大持续时间(以秒为单位),应该在挂钟时间的一秒内摄取。默认值为零,表示对摄取速度没有强加限制。值1代表实时速度,相当于-re
主要用于模拟捕获设备或实时输入流(例如从文件读取时)。当输入是实际捕获设备或实时流时,不应使用低值,因为它可能会导致数据包丢失。
当输出数据包的流速很重要时,它很有用,例如实时流。
-re (input) 以原生帧速率读取输入。这相当于设置 -readrate 1。
-vsync parameter (global)
-fps_mode[:stream_specifier] parameter (output,per-stream)
设置视频同步方式/帧率模式。 vsync 应用于所有输出视频流,但可以通过设置 fps_mode 为流覆盖。 vsync 已弃用,将来将被删除。
出于兼容性原因,vsync 的一些值可以指定为数字(在下表的括号中显示)。
-frame_drop_threshold parameter 丢帧阈值,它指定视频帧在被丢弃之前可以落后多少。在帧速率单位中,所以 1.0 是一帧。默认值为 -1.1。一种可能的用例是在有噪声的时间戳的情况下避免丢帧,或者在时间戳准确的情况下提高丢帧精度。
-adrift_threshold time 设置时间戳和音频数据之间的最小差异(以秒为单位)以触发添加/删除样本以使其与时间戳匹配。此选项实际上是在硬(添加/删除)和软(挤压/拉伸)补偿之间进行选择的阈值。 -async 必须设置为正值。
-apad parameters (output,per-stream) 填充输出音频流。这与应用 -af apad 相同。 Argument 是一串与 apad 过滤器相同的过滤器参数。必须为此输出设置 -shortest 才能使选项生效。
-copyts 不要处理输入时间戳,而是保留它们的值而不尝试清理它们。特别是,不要删除初始开始时间偏移值。
请注意,根据 vsync 选项或特定的复用器处理(例如,如果启用了格式选项 Avoid_negative_ts),即使选择了此选项,输出时间戳也可能与输入时间戳不匹配。
-start_at_zero 与副本一起使用时,移动输入时间戳,使其从零开始。这意味着使用例如-ss 50 将使输出时间戳从 50 秒开始,无论输入文件从哪个时间戳开始。
-copytb mode 指定流复制时如何设置编码器时基。 mode 是一个整数数值,可以采用以下值之一
1:使用解复用器时基,基从相应的输入解复用器复制到输出编码器。在复制具有可变帧速率的视频流时,有时需要这样做以避免非单调增加的时间戳。
0:使用解码器时基。时基从相应的输入解码器复制到输出编码器
-1:尝试自动做出选择,以生成合理的输出。Default value is -1.
-enc_time_base[:stream_specifier] timebase (output,per-stream) 设置编码器时基。 timebase 是一个浮点数,可以采用以下值之一:
0:根据媒体类型分配默认值。 对于视频 - 使用 1/帧率,对于音频 - 使用 1/采样率。
-1:尽可能使用输入流时基。 如果输入流不可用,将使用默认时基
>0:使用提供的数字作为时基。他的字段可以提供为两个整数的比率(例如 1:24、1:48000)或浮点数(例如 0.04166、2.0833e-5)Default value is 0.
-bitexact (input/output) 为 (de)muxer 和 (de/en)coder 启用 bitexact 模式
-shortest (output) 当最短的输出流结束时完成编码。
-dts_delta_threshold 时间戳不连续增量阈值。
-dts_error_threshold seconds 时间戳错误增量阈值。此阈值用于丢弃疯狂/损坏的时间戳,默认值为 30 小时,这是任意选择的,非常保守
-muxdelay seconds (output) 设置最大解复用解码延迟。
-muxpreload seconds (output) 设置初始解复用解码延迟。
-streamid output-stream-index:new-value (output) 为输出流分配一个新的流 id 值。此选项应在其应用的输出文件名之前指定。对于存在多个输出文件的情况,流 ID 可以重新分配给不同的值。
例如,要将输出 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 是以逗号分隔的比特流过滤器列表。使用 -bsfs 选项获取比特流过滤器列表。
ffmpeg -i h264.mp4 -c:v copy -bsf:v h264_mp4toannexb -an out.h264
ffmpeg -i file.mov -an -vn -bsf:s mov2textsub -c:s copy -f rawvideo sub.txt
-tag[:stream_specifier] codec_tag (input/output,per-stream) 强制使用标签/fourcc 来匹配流
-timecode hh:mm:ssSEPff 指定写入时间码。 SEP 是 ':' 表示非丢弃时间码和 ';' (或 '.') 表示丢弃。
ffmpeg -i input.mpg -timecode 01:02:03.04 -r 30000/1001 -s ntsc output.mpg
-filter_complex filtergraph (global) 定义一个复杂的过滤器图,即具有任意数量的输入和/或输出的过滤器图
输入链接标签必须使用 [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
作为一个特殊的例外,您可以使用位图字幕流作为输入:它将被转换为与文件中最大视频相同大小的视频,如果没有视频,则为 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 秒的纯红色视频:
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 被完全丢弃,而从流中选择性丢弃帧发生在解复用器上,并非所有解复用器都支持。
none Discard no frame.
default Default, which discards no frames.
noref 丢弃所有非参考帧
bidir 丢弃所有双向帧
nokey 丢弃除关键帧之外的所有帧。
all Discard all frames.
-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 兆字节,并且基于传递给多路复用器的数据包的总大小。
-auto_conversion_filters (global) 启用在所有过滤器图中自动插入格式转换过滤器,包括由 -vf、-af、-filter_complex 和 -lavfi 定义的过滤器。如果过滤器格式协商需要转换,过滤器的初始化将失败。仍然可以通过在图中插入相关的转换过滤器(比例、样本)来执行转换。默认情况下,要显式禁用它,您需要指定 -noauto_conversion_filters
-bits_per_raw_sample[:stream_specifier] value (output,per-stream) 将给定输出流中每个原始样本的位数声明为值。请注意,此选项设置提供给编码器/复用器的信息,它不会更改流以符合此值。设置与流属性不匹配的值可能会导致编码失败或无效的输出文件
5.12 Preset files
ffpreset 文件使用 vpre、apre、spre 和 fpre 选项指定。 fpre 选项将预设的文件名而不是预设名称作为输入,并且可以用于任何类型的编解码器。对于 vpre、apre 和 spre 选项,预设文件中指定的选项将应用于当前选择的与预设选项相同类型的编解码器
传递给 vpre、apre 和 spre 预设选项的参数根据以下规则标识要使用的预设文件
首先 ffmpeg 在 $FFMPEG_DATADIR(如果已设置)和 $HOME/.ffmpeg 目录以及配置时定义的数据目录(通常为 PREFIX/share/ffmpeg)或沿路径的 ffpresets 文件夹中搜索名为 arg.ffpreset 的文件在 win32 上可执行,按此顺序。例如,如果参数是 libvpx-1080p,它将搜索文件 libvpx-1080p.ffpreset。
如果没有找到这样的文件,则 ffmpeg 将在上述目录中搜索名为 codec_name-arg.ffpreset 的文件,其中 codec_name 是要应用预设文件选项的编解码器的名称。例如,如果您选择带有 -vcodec libvpx 的视频编解码器并使用 -vpre 1080p,那么它将搜索文件 libvpx-1080p.ffpreset。
5.12.2 avpreset files
avpreset 文件使用 pre 选项指定。它们的工作方式类似于 ffpreset 文件,但它们只允许特定于编码器的选项。因此,不能使用指定编码器的选项=值对。 指定 pre 选项后,ffmpeg 将在 $AVCONV_DATADIR(如果已设置)和 $HOME/.avconv 目录以及配置时定义的数据目录(通常为 PREFIX/share/ffmpeg)中查找后缀为 .avpreset 的文件, 以该顺序
定 pre 选项后,ffmpeg 将在 $AVCONV_DATADIR(如果已设置)和 $HOME/.avconv 目录以及配置时定义的数据目录(通常为 PREFIX/share/ffmpeg)中查找后缀为 .avpreset 的文件, 以该顺序。
首先 ffmpeg 在上述目录中搜索名为 codec_name-arg.avpreset 的文件,其中 codec_name 是要应用预设文件选项的编解码器的名称。例如,如果您选择带有 -vcodec libvpx 的视频编解码器并使用 -pre 1080p,那么它将搜索文件 libvpx-1080p.avpreset。
如果没有找到这样的文件,那么 ffmpeg 将在相同的目录中搜索一个名为 arg.avpreset 的文件
6.1 Video and Audio grabbing
If you specify the input format and device then ffmpeg can grab video and audio directly.
ffmpeg -f oss -i /dev/dsp -f video4linux2 -i /dev/video0 /tmp/out.mpg
Or with an ALSA audio source (mono input, card id 1) instead of OSS:
ffmpeg -f alsa -ac 1 -i hw:1 -f video4linux2 -i /dev/video0 /tmp/out.mpg
Grab the X11 display with ffmpeg via
ffmpeg -f x11grab -video_size cif -framerate 25 -i :0.0 /tmp/out.mpg#有效 抓取屏幕
0.0 是 X11 服务器的 display.screen 编号,与 DISPLAY 环境变量相同。
ffmpeg -f x11grab -video_size cif -framerate 25 -i :0.0+10,20 /tmp/out.mpg
您的 X11 服务器的编号,与 DISPLAY 环境变量相同。 10 是 x 偏移量,20 是抓取的 y 偏移量。
6.3 Video and Audio file format conversion
You can use YUV files as input:
ffmpeg -i /tmp/test%d.Y /tmp/out.mpg
It will use the files:
/tmp/test0.Y, /tmp/test0.U, /tmp/test0.V,
/tmp/test1.Y, /tmp/test1.U, /tmp/test1.V, etc...
Y 文件使用两倍于 U 和 V 文件的分辨率。它们是原始文件,没有标题。它们可以由所有体面的视频解码器生成。如果 ffmpeg 无法猜测,您必须使用 -s 选项指定图像的大小。
You can input from a raw YUV420P file:
ffmpeg -i /tmp/test.yuv /tmp/out.avi
test.yuv 是一个包含原始 YUV 平面数据的文件。每一帧由 Y 平面组成,然后是 U 和 V 平面,具有一半的垂直和水平分辨率。
You can output to a raw YUV420P file:
ffmpeg -i mydivx.avi hugefile.yuv
You can set several input files and output files:
ffmpeg -i /tmp/a.wav -s 640x480 -i /tmp/a.yuv /tmp/a.mpg
Converts the audio file a.wav and the raw YUV video file a.yuv to MPEG file a.mpg.
You can also do audio and video conversions at the same time:
ffmpeg -i /tmp/a.wav -ar 22050 /tmp/a.mp2
Converts a.wav to MPEG audio at 22050 Hz sample rate.
You can encode to several formats at the same time and define a mapping from input stream to output streams:
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 从某个时间点开始提取
For creating a video from many images:
ffmpeg -f image2 -framerate 12 -i foo-%03d.jpeg -s WxH foo.avi
语法 foo-%03d.jpeg 指定使用由用零填充的三位数字组成的十进制数来表示序列号。它与 C printf 函数支持的语法相同,但仅适用于接受普通整数的格式。
导入图像序列时,-i 还支持在内部扩展类似 shell 的通配符模式(通配符),方法是选择 image2-specific -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 See Also
ffmpeg-all, ffplay, ffprobe, ffmpeg-utils, ffmpeg-scaler, ffmpeg-resampler, ffmpeg-codecs, ffmpeg-bitstream-filters, ffmpeg-formats, ffmpeg-devices, ffmpeg-protocols, ffmpeg-filters