1. 概要 Synopsis 2. 说明 Description 3. 详细说明 3.1 过滤 3.1.1 简单的过滤器图 3.1.2 复杂的过滤器图 3.2 流拷贝 4. 选择流 4.1 说明 4.1.1 自动选择流 4.1.2 手动选择流stream 4.1.3 复杂的过滤器图 4.1.4 流处理 4.2 例子 5 选项 5.1 流说明符 5.2 通用选项 5.3 AVOptions 5.4 主要选项 5.5 视频选项 5.6 高级视频选项 5.7 音频选项 5.8 高级音频选项 5.9 字幕选项 5.a 高级字幕选项 5.b 高级选项 5.c 预设文件 5.c.1 ffpreset 文件 5.c.2. avpreset 文件 6 例子 6.1 音视频抓取 6.2 X11抓取 6.3. 视音频文件格式转换
ffmpeg-org-ffmpeg
下文是ffmpeg官方页面(2021-06-17)的google自动翻译, 请参阅如下原文。
https://ffmpeg.org/ffmpeg.html
更多: ffmpeg-all, ffplay, ffprobe, ffmpeg-utils, ffmpeg-scaler, ffmpeg-resampler, ffmpeg-codecs, ffmpeg-bitstream-filters, ffmpeg-formats, ffmpeg-devices, ffmpeg-protocols, ffmpeg-filters
1. 概要 Synopsis
ffmpeg [global_options] {[input_file_options] -i input_url} ... {[output_file_options] output_url} ...
2. 说明 Description
ffmpeg是一个非常快速的视频和音频转换器,也可以从实时音频/视频源中抓取。它还可以在任意采样率之间进行转换,并使用高质量的多相滤波器动态调整视频大小。
ffmpeg从选项指定的任意数量的输入“文件”(可以是常规文件、管道、网络流、抓取设备等)(regular files, pipes, network streams, grabbing devices)读取 -i,并写入任意数量的输出“文件”,由一个普通的输出网址。在命令行上发现的任何不能被解释为选项的东西都被认为是一个输出 url。
原则上,每个输入或输出 url 可以包含任意数量的不同类型的流(视频/音频/字幕/附件/数据)(video/audio/subtitle/attachment/data)。允许的流数量和/或类型可能受容器格式的限制。选择哪些流从哪些输入进入哪些输出是自动完成的或使用-map选项(参见流选择章节)。
要在选项中引用输入文件,您必须使用它们的索引(从 0 开始)。例如,第一个输入文件是0,第二个是1等等。类似地,文件中的流由它们的索引引用。例如,2:3引用第三个输入文件中的第四个流。另请参阅流说明符一章。
作为一般规则,选项应用于下一个指定的文件。因此,顺序很重要,您可以在命令行上多次使用相同的选项。然后将每次出现应用于下一个输入或输出文件。此规则的例外是全局选项(例如详细级别),应首先指定。
不要混合输入和输出文件——首先指定所有输入文件,然后指定所有输出文件。也不要混合属于不同文件的选项。所有选项仅适用于下一个输入或输出文件,并在文件之间重置。
将输出文件的视频比特率设置为 64 kbit/s:
ffmpeg -i input.avi -b:v 64k -bufsize 64k output.avi
将输出文件的帧速率强制为 24 fps:
ffmpeg -i input.avi -r 24 output.avi
将输入文件的帧速率(仅对原始格式有效)强制为 1 fps,将输出文件的帧速率强制为 24 fps:
ffmpeg -r 1 -i input.m2v -r 24 output.avi
原始输入文件可能需要格式选项。
3. 详细说明
ffmpeg每个输出的转码过程可以用下图描述:
_______ ______________ | | | | 解码器 | input | demuxer | encoded data | decoder | file | ---------→ | packets 编码 | -----+ |_______| 分路器 |______________| | v _________ | 解码 帧 | | decoded | | frames | |_________| ________ ______________ | | | 复用器 | | | | output | ←-------- | encoded data | ←----+ | file | muxer | packets 编码 | encoder |________| |______________| 编码器
ffmpeg调用 libavformat 库(包含分路器)来读取输入文件并从中获取包含编码数据的数据包。当有多个输入文件时,ffmpeg尝试通过跟踪任何活动输入流上的最低时间戳来保持它们同步。
然后将编码的数据包传递给解码器(除非为流选择了 streamcopy,请参阅进一步的说明)。解码器产生未压缩的帧(原始视频/PCM 音频/...),可以通过过滤进一步处理(见下一节)。过滤后,帧被传递到编码器,编码器对它们进行编码并输出编码数据包。最后,这些被传递给复用器,它将编码的数据包写入输出文件。
3.1 过滤
在编码之前,ffmpeg可以使用 libavfilter 库中的过滤器处理原始音频和视频帧。几个链接的过滤器形成一个过滤器图。ffmpeg区分两种类型的过滤器图:简单和复杂。
3.1.1 简单的过滤器图
简单的过滤器图是那些只有一个输入和输出,两者都是相同类型的。在上图中,它们可以通过在解码和编码之间简单地插入一个附加步骤来表示:
_________ ______________ | 解码 帧 | | 编码 数据包 | | decoded | | encoded data | | frames |\ _ | packets | |_________| \ /||______________| \ __________ / simple _\|| 过滤 帧 | / encoder filtergraph | filtered |/ 编码器 简单过滤图 | frames | |__________|
使用每个流配置简单的过滤器图 -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选项。请注意,此选项是全局的,因为复杂的 filtergraph 就其性质而言,不能与单个流或文件明确关联。
选项 -lavfi 相当于 -filter_complex.
复杂overlay滤波器图的一个简单示例是滤波器,它具有两个视频输入和一个视频输出,其中包含一个叠加在另一个视频上的视频。它的音频对应物是amix过滤器。
3.2 流拷贝
流复制是通过将copy参数提供给 -codec编解码器选项。它使得ffmpeg省略指定流的解码和编码步骤,因此它只进行解复用和复用。它对于更改容器格式或修改容器级元数据很有用。在这种情况下,上图将简化为:
_______ ______________ ________ | | | 编码 数据包 | | | | input | demuxer | encoded data | muxer | output | | file | ---------> | packets | -------> | file | |_______| 分路器 |______________| 复用器 |________|
由于没有解码或编码decoding or encoding,因此速度非常快且没有质量损失。但是,由于许多因素,它在某些情况下可能不起作用。应用过滤器显然也是不可能的,因为过滤器适用于未压缩的数据。
4. 选择流
ffmpeg提供-map在每个输出文件中手动控制流选择的选项。用户可以跳过-map并让 ffmpeg 执行自动流选择,如下所述。这些-vn / -an / -sn / -dn选项可用于分别跳过包含视频、音频、字幕和数据流,无论是手动映射还是自动选择,除了那些作为复杂过滤器图输出的流。
4.1 说明
下面的小节描述了流选择中涉及的各种规则。接下来的示例展示了这些规则在实践中的应用。
4.1.1 自动选择流
如果特定输出文件没有任何映射选项,ffmpeg 会检查输出格式以检查其中可以包含哪种类型的流,即。视频、音频和/或字幕。对于每种可接受的流类型,ffmpeg 将从所有输入中选择一个可用的流。
它将根据以下标准选择该流:
对于视频,它是具有最高分辨率resolution的流,
对于音频,它是拥有最多频道channels的流,
对于字幕,它是找到的第一个字幕流,但有一个警告。输出格式的默认字幕编码器可以是基于文本的,也可以是基于图像的,并且只会选择相同类型的字幕流。
在几个相同类型的流速率相等的情况下,选择索引最低的流。
数据或附件流不会自动选择,只能使用-map.
4.1.2 手动选择流stream
当-map被使用时,仅用户映射流被包括在该输出文件,用下面的输出FilterGraph动态一个可能的例外描述。
4.1.3 复杂的过滤器图
如果有任何带有未标记焊盘的复杂 filtergraph 输出流,它们将被添加到第一个输出文件中。如果输出格式不支持流类型,这将导致致命错误。在没有 map 选项的情况下,包含这些流会导致跳过它们类型的自动流选择。如果存在映射选项,除了映射流之外,还包括这些过滤器图流。
带有标记焊盘的复杂 filtergraph 输出流必须映射一次且恰好一次。
4.1.4 流处理
流处理独立于流选择,下面描述的字幕除外。流处理是通过-codec寻址特定输出文件中的流的选项设置的。特别是,编解码器选项由 ffmpeg 在流选择过程之后应用,因此不会影响后者。如果没有-codec为流类型指定选项,ffmpeg 将选择输出文件复用器注册的默认编码器。
字幕存在例外情况。如果为输出文件指定了字幕编码器,则将包括找到的任何类型、文本或图像的第一个字幕流。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.mov
指定了三个输出文件,前两个没有-map设置选项,所以ffmpeg会自动为这两个文件选择流。
- out1.mkv是 Matroska 容器文件并接受视频、音频和字幕流,因此 ffmpeg 将尝试从每种类型中选择一个。
对于视频,选择B.mp4的stream 0,video 1920x1080 在所有输入视频流中具有最高分辨率 resolution。
对于音频,选择B.mp4的stream 3,audio 5.1 channels 因为它的通道数最多。
对于字幕,选择B.mp4的stream 2,subtitles (text) 这是其中的第一个字幕流 A.avi 和 B.mp4.
- out2.wav只接受音频流,所以只选择B.mp4的stream 3。
- out3.mov,因为-map设置了一个选项,所以不会发生自动流选择。该-map 1:a选项将从第二个输入中选择所有音频流B.mp4. 此输出文件中不会包含其他流。
对于前两个输出,所有包含的流都将被转码。选择的编码器将是每个输出格式注册的默认编码器,可能与所选输入流的编解码器不匹配。
对于第三个输出,音频流的编解码器选项已设置为copy,因此不会发生或可能发生解码-过滤-编码操作。所选流的数据包应从输入文件传送并在输出文件中混合。
示例:自动字幕选择
ffmpeg -i C.mkv out1.mkv -c:s dvdsub -an out2.mkv
虽然 out1.mkv是接受字幕流的 Matroska 容器文件,只能选择视频和音频流。的字幕流C.mkv是基于图像的,而 Matroska muxer 的默认字幕编码器是基于文本的,因此字幕的转码操作预计会失败,因此不会选择流。然而,在 out2.mkv,在命令中指定了字幕编码器,因此,除了视频流之外,还选择了字幕流。存在-an 会禁用音频流选择out2.mkv.
示例:未标记的 filtergraph 输出
ffmpeg -i A.avi -i C.mkv -i B.mp4 -filter_complex "overlay" out1.mp4 out2.srt
此处使用该-filter_complex选项设置过滤器图,它由单个视频过滤器组成。该overlay过滤器需要正好两个视频输入,但没有被指定,所以第一个两个可用视频流被使用时,这些的a.avi 和 C.mkv. 过滤器的输出垫没有标签,因此被发送到第一个输出文件 out1.mp4. 因此,跳过了视频流的自动选择,这将在B.mp4. 大多数频道的音频流即。stream 3 在B.mp4, 是自动选择的。但是没有选择字幕流,因为 MP4 格式没有注册默认的字幕编码器,并且用户没有指定字幕编码器。
第二个输出文件, out2.srt,只接受基于文本的字幕流。所以,即使第一个可用的字幕流属于C.mkv,它是基于图像的,因此被跳过。选定的流,stream 2在B.mp4, 是第一个基于文本的字幕流。
示例:带标签的 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
上面的这个命令也会失败,因为色调过滤器输出有一个标签[outv],并且没有被映射到任何地方。
该命令应修改如下,
ffmpeg -i A.avi -i B.mp4 -i C.mkv -filter_complex "[1:v]hue=s=0,split=2[outv1][outv2];overlay;aresample" \
-map '[outv1]' -an out1.mp4 \
out2.mkv \
-map '[outv2]' -map 1:a:0 out3.mkv
视频流来自 B.mp4被发送到hue色调过滤器,其输出使用split拆分过滤器克隆一次,并且两个输出都被标记。然后每个副本都映射到第一个和第三个输出文件。
需要两个视频输入的overlay覆盖过滤器使用前两个未使用的视频流。这些是来自A.avi 和 C.mkv. 覆盖输出没有标记,所以它被发送到第一个输出文件out1.mp4,无论-map选项是否存在。
aresample 过滤器发送第一个未使用的音频流,即 A.avi. 由于此过滤器输出也未标记,因此它也映射到第一个输出文件。存在-an 会抑制音频流的自动或手动流选择,而不是从过滤器图发送的输出。这两个映射流都应在映射流之前排序out1.mp4.
映射到的视频、音频和字幕流out2.mkv完全由自动流选择决定。
out3.mkv 由hue色调过滤器的克隆视频输出和来自的第一个音频流组成 B.mp4.
5. 选项
如果没有另外指定,所有数字选项都接受表示数字的字符串作为输入,其后可以跟 SI 单位前缀之一,例如:'K'、'M' 或 'G'。
如果将“i”附加到 SI 单位前缀,则完整前缀将被解释为二进制倍数的单位前缀,其基于 1024 的幂而不是 1000 的幂。将“B”附加到 SI 单位前缀将乘以value 为 8。这允许使用,例如:'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]
匹配具有指定值的元数据标签键的流。如果 未给出值,则匹配包含具有任何值的给定标记的流。
u
将流与可用配置相匹配,必须定义编解码器,并且必须提供视频维度或音频采样率等基本信息。
请注意,在ffmpeg中,元数据匹配仅适用于输入文件。
5.2 通用选项
这些选项在 ff* 工具之间共享。
-L
出示许可证。
-h, -?, -help, --help [arg]
显示帮助。可以指定一个可选参数来打印有关特定项目的帮助。如果未指定参数,则仅显示基本(非高级)工具选项。
arg 的可能值是:
long 除基本工具选项外,还打印高级工具选项。
full 打印完整的选项列表,包括编码器、解码器、解复用器、复用器、过滤器等的共享和私有选项。
decoder=decoder_name 打印有关名为decoder_name的解码器的详细信息。使用 -解码器 选项以获取所有解码器的列表。
encoder=encoder_name 打印有关名为encoder_name的编码器的详细信息。使用 -编码器 选项以获取所有编码器的列表。
demuxer=demuxer_name 打印有关名为demuxer_name的分路器的详细信息。使用 -格式 获取所有分路器和多路复用器列表的选项。
muxer=muxer_name 打印有关名为muxer_name 的多路复用器的详细信息。使用 -格式 获取所有复用器和解复用器列表的选项。
filter=filter_name 打印有关名为filter_name的过滤器的详细信息。使用 -过滤器 选项以获取所有过滤器的列表。
bsf=bitstream_filter_name 打印有关名为bitstream_filter_name的比特流过滤器的详细信息。使用-bsfs 选项以获取所有比特流过滤器的列表。
protocol=protocol_name 打印有关名为protocol_name的协议的详细信息。使用-协议 选项以获取所有协议的列表。
-version
显示版本。
-buildconf
显示构建配置,每行一个选项。
-formats
显示可用格式(包括设备)。
-demuxers
显示可用的分路器。
-muxers
显示可用的多路复用器。
-devices
显示可用设备。
-codecs
显示 libavcodec 已知的所有编解码器。
请注意,术语’codec’“编解码器”在本文档中用作更准确地称为媒体比特流格式的快捷方式。
-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.4
-sinks device[,opt1=val1[,opt2=val2]...]
显示输出设备的自动检测接收器。某些设备可能提供无法自动检测的系统相关接收器名称。不能假定返回的列表总是完整的。
ffmpeg -sinks pulse,server=192.168.0.4
-loglevel [flags+]loglevel | -v [flags+]loglevel
设置库使用的日志记录级别和标志。
可选的标志前缀可以由以下值组成:
‘repeat’ 重复
表示不应该将重复的日志输出压缩到第一行,并且将省略“最后一条消息重复 n 次”这一行。
‘level’ 等级
指示日志输出应[level]为每个消息行添加前缀。这可以用作日志着色的替代方法,例如在将日志转储到文件时。
也可以通过添加 '+'/'-' 前缀来设置/重置单个标志而单独使用标志,而不会影响其他标志或更改loglevel。当同时设置flags和loglevel 时,最后一个flags值和loglevel之前应该有一个“+”分隔符。
loglevel是包含以下值之一的字符串或数字:
‘quiet, -8’
什么都不显示;安静。
‘panic, 0’
只显示可能导致进程崩溃的致命错误,例如断言失败。这目前不用于任何事情。
‘fatal, 8’
只显示致命错误。这些是过程绝对无法继续的错误。
‘error, 16’
显示所有错误,包括可以从中恢复的错误。
‘warning, 24’
显示所有警告和错误。将显示与可能不正确或意外事件相关的任何消息。
‘info, 32’
在处理过程中显示信息性消息。这是警告和错误的补充。这是默认值。
‘verbose, 40’
与 相同info,但更详细。
‘debug, 48’
显示所有内容,包括调试信息。
‘trace, 56’
例如启用重复日志输出,添加level前缀,并将 日志级别设置为verbose:
ffmpeg -loglevel repeat+level+verbose -i input output
启用重复日志输出而不影响level前缀标志或日志级别的当前状态的另一个示例:
ffmpeg [...] -loglevel +repeat
默认情况下,程序会记录到 stderr。如果终端支持着色,则使用颜色来标记错误和警告。可以通过设置环境变量禁用日志着色 AV_LOG_FORCE_NOCOLOR,也可以强制设置环境变量AV_LOG_FORCE_COLOR。
-report
将完整的命令行和日志输出转储到当前目录中命名的文件 中。此文件可用于错误报告。这也意味着. program-YYYYMMDD-HHMMSS.log-loglevel debug
将环境变量设置FFREPORT为任何值都具有相同的效果。如果值为':'分隔的键=值序列,这些选项将影响报告;如果选项值包含特殊字符或选项分隔符 ':',则必须对其进行转义(请参阅 ffmpeg-utils 手册中的“引用和转义”部分)。
识别以下选项:
file
设置用于报告的文件名;%p扩展为程序名称,%t扩展为时间戳,%%扩展为纯文本%
level
使用数值设置日志详细级别(请参阅 参考资料-loglevel)。
例如,要将报告输出到名为 ffreport.log 使用日志级别32(日志级别的别名info):
FFREPORT=file=ffreport.log:level=32 ffmpeg -i input output
解析环境变量的错误不是致命的,不会出现在报告中。
-hide_banner
禁止打印横幅。
所有 FFmpeg 工具通常都会显示版权声明、构建选项和库版本。此选项可用于禁止打印此信息。
-cpuflags flags (global)
允许设置和清除 CPU 标志。此选项用于测试。除非您知道自己在做什么,否则不要使用它。
ffmpeg -cpuflags -sse+mmx ...
ffmpeg -cpuflags mmx ...
ffmpeg -cpuflags 0 ...
此选项的可能标志是:
‘x86’
‘mmx’
‘mmxext’
‘sse’
‘sse2’
‘sse2slow’
‘sse3’
‘sse3slow’
‘ssse3’
‘atom’
‘sse4.1’
‘sse4.2’
‘avx’
‘avx2’
‘xop’
‘fma3’
‘fma4’
‘3dnow’
‘3dnowext’
‘bmi1’
‘bmi2’
‘cmov’
‘ARM’
‘armv5te’
‘armv6’
‘armv6t2’
‘vfp’
‘vfpv3’
‘neon’
‘setend’
‘AArch64’
‘armv8’
‘vfp’
‘neon’
‘PowerPC’
‘altivec’
‘Specific Processors’
‘pentium2’
‘pentium3’
‘pentium4’
‘k6’
‘k62’
‘athlon’
‘athlonxp’
‘k8’
-max_alloc bytes
通过 ffmpeg 的 malloc 函数系列设置在堆上分配块的最大大小限制。练习格外小心使用此选项时。如果您不了解这样做的全部后果,请不要使用。默认值为 INT_MAX。
5.3 AVOptions
这些选项由 libavformat、libavdevice 和 libavcodec 库直接提供。要查看可用 AVOptions 的列表,请使用 -帮助选项。它们分为两类:
generic 通用的
可以为任何容器、编解码器或设备设置这些选项。通用选项列在容器/设备的 AVFormatContext 选项下和编解码器的 AVCodecContext 选项下。
private 私人的
这些选项特定于给定的容器、设备或编解码器。私有选项列在其相应的容器/设备/编解码器下。
例如,要将 ID3v2.3 标头而不是默认 ID3v2.4 写入 MP3 文件,请使用 id3v2_version MP3 多路复用器的私有选项:
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.
注意:通过在选项名称前添加 v/a/s 来指定每个流 AVOptions 的旧的未记录方式现在已过时,并将很快被删除。
5.4 主要选项
-f fmt (input/output)
强制输入或输出文件格式。通常会自动检测输入文件的格式,并根据输出文件的文件扩展名猜测格式,因此在大多数情况下不需要此选项。
-i url (input)
输入文件网址
-y (global)
无需询问即可覆盖输出文件。
-n (global)
不要覆盖输出文件,如果指定的输出文件已经存在,则立即退出。
-stream_loop number (input)
设置输入流应循环的次数。循环 0 表示不循环,循环 -1 表示无限循环。
-c[:stream_specifier] codec (input/output,per-stream)
-codec[:stream_specifier] codec (input/output,per-stream)
为一个或多个流选择编码器(在输出文件之前使用时)或解码器(在输入文件之前使用时)。编解码器是解码器/编码器的名称或特殊值copy(仅输出)以指示不重新编码流。
例如
ffmpeg -i INPUT -map 0 -c:v libx264 -c:a copy OUTPUT
使用 libx264 编码所有视频流并复制所有音频流。
对于每个流,c应用最后一个匹配选项,因此
ffmpeg -i INPUT -map 0 -c copy -c:v:1 libx264 -c:a:137 libvorbis OUTPUT
将复制除第二个视频(将使用 libx264 编码)和第 138 个音频(将使用 libvorbis 编码)之外的所有流。
-t duration (input/output)
当用作输入选项(before -i)时,限制从输入文件读取数据的持续时间。
当用作输出选项时(在输出 url 之前),在其持续时间达到duration后停止写入输出。
duration必须是持续时间规范,请参阅(ffmpeg-utils) ffmpeg-utils(1) 手册中的持续时间部分。
-to 和 -t 是互斥的,-t 优先。
-to position (input/output)
停止在位置写入输出或读取输入。 position必须是持续时间规范,请参阅(ffmpeg-utils) ffmpeg-utils(1) 手册中的持续时间部分。
-fs limit_size (output)
设置文件大小限制,以字节为单位。超出限制后不会再写入更多的字节块。输出文件的大小略大于请求的文件大小。
-ss position (input/output)
当用作输入选项(before -i)时,在这个输入文件中寻找 位置。请注意,在大多数格式中,不可能精确搜索,因此ffmpeg会先搜索最近的搜索点position。当转码和-accurate_seek 启用(默认),在搜索点和 位置将被解码和丢弃。进行流复制时或-noaccurate_seek 被使用,它将被保留。
当用作输出选项时(在输出 url 之前),解码但丢弃输入,直到时间戳到达position。
position必须是持续时间规范,请参阅(ffmpeg-utils) ffmpeg-utils(1) 手册中的持续时间部分。
-sseof position (input)
喜欢该-ss选项,但相对于“文件结尾”。即负值在文件中较早,0 位于 EOF。
-itsoffset offset (input)
设置输入时间偏移。
offset必须是持续时间规范,请参阅(ffmpeg-utils) ffmpeg-utils(1) 手册中的持续时间部分。
偏移量被添加到输入文件的时间戳中。指定正偏移量意味着相应的流延迟了offset 中指定的持续时间。
-itsscale scale (input,per-stream)
重新调整输入时间戳。scale应该是一个浮点数。
-timestamp date (output)
在容器中设置录制时间戳。
date必须是日期规范,请参阅(ffmpeg-utils) ffmpeg-utils(1) 手册中的日期部分。
-metadata[:metadata_specifier] key=value (output,per-metadata)
设置元数据键/值对。
可以给出可选的metadata_specifier来设置流、章节或节目的元数据。有关-map_metadata 详细信息,请参阅文档。
此选项会覆盖使用-map_metadata. 也可以使用空值删除元数据。
例如,在输出文件中设置标题:
ffmpeg -i in.avi -metadata title="my title" out.flv
设置第一个音频流的语言:
ffmpeg -i INPUT -metadata:s:a:0 language=eng OUTPUT
-disposition[:stream_specifier] value (output,per-stream)
设置流的处置。
此选项会覆盖从输入流复制的处置。也可以通过将其设置为 0 来删除处置。
认可以下处置:
default
dub 配音
original 原来的
comment 评论
lyrics 歌词
karaoke 卡拉OK
forced 被迫
hearing_impaired 听力障碍
visual_impaired 视觉障碍
clean_effects 清洁效果
attached_pic 附加图片
captions 字幕
descriptions 说明
dependent 依赖
metadata 元数据
例如,要使第二个音频流成为默认流:
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
不过,您可以指定其他选项,只要您知道它们与标准不冲突,例如:
ffmpeg -i myfile.avi -target vcd -bf 2 /tmp/vcd.mpg
为每个目标设置的参数如下。
VCD
pal:
-f vcd -muxrate 1411200 -muxpreload 0.44 -packetsize 2324
-s 352x288 -r 25
-codec:v mpeg1video -g 15 -b:v 1150k -maxrate:v 1150v -minrate:v 1150k -bufsize:v 327680
-ar 44100 -ac 2
-codec:a mp2 -b:a 224k
ntsc:
-f vcd -muxrate 1411200 -muxpreload 0.44 -packetsize 2324
-s 352x240 -r 30000/1001
-codec:v mpeg1video -g 18 -b:v 1150k -maxrate:v 1150v -minrate:v 1150k -bufsize:v 327680
-ar 44100 -ac 2
-codec:a mp2 -b:a 224k
film:
-f vcd -muxrate 1411200 -muxpreload 0.44 -packetsize 2324
-s 352x240 -r 24000/1001
-codec:v mpeg1video -g 18 -b:v 1150k -maxrate:v 1150v -minrate:v 1150k -bufsize:v 327680
-ar 44100 -ac 2
-codec:a mp2 -b:a 224k
SVCD
pal:
-f svcd -packetsize 2324
-s 480x576 -pix_fmt yuv420p -r 25
-codec:v mpeg2video -g 15 -b:v 2040k -maxrate:v 2516k -minrate:v 0 -bufsize:v 1835008 -scan_offset 1
-ar 44100
-codec:a mp2 -b:a 224k
ntsc:
-f svcd -packetsize 2324
-s 480x480 -pix_fmt yuv420p -r 30000/1001
-codec:v mpeg2video -g 18 -b:v 2040k -maxrate:v 2516k -minrate:v 0 -bufsize:v 1835008 -scan_offset 1
-ar 44100
-codec:a mp2 -b:a 224k
film:
-f svcd -packetsize 2324
-s 480x480 -pix_fmt yuv420p -r 24000/1001
-codec:v mpeg2video -g 18 -b:v 2040k -maxrate:v 2516k -minrate:v 0 -bufsize:v 1835008 -scan_offset 1
-ar 44100
-codec:a mp2 -b:a 224k
DVD
pal:
-f dvd -muxrate 10080k -packetsize 2048
-s 720x576 -pix_fmt yuv420p -r 25
-codec:v mpeg2video -g 15 -b:v 6000k -maxrate:v 9000k -minrate:v 0 -bufsize:v 1835008
-ar 48000
-codec:a ac3 -b:a 448k
ntsc:
-f dvd -muxrate 10080k -packetsize 2048
-s 720x480 -pix_fmt yuv420p -r 30000/1001
-codec:v mpeg2video -g 18 -b:v 6000k -maxrate:v 9000k -minrate:v 0 -bufsize:v 1835008
-ar 48000
-codec:a ac3 -b:a 448k
film:
-f dvd -muxrate 10080k -packetsize 2048
-s 720x480 -pix_fmt yuv420p -r 24000/1001
-codec:v mpeg2video -g 18 -b:v 6000k -maxrate:v 9000k -minrate:v 0 -bufsize:v 1835008
-ar 48000
-codec:a ac3 -b:a 448k
DV
pal:
-f dv
-s 720x576 -pix_fmt yuv420p -r 25
-ar 48000 -ac 2
ntsc:
-f dv
-s 720x480 -pix_fmt yuv411p -r 30000/1001
-ar 48000 -ac 2
film:
-f dv
-s 720x480 -pix_fmt yuv411p -r 24000/1001
-ar 48000 -ac 2
dv50目标是相同的dv 不同之处在于像素格式集合是yuv422p的所有三个标准。
上述参数的任何用户设置值都将覆盖目标预设值。在这种情况下,输出可能不符合目标标准。
-dn (input/output)
作为输入选项,阻止文件的所有数据流被过滤或自动选择或映射用于任何输出。请参阅-discard 单独禁用流的选项。
作为输出选项,禁用数据记录,即任何数据流的自动选择或映射。如需完全手动控制,请参阅-map 选项。
-dframes number (output)
设置要输出的数据帧数。这是 的过时别名 -frames:d,您应该改用它。
-frames[:stream_specifier] framecount (output,per-stream)
在帧计数帧后停止写入流。
-q[:stream_specifier] q (output,per-stream)
-qscale[:stream_specifier] q (output,per-stream)
使用固定质量标度 (VBR)。q / qscale的含义是编解码器相关的。如果在没有stream_specifier 的情况下使用qscale,则它仅适用于视频流,这是为了保持与先前行为的兼容性,并且因为为音频和视频的 2 个不同编解码器指定相同的编解码器特定值通常不是没有 stream_specifier 时的预期目的用来。
-filter[:stream_specifier] filtergraph (output,per-stream)
创建由 filtergraph 指定的filtergraph并使用它来过滤流。
filtergraph是对应用于流的 filtergraph 的描述,并且必须具有相同类型的流的单个输入和单个输出。在过滤器图中,输入与标签相关联in,输出与标签相关联out。有关 filtergraph 语法的更多信息,请参阅 ffmpeg-filters 手册。
如果要创建具有多个输入和/或输出的过滤器图,请参阅-filter_complex 选项。
-filter_script[:stream_specifier] filename (output,per-stream)
此选项类似于 -filter,唯一的区别是它的参数是要从中读取过滤器图描述的文件的名称。
-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" 行组成。密钥 仅由字母数字字符组成。进度信息序列的最后一个键始终是 "progress".
更新周期使用 设置-stats_period。
-stdin
在标准输入上启用交互。默认情况下打开,除非使用标准输入作为输入。要显式禁用交互,您需要指定 -nostdin.
禁用标准输入上的交互很有用,例如,如果 ffmpeg 在后台进程组中。可以实现大致相同的结果,ffmpeg ... < /dev/null但它需要一个外壳。
-debug_ts (global)
打印时间戳信息。默认情况下它是关闭的。此选项主要用于测试和调试目的,输出格式可能会从一个版本更改为另一个版本,因此不应由可移植脚本使用。
另请参阅选项-fdebug ts。
-attach filename (output)
将附件添加到输出文件。一些格式(例如 Matroska)支持这种格式,例如用于渲染字幕的字体。附件作为特定类型的流实现,因此此选项将向文件添加新流。然后可以以通常的方式在此流上使用每个流选项。使用此选项创建的附件流将在所有其他流(即使用-map或自动映射创建的流)之后创建。
请注意,对于 Matroska,您还必须设置 mimetype 元数据标签:
ffmpeg -i INPUT -attach DejaVuSans.ttf -metadata:s:2 mimetype=application/x-truetype-font out.mkv
(假设附件流将是输出文件中的第三个)。
-dump_attachment[:stream_specifier] filename (input,per-stream)
将匹配的附件流提取到名为filename 的文件中。如果 filename为空,则将filename使用元数据标签的值。
例如,将第一个附件提取到名为“out.ttf”的文件中:
ffmpeg -dump_attachment:t:0 out.ttf -i INPUT
提取由filename标签确定的文件的所有附件:
ffmpeg -dump_attachment:t "" -i INPUT
技术说明 - 附件作为编解码器额外数据实现,因此此选项实际上可用于从任何流中提取额外数据,而不仅仅是附件。
5.5 视频选项
-vframes number (output)
设置要输出的视频帧数。这是 的过时别名 -frames:v,您应该改用它。
-r[:stream_specifier] fps (input/output,per-stream)
设置帧率(Hz 值、分数或缩写)。
作为输入选项,忽略存储在文件中的任何时间戳,而是假设恒定帧速率fps生成时间戳。这与-帧率用于某些输入格式的选项,如 image2 或 v4l2(它曾经在旧版本的 FFmpeg 中相同)。如果有疑问,请使用-帧率 而不是输入选项 -r.
作为输出选项,复制或删除输入帧以实现恒定的输出帧速率fps。
-fpsmax[:stream_specifier] fps (output,per-stream)
设置最大帧率(Hz 值、分数或缩写)。
当输出帧率是自动设置的并且高于此值时,限制输出帧率。在批处理中或当输入帧率被错误地检测为非常高时很有用。它不能与 一起设置-r。它在流复制期间被忽略。
-s[:stream_specifier] size (input/output,per-stream)
设置帧大小。
作为输入选项,这是一个快捷方式 视频大小 私有选项,被一些解复用器识别,其帧大小要么不存储在文件中,要么是可配置的——例如原始视频或视频采集器。
作为输出选项,这会将scale视频过滤器插入到相应过滤器图的 末尾。请scale直接使用过滤器将其插入开头或其他位置。
格式为 ‘wxh’(默认 - 与源相同)。
-aspect[:stream_specifier] aspect (output,per-stream)
设置由aspect指定的视频显示纵横比。
aspect可以是浮点数字符串,也可以是num : den形式的字符串,其中num和den是纵横比的分子和分母。例如,“4:3”、“16:9”、“1.3333”和“1.7777”是有效的参数值。
如果与 -vcodec 拷贝,它将影响存储在容器级别的纵横比,但不会影响存储在编码帧中的纵横比(如果存在)。
-vn (input/output)
作为输入选项,阻止文件的所有视频流被过滤或自动选择或映射到任何输出。请参阅-discard 单独禁用流的选项。
作为输出选项,禁用视频录制,即自动选择或映射任何视频流。如需完全手动控制,请参阅-map 选项。
-vcodec codec (output)
设置视频编解码器。这是 -codec:v 的别名。
-pass[:stream_specifier] n (output,per-stream)
选择通行证编号(1 或 2)。它用于进行两次视频编码。视频的统计信息在第一遍中记录到日志文件中(另请参见选项 -passlogfile),在第二遍中,该日志文件用于以准确请求的比特率生成视频。在第 1 阶段,您可以仅停用音频并将输出设置为 null,Windows 和 Unix 的示例:
ffmpeg -i foo.mov -c:v libxvid -pass 1 -an -f rawvideo -y NUL
ffmpeg -i foo.mov -c:v libxvid -pass 1 -an -f rawvideo -y /dev/null
-passlogfile[:stream_specifier] prefix (output,per-stream)
将两遍日志文件名前缀设置为前缀,默认文件名前缀为“ffmpeg2pass”。完整的文件名将是 前缀-N.log,其中 N 是特定于输出流的数字
-vf filtergraph (output)
创建由 filtergraph 指定的filtergraph并使用它来过滤流。
这是 -filter:v 的别名,请参阅-filter 选项。
-autorotate
根据文件元数据自动旋转视频。默认启用,使用-noautorotate 禁用它。
-autoscale
根据第一帧的分辨率自动缩放视频。默认启用,使用-noautoscale禁用它。禁用自动缩放时,过滤器图形的所有输出帧的分辨率可能不同,并且可能不适用于某些编码器/多路复用器。因此,除非您真的知道自己在做什么,否则不建议禁用它。禁用自动缩放,风险自负。
5.6 高级视频选项
-pix_fmt[:stream_specifier] format (input/output,per-stream)
设置像素格式。使用-pix_fmts显示所有支持的像素格式。如果无法选择所选像素格式,ffmpeg 将打印警告并选择编码器支持的最佳像素格式。如果pix_fmt以 a 为前缀,+如果无法选择请求的像素格式,则 ffmpeg 将退出并显示错误,并且过滤器图形中的自动转换被禁用。如果pix_fmt是 single +,则 ffmpeg 选择与输入(或图形输出)相同的像素格式并禁用自动转换。
-sws_flags flags (input/output)
设置 SwScaler 标志。
-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。
版本 = 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 (output,per-stream)
top=1/bottom=0/auto=-1 field first
-dc precision
Intra_dc_precision.
-vtag fourcc/tag (output)
强制视频标签/fourcc。这是 -tag:v 的别名。
-qphist (global)
显示 QP 直方图
-vbsf bitstream_filter
已弃用,请参阅 -bsf
-force_key_frames[:stream_specifier] time[,time...] (output,per-stream)
-force_key_frames[:stream_specifier] expr:expr (output,per-stream)
-force_key_frames[:stream_specifier] source (output,per-stream)
force_key_frames可以采用以下形式的参数:
time[,time...]
如果参数包含时间戳,则 ffmpeg 将根据编码器时基将指定时间四舍五入到最接近的输出时间戳,并在第一帧强制关键帧的时间戳等于或大于计算的时间戳。请注意,如果编码器时基太粗糙,则关键帧可能会被强制放在时间戳低于指定时间的帧上。默认编码器时基是输出帧率的倒数,但也可以通过其他方式设置-enc_time_base。
如果其中一个时间是“ chapters[ delta ]”,则将其扩展为文件中所有章节开始的时间,移位 delta,以秒为单位表示时间。此选项可用于确保在输出文件中的章节标记或任何其他指定位置存在搜索点。
例如,要在 5 分钟插入一个关键帧,加上每章开始前 0.1 秒的关键帧:
-force_key_frames 0:05:00,chapters-0.1
expr:expr
如果参数以 为前缀expr:,则字符串expr 被解释为表达式,并为每一帧求值。如果评估非零,则强制关键帧。
expr中的表达式可以包含以下常量:
n
当前处理的帧数,从0开始
n_forced
强制帧数
prev_forced_n
前一个强制帧的编号,是NAN在没有强制关键帧的时候
prev_forced_t
上一强制帧的时间,即NAN尚未强制关键帧的时间
t
当前处理帧的时间
例如,每 5 秒强制一个关键帧,您可以指定:
-force_key_frames expr:gte(t,n_forced*5)
要在最后一个强制帧的时间之后 5 秒强制一个关键帧,从 13 秒开始:
-force_key_frames expr:if(isnan(prev_forced_t),gte(t,13),gte(t,prev_forced_t+5))
source
如果参数是source,如果正在编码的当前帧在其源中被标记为关键帧,则 ffmpeg 将强制一个关键帧。
请注意,强制使用太多关键帧对于某些编码器的前瞻算法非常有害:使用固定 GOP 选项或类似选项会更有效。
-copyinkf[:stream_specifier] (output,per-stream)
在进行流复制时,还要复制开头找到的非关键帧。
-init_hw_device type[=name][:device[,key=value...]]
初始化类型的新的硬件设备类型称为名称,使用给定的设备参数。如果未指定名称,它将收到“ type %d”形式的默认名称。
device和以下参数的含义取决于设备类型:
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
hw2
hw3
hw4
如果未指定,会用'auto_any'。(请注意,通过创建适合平台的子设备('dxva2' 或者 'vaapi') 然后从中派生出 QSV 设备。)
opencl
device选择平台和设备作为platform_index.device_index。
也可以使用键值对过滤设备集,以仅查找与特定平台或设备字符串匹配的设备。
可用作过滤器的字符串是:
platform_profile
platform_version
platform_name
platform_vendor
platform_extensions
device_name
device_vendor
driver_version
device_version
device_profile
device_extensions
device_type
索引和过滤器必须一起唯一地选择一个设备。
例子:
-init_hw_device opencl:0.1
在第一个平台上选择第二个设备。
-init_hw_device opencl:,device_name=Foo9000
选择名称包含字符串Foo9000 的设备。
-init_hw_device opencl:1,device_type=gpu,device_extensions=cl_khr_fp16
在支持cl_khr_fp16 扩展的第二个平台上选择 GPU 设备。
vulkan
如果device是一个整数,它会通过它在系统相关设备列表中的索引来选择设备。如果设备是任何其他字符串,它会选择名称包含该字符串作为子字符串的第一个设备。
识别以下选项:
debug
如果设置为 1,则启用验证层(如果已安装)。
linear_images
如果设置为 1,则 hwcontext 分配的图像将是线性的且可本地映射。
instance_extensions
要启用的附加实例扩展的加号分隔列表。
device_extensions
要启用的附加设备扩展的加号分隔列表。
例子:
-init_hw_device vulkan:1
选择系统上的第二个设备。
-init_hw_device vulkan:RADV
选择名称中包含字符串RADV的第一个设备。
-init_hw_device vulkan:0,instance_extensions=VK_KHR_wayland_surface+VK_KHR_xcb_surface
选择第一个设备并启用 Wayland 和 XCB 实例扩展。
-init_hw_device type[=name]@source
初始化类型的新的硬件设备类型称为名称,从与名称现有设备导出它源。
-init_hw_device list
列出此 ffmpeg 版本中支持的所有硬件设备类型。
-filter_hw_device name
将名为name的硬件设备传递给任何过滤器图中的所有过滤器。这可用于设置要使用hwupload过滤器上传到的设备,或使用hwmap过滤器映射到的设备。其他过滤器在需要硬件设备时也可以使用此参数。请注意,这通常仅在输入不在硬件帧中时才需要 - 如果是,过滤器将从它们作为输入接收的帧的上下文中派生出所需的设备。
这是一个全局设置,因此所有过滤器都将接收相同的设备。
-hwaccel[:stream_specifier] hwaccel (input,per-stream)
使用硬件加速来解码匹配的流。hwaccel的允许值是:
none
不要使用任何硬件加速(默认)。
auto
自动选择硬件加速方式。
vdpau
使用 VDPAU(Unix 视频解码和演示 API)硬件加速。
dxva2
使用 DXVA2(DirectX 视频加速)硬件加速。
vaapi
使用 VAAPI(视频加速 API)硬件加速。
qsv
使用 Intel QuickSync Video 加速进行视频转码。
与大多数其他值不同,此选项不启用加速解码(即在选择 qsv 解码器时自动使用),而是加速转码,无需将帧复制到系统内存中。
要使其工作,解码器和编码器都必须支持 QSV 加速,并且不得使用过滤器。
如果选定的 hwaccel 不可用或不被选定的解码器支持,则此选项无效。
请注意,大多数加速方法旨在用于播放,并且不会比现代 CPU 上的软件解码更快。此外,ffmpeg 通常需要将解码后的帧从 GPU 内存复制到系统内存中,从而导致进一步的性能损失。因此,此选项主要用于测试。
-hwaccel_device[:stream_specifier] hwaccel_device (input,per-stream)
选择用于硬件加速的设备。
此选项仅在以下情况下有意义 -hwacel选项也被指定。它可以指代创建的现有设备-init_hw_device 按名称,或者它可以创建一个新设备,就像'-init_hw_device' type : hwaccel_device 之前被调用过。
-hwaccels
列出此 ffmpeg 版本中启用的所有硬件加速组件。实际运行时可用性取决于硬件及其安装的合适驱动程序。
5.7 音频选项
-aframes number (output)
设置要输出的音频帧数。这是 的过时别名 -frames:a,您应该改用它。
-ar[:stream_specifier] freq (input/output,per-stream)
设置音频采样频率。对于输出流,它默认设置为相应输入流的频率。对于输入流,此选项仅对音频抓取设备和原始解复用器有意义,并映射到相应的解复用器选项。
-aq q (output)
设置音频质量(特定于编解码器,VBR)。这是 -q:a 的别名。
-ac[:stream_specifier] channels (input/output,per-stream)
设置音频通道数。对于输出流,它默认设置为输入音频通道的数量。对于输入流,此选项仅对音频抓取设备和原始解复用器有意义,并映射到相应的解复用器选项。
-an (input/output)
作为输入选项,阻止文件的所有音频流被过滤或自动选择或映射到任何输出。请参阅-discard 单独禁用流的选项。
作为输出选项,禁用音频记录,即任何音频流的自动选择或映射。如需完全手动控制,请参阅-map 选项。
-acodec codec (input/output)
设置音频编解码器。这是 的别名-codec:a。
-sample_fmt[:stream_specifier] sample_fmt (output,per-stream)
设置音频样本格式。用-sample_fmts获得的支持采样格式的列表。
-af filtergraph (output)
创建由 filtergraph 指定的filtergraph并使用它来过滤流。
这是 的别名-filter:a,请参阅-filter 选项。
5.8 高级音频选项
-atag fourcc/tag (output)
强制音频标签/fourcc。这是 的别名-tag:a。
-absf bitstream_filter
已弃用,请参阅 -bsf
-guess_layout_max channels (input,per-stream)
如果某些输入通道布局未知,则仅尝试猜测它是否最多对应于指定数量的通道。例如,2 告诉将ffmpeg1 个通道识别为单声道,将 2 个通道识别为立体声,而不是将 6 个通道识别为 5.1。默认设置是始终尝试猜测。使用 0 禁用所有猜测。
5.9 字幕选项
-codec编解码器(输入/输出)
设置字幕编解码器。这是 的别名-codec:s。
-sn(输入/输出)
作为输入选项,阻止文件的所有字幕流被过滤或自动选择或映射用于任何输出。请参阅-discard 单独禁用流的选项。
作为输出选项,禁用字幕录制,即自动选择或映射任何字幕流。如需完全手动控制,请参阅-map 选项。
-sbsf比特流过滤器
已弃用,请参阅 -bsf
5.a 高级字幕选项
-fix_sub_duration
修复字幕持续时间。对于每个字幕,等待同一流中的下一个数据包并调整第一个的持续时间以避免重叠。这对于一些字幕编解码器是必要的,尤其是 DVB 字幕,因为原始数据包中的持续时间只是一个粗略的估计,而结尾实际上是由一个空的字幕帧标记的。必要时未能使用此选项可能会导致持续时间过长或由于非单调时间戳而导致多路复用失败。
请注意,此选项会延迟所有数据的输出,直到解码下一个字幕数据包:它可能会大大增加内存消耗和延迟。
-canvas_size大小
设置用于渲染字幕的画布大小。
5.b 高级选项
-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命令行上的第一个选项指定stream 0 的源,第二个-map选项指定stream 1 的源,依此类推。
A - 流标识符之前字符创建一个 "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”标识到(单个)输出流 out.wav.
例如,从输入文件中选择索引为 2 的流 a.mov (由标识符“0:2”指定),以及来自输入的索引为 6 的流 b.mov (由标识符“1: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 . 流说明符。channel_id |-1][?][: output_file_id。流说明符]
将音频通道从给定输入映射到输出。如果 output_file_id。stream_specifier未设置,音频通道将映射到所有音频流上。
使用 "-1" 而不是 input_file_id。流说明符。channel_id将映射静音频道。
尾随?将允许 map_channel 是可选的:如果 map_channel 不匹配任何通道,则 map_channel 将被忽略而不是失败。
例如,假设INPUT是一个立体声音频文件,您可以使用以下命令切换两个音频通道:
ffmpeg -i INPUT -map_channel 0.0.1 -map_channel 0.0.0 OUTPUT
如果您想将第一个通道静音并保留第二个通道:
ffmpeg -i INPUT -map_channel -1 -map_channel 0.0.1 OUTPUT
“-map_channel”选项的顺序指定输出流中通道的顺序。输出通道布局是根据映射的通道数推测出来的(如果是一个“-map_channel”则是单声道,如果是两个则是立体声,等等)。如果输入和输出通道布局不匹配(例如两个“-map_channel”选项和“-ac 6”),则将“-ac”与“-map_channel”结合使用可以更新通道增益级别。
您还可以将输入的每个通道提取到特定的输出;以下命令将INPUT音频流(文件 0,流 0)的两个通道提取到相应的OUTPUT_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_channel”选择包含在不同流(来自相同或不同文件)中的多个输入音频通道并将它们合并为单个输出流。因此,目前不可能将两个单独的单声道流转换为单个立体声流。然而,将立体声流拆分为两个单声道单声道流是可能的。
如果您需要此功能,可能的解决方法是使用amerge 过滤器。例如,如果您需要合并媒体(此处输入.mkv) 将 2 个单声道音频流合并为一个单立体声声道音频流(并保留视频流),您可以使用以下命令:
ffmpeg -i input.mkv -filter_complex "[0:1] [0:2] amerge" -c:a pcm_s16le -c:v copy output.mkv
要从第一个输入映射前两个音频通道,并使用 trailing ?,如果第一个输入是单声道而不是立体声,则忽略音频通道映射:
ffmpeg -i INPUT -map_channel 0.0.0 -map_channel 0.0.1? OUTPUT
-map_metadata[: metadata_spec_out ] infile [: metadata_spec_in ] ( output,per-metadata )
从infile设置下一个输出文件的元数据信息。请注意,这些是文件索引(从零开始),而不是文件名。可选的metadata_spec_in/out参数指定要复制的元数据。元数据说明符可以具有以下形式:
G
全局元数据,即适用于整个文件的元数据
s[:stream_spec]
每个流元数据。stream_spec是流说明符,如流说明符章节中所述。在输入元数据说明符中,复制第一个匹配的流。在输出元数据说明符中,所有匹配的流都被复制到。
c:chapter_index
每章元数据。chapter_index是从零开始的章节索引。
p:program_index
每个程序的元数据。program_index是从零开始的节目索引。
如果省略元数据说明符,则默认为全局。
默认情况下,全局元数据从第一个输入文件复制,每个流和每个章节的元数据与流/章节一起复制。通过创建相关类型的任何映射来禁用这些默认映射。负文件索引可用于创建仅禁用自动复制的虚拟映射。
例如,将元数据从输入文件的第一个流复制到输出文件的全局元数据:
ffmpeg -i in.ogg -map_metadata 0:s:0 out.mp3
反过来,也就是将全局元数据复制到所有音频流:
ffmpeg -i in.mkv -map_metadata:s:a 0:g out.mkv
请注意, simple0在此示例中也能正常工作,因为默认情况下采用全局元数据。
-map_chapters input_file_index(输出)
将具有索引input_file_index 的输入文件中的章节复制到下一个输出文件。如果未指定章节映射,则从包含至少一个章节的第一个输入文件复制章节。使用负文件索引禁用任何章节复制。
-基准(全球)
在编码结束时显示基准信息。显示实际、系统和用户使用时间以及最大内存消耗。并非所有系统都支持最大内存消耗,如果不支持,它通常会显示为 0。
-benchmark_all(全局)
在编码期间显示基准信息。显示在各个步骤(音频/视频编码/解码)中使用的真实时间、系统时间和用户时间。
-timelimit持续时间(全球)
在 ffmpeg在 CPU 用户时间中运行了duration秒后退出。
-dump (全局)
将每个输入数据包转储到 stderr。
-hex(全局)
转储数据包时,也转储有效载荷。
-re(输入)
以本机帧速率读取输入。主要用于模拟抓取设备或实时输入流(例如从文件读取时)。不应与实际抓取设备或实时输入流(可能导致数据包丢失)一起使用。默认情况下,ffmpeg尝试尽可能快地读取输入。此选项会将输入的读取速度减慢到输入的本机帧速率。它对于实时输出(例如实时流媒体)很有用。
-vsync参数
视频同步方法。出于兼容性原因,旧值可以指定为数字。新添加的值必须始终指定为字符串。
0, passthrough
每个帧都带有它的时间戳从多路复用器传递到多路复用器。
1, cfr
帧将被复制和丢弃,以准确实现所要求的恒定帧速率。
2, vfr
帧与其时间戳一起传递或丢弃,以防止 2 个帧具有相同的时间戳。
drop
作为直通但会破坏所有时间戳,使复用器根据帧速率生成新的时间戳。
-1, auto
根据多路复用器功能在 1 和 2 之间进行选择。这是默认方法。
请注意,在此之后,多路复用器可能会进一步修改时间戳。例如,在格式选项的情况下避免_否定_ts 已启用。
使用 -map,您可以选择应从哪个流中获取时间戳。您可以保持视频或音频不变,并将剩余的流同步到不变的流。
-frame_drop_threshold参数
丢帧阈值,指定视频帧在被丢弃之前可以落后多少。以帧速率为单位,所以 1.0 是一帧。默认值为 -1.1。一种可能的用例是在时间戳嘈杂的情况下避免丢帧,或者在时间戳准确的情况下提高丢帧精度。
-async samples_per_second
音频同步方法。“拉伸/挤压”音频流以匹配时间戳,该参数是每秒更改音频的最大样本数。-async 1 是一种特殊情况,其中仅纠正音频流的开头,而没有任何后续纠正。
请注意,在此之后,多路复用器可能会进一步修改时间戳。例如,在格式选项的情况下避免_否定_ts 已启用。
此选项已被弃用。请改用aresample音频过滤器。
-adrift_threshold时间
设置时间戳和音频数据之间的最小差异(以秒为单位)以触发添加/删除样本以使其与时间戳匹配。该选项实际上是在硬(添加/删除)和软(挤压/拉伸)补偿之间进行选择的阈值。 -async必须设置为正值。
-apad参数(输出,每个流)
填充输出音频流。这与应用相同-af apad。Argument 是一串过滤器参数,组成与apad过滤器相同。 -shortest必须为此输出设置才能使选项生效。
-copyts
不处理输入时间戳,但保留它们的值而不尝试清理它们。特别是,不要删除初始开始时间偏移值。
请注意,根据 垂直同步 选项或特定的多路复用器处理(例如,如果格式选项 避免_否定_ts 已启用)即使选择了此选项,输出时间戳也可能与输入时间戳不匹配。
-start_at_zero
当与 复制品, 移动输入时间戳,使它们从零开始。
这意味着使用 eg-ss 50将使输出时间戳从 50 秒开始,无论输入文件从哪个时间戳开始。
-copytb模式
指定流复制时如何设置编码器时基。 mode是一个整数数值,可以采用以下值之一:
1
使用分路器时基。
时基从相应的输入解复用器复制到输出编码器。在复制具有可变帧速率的视频流时,有时需要这样做以避免非单调增加时间戳。
0
使用解码器时基。
时基从相应的输入解码器复制到输出编码器。
-1
尝试自动做出选择,以生成合理的输出。
默认值为 -1。
-enc_time_base[: stream_specifier ]时基(输出,每个流)
设置编码器时基。时基是一个浮点数,可以采用以下值之一:
0
根据媒体类型分配默认值。
对于视频 - 使用 1/framerate,对于音频 - 使用 1/samplerate。
-1
尽可能使用输入流时基。
如果输入流不可用,则将使用默认时基。
>0
使用提供的数字作为时基。
此字段可以作为两个整数的比率(例如 1:24、1:48000)或浮点数(例如 0.04166、2.0833e-5)提供
默认值为 0。
-bitexact(输入/输出)
为 (de)muxer 和 (de/en)coder 启用 bitexact 模式
-最短(输出)
当最短的输入流结束时完成编码。
-dts_delta_threshold
时间戳不连续增量阈值。
-dts_error_threshold秒
时间戳错误增量阈值。此阈值用于丢弃疯狂/损坏的时间戳,默认值为 30 小时,这是任意选择且相当保守的。
-muxdelay秒(输出)
设置最大解复用器解码延迟。
-muxpreload秒(输出)
设置初始解复用器解码延迟。
-streamid输出流索引:新值(输出)
为输出流分配一个新的 stream-id 值。此选项应在它适用的输出文件名之前指定。对于存在多个输出文件的情况,streamid 可能会被重新分配给不同的值。
例如,要将输出 mpegts 文件的流 0 PID 设置为 33,将流 1 PID 设置为 36:
ffmpeg -i inurl -streamid 0:33 -streamid 1:36 out.ts
-bsf[: stream_specifier ] bitstream_filters ( output,per-stream )
为匹配流设置比特流过滤器。bitstream_filters是一个逗号分隔的比特流过滤器列表。使用该-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(输入/输出,每个流)
强制使用 tag/fourcc 来匹配流。
-timecode hh:mm:ssSEPff
指定用于写入的时间码。SEP是 ':' 表示非丢弃时间码和 ';' (或'.')用于删除。
ffmpeg -i input.mpg -timecode 01:02:03.04 -r 30000/1001 -s ntsc output.mpg
-filter_complex filtergraph(全局)
定义一个复杂的 filtergraph,即具有任意数量的输入和/或输出。对于简单的图形 - 那些具有相同类型的一个输入和一个输出的图形 - 请参阅-筛选选项。filtergraph是对 filtergraph 的描述,如 ffmpeg-filters 手册的“Filtergraph 语法”部分所述。
输入链接标签必须使用 [file_index:stream_specifier]语法(即与-地图 用途)。如果stream_specifier匹配多个流,将使用第一个。未标记的输入将连接到匹配类型的第一个未使用的输入流。
输出链接标签指的是 -地图. 未标记的输出被添加到第一个输出文件中。
请注意,使用此选项可以仅使用 lavfi 源而不使用普通输入文件。
例如,将图像覆盖在视频上
ffmpeg -i video.mkv -i image.png -filter_complex '[0:v][1:v]overlay[out]' -map
'[out]' out.mkv
这里[0:v]指的是第一个输入文件中的第一个视频流,它链接到覆盖过滤器的第一个(主)输入。类似地,第二个输入中的第一个视频流链接到覆盖的第二个(覆盖)输入。
假设每个输入文件只有一个视频流,我们可以省略输入标签,所以上面等价于
ffmpeg -i video.mkv -i image.png -filter_complex 'overlay[out]' -map
'[out]' out.mkv
此外,我们可以省略输出标签,过滤器图中的单个输出将自动添加到输出文件中,因此我们可以简单地编写
ffmpeg -i video.mkv -i image.png -filter_complex '叠加' 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 也可以工作)
使用 lavficolor源生成 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(全局)
定义一个复杂的 filtergraph,即具有任意数量的输入和/或输出。相当于-filter_complex.
-filter_complex_script文件名(全局)
此选项类似于 -filter_complex,唯一的区别是它的参数是要从中读取复杂过滤器图描述的文件的名称。
-accurate_seek(输入)
此选项启用或禁用输入文件中的准确搜索 -ss选项。它默认启用,因此在转码时搜索是准确的。用-noaccurate_seek 禁用它,这可能很有用,例如在复制某些流并转码其他流时。
-seek_timestamp(输入)
此选项启用或禁用在输入文件中按时间戳查找 -ss选项。默认情况下它是禁用的。如果启用,则参数-ssoption 被认为是一个实际的时间戳,并且不会被文件的开始时间偏移。这仅适用于不从时间戳 0 开始的文件,例如传输流。
-thread_queue_size大小(输入)
此选项设置从文件或设备读取时排队数据包的最大数量。低延迟/高速率的直播流,如果不及时读取数据包可能会被丢弃;设置此值可以强制 ffmpeg 使用单独的输入线程并在数据包到达时立即读取数据包。默认情况下,ffmpeg 仅在指定了多个输入时才执行此操作。
-sdp_file文件(全局)
将输出流的 sdp 信息打印到file。当至少一个输出不是 rtp 流时,这允许转储 sdp 信息。(需要至少一种输出格式为 rtp)。
-discard(输入)
允许从流中丢弃特定的流或帧。任何输入流都可以使用 value 完全丢弃,all而从流中选择性丢弃帧发生在解复用器处,并非所有解复用器都支持。
none
不丢弃任何帧。
default
默认,不丢弃任何帧。
noref
丢弃所有非参考帧。
bidir
丢弃所有双向帧。
nokey
丢弃除关键帧之外的所有帧。
all
丢弃所有帧。
-abort_on标志(全局)
在各种条件下停止和中止。以下标志可用:
empty_output
没有数据包传递给多路复用器,输出为空。
empty_output_stream
在某些输出流中没有数据包被传递到多路复用器。
-max_error_rate(全局)
在所有输入中设置解码帧失败的比例,当超过 ffmpeg 时将返回退出代码 69。超过此阈值不会终止处理。范围是 0 到 1 之间的浮点数。默认值为 2/3。
-xerror(全局)
出错时停止并退出
-max_muxing_queue_size数据包(输出,每个流)
对音频和/或视频流进行转码时,ffmpeg 将不会开始写入输出,直到每个此类流都有一个数据包。在等待这种情况发生时,其他流的数据包会被缓冲。此选项为匹配的输出流设置此缓冲区的大小(以数据包为单位)。
对于大多数用途,此选项的默认值应该足够高,因此只有在您确定需要时才触摸此选项。
-muxing_queue_data_threshold字节(输出,每个流)
这是一个最小阈值,在此之前不考虑复用队列大小。默认为每个流 50 兆字节,并基于传递给多路复用器的数据包的总体大小。
-auto_conversion_filters(全局)
在所有过滤器图中启用自动插入格式转换过滤器,包括由 -vf, -的, -filter_complex 和 -lavfi. 如果过滤器格式协商需要转换,则过滤器的初始化将失败。仍然可以通过在图中插入相关的转换过滤器(scale、aresample)来执行转换。默认情况下,要明确禁用它,您需要指定 -noauto_conversion_filters.
5.c 预设文件
预设文件包含一系列选项=值对,每行一个,指定在命令行上指定的选项序列。以散列 ('#') 字符开头的行将被忽略并用于提供注释。检查预设 FFmpeg 源代码树中的目录以获取示例。
有两种类型的预设文件:ffpreset 和 avpreset 文件。
5.c.1 ffpreset 文件
ffpreset文件与规定vpre,apre, spre,和fpre选项。该fpre选项将预设的文件名而不是预设名称作为输入,可用于任何类型的编解码器。对于vpre,apre和 spre选项,在预先设定的文件中指定的选项施加到类型相同的预设选项的当前选择的编解码器。
传递到的参数vpre,apre和spre 预设选项识别预置文件根据以下规则使用:
首先 ffmpeg在目录中搜索名为arg .ffpreset 的文件$FFMPEG_DATADIR (如果设置),和 $HOME/.ffmpeg, 并在配置时定义的 datadir 中(通常 前缀/共享/ffmpeg) 或在 预设win32 上可执行文件的文件夹,按此顺序。例如,如果参数是libvpx-1080p,它将搜索文件libvpx-1080p.ffpreset.
如果找不到这样的文件,则 ffmpeg 将在上述目录中搜索名为 codec_name - arg .ffpreset 的文件,其中codec_name是将应用预设文件选项的编解码器的名称。例如,如果您选择视频编解码器-vcodec libvpx并使用-vpre 1080p,那么它将搜索文件libvpx-1080p.ffpreset.
5.c.2 avpreset 文件
avpreset 文件是用pre选项指定的。它们的工作方式类似于 ffpreset 文件,但它们只允许特定于编码器的选项。因此,不能使用指定编码器的 选项=值对。
pre指定该选项后,ffmpeg 将在目录中查找后缀为 .avpreset 的文件$AVCONV_DATADIR (如果设置),和 $HOME/.avconv, 并在配置时定义的 datadir 中(通常 前缀/共享/ffmpeg), 以该顺序。
首先 ffmpeg在上述目录中搜索名为codec_name - arg .avpreset 的文件,其中codec_name是将应用预设文件选项的编解码器的名称。例如,如果您选择视频编解码器-vcodec libvpx并使用-pre 1080p,那么它将搜索文件libvpx-1080p.avpreset.
如果找不到这样的文件,则 ffmpeg 将在相同目录中搜索名为 arg .avpreset 的文件。
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 抓取 X11 显示器
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
0.0 是 X11 服务器的 display.screen 编号,与 DISPLAY 环境变量相同。10 是 x 偏移,20 是抓取的 y 偏移。
6.3 视音频文件格式转换
任何支持的文件格式和协议都可以作为 ffmpeg 的输入:
例子:
您可以使用 YUV 文件作为输入:
ffmpeg -i /tmp/test%dY /tmp/out.mpg
它将使用以下文件:
/tmp/test0.Y, /tmp/test0.U, /tmp/test0.V,
/tmp/test1.Y, /tmp/test1.U, /tmp/test1.V, etc...
Y 文件使用两倍于 U 和 V 文件的分辨率。它们是原始文件,没有标题。它们可以由所有体面的视频解码器生成。您必须使用-s 如果 ffmpeg 无法猜测它,则选择。
您可以从原始 YUV420P 文件输入:
ffmpeg -i /tmp/test.yuv /tmp/out.avi
test.yuv 是一个包含原始 YUV 平面数据的文件。每帧由 Y 平面和 U 平面和 V 平面组成,垂直和水平分辨率的一半。
您可以输出到原始 YUV420P 文件:
ffmpeg -i mydivx.avi hugefile.yuv
您可以设置多个输入文件和输出文件:
ffmpeg -i /tmp/a.wav -s 640x480 -i /tmp/a.yuv /tmp/a.mpg
将音频文件 a.wav 和原始 YUV 视频文件 a.yuv 转换为 MPEG 文件 a.mpg。
您还可以同时进行音频和视频转换:
ffmpeg -i /tmp/a.wav -ar 22050 /tmp/a.mp2
以 22050 Hz 采样率将 a.wav 转换为 MPEG 音频。
您可以同时编码为多种格式并定义从输入流到输出流的映射:
ffmpeg -i /tmp/a.wav -map 0:a -b:a 64k /tmp/a.mp2 -map 0:a -b:a 128k /tmp/b.mp2
将 a.wav 转换为 64 kbits 的 a.mp2 和 128 kbits 的 b.mp2。'-map file:index' 按照输出流定义的顺序指定每个输出流使用哪个输入流。
您可以对解密的 VOB 进行转码:
ffmpeg -i snatch_1.vob -f avi -c:v mpeg4 -b:v 800k -g 300 -bf 2 -c:a libmp3lame -b:a 128k snatch.avi
这是一个典型的 DVD 翻录示例;输入是一个 VOB 文件,输出一个带有 MPEG-4 视频和 MP3 音频的 AVI 文件。请注意,在此命令中,我们使用 B 帧,因此 MPEG-4 流与 DivX5 兼容,GOP 大小为 300,这意味着对于 29.97fps 输入视频,每 10 秒有一个内帧。此外,音频流是 MP3 编码的,因此您需要通过传递--enable-libmp3lame给配置来启用 LAME 支持。该映射对于 DVD 转码以获得所需的音频语言特别有用。
注意:要查看支持的输入格式,请使用ffmpeg -demuxers.
您可以从视频中提取图像,或从多个图像创建视频:
从视频中提取图像:
ffmpeg -i foo.avi -r 1 -s WxH -f image2 foo-%03d.jpeg
这将每秒从视频中提取一个视频帧,并将它们输出到名为 foo-001.jpeg, foo-002.jpeg等。图像将被重新缩放以适应新的 WxH 值。
如果您只想提取有限数量的帧,可以将上述命令与-frames:vor-t选项结合使用,或者与 -ss 结合使用,以从某个时间点开始提取。
从多个图像创建视频:
ffmpeg -f image2 -framerate 12 -i foo-%03d.jpeg -s WxH foo.avi
语法foo-%03d.jpeg指定使用由三个数字填充零组成的十进制数来表示序列号。它与 C printf 函数支持的语法相同,但只有接受普通整数的格式才是合适的。
导入图像序列时,-i 还支持通过选择特定于 image2 的-pattern_type glob选项在内部扩展类似 shell 的通配符模式(通配符)。
例如,要从匹配 glob 模式的文件名创建视频 foo-*.jpeg:
ffmpeg -f image2 -pattern_type glob -framerate 12 -i 'foo-*.jpeg' -s WxH foo.avi
您可以在输出中放置许多相同类型的流:
ffmpeg -i test1.avi -i test2.avi -map 1:1 -map 1:0 -map 0:1 -map 0:0 -c copy -y test12.nut
结果输出文件 test12.nut 将以相反的顺序包含来自输入文件的前四个流。
强制 CBR 视频输出:
ffmpeg -i myfile.avi -b 4000k -minrate 4000k -maxrate 4000k -bufsize 1835k out.m2v
四个选项 lmin、lmax、mblmin 和 mblmax 使用 'lambda' 单位,但您可以使用 QP2LAMBDA 常量轻松地从 'q' 单位转换:
ffmpeg -i src.ext -lmax 21*QP2LAMBDA dst.ext