网站翻译由林建有提供支持
目录
1 摘要
ffmpeg [全局选项] {[输入文件选项] -iinput_url} ... {[输出文件选项] output_url} ...
2 描述
ffmpeg是一种通用媒体转换器。它可以读取多种类型的输入,包括实时抓取/录制设备,通过过滤和转码处理,可产生大量的输出格式。
ffmpeg从任意数量的输入读取(输入可以是普通文件、管道、网络流、抓取设备等),并写入任意数量的输出,这些输出通过简单的输出URL指定。命令行中任何无法解析为选项的内容都会被视为输出URL。-i原则上,每个输入或输出可以包含任意数量的基本流并且具有不同类型(视频/音频/字幕/附件/数据),但容器格式可能会限制允许的流数量和/或类型。选择将哪个输入流转移到哪个输出流可以自动完成,也可以使用选项完成(参见“流选择”章节)。
为了在选项中引用输入和输出,必须使用它们的索引(从0开始)。例如,第一个输入是-map,第二个是等等。同样,输入/输出中的流通过它们的索引来引用。例如
chapter).
表示第三个输入或输出中的第四个流。也请参阅“流指定符”章节。0一般规则是,选项应用于下一个指定的文件。因此,顺序非常重要,您可以在命令行中多次使用同一个选项。每次出现都会应用于下一个输入或输出文件。例外是全局选项(如详细级别),应该首先指定。1不要混合输入和输出文件——首先指定所有输入文件,然后指定所有输出文件。也不要混合属于不同文件的选项。所有选项仅适用于下一个输入或输出文件,且在文件之间会被重置。2:3以下是一些简单示例。Stream specifiers chapter.
通过重新编码媒体流将输入媒体文件转换为不同格式:
Do not mix input and output files – first specify all input files, then all output files. Also do not mix options which belong to different files. All options apply ONLY to the next input or output file and are reset between files.
Some simple examples follow.
- 设置输出文件的视频比特率为64 kbit/s:
ffmpeg -i input.avi output.mp4
- 强制输出文件的帧率为24 fps:
ffmpeg -i input.avi -b:v 64k -bufsize 64k output.mp4
- 强制输入文件的帧率(仅对原始格式有效)为1 fps,输出文件帧率为24 fps:
ffmpeg -i input.avi -r 24 output.mp4
- 对于原始输入文件可能需要使用格式选项。
ffmpeg -r 1 -i input.m2v -r 24 output.mp4
3 详细描述
建立一个由以下列出的组件组成的转码管道。程序的操作由输入数据块从源向管道底部的接收器流动,而过程中由它们遇到的组件进行转换。
ffmpeg以下几种组件可用:
("解复用器"的缩写)从输入源读取内容以提取
- Demuxers全局属性,例如元数据或章节;
- 输入基础流的列表及其属性
- list of input elementary streams and their properties
为每个创建一个解复用器实例-i选项,并发送编码packets到decoders或muxers.
在其他文献中,解复用器有时被称为splitters, 因为它们的主要功能是将文件分割成基本流(尽管有些文件只包含一个基本流)。
解复用器的示意图如下所示:
┌──────────┬───────────────────────┐ │ demuxer │ │ packets for stream 0 ╞══════════╡ elementary stream 0 ├──────────────────────► │ │ │ │ global ├───────────────────────┤ │properties│ │ packets for stream 1 │ and │ elementary stream 1 ├──────────────────────► │ metadata │ │ │ ├───────────────────────┤ │ │ │ │ │ ........... │ │ │ │ │ ├───────────────────────┤ │ │ │ packets for stream N │ │ elementary stream N ├──────────────────────► │ │ │ └──────────┴───────────────────────┘ ▲ │ │ read from file, network stream, │ grabbing device, etc. │ - Decoders接收编码(压缩的)packets用于音频、视频或字幕基本流,并将其解码为原始frames(用于视频的像素数组,音频的PCM)。解码器通常与基本流中的(并从中接收输入)关联,demuxer但有时也可以单独存在(参见循环解码器).
解码器的示意图如下所示:
┌─────────┐ packets │ │ raw frames ─────────►│ decoder ├────────────► │ │ └─────────┘ - Filtergraphs处理并转换原始音频或视频frames。一个过滤图由一个或多个单个filters链接成一个图。有两种类型的过滤图 -simple和complex,可通过-filter和-filter_complex选项分别进行配置。
一个简单的过滤图与一个output elementary stream相关联;它接收要过滤的数据输入来自一个decoder并将过滤后的输出发送到该输出流的encoder.
一个简单的视频过滤图,它进行去隔行(使用
yadif去隔行处理器)然后调整大小(使用scale过滤器)可以像这样:┌────────────────────────┐ │ simple filtergraph │ frames from ╞════════════════════════╡ frames for a decoder │ ┌───────┐ ┌───────┐ │ an encoder ────────────►├─►│ yadif ├─►│ scale ├─►│────────────► │ └───────┘ └───────┘ │ └────────────────────────┘一个复杂的过滤图是独立的,与任何特定流无关。它可以有多个(或零)输入,可能是不同类型的(音频或视频),每个输入数据可以来自解码器或另一个复杂过滤图的输出。它还具有一个或多个输出,这些输出可以提供给编码器或另一个复杂过滤图的输入。
下图是一个有3个输入和2个输出(所有为视频)的复杂过滤图的例子:
┌─────────────────────────────────────────────────┐ │ complex filtergraph │ ╞═════════════════════════════════════════════════╡ frames ├───────┐ ┌─────────┐ ┌─────────┐ ┌────────┤ frames ─────────►│input 0├─►│ overlay ├─────►│ overlay ├─►│output 0├────────► ├───────┘ │ │ │ │ └────────┤ frames ├───────┐╭►│ │ ╭►│ │ │ ─────────►│input 1├╯ └─────────┘ │ └─────────┘ │ ├───────┘ │ │ frames ├───────┐ ┌─────┐ ┌─────┬─╯ ┌────────┤ frames ─────────►│input 2├►│scale├►│split├───────────────►│output 1├────────► ├───────┘ └─────┘ └─────┘ └────────┤ └─────────────────────────────────────────────────┘来自第二个输入的帧叠加在第一个输入的帧上。来自第三个输入的帧被重新调整大小,然后复制成两个相同的流。其中一个叠加在前两个输入的组合帧之上,结果作为过滤图的第一个输出。另一个副本成为过滤图的第二输出。
- Encoders接收原始音频、视频或字幕frames并编码成编码的packets。编码(压缩)过程通常是lossy——它降低了流的质量以使输出更小;有些编码器是lossless,但代价是输出大小大得多。视频或音频编码器从某些过滤图的输出接收其输入,字幕编码器从解码器接收输入(因为字幕过滤目前尚不支持)。每个编码器都与某些复用器的output
elementary stream相关联并将其输出发送给该复用器。
编码器的示意图如下所示:
┌─────────┐ raw frames │ │ packets ────────────►│ encoder ├─────────► │ │ └─────────┘ - Muxers(复用器的缩写)接收编码的packets用于其基本流的数据,来自编码器(transcoding路径)或直接来自解复用器(streamcopy路径),将其交错(当有多个基本流时),并将生成的字节写入到输出文件中(或管道、网络流等)。
复用器的示意图如下所示:
┌──────────────────────┬───────────┐ packets for stream 0 │ │ muxer │ ──────────────────────►│ elementary stream 0 ╞═══════════╡ │ │ │ ├──────────────────────┤ global │ packets for stream 1 │ │properties │ ──────────────────────►│ elementary stream 1 │ and │ │ │ metadata │ ├──────────────────────┤ │ │ │ │ │ ........... │ │ │ │ │ ├──────────────────────┤ │ packets for stream N │ │ │ ──────────────────────►│ elementary stream N │ │ │ │ │ └──────────────────────┴─────┬─────┘ │ write to file, network stream, │ grabbing device, etc. │ │ ▼
3.1 流复制
最简单的ffmpeg管道是单流streamcopy,即复制一个input elementary stream的包而不进行解码、过滤或编码。例如,考虑一个名为INPUT.mkv的输入文件,其中包含3个基本流,我们从中提取第二个并将其写入文件OUTPUT.mp4。这样一个管道的示意图如下所示:
┌──────────┬─────────────────────┐ │ demuxer │ │ unused ╞══════════╡ elementary stream 0 ├────────╳ │ │ │ │INPUT.mkv ├─────────────────────┤ ┌──────────────────────┬───────────┐ │ │ │ packets │ │ muxer │ │ │ elementary stream 1 ├─────────►│ elementary stream 0 ╞═══════════╡ │ │ │ │ │OUTPUT.mp4 │ │ ├─────────────────────┤ └──────────────────────┴───────────┘ │ │ │ unused │ │ elementary stream 2 ├────────╳ │ │ │ └──────────┴─────────────────────┘
上面的管道可以通过以下命令行构建:
ffmpeg -i INPUT.mkv -map 0:1 -c copy OUTPUT.mp4
在这个命令行中
- 有一个输入INPUT.mkv;
- 该输入没有输入选项;
- 有一个输出OUTPUT.mp4;
- 该输出有两个输出选项:
-
-map 0:1选择要使用的输入流 - 从索引为0(即第一个)的输入选择索引为1(即第二个)的流; -
-c copy选择copy编码器,即无解码或编码的流复制。
-
流复制对于更改基本流数量、容器格式或修改容器级元数据非常有用。由于没有解码或编码,它非常快并且没有质量损失。然而,由于各种因素(例如目标容器所需的某些信息在源文件中不可用),它可能在某些情况下不起作用。因为解码帧是过滤工作的基础,所以显然无法应用过滤。
可以构建更复杂的流复制场景 - 例如,将两个输入文件的流合并到一个输出中:
┌──────────┬────────────────────┐ ┌────────────────────┬───────────┐ │ demuxer 0│ │ packets │ │ muxer │ ╞══════════╡elementary stream 0 ├────────►│elementary stream 0 ╞═══════════╡ │INPUT0.mkv│ │ │ │OUTPUT.mp4 │ └──────────┴────────────────────┘ ├────────────────────┤ │ ┌──────────┬────────────────────┐ │ │ │ │ demuxer 1│ │ packets │elementary stream 1 │ │ ╞══════════╡elementary stream 0 ├────────►│ │ │ │INPUT1.aac│ │ └────────────────────┴───────────┘ └──────────┴────────────────────┘
可以通过以下命令行构建
ffmpeg -i INPUT0.mkv -i INPUT1.aac -map 0:0 -map 1:0 -c copy OUTPUT.mp4
输出-map选项在这里使用了两次,在输出文件中创建了两个流 - 一个由第一个输入提供,另一个由第二个输入提供。单个-c选项实例为这两个流选择流复制。也可以将此选项的多个实例与流选择 结合使用为每个流应用不同的值,这将在接下来的章节中演示。
相反的情况是将多个输入流拆分为多个输出:
┌──────────┬─────────────────────┐ ┌───────────────────┬───────────┐
│ demuxer │ │ packets │ │ muxer 0 │
╞══════════╡ elementary stream 0 ├─────────►│elementary stream 0╞═══════════╡
│ │ │ │ │OUTPUT0.mp4│
│INPUT.mkv ├─────────────────────┤ └───────────────────┴───────────┘
│ │ │ packets ┌───────────────────┬───────────┐
│ │ elementary stream 1 ├─────────►│ │ muxer 1 │
│ │ │ │elementary stream 0╞═══════════╡
└──────────┴─────────────────────┘ │ │OUTPUT1.mp4│
└───────────────────┴───────────┘
构建方式为
ffmpeg -i INPUT.mkv -map 0:0 -c copy OUTPUT0.mp4 -map 0:1 -c copy OUTPUT1.mp4
注意,每个输出文件都需要单独的-c选项实例,即使它们的值相同。这是因为非全局选项(大多数选项都是非全局的)只在它们之前的文件上下文中适用。
这些示例当然可以进一步推广到任意数量的输入和输出之间的重新映射。
3.2 转码
Transcoding是解码流然后再次编码的过程。由于编码通常计算量很大,而且在大多数情况下会降低流的质量(即它是lossy),因此只有在需要时才应该转码,否则执行流复制。需要转码的典型原因有:
- 应用过滤器 - 例如调整大小、去隔行或叠加视频;重采样或混音音频;
- 您希望将流传递给无法解码原始编解码器的设备。
请注意,ffmpeg会转码所有音频、视频和字幕流,除非您为它们指定了-c copy。
考虑一个示例管道,它读取一个包含一个音频和一个视频流的输入文件,转码视频并将音频复制到一个单独的输出文件中。此过程的示意图表示如下
┌──────────┬─────────────────────┐
│ demuxer │ │ audio packets
╞══════════╡ stream 0 (audio) ├─────────────────────────────────────╮
│ │ │ │
│INPUT.mkv ├─────────────────────┤ video ┌─────────┐ raw │
│ │ │ packets │ video │ video frames │
│ │ stream 1 (video) ├─────────►│ decoder ├──────────────╮ │
│ │ │ │ │ │ │
└──────────┴─────────────────────┘ └─────────┘ │ │
▼ ▼
│ │
┌──────────┬─────────────────────┐ video ┌─────────┐ │ │
│ muxer │ │ packets │ video │ │ │
╞══════════╡ stream 0 (video) │◄─────────┤ encoder ├──────────────╯ │
│ │ │ │(libx264)│ │
│OUTPUT.mp4├─────────────────────┤ └─────────┘ │
│ │ │ │
│ │ stream 1 (audio) │◄────────────────────────────────────╯
│ │ │
└──────────┴─────────────────────┘
并使用以下命令行实现:
ffmpeg -i INPUT.mkv -map 0:v -map 0:a -c:v libx264 -c:a copy OUTPUT.mp4
注意它如何使用流选择器:v和:a选择输入流并为其应用不同值的-c选项;有关详细信息,请参阅流选择器部分。
3.3 过滤
在转码过程中,可以在编码之前对音频和视频流进行过滤,使用simple或complex过滤图。
3.3.1 简单 过滤图
简单过滤图是指具有一个输入和一个输出的过滤图,两者都属于相同类型(音频或视频)。它们使用每个流的-filter选项进行配置(-vf和-af是-filter:v(视频)和-filter:a(音频)的别名)。请注意,简单过滤图与其输出流绑定,因此例如如果您有多个音频流,-af会为每个音频流创建一个单独的过滤图。
以上转码示例,添加过滤器(省略音频以清晰起见)后,可表示如下:
┌──────────┬───────────────┐
│ demuxer │ │ ┌─────────┐
╞══════════╡ video stream │ packets │ video │ frames
│INPUT.mkv │ ├─────────►│ decoder ├─────►───╮
│ │ │ └─────────┘ │
└──────────┴───────────────┘ │
╭───────────◄───────────╯
│ ┌────────────────────────┐
│ │ simple filtergraph │
│ ╞════════════════════════╡
│ │ ┌───────┐ ┌───────┐ │
╰──►├─►│ yadif ├─►│ scale ├─►├╮
│ └───────┘ └───────┘ ││
└────────────────────────┘│
│
│
┌──────────┬───────────────┐ video ┌─────────┐ │
│ muxer │ │ packets │ video │ │
╞══════════╡ video stream │◄─────────┤ encoder ├───────◄───────╯
│OUTPUT.mp4│ │ │ │
│ │ │ └─────────┘
└──────────┴───────────────┘
3.3.2 复杂 过滤图
复杂过滤器图是指那些不能简单地描述为对单个流进行线性处理链的图。例如,当图具有多个输入和/或输出时,或者输出流类型与输入不同,便是这种情况。复杂过滤器图通过以下配置-filter_complex选项。请注意,此选项是全局性的,因为复杂过滤器图的本质无法明确地与单个流或文件关联。每次使用-filter_complex都会创建一个新的复杂过滤器图,而且数量不受限制。
一个简单的复杂过滤器图的例子是overlay过滤器,该过滤器有两个视频输入和一个视频输出,将一个视频叠加在另一个上面。其音频对应的过滤器是amix过滤器。
3.4 回环解码器
虽然解码器通常与解复用器流关联,但也可以创建“回环”解码器,以解码某些编码器的输出并将其反馈到复杂过滤器图中。这通过以下方式实现-dec指令,该指令的参数是需要解码的输出流的索引。每条这样的指令都会创建一个新的回环解码器,从零开始按顺序编号。这些索引随后会用于复杂过滤器图链接标签中,如相关文档中描述的-filter_complex.
可通过在-dec之前传递解码 AVOptions(解码选项)到回环解码器,方式类似于输入/输出选项。
例如,以下示例:
ffmpeg -i INPUT \ -map 0:v:0 -c:v libx264 -crf 45 -f null - \ -threads 3 -dec 0:0 \ -filter_complex '[0:v][dec:0]hstack[stack]' \ -map '[stack]' -c:v ffv1 OUTPUT
读取一个视频输入,接着
- (第二行)使用
libx264以低质量对其进行编码; - (第三行)使用3个线程解码这个编码流;
- (第四行)将解码后的视频与原始输入视频并排显示;
- (第五行)合并后的视频以无损方式编码并写入到OUTPUT.
这样的转码流程可用以下图表表示:
┌──────────┬───────────────┐
│ demuxer │ │ ┌─────────┐ ┌─────────┐ ┌────────────────────┐
╞══════════╡ video stream │ │ video │ │ video │ │ null muxer │
│ INPUT │ ├──►│ decoder ├──┬────────►│ encoder ├─┬─►│(discards its input)│
│ │ │ └─────────┘ │ │(libx264)│ │ └────────────────────┘
└──────────┴───────────────┘ │ └─────────┘ │
╭───────◄──╯ ┌─────────┐ │
│ │loopback │ │
│ ╭─────◄──────┤ decoder ├────◄──╯
│ │ └─────────┘
│ │
│ │
│ │ ┌───────────────────┐
│ │ │complex filtergraph│
│ │ ╞═══════════════════╡
│ │ │ ┌─────────────┐ │
╰─╫─►├─►│ hstack ├─►├╮
╰─►├─►│ │ ││
│ └─────────────┘ ││
└───────────────────┘│
│
┌──────────┬───────────────┐ ┌─────────┐ │
│ muxer │ │ │ video │ │
╞══════════╡ video stream │◄─┤ encoder ├───────◄──────────╯
│ OUTPUT │ │ │ (ffv1) │
│ │ │ └─────────┘
└──────────┴───────────────┘
4 流选择
ffmpeg提供了-map选项,可以手动控制每个输出文件的流选择。用户可以跳过-map让ffmpeg根据以下描述执行自动流选择。通过-vn / -an / -sn / -dn选项可以分别跳过视频、音频、字幕和数据流的包含,无论是手动映射的还是自动选择的,但复杂过滤器图的输出流除外。
4.1 描述
以下子章节描述了流选择所涉及的各种规则。接下来的例子展示了这些规则在实践中的应用。
虽然已尽力准确反映程序的行为,但FFmpeg仍在持续开发中,代码可能已在撰写本文后更改。
4.1.1 自动流选择
如果某个输出文件没有任何映射选项,ffmpeg将检查输出格式以确定哪些类型的流可以包含在其中,即视频、音频和/或字幕。对于每一种可接受的流类型,当可用时,ffmpeg将从所有输入中选择一个流。
选择流时将基于以下标准:
- 对于视频,选择分辨率最高的流;
- 对于音频,选择声道最多的流;
- 对于字幕,选择找到的第一个字幕流,但有一个注意点:输出格式的默认字幕编码器可以是基于文本的或基于图像的,只会选择同类型的字幕流。
如果相同类型的多个流评分相等,将选择索引最低的流。
数据或附件流不会被自动选择,仅能通过-map.
4.1.2 手动流选择
使用-map时,只有用户映射的流会包含在输出文件中,除了以下描述的过滤图输出的可能例外情况。
4.1.3 复杂过滤器图
如果存在没有标签的复杂过滤器图输出流,它们将被添加到第一个输出文件中。如果输出格式不支持该流类型,这将导致致命错误。如果未指定映射选项,这些流的包含将导致跳过其类型的自动流选择。如果存在映射选项,这些过滤器图流将与映射的流一起包含。
有标签的复杂过滤器图输出流必须被映射一次且仅映射一次。
4.1.4 流处理
流处理独立于流选择,字幕除外。流处理通过-codec选项设置,针对特定output文件中的流。特别地,FFmpeg在流选择过程后应用编解码器选项,因此不影响流选择。如果没有为流类型指定-codec选项,ffmpeg将选择由输出文件复用器注册的默认编码器。
字幕存在一个例外。如果为输出文件指定了字幕编码器,将包含任何类型(文本或图像)的第一个字幕流。ffmpeg不会验证指定的编码器是否能转换所选流,或者转换后的流是否符合输出格式接受的范围。这通常适用:当用户手动设置编码器时,流选择过程无法检查编码后的流是否可以复用到输出文件中。如果不能,ffmpeg将中止并且all输出文件将处理失败。
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将尝试选择每种类型中的一个。
对于视频,将选择stream 0中的B.mp4,因为它在所有输入视频流中分辨率最高。
对于音频,将选择stream 3中的B.mp4,因为它的声道数最多。
对于字幕,将选择stream 2中的B.mp4,这是A.avi和B.mp4.
out2.wav中的第一个字幕流。stream 3只接受音频流,因此只选择B.mp4中的
。out3.mov对于-map,因为设置了-map 1:a选项,将不会执行自动流选择。B.mp4选项将选择来自第二个输入文件的所有音频流。
对于前两个输出,所有包含的流将被转码。选择的编码器将是每种输出格式注册的默认编码器,这可能与所选输入流的编解码器不匹配。
对于第三个输出,音频流的编解码选项已设置为copy,因此不会发生解码-过滤-编码操作,或仅发生can操作。选择的流的数据包将从输入文件中传输并复用到输出文件中。
示例:自动字幕选择
ffmpeg -i C.mkv out1.mkv -c:s dvdsub -an out2.mkv
虽然out1.mkv是一个支持字幕流的Matroska容器文件,但只会选择一个视频和一个音频流。C.mkv的字幕流是基于图像的,而Matroska复用器的默认字幕编码器是基于文本的,因此字幕的转码操作预计会失败,从而不选择该流。out2.mkv然而,在-an中,命令中指定了字幕编码器,因此除了视频流,还会选择字幕流。out2.mkv.
示例:无标签过滤器图输出
ffmpeg -i A.avi -i C.mkv -i B.mp4 -filter_complex "overlay" out1.mp4 out2.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,这是第一个基于文本的字幕流。
示例:有标签过滤器图输出
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被发送到色调过滤器,该过滤器的输出通过拆分过滤器克隆一次, 并标记两个输出。然后每个副本分别映射到第一个和第三个输出文件。
叠加过滤器需要两个视频输入,使用前两个未使用的视频流。它们
是来自A.avi和C.mkv的流。叠加输出未被标记,因此它
被发送到第一个输出文件out1.mp4, 不论是否存在-map选项。
音频重采样过滤器被发送到第一个未使用的音频流,来自A.avi。
因为这个过滤器的输出也未被标记,它也映射到第一个输出文件。-an仅抑制音频流的自动或手动流选择,而不影响来自
过滤图的输出。这两个映射的流都应排在映射流之前out1.mp4.
视频、音频和字幕流映射到out2.mkv完全由
自动流选择确定。
out3.mkv由色调过滤器克隆的视频输出和来自B.mp4.
第一个音频流组成
所有数值选项,除非另有说明,接受一个数字的字符串形式作为输入, 该数字后可跟一个SI单位前缀,例如 'K'、'M' 或 'G'。
如果SI单位前缀后加上'i',完整的前缀会被解释为二进制倍数单位前缀, 这基于1024的幂而非1000的幂。在SI单位前缀后加上'B'会将值乘以8。 这允许使用例如 'KB'、'MiB'、'G'和 'B'作为数字后缀。
不接受参数的选项为布尔选项,并将相应值设置为true。通过在选项名前添加"no"可将其 值设置为false。例如使用 "-nofoo" 将布尔选项"foo" 设置为false。
接受参数的选项支持一种特殊语法,其中命令行中的参数会被解释为文件路径, 从该文件加载实际的参数值。要使用此功能,在选项名前的破折号后添加一个斜杠 '/' ,例如:
ffmpeg -i INPUT -/filter:v filter.script OUTPUT
将从名为的文件加载过滤器图描述filter.script.
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匹配的流。 否则,它匹配所有指定类型的流。
- g:group_specifier[:additional_stream_specifier]
-
匹配位于具有说明符group_specifier的组中的流。 如果additional_stream_specifier被使用,则它匹配同时属于此组并与additional_stream_specifier. 匹配的流。group_specifier
- 可以为以下之一:
-
组索引匹配带有此组索引的流。
- #group_id or i:组ID匹配带有此组ID的流。
-
Match the stream with this group id.
- p:program_id[:additional_stream_specifier]
-
匹配位于具有IDprogram_id的节目中的流。如果additional_stream_specifier被使用,则它匹配同时属于此节目并与additional_stream_specifier.
- #匹配的流。 or i:stream_id
-
按流ID匹配流(例如 在MPEG-TS容器中的PID)。
- m:key[:value]
-
匹配具有指定值的元数据标记key的流。如果value未给出,则匹配具有给定标记但值任意的流。 在key或value中出现的冒号字符 ':' 必须进行反斜线转义。
- disp:dispositions[:additional_stream_specifier]
-
匹配具有给定配置的流。dispositions是一个由一个或多个配置组成的列表(如通过-dispositions选项打印) 通过 '+'连接。
- u
-
匹配具有可用的配置的流,编解码器必须已定义,并且必须存在诸如视频尺寸或音频采样率的基本信息。
注意,在
ffmpeg中,通过元数据匹配仅对输入文件正常工作。
5.2 通用选项
这些选项在ff*工具之间共享。
- -L
-
显示许可证。
- -h, -?, -help, --help [arg]
-
显示帮助。可以指定一个可选参数以显示有关特定项目的帮助。 如果未指定参数,则仅显示基本(非高级)工具选项。
可能值参数为:
- long
-
打印高级工具选项,以及基本工具选项。
- full
-
打印完整的选项列表,包括编码器、解码器、解复用器、复用器、滤镜等的共享和私有选项。
- decoder=解码器名称
-
打印指定名称的解码器的详细信息解码器名称。使用-decoders选项以获取所有解码器的列表。
- encoder=编码器名称
-
打印指定名称的编码器的详细信息编码器名称。使用-encoders选项以获取所有编码器的列表。
- demuxer=解复用器名称
-
打印指定名称的解复用器的详细信息解复用器名称。使用-formats选项以获取所有解复用器和复用器的列表。
- muxer=复用器名称
-
打印指定名称的复用器的详细信息复用器名称。使用-formats选项以获取所有复用器和解复用器的列表。
- filter=滤镜名称
-
打印指定名称的滤镜的详细信息滤镜名称。使用-filters选项以获取所有滤镜的列表。
- bsf=位流过滤器名称
-
打印指定名称的位流过滤器的详细信息位流过滤器名称。使用-bsfs选项以获取所有位流过滤器的列表。
- protocol=协议名称
-
打印指定名称的协议的详细信息协议名称。使用-protocols选项以获取所有协议的列表。
- -version
-
显示版本。
- -buildconf
-
显示构建配置,每行一个选项。
- -formats
-
显示可用格式(包括设备)。
- -demuxers
-
显示可用的解复用器。
- -muxers
-
显示可用的复用器。
- -devices
-
显示可用的设备。
- -codecs
-
显示所有已知的由libavcodec处理的编解码器。
请注意,术语“编解码器”在整个文档中被作为一种简写用于表示更准确的媒体位流格式。
- -decoders
-
显示可用的解码器。
- -encoders
-
显示所有可用的编码器。
- -bsfs
-
显示可用的位流过滤器。
- -protocols
-
显示可用的协议。
- -filters
-
显示可用的libavfilter滤镜。
- -pix_fmts
-
显示可用的像素格式。
- -sample_fmts
-
显示可用的采样格式。
- -layouts
-
显示频道名称和标准频道布局。
- -dispositions
-
显示流分配信息。
- -colors
-
显示识别的颜色名称。
- -sources 设备[,选项1=值1[,选项2=值2]...]
-
显示输入设备的自动检测源。 某些设备可能提供无法自动检测的系统相关源名称。 返回的列表不能保证总是完整的。
ffmpeg -sources pulse,server=192.168.0.4
- -sinks 设备[,选项1=值1[,选项2=值2]...]
-
显示输出设备的自动检测接收端。 某些设备可能提供无法自动检测的系统相关接收端名称。 返回的列表不能保证总是完整的。
ffmpeg -sinks pulse,server=192.168.0.4
- -loglevel [标志+]日志级别 | -v [标志+]日志级别
-
设置库使用的日志级别和标志。
可选项标志前缀可以包含以下值:
- ‘repeat’
-
表示重复的日志输出不应被压缩到第一行, 并且将省略“最后一条消息重复n次”的行。
- ‘level’
-
表示日志输出应添加
[level]前缀到每条消息行。 当将日志写入文件时,这可以作为日志着色的替代方案。 - ‘time’
-
表示日志行应该带有时间信息前缀。
- ‘datetime’
-
表示日志行应该带有日期和时间信息前缀。
标志也可以单独使用,通过添加“+”或“-”前缀来设置或重置单个标志,而不影响其他标志或者更改日志级别。若同时使用标志和日志级别,则期望在最后一个标志值和日志级别.
日志级别是一字符串或数字,包含以下值之一:
- ‘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
默认情况下,程序将日志记录到标准错误输出。如果终端支持着色,则使用颜色标记错误和警告。可以通过设置环境变量
AV_LOG_FORCE_NOCOLOR禁用日志着色,或者通过设置环境变量强制启用日志着色。AV_LOG_FORCE_COLOR. - -report
-
将完整的命令行和日志输出转储到一个文件中,文件名为
程序-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’
- -cpucount 计数 (global)
-
覆盖CPU计数的检测。此选项用于测试。除非你知道自己在做什么,否则不要使用它。
ffmpeg -cpucount 2
- -max_alloc 字节
-
设置FFmpeg的malloc函数家族在堆中分配块的最大尺寸限制。在使用此选项时需要极端谨慎。如果你不完全理解这样做的后果,请不要使用。默认值为INT_MAX。
5.3 AV选项
这些选项由libavformat、libavdevice和libavcodec库直接提供。要查看可用AV选项列表,请使用-help选项。它们分为两类:
- generic
-
这些选项可以为任何容器、编解码器或设备设置。通用选项列在AVFormatContext选项下用于容器/设备,并列在AVCodecContext选项下用于编解码器。
- private
-
这些选项是针对给定的容器、设备或编解码器特定的。私有选项列在它们对应的容器/设备/编解码器下。
例如,要为MP3文件写入ID3v2.3头而不是默认的ID3v2.4,请使用id3v2_versionMP3复用器的私有选项:
ffmpeg -i input.flac -id3v2_version 3 out.mp3
所有编解码器的AV选项都是按流设置的,因此应该附加流说明符:
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语法不能用于布尔类型的AV选项,请使用-option 0/-option 1.
注意:通过在选项名称前添加v/a/s来指定按流的AV选项的旧的未记录方法现在已经过时并即将被移除。
5.4 主要选项
- -f 格式 (input/output)
-
强制输入或输出文件格式。对于输入文件,通常会自动检测格式;对于输出文件,通常会根据文件扩展名猜测格式,因此大多数情况下不需要使用此选项。
- -i URL (input)
-
输入文件URL
- -y (global)
-
覆盖输出文件而无需询问。
- -n (global)
-
不要覆盖输出文件,如果指定的输出文件已存在,则立即退出。
- -stream_loop 数字 (input)
-
设置输入流循环的次数。循环0表示不循环,循环-1表示无限循环。
- -recast_media (global)
-
允许强制使用与解复用器检测或指定的媒体类型不同的解码器。这对于解码作为数据流复用的媒体数据很有用。
- -c[:流说明符] 编解码器 (input/output,per-stream)
- -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 时长 (input/output)
-
当用作输入选项时(在
-i之前)限制从输入文件读取的时长数据。当用作输出选项时(在输出URL之前),将在输出的时长达到时停止写入。.
时长必须是一个时间长度规格,参见(ffmpeg-utils)ffmpeg-utils(1)手册中的时间长度部分.
-to和-t是互斥的,而-t具有优先级。
- -to 位置 (input/output)
-
在位置处停止写入输出或读取输入。. 位置必须是一个时间长度规格,参见(ffmpeg-utils)ffmpeg-utils(1)手册中的时间长度部分.
-to和-t是互斥的,而-t具有优先级。
- -fs 限制大小 (output)
-
设置文件大小限制,以字节为单位。当超过限制时不会再写入进一步的数据块。输出文件的大小略大于请求的文件大小。
- -ss 位置 (input/output)
-
当作为输入选项时(在
-i之前),在此输入文件中定位到位置。请注意,在大多数格式中无法精确查找, 因此ffmpeg将定位到最接近的查找点之前位置。 当进行转码并且-accurate_seek被启用时(默认设置), 这个从查找点到位置的额外段将被解码并 丢弃。当进行流复制或使用-noaccurate_seek时, 它将被保留。当用作输出选项(在输出URL之前)时,解码但丢弃 输入,直到时间戳达到位置.
位置必须是时间持续时间的规范, 参见(ffmpeg-utils)ffmpeg-utils(1)手册中的 时间持续时间部分.
- -sseof 位置 (input)
-
类似于
-ss选项,但相对于“文件末尾”。即负值 表示文件中较早的部分,0 表示文件末尾。 - -isync 输入索引 (input)
-
分配一个输入作为同步源。
这将取目标和参考输入的开始时间的差值, 并通过该差值偏移目标文件的时间戳。两个输入的源时间戳 应来自同一时钟源才能获得预期结果。如果
copyts被设置, 那么start_at_zero也必须被设置。如果任一输入没有起始时间戳, 则不会进行同步调整。可接受的值是那些引用有效ffmpeg输入索引的值。如果同步参考是 目标索引本身或-1,则不会对目标时间戳进行调整。 同步参考本身不能与其他输入同步。
默认值是-1.
- -itsoffset 偏移 (input)
-
设置输入时间偏移。
偏移必须是时间持续时间的规范, 参见(ffmpeg-utils)ffmpeg-utils(1)手册中的 时间持续时间部分.
偏移被加到输入文件的时间戳上。指定 正偏移意味着相应的流将被 按照在偏移.
- -itsscale 缩放 (input,per-stream)
-
重新缩放输入时间戳。缩放应为浮点数。
- -timestamp 日期 (output)
-
在容器中设置录制时间戳。
日期必须是日期规范, 参见(ffmpeg-utils)ffmpeg-utils(1)手册中的 日期部分.
- -metadata[:metadata_specifier] 键=值 (output,per-metadata)
-
设置元数据键/值对。
可选参数元数据指定符可以用来设置元数据 到流、章节或节目上。详见
-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] 值 (output,per-stream)
-
设置流的处置标志。
默认值:默认情况下,所有处置标志都会从输入流中复制, 除非此选项适用于由复杂过滤图生成的输出流 - 在这种情况下,默认情况下不会设置任何处置标志。
值是由‘+’或‘-’分隔的处置标志序列。‘+’ 前缀添加给定的处置,‘-’删除它。如果第一个标志也 以‘+’或‘-’为前缀,则结果处置是默认值 经由值更新后的结果。如果第一个标志没有前缀, 则结果处置是值。还可以通过将其设置为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
为第一个音频流添加‘原始’并删除‘评论’处置标志, 不删除其他处置标志:
ffmpeg -i in.mkv -c copy -disposition:a:0 +original-comment out.mkv
为第一个音频流删除‘原始’并添加‘评论’处置标志, 不删除其他处置标志:
ffmpeg -i in.mkv -c copy -disposition:a:0 -original+comment out.mkv
仅对第一个音频流设置‘原始’和‘评论’处置标志 (并删除其他处置标志):
ffmpeg -i in.mkv -c copy -disposition:a:0 original+comment out.mkv
从第一个音频流中删除所有处置标志:
ffmpeg -i in.mkv -c copy -disposition:a:0 0 out.mkv
并非所有复用器都支持嵌入的缩略图,支持的格式仅包括少数,如 JPEG 或 PNG。
- -program [title=标题:][program_num=节目编号:]st=流[:st=流...] (output)
-
使用指定的标题, 节目编号创建一个节目,并添加指定的流到其中。
- -stream_group [map=输入文件ID=流组][type=类型:]st=流[:st=流][:stg=流组][:id=流组ID...] (output)
-
创建具有指定类型和流组ID的流组,或通过映射输入组,添加指定的流和/或之前 定义的流组(s) 到它。
类型可以是以下之一:
- iamf_audio_element
-
组流属于同一 IAMF 音频元素的
对于此组类型,以下选项可用
- audio_element_type
-
音频元素类型。支持以下值:
- channel
-
可伸缩声道音频表示
- scene
-
声场表示
- demixing
-
用于重构可伸缩声道音频表示的解混信息。 此选项必须以“,”与其他选项分隔,并接受以下 键=值选项
- parameter_id
-
帧中参数块可能引用的标识符
- dmixp_mode
-
预定义的解混参数组合
- recon_gain
-
用于重构可伸缩声道音频表示的重构增益信息。 此选项必须以“,”与其他选项分隔,并接受以下 键=值选项
- parameter_id
-
帧中参数块可能引用的标识符
- layer
-
在音频元素中定义声道布局的层。 此选项必须以“,”与其他选项分隔。可以定义多个“,”分隔的条目,且至少必须设置一个。
它接受以下“:”分隔的键=值选项
- ch_layout
-
该层的声道布局
- flags
-
以下标志可用:
- recon_gain
-
标识是否在帧中的参数块中以元数据的形式提供重构增益
- output_gain
- output_gain_flags
-
输出增益适用的声道。以下标志可用:
- FL
- FR
- BL
- BR
- TFL
- TFR
- ambisonics_mode
-
声场模式。如果 audio_element_type 设置为声道,则该设置无效。
支持以下值:
- mono
-
每个声场声道被编码为组中的单独单声道流
- default_w
-
默认权值值
- iamf_mix_presentation
-
组流属于所有被相同 IAMF 混音演示引用的 IAMF 音频元素
对于此组类型,以下选项可用
- submix
-
混音演示中的子混音。 此选项必须以“,”与其他选项分隔。可以定义多个“,”分隔的条目,且至少必须设置一个。
它接受以下“:”分隔的键=值选项
- parameter_id
-
帧中参数块可能引用的标识符,用于对混合音频信号进行后处理,以生成回放音频信号
- parameter_rate
-
帧中参数块中引用该参数标识符的采样率时间段字段以
- default_mix_gain
-
当没有共享相同参数标识符的参数块时,应用的默认混合增益值
- element
-
引用用于生成回放最终输出音频信号的此混音演示中的音频元素。 此选项必须以“|”与其他选项分隔。可以定义多个“|”分隔的条目,且至少必须设置一个。
它接受以下“:”分隔的键=值选项:
- stg
-
该流组标识符到此子混音引用的音频元素
- parameter_id
-
帧中参数块可能引用的标识符,用于对引用并渲染的音频元素进行任何处理,然后与其他处理过的音频元素相加
- parameter_rate
-
帧中参数块中引用该参数标识符的采样率时间段字段以
- default_mix_gain
-
当没有共享相同参数标识符的参数块时,应用的默认混合增益值
- annotations
-
描述子混音元素的 key=value 字符串,其中“key”是符合 BCP-47 的字符串,指定“value”字符串的语言。“key”必须与混音的注释
- headphones_rendering_mode
-
指示输入的基于声道的音频元素是以立体声扬声器回放还是在耳机回放时使用双耳渲染器进行空间化。 如果引用的音频元素的audio_element_type设置为声道,则无效。
支持以下值:
- stereo
- binaural
- layout
-
指定测量响度信息的此子混音布局。 此选项必须以“|”与其他选项分隔。可以定义多个“|”分隔的条目,且至少必须设置一个。
它接受以下“:”分隔的键=值选项:
- layout_type
-
- loudspeakers
-
布局遵循 ITU-2051-3 的扬声器声音系统约定。
- binaural
-
布局为双耳。
- sound_system
-
通道布局匹配 ITU-2051-3 的 A 至 J 声音系统之一,以及 7.1.2 和 3.1.2 如果布局类型设置为双耳,则无效。
- integrated_loudness
-
程序综合响度信息,如 ITU-1770-4 中定义。
- digital_peak
-
音频信号的数字(采样)峰值,如 ITU-1770-4 中定义。
- true_peak
-
音频信号的真实峰值,如 ITU-1770-4 中定义。
- dialog_anchored_loudness
-
对话响度信息,如 ITU-1770-4 中定义。
- album_anchored_loudness
-
专辑响度信息,如 ITU-1770-4 中定义。
- annotations
-
描述混音的 key=value 字符串,其中“key”是符合 BCP-47 的字符串,指定“value”字符串的语言。“key”必须与所有子混音元素的注释一致
例如,从几个 WAV 输入文件中创建一个可伸缩的 5.1 IAMF 文件
ffmpeg -i front.wav -i back.wav -i center.wav -i lfe.wav -map 0:0 -map 1:0 -map 2:0 -map 3:0 -c:a opus -stream_group type=iamf_audio_element:id=1:st=0:st=1:st=2:st=3, demixing=parameter_id=998, recon_gain=parameter_id=101, layer=ch_layout=stereo, layer=ch_layout=5.1(side), -stream_group type=iamf_mix_presentation:id=2:stg=0:annotations=en-us=Mix_Presentation, submix=parameter_id=100:parameter_rate=48000|element=stg=0:parameter_id=100:annotations=en-us=Scalable_Submix|layout=sound_system=stereo|layout=sound_system=5.1(side) -streamid 0:0 -streamid 1:1 -streamid 2:2 -streamid 3:3 output.iamf
将包含四个流的 IAMF 输入文件中两个流组(音频元素和混音演示)复制到 mp4 输出中
ffmpeg -i input.iamf -c:a copy -stream_group map=0=0:st=0:st=1:st=2:st=3 -stream_group map=0=1:stg=0 -streamid 0:0 -streamid 1:1 -streamid 2:2 -streamid 3:3 output.mp4
- -target 类型 (output)
-
指定目标文件类型(
vcd,svcd,dvd,dv,dv50). 类型可以以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 1150k -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 1150k -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 1150k -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 电影: -f dv -s 720x480 -pix_fmt yuv411p -r 24000/1001 -ar 48000 -ac 2
这个
dv50目标与dv目标相同,只是像素格式设置为yuv422p适用于所有三个标准。用户设置的任何参数值将覆盖目标预设值。在这种情况下,输出可能不符合目标标准。
- -dn (input/output)
-
作为输入选项,阻止文件的所有数据流被过滤或自动选择或映射到任何输出。请参阅
-discard选项以单独禁用流。作为输出选项,禁用数据记录,即自动选择或映射任何数据流。要全面手动控制,请参阅
-map选项。 - -dframes 数字 (output)
-
设置要输出的数据帧数量。这是
-frames:d的废弃别名,建议使用它。 - -frames[:流选择器] 帧计数 (output,per-stream)
-
写入到流后停止,直到帧数帧。
- -q[:流选择器] 质量 (output,per-stream)
- -qscale[:流选择器] 质量 (output,per-stream)
-
使用固定质量级别(VBR)。质量/质量比例的含义取决于编码器。如果质量比例未指定流选择器那么它仅适用于视频流,这是为了保持之前行为的兼容性,并且因为对视频和音频使用同一编码器的特定值通常不是无流选择器时的预期。
- -filter[:流选择器] 过滤器图 (output,per-stream)
-
创建由过滤器图指定的过滤器图,并用它来过滤流。
过滤器图是将要应用于流的过滤器图的描述,必须具有单一输入和单一输出,与流类型相同。在过滤器图中,输入与标签
in相关联,输出与标签out相关联。请参阅ffmpeg-filters手册以获取有关过滤器图语法的更多信息。请参阅-filter_complex选项如果您想创建具有多个输入和/或输出的过滤图。
- -reinit_filter[:流选择器] 整数 (input,per-stream)
-
此布尔选项确定当输入帧参数在流中发生变化时,流所供给的过滤器图是否会被重新初始化。此选项默认启用,因为大多数视频和所有音频过滤器无法处理输入帧属性的变化。在重新初始化时,现有过滤器状态将丢失,例如某些过滤器中可用的帧计数参考。在重新初始化时缓冲的任何帧都会丢失。触发重新初始化的属性变化包括:对于视频,帧分辨率或像素格式;对于音频,样本格式、采样率、通道数或通道布局。
nreference available in some filters. Any frames buffered at time of reinitialization are lost. The properties where a change triggers reinitialization are, for video, frame resolution or pixel format; for audio, sample format, sample rate, channel count or channel layout. - -drop_changed[:流选择器] 整数 (input,per-stream)
-
此布尔选项决定带有不同帧参数的中间帧是否应被丢弃,以避免由于过滤器图重新初始化导致的过滤器状态丢失。通常在直播流输入中避免受损但可解码的数据包是有用的。默认是false。
- -filter_threads 线程数量 (global)
-
定义处理过滤器管道时使用的线程数。每个管道将生成一个线程池,其中包含此线程数用于并行处理。默认值是可用的CPU数量。
- -pre[:流选择器] 预设名称 (output,per-stream)
-
指定匹配流的预设。
- -stats (global)
-
以"info"级日志记录编码进度/统计数据(请参阅
-loglevel)。默认情况下启用,要明确禁用,您需要指定-nostats. - -stats_period 时间 (global)
-
设置更新编码进度/统计数据的周期。默认是0.5秒。
- -print_graphs (global)
-
以 -print_graphs_format 设置的格式,将执行图细节打印到stderr。
- -print_graphs_file 文件名 (global)
-
以 -print_graphs_format 设置的格式,将执行图细节写入到指定的文件。
- -print_graphs_format 格式 (global)
-
设置输出格式(可用格式有:默认,紧凑,csv,平面,ini,json,xml,mermaid,mermaidhtml)。默认格式是json。
- -progress URL (global)
-
将程序友好的进度信息发送到URL.
进度信息将周期性写入并在编码过程结束时生成。信息由"键=值"行组成。键只包含字母数字字符。进度信息序列的最后一个键始终是"progress",值为"continue"或"end"。
更新周期通过
-stats_period.例如,将进度信息记录到stdout:
ffmpeg -progress pipe:1 -i in.mkv out.mkv
- -stdin
-
在标准输入上启用交互。默认启用,除非标准输入用作输入。要显式禁用交互,需要指定
-nostdin.在标准输入上禁用交互是有用的,例如,当ffmpeg在后台进程组中。类似的结果可以通过
ffmpeg ... < /dev/null实现,但这需要一个shell。 - -debug_ts (global)
-
打印时间戳/延迟信息。默认关闭。此选项主要用于测试和调试目的,输出格式可能会因版本变化,因此不应用于便携的脚本。
另请参阅选项
-fdebug ts. - -attach 文件名 (output)
-
向输出文件添加附件。这仅被少数格式支持,如Matroska用于渲染字幕的字体。附件作为一种特定类型的流实现,因此此选项将在文件中添加一个新的流。然后可以在此流上以通常方式使用每流选项。使用此选项创建的附件流将在所有其他流之后创建(即那些通过
-map或自动映射创建的流)。请注意,对于Matroska格式,还必须设置mimetype元数据标签:
ffmpeg -i INPUT -attach DejaVuSans.ttf -metadata:s:2 mimetype=application/x-truetype-font out.mkv
(假设附件流是输出文件中的第三个流)。
- -dump_attachment[:流选择器] 文件名 (input,per-stream)
-
将匹配的附件流提取到名为文件名的文件。如果文件名为空,则将使用
filename元数据标签值作为文件名。例如,将第一个附件提取到名为‘out.ttf’的文件中:
ffmpeg -dump_attachment:t:0 out.ttf -i INPUT
提取所有附件到由
filename标签确定的文件中:ffmpeg -dump_attachment:t "" -i INPUT
技术说明——附件是以编码器的额外数据实现的,因此此选项实际上可以用于提取任何流的额外数据,而不仅仅是附件。
5.5 视频选项
- -vframes 数字 (output)
-
设置输出视频帧的数量。这是
-frames:v的废弃别名,建议使用它。 - -r[:流说明符] 帧率 (input/output,per-stream)
-
设置帧率(以赫兹值、分数或缩写表示)。
作为输入选项,忽略文件中存储的任何时间戳,而是生成基于恒定帧率的时间戳。这与-framerate选项不同,此选项用于某些输入格式,例如 image2 或 v4l2(以前版本的 FFmpeg 中是相同的)。 如果不确定,请使用-framerate代替输入选项-r.
作为输出选项:
- video encoding
-
在编码前直接复制或丢弃帧以实现恒定输出帧率fps.
- video streamcopy
-
指示复用器fps是流的帧率。在这种情况下,没有数据会被丢弃或复制。如果fps与由数据包时间戳确定的实际流帧率不匹配,这可能会生成无效文件。 另请参见
setts比特流过滤器。
- -fpsmax[:流说明符] 帧率 (output,per-stream)
-
设置最大帧率(以赫兹值、分数或缩写表示)。
当输出帧率被自动设置且高于该值时,限制输出帧率。 在批处理或输入帧率被误检测为非常高的情况下很有用。 它不能与
-r一起设置。在流拷贝时会被忽略。 - -s[:流说明符] 尺寸 (input/output,per-stream)
-
设置帧尺寸。
作为输入选项,这是video_size特定选项的快捷方式,此选项被某些解复用器识别,这些解复用器的帧尺寸要么未存储在文件中,要么可配置——例如原始视频或视频捕获器。
作为输出选项,这会插入
scale视频滤镜到end对应滤镜图的开始处。 请直接使用scale滤镜以便插入到开始或其他位置。格式为‘wxh’(默认值 - 与源相同)。
- -aspect[:流说明符] 宽高比 (output,per-stream)
-
设置由宽高比指定的视频显示比例。.
宽高比可以是一个浮点数字符串,或一个形式为数字:分母的字符串,其中数字和分母是宽高比的分子与分母。 例如 "4:3"、"16:9"、"1.3333" 和 "1.7777" 是有效的参数值。
如果与-vcodec copy一起使用,它会影响存储在容器级别的宽高比,而不会影响存储在已编码帧中的宽高比(如果存在)。
- -display_rotation[:流说明符] 旋转 (input,per-stream)
-
设置视频旋转元数据。
旋转是一个十进制数字,指定视频应逆时针旋转显示的角度。
此选项会覆盖存储在文件中的旋转/显示变换元数据(如果存在)。在视频被转码(而不是复制)且
-autorotate启用时,视频将在滤镜阶段被旋转。否则,元数据将被写入输出文件(如果复用器支持)。如果同时指定了
-display_hflip和/或-display_vflip选项,它们将在该选项指定的旋转之后应用。 - -display_hflip[:流说明符] (input,per-stream)
-
设置显示图像时是否应水平翻转。
详见
-display_rotation选项。 - -display_vflip[:流说明符] (input,per-stream)
-
设置显示图像时是否应垂直翻转。
详见
-display_rotation选项。 - -vn (input/output)
-
作为输入选项,阻止文件中的所有视频流被筛选或自动选择或映射到任何输出。 请参见
-discard选项以单独禁用流。作为输出选项,禁用视频录制,即禁用任何视频流的自动选择或映射。 有关完全手动控制的信息,请参见
-map选项。 - -vcodec 编解码器 (output)
-
设置视频编解码器。它是
-codec:v. - -pass[:的别名。] n (output,per-stream)
-
选择通道号(1 或 2)。用于进行两次视频编码传递。 第一次传递中,视频的统计信息被记录在一个日志文件中(另见选项 -passlogfile), 第二次传递中,该日志文件用于生成精确请求的比特率视频。 在第一传递中,您可禁用音频,并将输出设置为 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[:流说明符] 前缀 (output,per-stream)
-
将两次传递日志文件名称前缀设置为前缀,默认文件名前缀是“ffmpeg2pass”。 完整文件名将为PREFIX-N.log,其中 N 是特定于输出流的数字。
- -vf 滤镜图 (output)
-
创建由滤镜图指定的滤镜图并用其来筛选流。
它是
-filter:v的别名。 详见-filter 选项。. - -autorotate
-
根据文件元数据自动旋转视频。默认启用,使用-noautorotate禁用。
- -autoscale
-
根据首帧的分辨率自动缩放视频。 默认启用,使用-noautoscale禁用。当自动缩放被禁用时,滤镜图的所有输出帧可能分辨率不同, 这可能不适用于某些编码器/复用器。 因此,除非您非常清楚自己在做什么,否则不建议禁用它。 禁用自动缩放后果自负。
5.6 高级视频选项
- -pix_fmt[:流说明符] 格式 (input/output,per-stream)
-
设置像素格式。使用
-pix_fmts显示所有支持的像素格式。 如果选定的像素格式无法选择,ffmpeg 将打印警告并选择编码器支持的最佳像素格式。 如果像素格式以+开头,ffmpeg 将在无法选择请求的像素格式时退出并报错, 并且禁用滤镜图内的自动转换。 如果像素格式是一个单独的+,ffmpeg选择与输入(或图表输出)相同的像素格式,并禁用自动转换。 - -sws_flags 标志 (input/output)
-
为libswscale库设置默认标志。这些标志由自动插入的
scale过滤器和简单过滤器图内的过滤器使用,除非在过滤器图定义中被覆盖。请参阅(ffmpeg-scaler)ffmpeg-scaler手册以查看缩放器选项列表。
- -rc_override[:流指定符] 覆盖 (output,per-stream)
-
为特定区间设置速率控制覆盖,格式为“int,int,int”的列表,用斜杠分隔。前两个值是开始和结束帧号,最后一个值为正时使用量化器,或为负时使用质量因子。
- -vstats
-
将视频编码统计信息转存到vstats_HHMMSS.log。请参阅vstats文件格式部分以了解格式描述。
- -vstats_file 文件
-
将视频编码统计信息转存到文件。请参阅vstats文件格式部分以了解格式描述。
- -vstats_version 文件
-
指定使用哪个版本的vstats文件格式。默认是
2。请参阅vstats文件格式部分以了解格式描述。 - -vtag fourcc/tag (output)
-
强制视频标签/fourcc。这是
-tag:v. - -force_key_frames[:流指定符] 时间[,时间...] (output,per-stream)
- -force_key_frames[:流指定符] expr:表达式 (output,per-stream)
- -force_key_frames[:流指定符] source (output,per-stream)
-
强制关键帧可以使用以下形式的参数:
- 时间[,时间...]
-
如果参数由时间戳组成,ffmpeg将根据编码器时间基四舍五入指定时间到最近的输出时间戳,并在第一个具有等于或大于计算时间戳的帧上强制关键帧。请注意,如果编码器时间基过于粗糙,则可能会在时间戳小于指定时间的帧上强制关键帧。默认编码器时间基是输出帧率的倒数,但可以通过
-enc_time_base.如果其中一个时间是“
chapters[偏移]”,它会扩展为文件中所有章节开头的时间,加上偏移,以秒为单位表达时间。此选项可用来确保在章节标记或输出文件的任何其他指定位置存在一个寻点。例如,要在5分钟时插入一个关键帧,以及每个章节开始前0.1秒插入关键帧:
-force_key_frames 0:05:00,chapters-0.1
- 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选项或类似选项将更为高效。
- -apply_cropping[:流指定符] 源 (input,per-stream)
-
根据文件元数据在解码后自动剪裁视频。默认是all.
- none (0)
-
不应用任何剪裁元数据。
- all (1)
-
同时应用编解码器和容器级剪裁。这是默认模式。
- codec (2)
-
应用编解码器级剪裁。
- container (3)
-
应用容器级剪裁。
- -copyinkf[:流指定符] (output,per-stream)
-
执行流拷贝时,也拷贝开头的非关键帧。
- -init_hw_device 类型[=名称][:设备[,键=值...]]
-
初始化一个新的硬件设备类型类型,名为名称,使用给定的设备参数。如果未指定名称,它将接收默认名称形式“类型%d”。
含义设备以及后续参数的含义取决于设备类型:
- cuda
-
设备是CUDA设备的编号。
以下选项被识别:
- primary_ctx
-
如果设置为1,则使用主设备上下文,而非创建新的上下文。
示例:
- -init_hw_device cuda:1
-
选择系统上的第二个设备。
- -init_hw_device cuda:0,primary_ctx=1
-
选择第一个设备并使用主设备上下文。
- dxva2
-
设备是Direct3D 9显示适配器的编号。
- d3d11va
-
设备是Direct3D 11显示适配器的编号。如果未指定,将尝试使用默认Direct3D 11显示适配器或硬件供应商ID由‘vendor_id’.
例子:
- -init_hw_device d3d11va
-
在默认的Direct3D 11显示适配器上创建一个d3d11va设备。
- -init_hw_device d3d11va:1
-
在Direct3D 11显示适配器索引1上创建一个d3d11va设备。
- -init_hw_device d3d11va:,vendor_id=0x8086
-
在第一个硬件供应商ID为0x8086的Direct3D 11显示适配器上创建一个d3d11va设备。
- vaapi
-
设备可以是X11显示名称、DRM渲染节点或DirectX适配器索引。 如果未指定,它将尝试打开默认的X11显示($DISPLAY),然后尝试打开第一个DRM渲染节点(/dev/dri/renderD128),或者在Windows上使用默认DirectX适配器。
支持以下选项:
- kernel_driver
-
当设备未指定时,可以使用此选项指定与目标设备相关联的内核驱动程序名称。此选项仅在启用硬件加速方法drm和vaapi时可用。
- vendor_id
-
当设备和内核驱动未指定时,可以使用此选项指定与目标设备相关联的供应商ID。此选项仅在启用硬件加速方法drm和vaapi时且未指定kernel_driver时可用。
例子:
- -init_hw_device vaapi
-
在默认设备上创建一个vaapi设备。
- -init_hw_device vaapi:/dev/dri/renderD129
-
在DRM渲染节点上创建一个vaapi设备/dev/dri/renderD129.
- -init_hw_device vaapi:1
-
在DirectX适配器1上创建一个vaapi设备。
- -init_hw_device vaapi:,kernel_driver=i915
-
在与内核驱动程序‘i915’.
- -init_hw_device vaapi:,vendor_id=0x8086
-
’相关联的设备上创建一个vaapi设备。0x8086’.
- vdpau
-
设备是X11显示名称。 如果未指定,它将尝试打开默认的X11显示($DISPLAY).
- qsv
-
设备选择一个值‘MFX_IMPL_*’。允许的值为:
- auto
- sw
- hw
- auto_any
- hw_any
- hw2
- hw3
- hw4
如果未指定,将使用‘auto_any’。 (注意:通过创建与平台相关的子设备(‘dxva2’或‘d3d11va’或‘vaapi’)并从中导出一个QSV设备可能更容易实现预期结果。)
支持以下选项:
- child_device
-
在Linux上指定DRM渲染节点或在Windows上指定DirectX适配器。
- child_device_type
-
选择与平台相关的子设备类型。在Windows上,默认子设备类型为‘d3d11va’,当在配置时指定
--enable-libvpl时;默认子设备类型为‘dxva2’,当在配置时指定--enable-libmfx时。在Linux上,用户只能使用‘vaapi’作为子设备类型。
例子:
- -init_hw_device qsv:hw,child_device=/dev/dri/renderD129
-
在DRM渲染节点上使用‘MFX_IMPL_HARDWARE’创建一个QSV设备。/dev/dri/renderD129.
- -init_hw_device qsv:hw,child_device=1
-
在DirectX适配器1上使用‘MFX_IMPL_HARDWARE’创建一个QSV设备。
- -init_hw_device qsv:hw,child_device_type=d3d11va
-
选择GPU子设备类型‘d3d11va’,并创建一个包含‘MFX_IMPL_HARDWARE’.
- -init_hw_device qsv:hw,child_device_type=dxva2
-
选择GPU子设备类型‘dxva2’,并创建一个包含‘MFX_IMPL_HARDWARE’.
- -init_hw_device qsv:hw,child_device=1,child_device_type=d3d11va
-
在DirectX适配器1上使用子设备类型‘MFX_IMPL_HARDWARE’的‘d3d11va’.
- -init_hw_device vaapi=va:/dev/dri/renderD129 -init_hw_device qsv=hw1@va
-
创建一个名为‘va’的VAAPI设备在/dev/dri/renderD129, 然后从设备‘hw1’导出一个名为‘va’.
- opencl
-
设备选择平台和设备作为platform_index.device_index.
也可以用键值对过滤设备以找到符合特定平台或设备字符串的设备。
可用作过滤的字符串包括:
- platform_profile
- platform_version
- platform_name
- platform_vendor
- platform_extensions
- device_name
- device_vendor
- driver_version
- device_version
- device_profile
- device_extensions
- device_type
索引和过滤器必须共同唯一选择一个设备。
例子:
- -init_hw_device opencl:0.1
-
选择第一个平台上的第二个设备。
- -init_hw_device opencl:,device_name=Foo9000
-
选择名称包含字符串Foo9000.
- -init_hw_device opencl:1,device_type=gpu,device_extensions=cl_khr_fp16
-
的设备。cl_khr_fp16选择支持
- vulkan
-
扩展的第二个平台上的GPU设备。设备是一个整数时,它按系统相关设备列表中的索引选择设备。如果设备是其他字符串,它选择名称中包含该字符串作为子串的第一个设备。
支持以下选项:
- debug
-
如果设置为1,则启用验证层(如果安装的话)。
- linear_images
-
如果设置为1,由硬件上下文分配的图像将是线性且本地可映射的。
- 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 类型[=名称]@来源
-
初始化一个新硬件设备,类型为类型,名为名称, 从现存设备‘来源.
- -init_hw_device list
-
列出此ffmpeg版本支持的所有硬件设备类型。
- -filter_hw_device 名称
-
将名为‘名称’的硬件设备传递给所有滤镜图形中的滤镜。 这可以用来设置上传到的设备,例如
hwupload过滤器,或要映射到的设备hwmap过滤器。其他过滤器也可能需要此参数,当它们需要硬件设备时。请注意,这通常仅在输入尚未采用硬件帧的情况下才需要——当采用时,过滤器将根据它们接收到的输入帧的上下文确定所需设备。这是一个全局设置,因此所有过滤器都会接收到相同的设备。
- -hwaccel[:流说明符] 硬件加速 (input,per-stream)
-
使用硬件加速解码匹配的流。允许的值为硬件加速为:
- none
-
不要使用任何硬件加速(默认值)。
- auto
-
自动选择硬件加速方法。
- vdpau
-
使用 VDPAU(用于 Unix 的视频解码和呈现 API)硬件加速。
- dxva2
-
使用 DXVA2(DirectX 视频加速)硬件加速。
- d3d11va
-
使用 D3D11VA(DirectX 视频加速)硬件加速。
- vaapi
-
使用 VAAPI(视频加速 API)硬件加速。
- qsv
-
使用 Intel QuickSync Video 加速进行视频转码。
与大多数其他值不同,此选项并不启用加速解码(当选择 QSV 解码器时会自动使用),而是启用加速转码,而无需将帧复制到系统内存。
为了使其工作,解码器和编码器都必须支持 QSV 加速,并且不能使用过滤器。
- videotoolbox
-
使用 Video Toolbox 硬件加速。
如果所选的硬件加速不可用或不受选择的解码器支持,则此选项无效。
请注意,大多数加速方法针对播放而设计,并不会比现代 CPU 上的软件解码更快。此外,
ffmpeg通常需要将解码后的帧从 GPU 内存复制到系统内存,从而导致进一步的性能损失。因此,此选项主要用于测试。 - -hwaccel_device[:流说明符] 硬件加速设备 (input,per-stream)
-
选择要用于硬件加速的设备。
此选项仅在同时指定-hwaccel选项时有意义。它可以通过名称引用使用-init_hw_device创建的现有设备,或创建一个新设备,仿佛在之前立即调用了‘-init_hw_device’ 类型:硬件加速设备’。
- -hwaccels
-
列出在当前 FFmpeg 构建中启用的所有硬件加速组件。实际运行时的可用性取决于硬件及其适当驱动程序是否已安装。
- -fix_sub_duration_heartbeat[:流说明符]
-
根据接收到随机访问数据包时当前正在处理的字幕流,为指定的输出视频流设置心跳流。
这降低了字幕的延迟(字幕的结束数据包或下一个字幕尚未收到)。作为缺点,这可能会导致字幕事件的重复出现,以覆盖完整持续时间。因此,在处理对字幕事件传递输出的延迟不相关的情况时,不应使用此选项。
需要-fix_sub_duration为相关输入字幕流设置此选项,以产生任何效果,同时需要输入字幕流直接映射到心跳流所在的同一输出。
5.7 音频选项
- -aframes 数字 (output)
-
设置要输出的音频帧数。这是
-frames:a的过时别名,你应该使用 - -ar[:流说明符] 频率 (input/output,per-stream)
-
设置音频采样频率。对于输出流,它默认为对应输入流的频率。对于输入流,此选项仅在音频抓取设备和原始解复用器中有意义,并映射到相应的解复用器选项。
- -aq 质量 (output)
-
设置音频质量(特定于编解码器,可变比特率)。这是 -q:a 的别名。
- -ac[:流说明符] 通道 (input/output,per-stream)
-
设置音频通道数量。对于输出流,默认设置为输入音频通道数。对于输入流,此选项只有在音频抓取设备和原始解复用器中有意义,并映射到相应的解复用器选项。
- -an (input/output)
-
作为输入选项,阻止文件的所有音频流被过滤或自动选择或映射到任何输出。请参阅
-discard选项以单独禁用流。作为输出选项,禁用音频录制,即任何音频流的自动选择或映射。要完全手动控制,请参阅
-map选项。 - -acodec 编解码器 (input/output)
-
设置音频编解码器。这是
-codec:a. - -sample_fmt[:的别名。] 采样格式 (output,per-stream)
-
设置音频采样格式。使用
-sample_fmts获取支持采样格式的列表。 - -af 滤镜图 (output)
-
创建由滤镜图指定的滤镜图并用于过滤流。
这是
-filter:a的别名,请参阅-filter 选项.
5.8 高级音频选项
- -atag fourcc/标记 (output)
-
强制音频标记/四字符代码。这是
-tag:a. - -ch_layout[:的别名。] 布局 (input/output,per-stream)
-
别名为
-channel_layout. - -channel_layout[:流说明符] 布局 (input/output,per-stream)
-
设置音频通道布局。对于输出流,它默认设置为输入通道布局。对于输入流,它覆盖输入的通道布局。并非所有解码器都遵循覆盖的通道布局。此选项还为音频抓取设备和原始解复用器设置了通道布局,并映射到相应的解复用器选项。
- -guess_layout_max 通道 (input,per-stream)
-
如果某些输入通道布局未知,仅尝试在它对应的通道数量最多为指定号码时进行猜测。例如,2 表示
ffmpeg以识别 1 个通道为单声道,2 个通道为立体声,但 6 个通道不是 5.1。默认情况下,总是尝试猜测。使用 0 禁用所有猜测。使用-channel_layout选项明确指定输入布局也会禁用猜测。
5.9 字幕选项
- -scodec 编解码器 (input/output)
-
设置字幕编解码器。这是
-codec:s. - -sn (input/output)
-
作为输入选项,阻止文件的所有字幕流被过滤或自动选择或映射到任何输出。请参阅
-discard选项以单独禁用流。作为输出选项,禁用字幕录制,即任何字幕流的自动选择或映射。要完全手动控制,请参阅
-map选项。
5.10 高级字幕选项
- -fix_sub_duration
-
修复字幕持续时间。对于每个字幕,等待同一流中的下一个数据包,并调整第一个字幕的持续时间,以避免重叠。这对于某些字幕编解码器特别重要,尤其是 DVB 字幕,因为原始数据包中的持续时间仅是粗略估计,结束实际上由空字幕帧标记。如果在需要时未使用此选项,可能会导致过长的持续时间或由于时间戳不单调而导致复用失败。
请注意,此选项将在下一个字幕数据包解码之前延迟所有数据的输出:它可能会大大增加内存消耗和延迟。
- -canvas_size 尺寸
-
设置用于渲染字幕的画布大小。
5.11 高级选项
- -map [-]输入文件 ID[:流说明符][:视图说明符][:?] | [链接标签] (output)
-
在输出文件中创建一个或多个流。此选项有两种形式来指定数据源:第一种形式从某些输入文件中选择一个或多个流(由
-i指定),第二种形式从某些复杂滤镜图输出中选择(由-filter_complex).在第一种形式中,为输入文件中索引为输入文件 ID的每个流创建一个输出流。如果流说明符如果指定了,仅使用符合说明符的流(参见流说明符部分以了解流说明符的语法)。
一个
-字符放置在流标识符之前会创建一个“负”的映射。它会禁用已经创建映射中的匹配流。一个可选的视图说明符可以在流说明符之后指定,适用于多视图视频指定使用的视图。视图说明符可能具有以下格式之一:
- view:视图ID
-
通过其ID选择视图;视图ID可以设置为'all'以使用所有视图,并将其交织为一个流;
- vidx:视图索引
-
通过其索引选择视图;例如,0是基础视图,1是第一个非基础视图,依此类推。
- vpos:位置
-
通过其显示位置选择视图;位置可能是
left或right
对于转码,默认情况下仅使用基础视图,即等同于
vidx:0。对于流拷贝,不支持视图说明符,因此始终复制所有视图。在流索引之后的尾随
?将允许映射变为可选:如果映射没有匹配到流,则忽略映射而不是失败。请注意,如果使用无效的输入文件索引(例如映射指向不存在的输入),则映射仍会失败。一种替代的[链接标签]形式将复杂滤镜图中的输出映射到输出文件(参见-filter_complex选项)。链接标签必须对应于图中定义的输出链接标签。
此选项可以指定多次,每次向输出文件增加更多流。任何给定的输入流也可以被多次映射,作为不同输出流的来源,例如为了使用不同的编码选项和/或滤镜。流在输出中的创建顺序与命令行中指定
-map选项的顺序一致。使用此选项会禁用该输出文件的默认映射。
示例:
- map everything
-
将第一个输入文件中的所有流映射到输出中
ffmpeg -i INPUT -map 0 output
- select specific stream
-
如果第一个输入文件中有两个音频流,这些流分别由0:0和0:1标识。您可以使用
-map选择哪些流放置在输出文件中。例如:ffmpeg -i INPUT -map 0:1 out.wav
将INPUT中的第二个输入流映射到out.wav.
- create multiple streams
-
选择来自输入文件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
- create multiple streams 2
-
从输入文件选择所有视频流和第三个音频流:
ffmpeg -i INPUT -map 0:v -map 0:a:2 OUTPUT
- negative map
-
使用负映射,将所有流映射到输出(除了第二个音频情况下):
ffmpeg -i INPUT -map 0 -map -0:a:1 OUTPUT
- optional map
-
从第一个输入中映射视频和音频流,并使用尾随
?如果第一个输入中没有音频流,则忽略音频映射:ffmpeg -i INPUT -map 0:v -map 0:a? OUTPUT
- map by language
-
选择英语音频流:
ffmpeg -i INPUT -map 0:m:language:eng OUTPUT
- -ignore_unknown
-
忽略具有未知类型的输入流,从而避免在尝试复制这些流时失败。
- -copy_unknown
-
允许具有未知类型的输入流被复制,从而避免在复制这些流时失败。
- -map_metadata[:输出元数据说明符] 输入文件[:元数据说明符输入] (output,per-metadata)
-
从输入文件设置下一个输出文件的元数据信息。请注意,这些是文件索引(0开始),而不是文件名。可选的元数据说明符输入/输出参数用于指定要复制的元数据。元数据说明符可以具有以下形式:
- g
-
全局元数据,即适用于整个文件的元数据
- s[:流说明符]
-
每流元数据。流说明符是一个流说明符,如在流说明符章节中描述。在输入元数据说明符中,从第一个匹配流进行复制。在输出元数据说明符中,将所有匹配流复制到目标位置。
- c:章节索引
-
每章节元数据。章节索引是基于0的章节索引。
- p:节目索引
-
每节目元数据。节目索引是基于0的节目索引。
如果省略元数据说明符,则默认为全局。
默认情况下,全局元数据从第一个输入文件复制,每流和每章节元数据则与流/章节一起复制。这些默认映射可以通过创建任何相关类型的映射禁用。可以使用负文件索引创建一个虚拟映射,以禁用自动复制。
例如,复制输入文件中第一个流的元数据到输出文件的全局元数据:
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 输入文件索引 (output)
-
从输入文件索引复制章节到下一个输出文件。如果未指定章节映射,则从至少有一个章节的第一个输入文件中复制章节。使用负文件索引禁用任何章节复制。 to the next output file. If no chapter mapping is specified, then chapters are copied from the first input file with at least one chapter. Use a negative file index to disable any chapter copying.
- -benchmark (global)
-
在编码结束时显示基准信息。显示实际、系统及用户使用时间和最大内存消耗。最大内存消耗并非所有系统都支持,如果不支持,通常显示为0。
- -benchmark_all (global)
-
在编码期间显示基准信息。显示实际、系统及用户使用时间在不同步骤(音频/视频编码/解码)中的分布。
- -timelimit 持续时间 (global)
-
在FFmpeg运行CPU用户时间达到指定秒数后退出。 seconds in CPU user time.
- -dump (global)
-
将每个输入包转储到标准错误。
- -hex (global)
-
在转储包时,也转储有效负载。
- -readrate 速度 (input)
-
限制输入读取速度。
其值是一个浮点正数,表示在一秒的实时时间内应该摄取的媒体的最大时长(以秒为单位)。 默认值为零,表示没有对摄取速度施加限制。
1表示实时速度,相当于-re.主要用于模拟捕获设备或实时输入流(例如从文件读取时)。 当输入是实际捕获设备或实时流时,不应使用低值,因为可能会导致数据包丢失。
适用于输出数据包流速重要的情况,例如实时流媒体。
- -re (input)
-
以原生帧率读取输入。这等同于设置
-readrate 1. - -readrate_initial_burst 秒
-
设置初始读取突发时间(以秒为单位),之后-re/-readrate将被强制执行。
- -readrate_catchup 速度 (input)
-
如果输入或输出被阻止导致实际读取速度落后于指定的读取速率,则此速率生效,直到输入赶上指定的读取速率。必须不低于主要读取速率。
- -vsync 参数 (global)
- -fps_mode[:流_指定符] 参数 (output,per-stream)
-
设置视频同步方法/帧率模式。vsync适用于所有输出视频流,但可以通过设置fps_mode覆盖某个流。vsync已经不推荐使用,将来会被移除。
出于兼容性原因,vsync的某些值可以用数字指定(以下表中括号内显示)。
- passthrough (0)
-
每帧根据其从解复用器到复用器的时间戳传递。
- cfr (1)
-
框架将被复制或丢弃以实现精确的固定帧率。
- vfr (2)
-
框架将根据其时间戳传递或丢弃,以防止两个框架具有相同的时间戳。
- auto (-1)
-
根据复用器能力在cfr和vfr之间选择。这是默认方法。
请注意,此后时间戳可能会由复用器进一步修改。 例如,如果格式选项avoid_negative_ts已启用。
通过-map选项可以选择从哪个流中获取时间戳。 可以保持视频或音频不变,并使其他流与未更改的流同步。
- -frame_drop_threshold 参数
-
帧丢弃阈值,指定视频帧在被丢弃前可以落后多少。 单位是帧率,因此1.0表示一帧。 默认值是-1.1。一个可能的应用场景是避免时间戳噪声引起的帧丢弃,或在时间戳精确的情况下提高帧丢弃精度。
- -apad 参数 (output,per-stream)
-
填充输出音频流。这与应用
-af apad相同。 参数是一个滤镜参数字符串,其组成与apad滤镜相同。-shortest必须为该输出设置,以使选项生效。 - -copyts
-
不处理输入时间戳,但保留其值而不尝试进行校正。 特别是不移除初始启动时间偏移值。
请注意,根据vsync选项或特定复用器的处理(例如,如果格式选项avoid_negative_ts已启用),即使选择了此选项,输出时间戳也可能与输入时间戳不匹配。
- -start_at_zero
-
与copyts一起使用时,移动输入时间戳使其从零开始。
例如使用
-ss 50会使输出时间戳从50秒开始,无论输入文件的时间戳是从什么开始的。 - -copytb 模式
-
指定在流复制时如何设置编码器时间基。模式是一个整数数值,可以是以下值之一:
- 1
-
使用解复用器时间基。
时间基从对应的输入解复用器复制到输出编码器。 这有时是必须的,以避免在复制可变帧率视频流时出现非单调增加的时间戳。
- 0
-
使用解码器时间基。
时间基从对应的输入解码器复制到输出编码器。
- -1
-
尝试自动选择,以生成合理的输出。
默认值是-1。
- -enc_time_base[:流_指定符] 时间基 (output,per-stream)
-
设置编码器时间基。时间基可以是以下值之一:
- 0
-
根据媒体类别分配默认值。
对于视频 - 使用1/帧率,对于音频 - 使用1/采样率。
- demux
-
使用解复用器的时间基。
- filter
-
使用滤波图的时间基。
- a positive number
-
使用提供的数字作为时间基。
此字段可以用两个整数的比率表示(例如1:24, 1:48000),或者用小数表示(例如0.04166, 2.0833e-5)。
默认值是0。
- -bitexact (input/output)
-
为(解)复用器和(解)编码器启用完全一致模式
- -shortest (output)
-
当最短输出流结束时完成编码。
请注意,此选项可能需要缓冲帧,从而导致额外延迟。 可以用
-shortest_buf_duration选项控制此延迟的最大值。 - -shortest_buf_duration 持续时间 (output)
-
该
-shortest选项可能需要缓冲潜在大量的数据, 当至少一个流是“稀疏”的(例如帧之间有较大间隔 – 这通常发生在字幕的情况下)。此选项控制缓冲帧的最大持续时间(以秒为单位)。 更大的值可能使该
-shortest选项生成更精确的结果,但会增加内存使用量和延迟。默认值是10秒。
- -dts_delta_threshold 阈值
-
时间戳不连续增量阈值,用秒的小数表示。
此选项启用的时间戳不连续校正仅适用于接受时间戳不连续的输入格式(
AVFMT_TS_DISCONT标志已启用),例如MPEG-TS和HLS, 并且在使用-copyts选项时自动禁用(除非检测到环绕)。如果检测到时间戳不连续,其绝对值大于阈值,ffmpeg将通过减小/增加当前DTS和PTS来消除这种不连续性。
默认值是10。
- -dts_error_threshold 阈值
-
时间戳误差增量阈值,用秒的小数表示。
此选项启用的时间戳校正仅适用于不接受时间戳不连续的输入格式(
AVFMT_TS_DISCONT标志未启用)。如果检测到时间戳不连续,其绝对值大于阈值,ffmpeg将丢弃PTS/DTS时间戳值。
默认值是
3600*30(30小时),这是任意选定的值,且相当保守。 - -muxdelay 秒 (output)
-
设置解复用-解码的最大延迟。
- -muxpreload 秒 (output)
-
设置初始解复用-解码延迟。
- -streamid 输出流索引:新值 (output)
-
为输出流分配一个新的流ID值。此选项应在适用的输出文件名之前指定。 在存在多个输出文件的情况下,流ID可能被重新分配为不同的值。
例如,将输出mpegts文件的流0 PID设置为33,流1 PID设置为36:
ffmpeg -i inurl -streamid 0:33 -streamid 1:36 out.ts
- -bsf[:流_指定符] 比特流滤镜 (input/output,per-stream)
-
将比特流滤镜应用于匹配的流。 滤镜在从解复用器接收每个数据包时应用(作为输入选项时),或者在发送到复用器之前应用(作为输出选项时)。
比特流过滤器是一个逗号分隔的比特流过滤器规格列表,每个规格的形式为
过滤器[=选项名0=选项值0:选项名1=选项值1:...]
任何要作为选项值一部分的‘,=:’字符需要使用反斜杠进行转义。
使用
-bsfs选项来获取比特流过滤器列表。例如:
ffmpeg -bsf:v h264_mp4toannexb -i h264.mp4 -c:v copy -an out.h264
应用
h264_mp4toannexb比特流过滤器(将MP4封装的H.264流转为Annex B)到input视频流。另一方面,
ffmpeg -i file.mov -an -vn -bsf:s mov2textsub -c:s copy -f rawvideo sub.txt
应用
mov2textsub比特流过滤器(从MOV字幕中提取文本)到output字幕流。然而请注意,由于这两个示例都使用了-c copy选项,因此过滤器是应用在输入还是输出上的区别不大——如果发生转码则情况会有所改变。 - -tag[:流指示器] 编码标签 (input/output,per-stream)
-
强制为匹配的流设置标签/fourcc。
- -timecode 小时:分钟:秒SEP帧
-
指定写入的时间码。分隔符对于非丢帧时间码为‘:’,对于丢帧为‘;’(或‘.’)。
ffmpeg -i input.mpg -timecode 01:02:03.04 -r 30000/1001 -s ntsc output.mpg
- -filter_complex 过滤器图 (global)
-
定义一个复杂过滤器图,即一个具有任意数量输入和/或输出的图。对于简 单图(只有一个输入和一个同类型输出),请参阅-filter选项。过滤器图是过滤器图的描述,如ffmpeg-filters手册中“过滤器图语法”部分所述。此 选项可以多次指定,每次使用都会创建一个新的复杂过滤器图。
复杂过滤器图的输入可以来自不同的源类型,由相应链接标签的格式区分:
- 要连接一个输入流,请使用
[file_index:stream_specifier](即与-map语法相同)。如果流指示器匹配多个 流,则将使用第一个流。对于多视图视频,流指示器后面可以跟视图指示器, 请参阅-map选项的文档了解其语法。 - 要连接环回解码器,请使用[dec:解码器索引],其中解码器索引是 要连接到给定输入的环回解码器索引。对于多视图视频,解码器索引后面可能 有视图指示器,请参阅-map选项的文档了解其语法。
- 要连接来自另一复杂过滤器图的输出,请使用其链接标签。例如以下示例:
ffmpeg -i input.mkv \ -filter_complex '[0:v]scale=size=hd1080,split=outputs=2[for_enc][orig_scaled]' \ -c:v libx264 -map '[for_enc]' output.mkv \ -dec 0:0 \ -filter_complex '[dec:0][orig_scaled]hstack[stacked]' \ -map '[stacked]' -c:v ffv1 comparison.mkv
读取输入视频并
- (第2行)使用一个具有一个输入和两个输出的复杂过滤器图 对视频进行1920x1080缩放并将结果复制到两个输出;
- (第3行)使用
libx264对其中的一个缩放输出进行编码并将结果写入output.mkv; - (第4行)使用环回解码器解码此编码流;
- (第5行)将环回解码器的输出(即
libx264-编码的视频)与缩放的原始输入并排放置; - (第6行)然后对组合视频进行无损编码并写入comparison.mkv.
请注意,这两个过滤器图不能合并为一个,否则在转码管道中会形成循环 (过滤器图的输出用于编码,然后再进行解码,再返回到同一个图中),这 样的循环是不允许的。
未标记的输入将连接到第一个未使用的匹配类型的输入流。
输出链接标签通过-map引用。未标记的输出则被添加到第一个输出文件中。
请注意,通过此选项可以仅使用lavfi源,而无需使用正常的输入文件。
例如,将图像覆盖到视频上
ffmpeg -i video.mkv -i image.png -filter_complex '[0:v][1:v]overlay[out]' -map '[out]' out.mkv
这里,
[0:v]指第一个输入文件中的第一个视频流, 其被连接到overlay过滤器的第一个(主)输入。同样,第二个输入中的第一个 视频流被连接到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
作为一个特别的例外,您可以将位图字幕流用作输入:它将被转换为与文件中最 大视频相同大小的视频,如果没有视频,则为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秒纯红色视频的源:
color源:ffmpeg -filter_complex 'color=c=red' -t 5 out.mkv
- 要连接一个输入流,请使用
- -filter_complex_threads 线程数量 (global)
-
定义处理复杂过滤器图的线程数量。类似于filter_threads,但用于
-filter_complex图。 默认值为可用CPU数量。 - -lavfi 过滤器图 (global)
-
定义一个复杂过滤器图,即具有任意输入和/或输出的图。等效于-filter_complex.
- -accurate_seek (input)
-
此选项在输入文件中启用或禁用对-ss选项的精确搜索。默认已启用,从而在转码时搜索是精确的。使用-noaccurate_seek禁用它,这可能在复制某些流并转码其他流时有用。
- -seek_timestamp (input)
-
此选项在输入文件中启用或禁用通过时间戳搜索对-ss选项。默认关闭。如果启用,-ss选项的参数被认为是实际时间戳,而不是文件开始时间的偏移。这仅对 不从时间戳0开始的文件有效,比如传输流。
- -thread_queue_size 大小 (input/output)
-
对于输入,此选项设置读取文件或设备时最大队列包数。在低延迟/高速率 的流中,如果包没有及时读取可能会被丢弃;设置此值可以强制ffmpeg使用单独 的输入线程并在包到达时即读取包。默认情况下,ffmpeg只有在指定了多个 输入时才会这样做。
对于输出,此选项指定每个复用线程可能队列的最大包数。
- -sdp_file 文件 (global)
-
将输出流的sdp信息打印到文件。 这允许在至少一个输出不是rtp流时转储sdp信息。(至少一个输出格式需为rtp。). This allows dumping sdp information when at least one output isn’t an rtp stream. (Requires at least one of the output formats to be rtp).
- -discard (input)
-
允许丢弃特定流或流中的帧。 任何输入流都可以完全丢弃,使用值
all,而 在解复用器处选择性丢弃流中的帧不被所有解复用器支持。- none
-
不丢弃任何帧。
- default
-
默认,不丢弃任何帧。
- noref
-
丢弃所有非参考帧。
- bidir
-
丢弃所有双向帧。
- nokey
-
丢弃除关键帧以外的所有帧。
- all
-
丢弃所有帧。
- -abort_on 标志 (global)
-
在各种条件下停止并中止。可用的标志包括:
- empty_output
-
未向复用器传递任何包,输出为空。
- empty_output_stream
-
没有数据包在某些输出流中传递给复用器。
- -max_error_rate (global)
-
设置跨所有输入的解码帧失败率的分数,当超过 ffmpeg将返回退出代码69。超过此阈值不会终止处理。 范围是一个介于0到1之间的浮点数。默认值为2/3。
- -xerror (global)
-
出现错误时停止并退出
- -max_muxing_queue_size 数据包 (output,per-stream)
-
在转码音频和/或视频流时,ffmpeg不会写入输出,直到它为每个这样的流都有一个数据包。 在等待此过程完成时,其他流的数据包会被缓冲。 此选项设置匹配输出流缓冲区的大小(以数据包为单位)。
此选项的默认值应足够高以满足大多数需求,因此仅在确实需要时调整此选项。
- -muxing_queue_data_threshold 字节 (output,per-stream)
-
这是一个最低阈值,直到达到该值之前,复用队列大小不会被考虑。 默认值为每个流50兆字节,并基于传递给复用器的总数据包大小。
- -auto_conversion_filters (global)
-
启用在所有过滤器图中自动插入格式转换过滤器,包括由-vf, -af, -filter_complex和-lavfi定义的过滤器图。如果过滤器格式协商需要转换,过滤器的初始化将失败。 转换仍然可以通过在图中插入相关转换过滤器(比如scale,aresample)来执行。 默认启用,若需显式禁用,请指定
-noauto_conversion_filters. - -bits_per_raw_sample[:流指定符] 值 (output,per-stream)
-
声明给定输出流中的每个原始样本的位数为值。请注意,此选项设置提供给编码器/复用器的信息,但不会更改流以符合此值。 设置与流特性不匹配的值可能会导致编码失败或输出文件无效。
- -stats_enc_pre[:流指定符] 路径 (output,per-stream)
- -stats_enc_post[:流指定符] 路径 (output,per-stream)
- -stats_mux_pre[:流指定符] 路径 (output,per-stream)
-
将有关匹配流的每帧编码信息写入文件路径.
-stats_enc_pre写入关于在编码之前发送的原始视频或音频帧的信息,而-stats_enc_post写入关于从编码器接收的编码包的信息。-stats_mux_pre写入有关即将发送到复用器的数据包的信息。 每帧或数据包在指定文件中生成一行。 该行的格式由-stats_enc_pre_fmt / -stats_enc_post_fmt / -stats_mux_pre_fmt.
控制。当多个流的统计写入一个文件时,不同流对应的行将交错排列。 此交错的确切顺序并未明确指定,并且使用相同的选项多次运行程序时可能产生不同的结果。
- -stats_enc_pre_fmt[:流指定符] 格式指定符 (output,per-stream)
- -stats_enc_post_fmt[:流指定符] 格式指定符 (output,per-stream)
- -stats_mux_pre_fmt[:流指定符] 格式指定符 (output,per-stream)
-
指定用-stats_enc_pre / -stats_enc_post / -stats_mux_pre.
写入行的格式是一个字符串,可能包含形式为{fmt}. 的指令。是反斜杠转义的—使用\{、\}和\\写出字面上的 {、} 或\,分别对应输出。
使用的指令fmt可能是下列之一:
- fidx
-
输出文件的索引号。
- sidx
-
文件中的输出流的索引号。
- n
-
帧编号。编码前:到目前为止发送到编码器的帧数。 编码后:到目前为止从编码器接收到的数据包数。 复用:到目前为止提交给此流复用器的数据包数。
- ni
-
输入帧号。与此输出帧或数据包对应的输入帧(即由解码器输出的帧)的索引。 如果不可用,则为-1。
- tb
-
该帧/数据包时间戳所使用的时间基准,以有理数表示num/den。请注意,编码器和复用器可能使用不同的时间基准。
- tbi
-
时间基准用于ptsi,以有理数表示num/den。仅在ptsi可用时有效,0/1否则无效。
- pts
-
帧或数据包的显示时间戳,以整数表示。应乘以时间基准以计算显示时间。
- ptsi
-
输入帧的显示时间戳(见ni),以整数表示。应乘以tbi来计算显示时间。 如果不可用,则显示为(2^63 - 1 = 9223372036854775807)。
- t
-
帧或数据包的显示时间(以小数表示)。等于pts乘以tb.
- ti
-
输入帧的显示时间(见ni),以小数表示。等于ptsi乘以tbi。如果不可用,则显示为inf。
- dts (packet)
-
数据包的解码时间戳,以整数表示。应乘以时间基准计算显示时间。
- dt (packet)
-
帧或数据包的解码时间(以小数表示)。等于dts乘以tb.
- sn (frame,audio)
-
到目前为止发送给编码器的音频样本数。
- samp (frame,audio)
-
帧中的音频样本数量。
- size (packet)
-
编码数据包的大小(以字节为单位)。
- br (packet)
-
当前的比特率(以比特每秒为单位)。
- abr (packet)
-
到目前为止发生的整个流的平均比特率(以比特每秒为单位),如果此时无法确定,则为-1。
- key (packet)
-
如果数据包包含关键帧,则为字符‘K’,否则为字符‘N’。
标记为packet的指令只能用于-stats_enc_post_fmt和-stats_mux_pre_fmt.
标记为frame的指令只能用于-stats_enc_pre_fmt.
标记为audio的指令只能用于音频流。
默认格式字符串为:
- pre-encoding
-
{fidx} {sidx} {n} {t}
- post-encoding
-
{fidx} {sidx} {n} {t}
将来可能会在默认格式化字符串的末尾添加新项。 依赖格式保持完全相同的用户,应手动定义格式。
请注意,写入同一文件的不同流的统计可能具有不同的格式。
5.12 预设文件
预设文件包含一个序列选项=值对, 每一行指定一个选项序列,这样会比在命令行中指定更方便。以井号(‘#’)开头的行会被忽略,并用作注释。参考presetsFFmpeg源代码树中的目录获取示例。
预设文件有两种类型:ffpreset和avpreset文件。
5.12.1 ffpreset文件
用以下命令可以指定ffpreset文件vpre, apre,
spre,以及fpre选项。这个fpre选项接收预设文件的
文件名作为输入,而不是预设名称,可以用于任何类型的编解码器。而vpre, apre,以及spre选项,预设文件中指定的选项会应用于与该预设选项类型相同的当前选择的编解码器。
对vpre, apre,以及spre预设选项所传递的参数用于根据以下规则标识要使用的预设文件:
首先,ffmpeg会搜索名称为arg.ffpreset的文件,
在以下目录中依次查找:$FFMPEG_DATADIR(如果设置了),$HOME/.ffmpeg和在配置时定义的datadir目录(通常为PREFIX/share/ffmpeg)
或者在Win32平台上与可执行文件同级的ffpresets文件夹中。例如,如果参数是libvpx-1080p,它将搜索libvpx-1080p.ffpreset.
这个文件。如果没有找到这样的文件,ffmpeg则会搜索一个名称为-arg.ffpreset的文件,在上述目录中,
其中codec_name是将预设文件选项应用到的编解码器名称。例如,如果你选择了视频编解码器-vcodec libvpx并使用了-vpre 1080p,
那么它将搜索libvpx-1080p.ffpreset.
5.12.2 avpreset文件
可以用pre选项指定avpreset文件。它们的工作方式类似于
ffpreset文件,但只允许特定于编码器的选项。因此,不能使用一对选项=值指定编码器。
当指定了pre选项时,ffmpeg将会在以下目录中搜索后缀为.avpreset的文件:$AVCONV_DATADIR(如果设置了),$HOME/.avconv和在配置时定义的datadir目录(通常为PREFIX/share/ffmpeg),按照这个顺序查找。
首先,ffmpeg会搜索名称为codec_name-arg.avpreset的文件,在上述目录中,
其中codec_name是将预设文件选项应用到的编解码器名称。例如,如果你选择了视频编解码器-vcodec libvpx并使用了-pre 1080p,
那么它将搜索libvpx-1080p.avpreset.
如果没有找到这样的文件,ffmpeg则会搜索一个名称为arg.avpreset的文件,在相同的目录中。
5.13 vstats文件格式
通过-vstats和-vstats_file选项可以生成一个文件,
其中包含关于生成的视频输出的统计信息。
用-vstats_version选项可控制生成文件的格式版本。
格式版本为1时的格式为:
frame= 帧 q= 帧质量 PSNR= 峰值信噪比 f_size= 帧大小 s_size= 流大小kB time= 时间戳 br= 比特率kbits/s avg_br= 平均比特率kbits/s
格式版本为2的格式为:
out= 输出文件索引 st= 输出文件流索引 frame= 帧号 q= 帧质量f PSNR= 峰值信噪比 f_size= 帧大小 s_size= 流大小kB time= 时间戳 br= 比特率kbits/s avg_br= 平均比特率kbits/s
每个键对应的值说明如下:
- avg_br
-
以Kbits/s为单位的平均比特率
- br
-
以Kbits/s为单位的比特率
- frame
-
已编码帧的数量
- out
-
输出文件索引
- PSNR
-
峰值信噪比
- q
-
帧的质量
- f_size
-
已编码包大小,以字节数为单位
- s_size
-
流的大小,以KiB为单位
- st
-
输出文件流索引
- time
-
包的时间
- type
-
图片类型
另请参见-stats_enc选项以另一种方式显示编码统计信息。
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
请注意,在使用任何电视观看器(如)启动ffmpeg之前,您必须激活正确的视频源和频道。xawtv由Gerd Knorr编写。您还必须用标准混音器正确设置音频录制级别。
6.2 X11抓取
通过ffmpeg抓取X11显示内容
ffmpeg -f x11grab -video_size cif -framerate 25 -i :0.0 /tmp/out.mpg
0.0是您X11服务器的显示.screen编号,与DISPLAY环境变量相同。
ffmpeg -f x11grab -video_size cif -framerate 25 -i :0.0+10,20 /tmp/out.mpg
0.0是您X11服务器的显示.screen编号,与DISPLAY环境变量相同。10是抓取的x偏移,20是y偏移。
6.3 视频和音频文件格式转换
任何支持的文件格式和协议都可以作为ffmpeg的输入:
示例:
- 您可以使用YUV文件作为输入:
ffmpeg -i /tmp/test%d.Y /tmp/out.mpg
它将使用以下文件:
/tmp/test0.Y, /tmp/test0.U, /tmp/test0.V, /tmp/test1.Y, /tmp/test1.U, /tmp/test1.V, etc...
Y文件的分辨率是U和V文件的两倍。它们是没有头部的原始文件,可以通过所有优秀的视频解码器生成。如果ffmpeg无法推断图像的大小,您必须使用-s选项来指定。
- 您可以从一个原始YUV420P文件中输入:
ffmpeg -i /tmp/test.yuv /tmp/out.avi
test.yuv是一个包含原始YUV平面数据的文件。每帧由Y平面组成,后面是U和平面,U和平面具有垂直和水平一半的分辨率。
- 您可以输出到一个原始YUV420P文件:
ffmpeg -i mydivx.avi hugefile.yuv
- 您可以设置多个输入文件和输出文件:
ffmpeg -i /tmp/a.wav -s 640x480 -i /tmp/a.yuv /tmp/a.mpg
将音频文件a.wav和原始YUV视频文件a.yuv转换为MPEG文件a.mpg。
- 您还可以同时进行音频和视频转换:
ffmpeg -i /tmp/a.wav -ar 22050 /tmp/a.mp2
将a.wav转换为22050 Hz采样率的MPEG音频。
- 您可以同时编码为多种格式,并定义从输入流到输出流的映射:
ffmpeg -i /tmp/a.wav -map 0:a -b:a 64k /tmp/a.mp2 -map 0:a -b:a 128k /tmp/b.mp2
将a.wav转换为64 kbits的a.mp2和128 kbits的b.mp2。'-map file:index'指定哪个输入流用于每个输出流,按输出流定义的顺序排列。
- 您可以转码解密的VOB文件:
ffmpeg -i snatch_1.vob -f avi -c:v mpeg4 -b:v 800k -g 300 -bf 2 -c:a libmp3lame -b:a 128k snatch.avi
这是一个典型的DVD抓取示例;输入是VOB文件,输出是带有MPEG-4视频和MP3音频的AVI文件。请注意,在此命令中我们使用了B帧,因此MPEG-4流与DivX5兼容,并且GOP大小为300,这意味着对于29.97fps输入视频,每10秒有一个帧内帧。此外,音频流是MP3编码的,因此您需要通过传递启用LAME支持
--enable-libmp3lame来配置。映射对于DVD转码特别有用,可以选择所需的音频语言。注意:要查看支持的输入格式,请使用
ffmpeg -demuxers. - 您可以从视频中提取图像,或从许多图像创建视频:
从视频中提取图像:
ffmpeg -i foo.avi -r 1 -s WxH -f image2 foo-%03d.jpeg
这将从视频中每秒提取一帧,并将其输出到以文件命名的文件中foo-001.jpeg, foo-002.jpeg等。图像将被重新调整大小以适应新的WxH值。
如果您只想提取有限数量的帧,您可以将上述命令与
-frames:v或-t选项结合使用,或者与-ss结合使用,从某个时间点开始提取。从许多图像创建视频:
ffmpeg -f image2 -framerate 12 -i foo-%03d.jpeg -s WxH foo.avi
语法
foo-%03d.jpeg指定使用一个由三位数字组成的十进制数,并用零填充以表示序列号。这与C语言printf函数支持的语法相同,但只有接受普通整数的格式是适用的。在导入图像序列时,-i还支持通过选择image2特定的
-pattern_type glob选项内部扩展类似shell的通配符模式(globbing)。例如,从与glob模式匹配的文件名中创建视频
foo-*.jpeg:ffmpeg -f image2 -pattern_type glob -framerate 12 -i 'foo-*.jpeg' -s WxH foo.avi
- 您可以在输出中放入同类型的多个流:
ffmpeg -i test1.avi -i test2.avi -map 1:1 -map 1:0 -map 0:1 -map 0:0 -c copy -y test12.nut
生成的输出文件test12.nut将包含从输入文件中按相反顺序排列的前四个流。
- 强制CBR视频输出:
ffmpeg -i myfile.avi -b 4000k -minrate 4000k -maxrate 4000k -bufsize 1835k out.m2v
- 四个选项lmin、lmax、mblmin和mblmax使用“lambda”单位,但您可以使用常数QP2LAMBDA轻松从“q”单位进行转换:
ffmpeg -i src.ext -lmax 21*QP2LAMBDA dst.ext
7 另请参阅
ffmpeg-all, ffplay, ffprobe, ffmpeg-utils, ffmpeg-scaler, ffmpeg-resampler, ffmpeg-codecs, ffmpeg-bitstream-filters, ffmpeg-formats, ffmpeg-devices, ffmpeg-protocols, ffmpeg-filters
8 作者
FFmpeg开发者。
有关作者信息,请参阅项目的Git历史记录(https://git.ffmpeg.org/ffmpeg),例如通过在FFmpeg源目录中输入命令git log,或浏览在线存储库https://git.ffmpeg.org/ffmpeg.
特定组件的维护者列在文件中MAINTAINERS源代码树中。
本文档生成于May 23, 2025使用makeinfo.
托管服务由telepoint.bg 提供