FFmpeg 格式文档

目录

1 描述

本文档描述了 libavformat 库提供的支持的格式(复用器和解复用器)。

2 格式选项

libavformat 库提供了一些通用的全局选项,这些选项可以在所有复用器和解复用器上设置。此外,每个复用器或解复用器可能支持所谓的私有选项,这些选项是该组件特有的。

可以通过在 FFmpeg 工具中指定 -选项 ,或者通过在 AVFormatContext 选项中显式设置该值,或者使用 libavutil/opt.h API 进行编程使用来设置选项。

以下是支持的选项列表

avioflags 标志 (输入/输出)

可能的值

direct

减少缓冲。

probesize 整数 (输入)

设置探测大小(以字节为单位),即分析以获取流信息的数据大小。较高的值将能够在流中分散的情况下检测到更多信息,但会增加延迟。必须是不小于 32 的整数。默认值为 5000000。

max_probe_packets 整数 (输入)

设置探测编解码器时缓冲的最大数据包数。默认值为 2500 个数据包。

packetsize 整数 (输出)

设置数据包大小。

fflags 标志

设置格式标志。有些是为有限数量的格式实现的。

输入文件的可能值

discardcorrupt

丢弃损坏的数据包。

fastseek

对某些格式启用快速但不精确的查找。

genpts

如果存在 DTS,则生成缺失的 PTS。

igndts

如果也设置了 PTS,则忽略 DTS。如果设置了 PTS,则将 DTS 值设置为 NOPTS。当设置 nofillin 标志时,将忽略此设置。

ignidx

忽略索引。

nobuffer

减少初始输入流分析期间缓冲引入的延迟。

nofillin

不要填充可以精确计算的数据包字段中的缺失值。

noparse

禁用 AVParsers,这也需要 +nofillin

sortdts

尝试按 DTS 交错输出数据包。目前,仅适用于具有索引的 AVI。

输出文件的可能值

autobsf

根据输出格式的要求自动应用比特流过滤器。默认启用。

bitexact

仅写入平台、构建和时间无关的数据。这确保了文件和数据校验和是可重现的,并且在平台之间匹配。它的主要用途是用于回归测试。

flush_packets

立即写出数据包。

shortest

在最短流的末尾停止复用。可能需要增加 max_interleave_delta 以避免在 EOF 之前刷新较长的流。

seek2any 整数 (输入)

如果设置为 1,则允许在支持时在解复用器级别查找非关键帧。默认值为 0。

analyzeduration 整数 (输入)

指定分析输入所用的微秒数。数值越高,检测到的信息越准确,但会增加延迟。默认值为 5,000,000 微秒 = 5 秒。

cryptokey 十六进制字符串 (输入)

设置解密密钥。

indexmem 整数 (输入)

设置时间戳索引的最大内存使用量(每个流)。

rtbufsize 整数 (输入)

设置用于缓冲实时帧的最大内存。

fdebug 标志 (输入/输出)

打印特定的调试信息。

可能的值

ts
max_delay 整数 (输入/输出)

设置复用或解复用的最大延迟(以微秒为单位)。

fpsprobesize 整数 (输入)

设置用于探测 fps 的帧数。

audio_preload 整数 (输出)

设置音频数据包应提前交错的微秒数。

chunk_duration 整数 (输出)

设置每个块的微秒数。

chunk_size 整数 (输出)

设置每个块的大小(以字节为单位)。

err_detect, f_err_detect 标志 (输入)

设置错误检测标志。f_err_detect 已弃用,应仅通过 ffmpeg 工具使用。

可能的值

crccheck

验证嵌入的 CRC。

bitstream

检测比特流规范偏差。

buffer

检测不正确的比特流长度。

explode

在检测到小错误时中止解码。

careful

将违反规范且在实际应用中未出现过的情况视为错误。

compliant

将所有不符合规范的情况视为错误。

aggressive

将理智的编码器不应该做的事情视为错误。

max_interleave_delta 整数 (输出)

设置交错的最大缓冲持续时间。该持续时间以微秒表示,默认值为 10000000(10 秒)。

为了确保所有流都正确交错,libavformat 将等待,直到它至少拥有每个流的一个数据包,然后再将任何数据包写入输出文件。当某些流“稀疏”(即,连续数据包之间存在较大间隔)时,这可能会导致过度缓冲。

此字段指定复用队列中第一个和最后一个数据包的时间戳之间的最大差异,高于此值时,libavformat 将输出数据包,无论它是否已为所有流排队了数据包。

如果设置为 0,libavformat 将继续缓冲数据包,直到它拥有每个流的数据包,而不管缓冲数据包之间的最大时间戳差异。

use_wallclock_as_timestamps 整数 (输入)

如果设置为 1,则使用挂钟时间作为时间戳。默认值为 0。

avoid_negative_ts 整数 (输出)

可能的值

make_non_negative

移动时间戳以使其非负数。另请注意,这仅影响前导负时间戳,而不影响非单调负时间戳。

make_zero

移动时间戳,使第一个时间戳为 0。

auto (默认)

在目标格式需要时启用移动。

disabled

禁用时间戳的移动。

启用移动后,所有输出时间戳都移动相同的量。与不移动的情况相比,音频、视频和字幕的同步和相对时间戳差异将保留。

skip_initial_bytes 整数 (输入)

如果设置为 1,则设置在读取标头和帧之前要跳过的字节数。默认值为 0。

correct_ts_overflow 整数 (输入)

如果设置为 1,则校正单个时间戳溢出。默认值为 1。

flush_packets 整数 (输出)

在每个数据包之后刷新底层 I/O 流。默认值为 -1(自动),这意味着底层协议将决定,1 启用它,并且具有降低延迟的效果,0 禁用它,并且在某些情况下可能会提高 IO 吞吐量。

output_ts_offset 偏移量 (输出)

设置输出时间偏移量。

偏移量 必须是时间持续时间规范,请参阅 (ffmpeg-utils)ffmpeg-utils(1) 手册中的“时间持续时间”部分

偏移量由复用器添加到输出时间戳。

指定正偏移量意味着相应的流将延迟 偏移量 中指定的时间持续时间。默认值为 0(表示不应用偏移)。

format_whitelist 列表 (输入)

允许的解复用器列表,以“,”分隔。默认情况下,允许所有解复用器。

dump_separator 字符串 (输入)

用于分隔命令行上打印的有关流参数的字段的分隔符。例如,要使用换行符和缩进分隔字段

ffprobe -dump_separator "
                          "  -i ~/videos/matrixbench_mpeg2.mpg
max_streams 整数 (输入)

指定最大流数。这可用于拒绝由于大量流而需要过多资源的文件。

skip_estimate_duration_from_pts 布尔值 (输入)

如果需要在文件末尾对 PTS 进行额外探测,则跳过输入持续时间的估计。目前,适用于 MPEG-PS 和 MPEG-TS。

duration_probesize 整数 (输入)

设置探测大小(以字节为单位),用于在实际需要在文件末尾对 PTS 进行额外探测时估计输入持续时间(目前:MPEG-PS 和 MPEG-TS)。它面向对自身或间接(例如,因为使用 concat 解复用器)对更好的持续时间探测感兴趣的用户。典型的用例是具有高比特率、高视频缓冲且以视频和音频的相似 PTS 结束清理的 MPEG-TS CBR:在这种情况下,最后一个视频数据包和最后一个音频数据包之间的大物理间隙使得需要读取许多字节才能获得视频流持续时间。另一个用例是,由于帧重新排序,默认探测行为仅到达单个视频帧,该帧不是流的最后一个视频帧,因此持续时间不准确。设置此选项即使对于小文件也会产生性能影响,因为探测大小是固定的。默认行为是一种通用的权衡方案,具有很强的适应性,但不会不惜一切代价扩展探测大小来获取流持续时间。必须是大于 1 的整数,或者为 0 表示默认行为。

strict, f_strict 整数 (输入/输出)

指定遵循标准的严格程度。f_strict 已弃用,应仅通过 ffmpeg 工具使用。

可能的值

very

严格遵守较旧、更严格的规范版本或参考软件

strict

严格遵守规范中的所有内容,无论后果如何

normal
unofficial

允许非官方扩展

experimental

允许非标准化实验性内容、实验性(未完成/正在进行的工作/未经充分测试)解码器和编码器。注意:实验性解码器可能会带来安全风险,不要将其用于解码不受信任的输入。

2.1 格式流指定符

格式流说明符允许选择一个或多个与特定属性匹配的流。

流说明符的确切语义由 libavformat/avformat.h 标头中声明并在 (ffmpeg)ffmpeg(1) 手册中的“流说明符”部分中记录的 avformat_match_stream_specifier() 函数定义。

3 解复用器

解复用器是 FFmpeg 中配置的元素,可以从特定类型的文件中读取多媒体流。

当您配置 FFmpeg 构建时,默认情况下会启用所有支持的解复用器。您可以使用配置选项 --list-demuxers 列出所有可用的解复用器。

您可以使用配置选项 --disable-demuxers 禁用所有解复用器,并使用选项 --enable-demuxer=DEMUXER 选择性地启用单个解复用器,或使用选项 --disable-demuxer=DEMUXER 禁用它。

ff* 工具的选项 -demuxers 将显示已启用的解复用器列表。使用 -formats 查看已启用的解复用器和复用器的组合列表。

以下是一些当前可用的解复用器的描述。

3.1 aa

Audible Format 2、3 和 4 解复用器。

此解复用器用于解复用 Audible Format 2、3 和 4 (.aa) 文件。

3.2 aac

原始音频数据传输流 AAC 解复用器。

此解复用器用于解复用包含单个 AAC 流以及其中任何 ID3v1/2 或 APE 标签的 ADTS 输入。

3.3 apng

动画可移植网络图形解复用器。

此解复用器用于解复用 APNG 文件。所有标头(除了 PNG 签名)直到(但不包括)第一个 fcTL 块都作为附加数据传输。然后,帧被分割为两个 fcTL 块之间或最后一个 fcTL 和 IEND 块之间的所有块。

-ignore_loop bool

如果设置,则忽略文件中的循环变量。默认情况下启用。

-max_fps int

最大帧速率,以每秒帧数为单位。默认值 0 表示没有限制。

-default_fps int

文件中未指定时的默认帧速率(0 表示尽可能快)。默认值为 15。

3.4 asf

高级系统格式解复用器。

此解复用器用于解复用 ASF 文件和 MMS 网络流。

-no_resync_search bool

不要尝试通过查找特定的可选起始代码来重新同步。

3.5 concat

虚拟连接脚本解复用器。

此解复用器从文本文件中读取文件列表和其他指令,并按顺序解复用它们,就好像它们的所有数据包都已复用在一起一样。

文件中的时间戳会进行调整,以便第一个文件从 0 开始,每个下一个文件从上一个文件结束的位置开始。请注意,这是全局完成的,如果所有流的长度不完全相同,可能会导致间隙。

所有文件必须具有相同的流(相同的编解码器、相同的时间基准等)。

每个文件的持续时间用于调整下一个文件的时间戳:如果持续时间不正确(因为它是使用比特率计算的,或者因为文件被截断,例如),可能会导致伪像。可以使用 duration 指令来覆盖存储在每个文件中的持续时间。

3.5.1 语法

脚本是一个扩展 ASCII 文本文件,每行一个指令。空行、前导空格和以“#”开头的行将被忽略。识别以下指令

file path

要读取的文件的路径;特殊字符和空格必须使用反斜杠或单引号转义。

所有后续与文件相关的指令都适用于该文件。

ffconcat version 1.0

识别脚本类型和版本。

为了使 FFmpeg 自动识别该格式,此指令必须完全按照原样(没有额外的空格或字节顺序标记)出现在脚本的第一行。

duration dur

文件的持续时间。此信息可以从文件中指定;在此处指定可能更有效,或者在文件中的信息不可用或不准确时有所帮助。

如果为所有文件设置了持续时间,则可以在整个连接的视频中进行查找。

inpoint timestamp

文件的入点。当解复用器打开文件时,它会立即查找指定的时间戳。进行查找是为了确保所有流都可以在入点成功呈现。

此指令最适合帧内编解码器,因为对于非帧内编解码器,您通常会在实际入点之前获得额外的数据包,并且解码的内容很可能也包含入点之前的帧。

对于每个文件,文件入点之前的数据包的时间戳将小于该文件的计算起始时间戳(对于第一个文件为负值),并且文件的持续时间(如果未由 duration 指令指定)将根据其指定的入点减少。

由于入点之前可能存在数据包,因此两个连接文件之间的数据包时间戳可能会重叠。

outpoint timestamp

文件的出点。当解复用器在任何流中达到指定的解码时间戳时,它会将其视为文件结束条件,并跳过当前和所有流中剩余的数据包。

出点是排他的,这意味着解复用器不会输出解码时间戳大于或等于出点的数据包。

此指令最适合帧内编解码器和所有流都紧密交织的格式。对于非帧内编解码器,您通常会在出点之后获得具有演示时间戳的额外数据包,因此解码的内容很可能也包含出点之后的帧。如果您的流没有紧密交织,您可能无法在出点之前获得所有流的所有数据包,并且您可能只能解码出点之前最早的流。

文件的持续时间(如果未由 duration 指令指定)将根据其指定的出点减少。

file_packet_metadata key=value

文件数据包的元数据。指定的元数据将为每个文件数据包设置。您可以多次指定此指令以添加多个元数据条目。此指令已弃用,请改用 file_packet_meta

file_packet_meta key value

文件数据包的元数据。指定的元数据将为每个文件数据包设置。您可以多次指定此指令以添加多个元数据条目。

option key value

访问、打开和探测文件的选项。可以多次出现。

stream

在虚拟文件中引入一个流。所有后续与流相关的指令都适用于最后引入的流。必须设置某些流属性,以便允许识别子文件中匹配的流。如果脚本中没有定义任何流,则会复制第一个文件中的流。

exact_stream_id id

设置流的 id。如果给出此指令,将使用子文件中具有相应 id 的字符串。这对于 MPEG-PS (VOB) 文件尤其有用,因为流的顺序不可靠。

stream_meta key value

流的元数据。可以多次出现。

stream_codec

流的编解码器。

stream_extradata 十六进制字符串

流的额外数据,以十六进制编码。

chapter id 开始 结束

添加一个章节。id 是一个唯一的标识符,通常是小而连续的。

3.5.2 选项

此解复用器接受以下选项

safe

如果设置为 1,则拒绝不安全的文件路径和指令。如果文件路径不包含协议规范,并且是相对路径,并且所有组件仅包含来自可移植字符集(字母、数字、句点、下划线和连字符)的字符,并且组件的开头没有句点,则该文件路径被认为是安全的。

如果设置为 0,则接受任何文件名。

默认值为 1。

auto_convert

如果设置为 1,则尝试对数据包数据执行自动转换,以使流可以连接。默认值为 1。

目前,唯一的转换是将 h264_mp4toannexb 比特流过滤器添加到 MP4 格式的 H.264 流中。如果存在分辨率更改,则尤其有必要这样做。

segment_time_metadata

如果设置为 1,则每个数据包将包含 lavf.concat.start_timelavf.concat.duration 数据包元数据值,这些值是以微秒表示的连接输出中各个文件段的开始时间和持续时间。只有在基于连接文件已知持续时间时,才会设置持续时间元数据。默认值为 0。

3.5.3 示例

  • 使用绝对文件名并包含一些注释
    # my first filename
    file /mnt/share/file-1.wav
    # my second filename including whitespace
    file '/mnt/share/file 2.wav'
    # my third filename including whitespace plus single quote
    file '/mnt/share/file 3'\''.wav'
    
  • 允许输入格式自动探测,使用安全文件名并设置第一个文件的持续时间
    ffconcat version 1.0
    
    file file-1.wav
    duration 20.0
    
    file subdir/file-2.wav
    

3.6 dash

基于 HTTP 的动态自适应流解复用器。

此解复用器呈现清单中找到的所有 AVStream。通过设置 AVStream 上的丢弃标志,调用者可以决定实际接收哪些流。每个流都镜像 <Representation> 中的 idbandwidth 属性,作为名为 "id" 和 "variant_bitrate" 的元数据键。

3.6.1 选项

此解复用器接受以下选项

cenc_decryption_key

16 字节密钥,以十六进制表示,用于解密使用 ISO 通用加密(CENC/AES-128 CTR;ISO/IEC 23001-7)加密的文件。

3.7 dvdvideo

DVD-Video 解复用器,由 libdvdnav 和 libdvdread 提供支持。

可以直接将 DVD 标题(特别是连续的 PGC)摄取到转换管道中。菜单资源,例如背景视频或音频,也可以根据菜单的坐标(尽最大努力)进行解复用。

接受块设备(DVD 驱动器)、ISO 文件和目录结构。在这些输入的前面使用 -f dvdvideo 激活。

此解复用器不具有任何类型的解密代码。您需要自己处理加密的 DVD,并且不应期望在这方面获得支持。

底层播放由 libdvdnav 处理,结构解析由 libdvdread 处理。FFmpeg 必须使用可用的 GPL 库支持以及配置开关 --enable-libdvdnav--enable-libdvdread 构建。

您将需要提供所需的“标题编号”或确切的 PGC/PG 坐标。许多开源 DVD 播放器和工具可以帮助提供此信息。如果未指定,则解复用器将默认为标题 1,这对许多光盘都有效。但是,由于格式的灵活性,建议手动检查。有许多光盘的创作方式很奇怪或带有无效的标头。

如果输入是真实的 DVD 驱动器,请注意,有些驱动器可能会在从光盘读取坏扇区时静默失败,而是返回随机位,这实际上是损坏的数据。这在老化的或腐烂的光盘上尤为突出。需要进行第二次扫描和完整性检查才能检测到损坏。这不是 FFmpeg 的问题。

3.7.1 背景

DVD-Video 不是传统意义上可以直接访问的线性容器格式。相反,它允许复杂且可编程地播放仔细多路复用的 MPEG-PS 流,这些流存储在无标头的 VOB 文件中。对于最终用户,这些流简称为“标题”,但实际的逻辑播放顺序由标题中的一个或多个“PGC”(即节目组链)定义。PGC 又由多个“PG”(即节目)组成,这些节目是实际的视频片段(对于典型的视频功能,按顺序排列)。PGC 结构以及流布局和元数据存储在需要解析的 IFO 文件中。PGC 可以更简单地被认为是播放列表。

实际的 DVD 播放器依靠用户通过菜单和内部虚拟机进行 GUI 交互来驱动解复用的方向。通常,用户会导航(通过菜单)或自动重定向到他们选择的 PGC。在此过程和随后的播放过程中,DVD 播放器的内部虚拟机还会维护状态并执行可以在播放期间创建跳转到不同扇区的指令。这就是 libdvdnav 的原因,因为线性读取光盘上的 MPEG-PS blob(VOB)不足以在许多情况下产生正确的序列。

还有许多其他的 DVD 结构(一个很长的主题)在这里不讨论。特别是,NAV 数据包由该解复用器处理以构建准确的计时,但不作为流发出。要获得良好的高层理解,请参阅:https://code.videolan.org/videolan/libdvdnav/-/blob/master/doc/dvd_structures

3.7.2 选项

此解复用器接受以下选项

title 整数

要播放的标题编号。如果未设置 pgcpg,则必须设置。不适用于菜单。默认为 0(自动),目前仅选择第一个可用的标题(标题 1)并通知用户其含义。

chapter_start 整数

要开始的章节或 PTT(标题的一部分)编号。不适用于菜单。默认为 1。

chapter_end 整数

要结束的章节或 PTT(标题的一部分)编号。不适用于菜单。默认为 0,这是一个特殊值,表示在最后一个可能的章节结束。

angle 整数

视频角度编号,指的是本质上是另一个视频流,该视频流由 VOB 中交错的备用帧组成。不适用于菜单。默认为 1。

region 整数

用于播放的区域代码。某些光盘可能会使用此选项来在不同区域中默认播放特定角度。如果用作输入,此选项不会影响真实 DVD 驱动器的区域代码。不适用于菜单。默认为 0,“世界”。

menu 布尔值

解复用菜单资源而不是导航标题。需要菜单的确切坐标(menu_lumenu_vtspgcpg)。默认为 false。

menu_lu 整数

要解复用的菜单语言。在 DVD 中,菜单按语言分组。默认为 1,第一个语言单元。

menu_vts 整数

菜单所在的 VTS,如果它是 VMG 菜单(根级别),则为 0。默认为 1,第一个 VTS 的菜单。

pgc 整数

要开始播放的入口 PGC,与 pg 结合使用。替代设置 title。目前不支持章节标记。必须为菜单显式设置。默认为 0,从 title 的值自动解析。

pg 整数

要开始播放的入口 PG,与 pgc 结合使用。替代设置 title。目前不支持章节标记。默认为 1,PGC 的第一个 PG。

preindex 布尔值

启用此功能以获得准确的章节(PTT)标记和持续时间测量,这需要进行慢速第二次扫描读取,以便从 NAV 数据包中索引章节标记时间戳。对于真实的磁光驱动器来说,这是不理想的额外工作。建议将 DVD 结构的备份存储在硬盘驱动器上时使用此选项,速度会更快。与 pgcpg 不兼容。默认为 0,false。

trim 布尔值

跳过开头处的填充单元格(即短于 1 秒的单元格)。许多光盘在 PGC 的开头都有填充片段,这些片段通常包含用于控制真实 DVD 播放器缓冲速度的垃圾数据,并且没有其他材质数据值。不适用于菜单。默认为 1,即 true。

3.7.3 示例

  • 从给定的 DVD 结构打开标题 3
    ffmpeg -f dvdvideo -title 3 -i <path to DVD> ...
    
  • 从给定的 DVD 结构中打开标题 1 中的章节 3-6
    ffmpeg -f dvdvideo -chapter_start 3 -chapter_end 6 -title 1 -i <path to DVD> ...
    
  • 从给定的 DVD 结构中仅打开标题 1 中的章节 5
    ffmpeg -f dvdvideo -chapter_start 5 -chapter_end 5 -title 1 -i <path to DVD> ...
    
  • 从 VTS 1、PGC 1 中的 PG 1 开始解复用语言 1 的菜单
    ffmpeg -f dvdvideo -menu 1 -menu_lu 1 -menu_vts 1 -pgc 1 -pg 1 -i <path to DVD> ...
    

3.8 ea

Electronic Arts 多媒体格式解复用器。

此格式由各种 Electronic Arts 游戏使用。

3.8.1 选项

merge_alpha bool

通常,VP6 alpha 通道(如果存在)将作为辅助视频流返回,通过设置此选项,您可以使解复用器返回单个视频流,其中包含 alpha 通道以及普通视频。

3.9 imf

Interoperable Master Format 解复用器。

此解复用器呈现 IMF 合成中找到的音频和视频流,如 SMPTE ST 2067-2 中所指定。

ffmpeg [-assetmaps <path of ASSETMAP1>,<path of ASSETMAP2>,...] -i <path of CPL> ...

如果未指定 -assetmaps,则解复用器将在与 CPL 相同的目录中查找名为 ASSETMAP.xml 的文件。

3.10 flv, live_flv, kux

Adobe Flash 视频格式解复用器。

此解复用器用于解复用 FLV 文件和 RTMP 网络流。在实时网络流的情况下,如果您强制指定格式,可以使用 live_flv 选项代替 flv,以避免时间戳不连续。KUX 是 Youku 平台上使用的一种 flv 变体。

ffmpeg -f flv -i myfile.flv ...
ffmpeg -f live_flv -i rtmp://<any.server>/anything/key ....
-flv_metadata bool

根据 onMetaData 数组内容分配流。

-flv_ignore_prevtag bool

忽略上一个标记值的大小。

-flv_full_metadata bool

输出 onMetadata 的所有上下文。

3.11 gif

动画 GIF 解复用器。

它接受以下选项

min_delay

设置帧之间最小有效延迟,单位为百分之一秒。范围为 0 到 6000。默认值为 2。

max_gif_delay

设置帧之间最大有效延迟,单位为百分之一秒。范围为 0 到 65535。默认值为 65535(接近 11 分钟),这是规范允许的最大值。

default_delay

设置帧之间默认延迟,单位为百分之一秒。范围为 0 到 6000。默认值为 10。

ignore_loop

GIF 文件可以包含循环特定次数(或无限循环)的信息。如果 ignore_loop 设置为 1,则将忽略输入的循环设置,并且不会发生循环。如果设置为 0,则将发生循环,并根据 GIF 循环的次数进行循环。默认值为 1。

例如,使用叠加滤镜,将无限循环的 GIF 叠加到另一个视频上

ffmpeg -i input.mp4 -ignore_loop 0 -i input.gif -filter_complex overlay=shortest=1 out.mkv

请注意,在上面的示例中,叠加滤镜的最短选项用于在最短输入文件的长度处结束输出视频,在本例中为 input.mp4,因为本例中的 GIF 是无限循环的。

3.12 hls

HLS 解复用器

Apple HTTP Live Streaming 解复用器。

此解复用器呈现所有变体流中的所有 AVStream。id 字段设置为比特率变体索引号。通过在 AVStream 上设置丢弃标志(在 ffplay 中按 ’a’ 或 ’v’),调用者可以决定实际接收哪些变体流。流所属变体的总比特率在名为“variant_bitrate”的元数据键中可用。

它接受以下选项

live_start_index

开始实时流的段索引(负值表示从末尾开始)。

prefer_x_start

如果播放列表中存在 #EXT-X-START,则优先使用它而不是 live_start_index。

allowed_extensions

允许 hls 访问的文件扩展名列表,以“,”分隔。

max_reload

尝试重新加载不足列表的最大次数。默认值为 1000。

m3u8_hold_counters

当 m3u8 在没有新段的情况下刷新时,加载 m3u8 的最大次数。默认值为 1000。

http_persistent

使用持久 HTTP 连接。仅适用于 HTTP 流。默认启用。

http_multiple

使用多个 HTTP 连接下载 HTTP 段。对于 HTTP/1.1 服务器,默认启用。

http_seekable

使用 HTTP 部分请求下载 HTTP 段。0 = 禁用,1 = 启用,-1 = 自动,默认为自动。

seg_format_options

使用以 : 分隔的键=值对列表为媒体段的解复用器设置选项。

seg_max_retry

在发生错误时重新加载段的最大次数,当不希望在网络错误时跳过段时很有用。默认值为 0。

3.13 image2

图像文件解复用器。

此解复用器从模式指定的图像文件列表中读取。模式的语法和含义由选项 pattern_type 指定。

该模式可能包含一个后缀,该后缀用于自动确定文件中包含的图像格式。

序列中所有文件的大小、像素格式和格式必须相同。

此解复用器接受以下选项

framerate

设置视频流的帧率。默认为 25。

loop

如果设置为 1,则循环输入。默认值为 0。

pattern_type

选择用于解释提供的文件名的模式类型。

pattern_type 接受以下值之一。

none

禁用模式匹配,因此视频将仅包含指定的图像。如果您不想从多个图像创建序列并且文件名可能包含特殊的模式字符,则应使用此选项。

sequence

选择序列模式类型,用于指定由顺序数字索引的文件序列。

序列模式可能包含字符串“%d”或“%0Nd”,它指定在模式匹配的每个文件名中表示顺序数字的字符位置。如果使用“%d0Nd”形式,则每个文件名中表示数字的字符串都将使用 0 填充,并且 N 是表示该数字的 0 填充数字的总数。文字字符“%”可以在模式中使用字符串“%%”指定。

如果序列模式包含“%d”或“%0Nd”,则模式指定的文件列表的第一个文件名必须包含一个数字,该数字包含在 start_numberstart_number+start_number_range-1 之间(包含),并且所有后续数字都必须是连续的。

例如,模式“img-%03d.bmp”将匹配 img-001.bmpimg-002.bmp、...、img-010.bmp 等形式的文件名序列;模式“i%%m%%g-%d.jpg”将匹配 i%m%g-1.jpgi%m%g-2.jpg、...、i%m%g-10.jpg 等形式的文件名序列。

请注意,该模式不一定必须包含“%d”或“%0Nd”,例如,要转换单个图像文件 img.jpeg,您可以使用以下命令

ffmpeg -i img.jpeg img.png
glob

选择 glob 通配符模式类型。

该模式的解释方式与 glob() 模式相同。仅当 libavformat 在编译时支持 globbing 时,才能选择此模式。

glob_sequence (已弃用,将被删除)

选择混合的 glob 通配符/序列模式。

如果您的 libavformat 版本编译时启用了 globbing 支持,并且提供的模式中包含至少一个未转义的 "%" 字符前缀的 glob 元字符(%*?[]{}),则该模式将像 glob() 模式一样进行解释;否则,它将像序列模式一样进行解释。

所有 glob 特殊字符 %*?[]{} 都必须以 "%" 为前缀。要转义字面上的 "%",您应该使用 "%%"。

例如,模式 foo-%*.jpeg 将匹配所有以 "foo-" 开头并以 ".jpeg" 结尾的文件名,而 foo-%?%?%?.jpeg 将匹配所有以 "foo-" 开头,后跟三个字符序列,并以 ".jpeg" 结尾的文件名。

这种模式类型已被弃用,推荐使用 globsequence

默认值为 glob_sequence

pixel_format

设置要读取的图像的像素格式。如果未指定,则从序列中的第一个图像文件推测像素格式。

start_number

设置要开始读取的图像文件模式匹配的文件的索引。默认值为 0。

start_number_range

设置在查找序列中第一个图像文件时要检查的索引间隔范围,从 start_number 开始。默认值为 5。

ts_from_file

如果设置为 1,则将帧时间戳设置为图像文件的修改时间。请注意,不保证时间戳的单调性:图像的顺序与没有此选项时相同。默认值为 0。如果设置为 2,则将帧时间戳设置为图像文件的修改时间,精度为纳秒。

video_size

设置要读取的图像的视频大小。如果未指定,则从序列中的第一个图像文件推测视频大小。

export_path_metadata

如果设置为 1,则会在输入中找到的元数据中添加两个额外的字段,使它们也可用于其他过滤器(例如,请参阅 drawtext 过滤器)。默认值为 0。额外的字段如下所述:

lavf.image2dec.source_path

对应于正在读取的输入文件的完整路径。

lavf.image2dec.source_basename

对应于正在读取的文件的名称。

3.13.1 示例

  • 使用 ffmpeg 从文件序列 img-001.jpegimg-002.jpeg、... 中的图像创建视频,假设输入帧速率为每秒 10 帧
    ffmpeg -framerate 10 -i 'img-%03d.jpeg' out.mkv
    
  • 与上面相同,但从序列中索引为 100 的文件开始读取
    ffmpeg -framerate 10 -start_number 100 -i 'img-%03d.jpeg' out.mkv
    
  • 读取匹配 "*.png" glob 模式的图像,即所有以 ".png" 后缀结尾的文件
    ffmpeg -framerate 10 -pattern_type glob -i "*.png" out.mkv
    

3.14 libgme

Game Music Emu 库是一系列电子游戏音乐文件模拟器。

有关更多信息,请参阅 https://bitbucket.org/mpyne/game-music-emu/overview

它接受以下选项

track_index

设置要解复用的轨道索引。解复用器只能导出一个轨道。轨道索引从 0 开始。默认是选择第一个轨道。轨道数量作为 tracks 元数据条目导出。

sample_rate

设置导出的轨道的采样率。范围是 1000 到 999999。默认值是 44100。

max_size (字节)

解复用器会将整个文件缓冲到内存中。调整此值以设置最大缓冲区大小,该大小反过来充当可以读取的文件大小的上限。默认值为 50 MiB。

3.15 libmodplug

基于 ModPlug 的模块解复用器

请参阅 https://github.com/Konstanty/libmodplug

它将导出一个 2 声道 16 位 44.1 kHz 音频流。可选地,可以导出带有或不带有打印元数据的 pal8 16 色视频流。

它接受以下选项

noise_reduction

应用一个简单的低通滤波器。可以是 1(开启)或 0(关闭)。默认值为 0。

reverb_depth

设置混响量。范围 0-100。默认值为 0。

reverb_delay

设置延迟时间(以毫秒为单位),范围限制为 40-250 毫秒。默认值为 0。

bass_amount

应用低音扩展,又名 XBass 或 megabass。范围是 0(静音)到 100(响亮)。默认值为 0。

bass_range

设置低音频率的截止频率,即上限。范围是 10-100 Hz。默认值为 0。

surround_depth

应用杜比定向逻辑环绕效果。范围是 0(静音)到 100(重)。默认值为 0。

surround_delay

设置环绕延迟时间(以毫秒为单位),范围限制为 5-40 毫秒。默认值为 0。

max_size

解复用器会将整个文件缓冲到内存中。调整此值以设置最大缓冲区大小,该大小反过来充当可以读取的文件大小的上限。范围是 0 到 100 MiB。0 将删除缓冲区大小限制(不推荐)。默认值为 5 MiB。

video_stream_expr

使用 eval API 计算的字符串,用于为生成的视频流分配颜色。可以使用以下变量:xywhtspeedtempoorderpatternrow

video_stream

生成视频流。可以是 1(开启)或 0(关闭)。默认值为 0。

video_stream_w

设置视频帧宽度,以“字符”为单位,其中一个字符表示 8 个像素。范围是 20-512。默认值为 30。

video_stream_h

设置视频帧高度,以“字符”为单位,其中一个字符表示 8 个像素。范围是 20-512。默认值为 30。

video_stream_ptxt

在视频流上打印元数据。包括 speedtempoorderpatternrowts(以毫秒为单位的时间)。可以是 1(开启)或 0(关闭)。默认值为 1。

3.16 libopenmpt

基于 libopenmpt 的模块解复用器

有关更多信息,请参阅 https://lib.openmpt.org/libopenmpt/

某些文件具有多个子歌曲(轨道),可以使用 subsong 选项设置。

它接受以下选项

subsong

设置子歌曲索引。它可以是 "all"、"auto" 或子歌曲的索引。子歌曲索引从 0 开始。默认值为 "auto"。

默认值是让 libopenmpt 选择。

layout

设置声道布局。有效值是 1、2 和 4 声道布局。默认值是 STEREO。

sample_rate

设置 libopenmpt 输出的采样率。范围是 1000 到 INT_MAX。默认值是 48000。

3.17 mov/mp4/3gp

Quicktime 文件格式和 ISO/IEC 基本媒体文件格式(ISO/IEC 14496-12 或 MPEG-4 Part 12,ISO/IEC 15444-12 或 JPEG 2000 Part 12)的解复用器。

已注册的扩展名:mov, mp4, m4a, 3gp, 3g2, mj2, psp, m4b, ism, ismv, isma, f4v

3.17.1 选项

此解复用器接受以下选项

enable_drefs

启用加载外部轨道,默认禁用。在某些用例中,启用此选项可能会泄漏信息。

use_absolute_path

允许通过绝对路径加载外部轨道,默认禁用。启用此选项会带来安全风险。只有在已知源不是恶意的情况下才应启用此选项。

seek_streams_individually

在查找时,分别识别每个流中最接近的点,并从识别的点开始解复用该流中的数据包。这可能会导致与从头开始线性解复用相比不同的数据包序列。默认值为 true。

ignore_editlist

忽略任何编辑列表原子(edit list atoms)。默认情况下,解复用器会修改流索引以反映编辑列表描述的时间线。默认值为 false。

advanced_editlist

修改流索引以反映编辑列表描述的时间线。必须将 ignore_editlist 设置为 false,此选项才能生效。如果 ignore_editlist 和此选项都设置为 false,则仅修改流索引的起始位置,以反映编辑列表描述的初始停留时间或起始时间戳。默认值为 true。

ignore_chapters

不解析章节。这包括 GoPro 的“HiLight”标签/时刻。请注意,只有当输入可查找时才会解析章节。默认值为 false。

use_mfra_for

对于可查找的碎片化输入,如果存在媒体片段随机访问框,则从该框设置片段的起始时间戳。

以下选项可用

auto

自动检测是否将 mfra 时间戳设置为 PTS 或 DTS (默认)

dts

将 mfra 时间戳设置为 DTS

pts

将 mfra 时间戳设置为 PTS

0

不使用 mfra 框设置时间戳

use_tfdt

对于碎片化输入,将片段的起始时间戳设置为 tfdt 框中的 baseMediaDecodeTime。默认情况下启用此选项,这将优先使用 tfdt 框设置 DTS。禁用此选项将使用 sidx 框中的 earliest_presentation_time。在任何一种情况下,如果 mfra 框可用且 use_mfra_for 设置为 pts 或 dts,则将使用 mfra 框中的时间戳。

export_all

udta 框中无法识别的框导出为元数据条目。框类型的前四个字符将设置为键。默认值为 false。

export_xmp

XMP_ 框和 uuid 框的全部内容导出为键为 xmp 的字符串。请注意,如果设置了 export_all 但未设置此选项,则仍然会导出 XMP_ 框的内容,但键为 XMP_。默认值为 false。

activation_bytes

解密 Audible AAX 和 AAX+ 文件所需的 4 字节密钥。请参阅下面的 Audible AAX 小节。

audible_fixed_key

用于处理 Audible AAX/AAX+ 文件的固定密钥。它已预先设置,因此无需指定。

decryption_key

16 字节密钥,以十六进制表示,用于解密使用 ISO 通用加密(CENC/AES-128 CTR;ISO/IEC 23001-7)加密的文件。

max_stts_delta

在 trak 的 stts 框中写入的非常大的样本增量有时可能是故意的,但通常是错误写入,或者在将其视为有符号 32 位整数时用于存储 dts 校正的负值。此选项允许用户设置一个上限,超出此上限时,增量将被钳制为 1。如果转换为 int32 时值大于限制值且为负数,则用于调整后续的 dts。

单位是轨道时间刻度。范围是 0 到 UINT_MAX。默认值为 UINT_MAX - 48000*10,它允许 48 kHz 音频流最多进行 10 秒的 dts 校正,同时容纳 99.9% 的 uint32 范围。

interleaved_read

在解复用器级别交错来自多个轨道的数据包。对于交错不佳的文件,这可以防止由于不同轨道中数据包之间存在较大间隙而引起的播放问题,因为 MOV/MP4 没有数据包放置要求。但是,由于在轨道之间查找,这可能会导致在交错非常差的文件上进行过多的查找,因此禁用它可能会防止 I/O 问题,但会牺牲播放效果。

3.17.2 Audible AAX

Audible AAX 文件是加密的 M4B 文件,可以通过指定 4 字节的激活密钥来解密。

ffmpeg -activation_bytes 1CEB00DA -i test.aax -vn -c:a copy output.mp4

3.18 mpegts

MPEG-2 传输流解复用器。

此解复用器接受以下选项

resync_size

设置查找新同步的大小限制。默认值为 65536。

skip_unknown_pmt

跳过 PAT 中未定义的程序的 PMT。默认值为 0。

fix_teletext_pts

使用从包含字幕流且未被丢弃的第一个程序的 PCR 计算的时间戳覆盖字幕数据包的 PTS 和 DTS 值。默认值为 1,如果要保持字幕数据包的 PTS 和 DTS 值不变,请将此选项设置为 0。

ts_packetsize

输出选项,携带原始数据包的大小(以字节为单位)。显示检测到的原始数据包大小,用户无法设置。

scan_all_pmts

扫描并合并所有 PMT。该值是一个整数,取值范围为 -1 到 1(-1 表示自动设置,1 表示启用,0 表示禁用)。默认值为 -1。

merge_pmt_versions

当 PMT 的版本更新且基本流移动到不同的 PID 时,重用现有流。默认值为 0。

max_packet_size

设置解复用器发出的数据包的最大大小(以字节为单位)。大于此大小的有效负载将被拆分到多个数据包中。范围是 1 到 INT_MAX/2。默认值为 204800 字节。

3.19 mpjpeg

封装在多部分 MIME 中的 MJPEG 解复用器。

此解复用器允许读取 MJPEG,其中每帧都表示为 multipart/x-mixed-replace 流的一部分。

strict_mime_boundary

默认实现对多部分 MIME 边界检测应用了宽松的标准,以防止与大量现有未生成正确的 MIME MJPEG 流的端点发生回归。通过将此选项设置为 1 将导致对边界值进行更严格的检查。

3.20 rawvideo

原始视频解复用器。

此解复用器允许读取原始视频数据。由于没有指定假定视频参数的标头,因此用户必须指定它们才能正确解码数据。

此解复用器接受以下选项

framerate

设置输入视频帧率。默认值为 25。

pixel_format

设置输入视频像素格式。默认值为 yuv420p

video_size

设置输入视频大小。必须显式指定此值。

例如,要使用 ffplay 读取原始视频文件 input.raw,假设像素格式为 rgb24,视频大小为 320x240,帧率为每秒 10 张图像,请使用以下命令

ffplay -f rawvideo -pixel_format rgb24 -video_size 320x240 -framerate 10 input.raw

3.21 rcwt

RCWT(带有时间的原始字幕)是 ccextractor 的本机格式,ccextractor 是一种常用的开源工具,用于处理 608/708 隐藏字幕 (CC) 源。有关该格式的更多信息,请参阅 (ffmpeg-formats)rcwtenc

此解复用器实现了截至 2024 年 3 月的规范,该规范自 2014 年 4 月以来一直保持稳定且未更改。

3.21.1 示例

  • 使用内置解码器将 CC 渲染为 ASS
    ffmpeg -i CC.rcwt.bin CC.ass
    

    请注意,如果您的输出似乎为空,您可能必须手动设置解码器的 data_field 选项以选择所需的 CC 子流。

  • 将 RCWT 备份转换为 Scenarist (SCC) 格式
    ffmpeg -i CC.rcwt.bin -c:s copy CC.scc
    

    请注意,SCC 格式不支持 RCWT 中可能存储的所有 CC 扩展(例如 EIA-708)。

3.22 sbg

SBaGen 脚本解复用器。

此解复用器读取 SBaGen http://uazu.net/sbagen/ 使用的脚本语言,以生成双耳节拍会话。SBG 脚本如下所示

-SE
a: 300-2.5/3 440+4.5/0
b: 300-2.5/0 440+4.5/3
off: -
NOW      == a
+0:07:00 == b
+0:14:00 == a
+0:21:00 == b
+0:30:00    off

SBG 脚本可以混合绝对和相对时间戳。如果脚本仅使用绝对时间戳(包括脚本开始时间)或仅使用相对时间戳,则其布局是固定的,并且转换很简单。另一方面,如果脚本混合了这两种时间戳,则相对时间戳的 NOW 参考将取自读取脚本时当前的时间,并且脚本布局将根据该参考冻结。这意味着,如果直接播放脚本,则实际时间将与绝对时间戳匹配,直至声音控制器的时钟精度,但是,如果用户以某种方式暂停播放或查找,则所有时间都将相应地移动。

3.23 tedcaptions

用于 TED Talks 的 JSON 字幕。

TED 不提供指向字幕的链接,但是可以从页面推测出来。FFmpeg 源代码树中的文件 tools/bookmarklets.html 包含一个用于公开它们的书签。

此解复用器接受以下选项

start_time

设置 TED 演讲的开始时间,单位为毫秒。默认值为 15000(15 秒)。它用于将字幕与可下载的视频同步,因为这些视频包含 15 秒的片头。

示例:将字幕转换为大多数播放器可以理解的格式

ffmpeg -i http://www.ted.com/talks/subtitles/id/1/lang/en talk1-en.srt

3.24 vapoursynth

Vapoursynth 封装器。

出于安全考虑,Vapoursynth 脚本不会自动检测,因此必须强制输入格式。对于 ff* CLI 工具,请在输入 ` -i yourscript.vpy` 之前添加 ` -f vapoursynth` 。

此解复用器接受以下选项

max_script_size

解复用器将整个脚本缓冲到内存中。调整此值以设置最大缓冲区大小,这反过来又充当可以读取的脚本大小的上限。默认值为 1 MiB。

3.25 w64

Sony Wave64 音频解复用器。

此解复用器接受以下选项

max_size

请参阅 wav 解复用器的相同选项。

3.26 wav

RIFF Wave 音频解复用器。

此解复用器接受以下选项

max_size

指定解复用数据包的最大大小(以字节为单位)。默认情况下,此值设置为 0,这意味着会根据输入格式选择一个合理的值。

4 复用器

复用器是 FFmpeg 中配置的元素,允许将多媒体流写入特定类型的文件。

当您配置 FFmpeg 构建时,默认情况下会启用所有受支持的复用器。您可以使用配置选项 ` --list-muxers` 列出所有可用的复用器。

您可以使用配置选项 ` --disable-muxers` 禁用所有复用器,并使用选项 ` --enable-muxer=MUXER` / ` --disable-muxer=MUXER` 有选择地启用/禁用单个复用器。

ff* 工具的 ` -muxers` 选项将显示已启用的复用器列表。使用 ` -formats` 查看已启用的解复用器和复用器的组合列表。

以下是一些当前可用复用器的说明。

4.1 原始复用器

本节介绍原始复用器。它们接受与指定编解码器匹配的单个流。它们不存储时间戳或元数据。除非另有说明,否则识别的扩展名与复用器名称相同。

它包括以下复用器。还显示了媒体类型和用于从输出扩展名自动选择复用器的最终扩展名。

ac3 audio

杜比数字,也称为 AC-3。

adx audio

CRI 中间件 ADX 音频。

当输出可搜索且计数可以存储在 32 位中时,此复用器将在第一个数据包的开头附近写出总样本计数。

aptx audio

aptX(蓝牙音频处理技术)

aptx_hd audio (aptxdh)

aptX HD(蓝牙音频处理技术)音频

avs2 video (avs, avs2)

AVS2-P2(音频视频标准 - 第二代 - 第 2 部分)/ IEEE 1857.4 视频

avs3 video (avs3)

AVS3-P2(音频视频标准 - 第三代 - 第 2 部分)/ IEEE 1857.10 视频

cavsvideo video (cavs)

中国 AVS(音频视频标准 - 第一代)

codec2raw audio

编解码器 2 音频。

没有注册扩展名,因此必须提供格式名称,例如使用 ffmpeg CLI 工具 ` -f codec2raw`。

data any

通用数据复用器。

此复用器接受具有任何类型的任何编解码器的单个流。必须使用 `ffmpeg` CLI 工具的 `-map` 选项选择输入流。

没有注册扩展名,因此必须提供格式名称,例如使用 `ffmpeg` CLI 工具 ` -f data`。

dfpwm audio (dfpwm)

原始 DFPWM1a(动态滤波器脉冲宽度调制)音频复用器。

dirac video (drc, vc2)

BBC Dirac 视频。

Dirac Pro 编解码器是子集,并已标准化为 SMPTE VC-2。

dnxhd video (dnxhd, dnxhr)

Avid DNxHD 视频。

它已标准化为 SMPTE VC-3。接受 DNxHR 流。

dts audio

DTS 相干声学(DCA)音频

eac3 audio

杜比数字增强版,也称为增强型 AC-3

evc video (evc)

MPEG-5 基本视频编码 (EVC) / EVC / MPEG-5 Part 1 EVC 视频

g722 audio

ITU-T G.722 音频

g723_1 audio (tco, rco)

ITU-T G.723.1 音频

g726 audio

ITU-T G.726 大端(“左对齐”)音频。

没有注册扩展名,因此必须提供格式名称,例如使用 `ffmpeg` CLI 工具 ` -f g726`。

g726le audio

ITU-T G.726 小端(“右对齐”)音频。

没有注册扩展名,因此必须提供格式名称,例如使用 `ffmpeg` CLI 工具 ` -f g726le`。

gsm audio

全球移动通信系统音频

h261 video

ITU-T H.261 视频

h263 video

ITU-T H.263 / H.263-1996、H.263+ / H.263-1998 / H.263 版本 2 视频

h264 video (h264, 264)

ITU-T H.264 / MPEG-4 第 10 部分 AVC 视频。如果比特流处于长度前缀模式,则应将其转换为 Annex B 语法。

hevc video (hevc, h265, 265)

ITU-T H.265 / MPEG-H 第 2 部分 HEVC 视频。如果比特流处于长度前缀模式,则应将其转换为 Annex B 语法。

m4v video

MPEG-4 第 2 部分视频

mjpeg video (mjpg, mjpeg)

运动 JPEG 视频

mlp audio

子午线无损压缩,也称为打包 PCM

mp2 audio (mp2, m2a, mpa)

MPEG-1 音频层 II 音频

mpeg1video video (mpg, mpeg, m1v)

MPEG-1 第 2 部分视频。

mpeg2video video (m2v)

ITU-T H.262 / MPEG-2 第 2 部分视频

obu video

AV1 低开销开放比特流单元复用器。

时域分隔符 OBU 将插入到流的所有时域单元中。

rawvideo video (yuv, rgb)

原始未压缩视频。

sbc audio (sbc, msbc)

蓝牙 SIG 低复杂度子带编解码器音频

truehd audio (thd)

杜比 TrueHD 音频

vc1 video

SMPTE 421M / VC-1 视频

4.1.1 示例

  • 使用 `ffmpeg` 通过 ‘rawvideo’ 复用器存储原始视频帧
    ffmpeg -f lavfi -i testsrc -t 10 -s hd1080p testsrc.yuv
    

    由于 rawvideo 复用器不存储与大小和格式相关的信息,因此在解复用文件时必须提供此信息

    ffplay -video_size 1920x1080 -pixel_format rgb24 -f rawvideo testsrc.rgb
    

4.2 原始 PCM 复用器

本节介绍原始 PCM(脉冲编码调制)音频复用器。

它们接受与指定编解码器匹配的单个流。它们不存储时间戳或元数据。识别的扩展名与复用器名称相同。

它包括以下复用器。用于从输出扩展名自动选择复用器的可选附加扩展名也显示在括号中。

alaw (al)

PCM A-law

f32be

PCM 32 位浮点大端

f32le

PCM 32 位浮点小端

f64be

PCM 64 位浮点大端

f64le

PCM 64 位浮点小端

mulaw (ul)

PCM mu-law

s16be

PCM 有符号 16 位大端

s16le

PCM 有符号 16 位小端

s24be

PCM 有符号 24 位大端

s24le

PCM 有符号 24 位小端

s32be

PCM 有符号 32 位大端

s32le

PCM 有符号 32 位小端

s8 (sb)

PCM 有符号 8 位

u16be

PCM 无符号 16 位大端

u16le

PCM 无符号 16 位小端

u24be

PCM 无符号 24 位大端

u24le

PCM 无符号 24 位小端

u32be

PCM 无符号 32 位大端

u32le

PCM 无符号 32 位小端

u8 (ub)

PCM 无符号 8 位

vidc

PCM 阿基米德 VIDC

4.3 MPEG-1/MPEG-2 程序流复用器

本节介绍属于 MPEG-1 和 MPEG-2 系统系列的格式。

MPEG-1 系统格式(也称为 ISO/IEEC 11172-1 或 MPEG-1 程序流)已被采用为 VCD(视频光盘)中存储的媒体轨道的格式。

MPEG-2 系统标准(也称为 ISO/IEEC 13818-1)涵盖两种容器格式,一种称为传输流,另一种称为程序流;这里仅介绍后者。

MPEG-2 程序流格式(也称为 VOB,因为对应的文件扩展名)是 MPEG-1 程序流的扩展:除了支持音频和视频流的不同编解码器外,它还存储字幕和导航元数据。MPEG-2 程序流已被采用用于存储 SVCD 和 DVD 存储设备中的媒体流。

本节包括以下复用器。

mpeg (mpg,mpeg)

MPEG-1 系统 / MPEG-1 程序流复用器。

vcd

MPEG-1 系统 / MPEG-1 程序流 (VCD) 复用器。

此复用器可用于生成 VCD(视频光盘)存储设备接受的格式的轨道。

它与 ‘mpeg’ 复用器相同,但有一些差异。

vob

MPEG-2 程序流 (VOB) 复用器。

dvd

MPEG-2 程序流 (DVD VOB) 复用器。

此复用器可用于生成 DVD(数字多功能光盘)存储设备接受的格式的轨道。

这与 ‘vob’ 复用器相同,但有一些差异。

svcd (vob)

MPEG-2 程序流 (SVCD VOB) 复用器。

此复用器可用于生成 SVCD(超级视频光盘)存储设备接受的格式的轨道。

这与 ‘vob’ 复用器相同,但有一些差异。

4.3.1 选项

muxrate rate

设置用户定义的复用速率,表示为比特/秒。如果未指定,则采用自动计算的复用速率。默认值为 0

preload delay

设置初始解复用-解码延迟,单位为微秒。默认值为 500000

4.4 MOV/MPEG-4/ISOMBFF 复用器

本节介绍属于 QuickTime / MOV 系列的格式,包括 MPEG-4 Part 14 格式和 ISO 基本媒体文件格式 (ISOBMFF)。这些格式共享基于 ISO 基本媒体文件格式 (ISOBMFF) 的通用结构。

MOV 格式最初是为与 Apple QuickTime 一起使用而开发的。它后来被用作 MPEG-4 Part 1(后来的 Part 14)格式的基础,也称为 ISO/IEC 14496-1。然后,该格式被推广到 ISOBMFF,也称为 MPEG-4 Part 12 格式,ISO/IEC 14496-12 或 ISO/IEC 15444-12。

它包括以下复用器。

3gp

用于 3G UMTS 多媒体服务的第三代合作伙伴项目 (3GPP) 格式

3g2

用于 3G CDMA2000 多媒体服务的第三代合作伙伴项目 2 (3GP2 或 3GPP2) 格式,类似于 ‘3gp’,但具有扩展和限制

f4v

Adobe Flash 视频格式

ipod

MPEG-4 音频文件格式,与 MOV/MP4 类似,但仅限于包含音频流,通常使用 Apple ipod 设备播放

ismv

Microsoft IIS(Internet 信息服务)平滑流媒体音频/视频(ISMV 或 ISMA)格式。它基于 MPEG-4 Part 14 格式,带有一些不兼容的变体,用于为 Microsoft IIS 服务器流式传输媒体文件。

mov

.mov 扩展名标识的 QuickTime 播放器格式

mp4

MP4 或 MPEG-4 Part 14 格式

psp

PlayStation Portable MP4/MPEG-4 Part 14 格式变体。它基于 MPEG-4 Part 14 格式,带有一些不兼容的变体,用于在 PlayStation 设备上播放文件。

4.4.1 分片

mov’、‘mp4’ 和 ‘ismv’ 复用器支持分段。通常,MOV/MP4 文件将所有数据包的元数据存储在一个位置。

此数据通常写入文件末尾,但可以通过将 +faststart 添加到 -movflags 或使用 qt-faststart 工具将其移动到开头,以便更好地播放。

分段文件由多个片段组成,其中数据包和有关这些数据包的元数据一起存储。写入分段文件的优点是,即使写入中断,该文件也可以解码(而如果正常的 MOV/MP4 文件未正确完成,则无法解码),并且在写入非常长的文件时需要的内存更少(因为写入正常的 MOV/MP4 文件会将有关每个数据包的信息存储在内存中,直到文件关闭)。缺点是它与其他应用程序的兼容性较差。

通过设置定义如何将文件分割成片段的选项之一来启用分段

frag_duration
frag_size
min_frag_duration
movflags +frag_keyframe
movflags +frag_custom

如果指定了多个条件,则当满足指定的条件之一时,将分割片段。此选项的例外情况是 min_frag_duration 选项,该选项必须满足才能应用任何其他条件。

4.4.2 选项

brand brand_string

覆盖主要品牌。

empty_hdlr_name bool

启用以跳过在 hdlr 框内写入名称。默认值为 false

encryption_key key

以十六进制格式设置媒体加密密钥

encryption_kid kid

以十六进制格式设置媒体加密密钥标识符

encryption_scheme scheme

配置加密方案,允许的值为 ‘none’ 和 ‘cenc-aes-ctr

frag_duration duration

创建长度为 duration 微秒的片段。

frag_interleave number

交错片段中的样本(最大连续样本数,值越低,交错越紧密,但开销越大。默认设置为 0

frag_size size

创建最多包含 size 字节有效负载数据的片段

iods_audio_profile profile

指定音频配置文件原子 (从 -1 到 255) 的 iods 编号,默认值为 -1

iods_video_profile profile

指定视频配置文件原子 (从 -1 到 255) 的 iods 编号,默认值为 -1

ism_lookahead num_entries

为 ISM 文件指定预读条目数(从 0 到 255),默认值为 0

min_frag_duration duration

不创建短于 duration 微秒的片段

moov_size bytes

在文件开头预留空间给 moov atom,而不是将其放置在文件末尾。如果预留空间不足,复用将失败。

mov_gamma gamma

为 gama atom 指定 gamma 值(十进制数,范围从 0 到 10),默认值为 0.0,必须与 + movflags 一起设置。

movflags flags

设置各种复用开关。可以使用以下标志:

cmaf

写入兼容 CMAF(通用媒体应用格式)的碎片化 MP4 输出。

dash

写入兼容 DASH(基于 HTTP 的动态自适应流媒体)的碎片化 MP4 输出。

default_base_moof

与 ‘omit_tfhd_offset’ 标志类似,此标志避免在 tfhd atom 中写入绝对的 base_data_offset 字段,而是使用新的 default-base-is-moof 标志。此标志是 14496-12:2012 中新增的。在某些情况下,这可能使片段更容易解析(避免基于先前轨道片段的隐式结尾进行轨道片段位置计算)。

delay_moov

延迟写入初始 moov,直到第一个片段被切分,或直到第一个片段刷新。

disable_chpl

禁用 Nero 章节标记(chpl atom)。通常,Nero 章节和 QuickTime 章节轨道都会写入文件。设置此选项后,只会写入 QuickTime 章节轨道。当使用某些标签程序(如 mp3Tag 2.61a 和 iTunes 11.3)重新处理文件时,Nero 章节可能会导致失败,很可能其他版本也会受到影响。

faststart

运行第二次处理,将索引(moov atom)移动到文件开头。此操作可能需要一段时间,并且在各种情况下(例如碎片化输出)无法工作,因此默认情况下不启用。

frag_custom

允许调用者通过调用 av_write_frame(ctx, NULL) 来手动选择何时切割片段,以写入迄今为止已写入的数据包。(这仅在使用 libavformat 集成的其他应用程序时有用,而不是从 ffmpeg 中调用。)

frag_discont

表示下一个片段与之前的片段不连续。

frag_every_frame

在每一帧处进行分片。

frag_keyframe

在每个视频关键帧处启动新片段。

global_sidx

在文件开头写入全局 sidx 索引。

isml

创建一个实时平滑流媒体源(用于推送到发布点)。

negative_cts_offsets

启用 CTTS box 的版本 1,其中 CTS 偏移量可以为负数。这使得初始样本的 DTS/CTS 为零,并减少了某些情况(例如带有 B 帧的视频轨道)下对编辑列表的需求。此外,更容易符合 DASH-IF 互操作性指南。

当写入 ‘ismv’(平滑流媒体)文件时,此选项会隐式设置。

omit_tfhd_offset

不要在 tfhd atom 中写入任何绝对的 base_data_offset。这避免了将片段与文件/流中的绝对字节位置绑定。

prefer_icc

如果在流数据包边数据中存在 ICC 配置文件,则在写入 colr atom 时优先使用它。

rtphint

向输出文件添加 RTP 提示轨道。

separate_moof

为每个轨道写入单独的 moof(电影片段)atom。通常,所有轨道的包都写入一个 moof atom(这效率稍高),但设置此选项后,复用器会为每个轨道写入一个 moof/mdat 对,从而更容易分离轨道。

skip_sidx

跳过写入 sidx atom。当由于 sidx atom 导致的比特率开销较高时,此选项可用于 sidx atom 不是强制性的情况。当启用 ‘global_sidx’ 标志时,此选项将被忽略。

skip_trailer

跳过为碎片化文件写入 mfra/tfra/mfro trailer。

use_metadata_tags

使用 mdta atom 作为元数据。

write_colr

即使未指定颜色信息,也写入 colr atom。此标志是实验性的,可能会重命名或更改,请勿从脚本中使用。

write_gama

写入已弃用的 gama atom。

hybrid_fragmented

为了可恢复性 - 将输出文件写入为碎片化文件。这允许在写入时读取中间文件(特别是,如果写入过程非正常中止)。写入完成后,该文件将转换为常规的、非碎片化的文件,该文件具有更好的兼容性并允许更快更轻松地搜索。

如果写入中止,则可以手动重新复用中间文件,以获得已写入到未完成文件中的常规的、非碎片化文件。

movie_timescale scale

设置电影头框 (mvhd) 中写入的时间刻度。范围是 1 到 INT_MAX。默认值为 1000

rtpflags flags

向输出文件添加 RTP 提示轨道。

可以使用以下标志:

h264_mode0

在 RTP 中对 H.264 使用模式 0。

latm

对 AAC 使用 MP4A-LATM 分包化,而不是 MPEG4-GENERIC。

rfc2190

对 H.263 使用 RFC 2190 分包化,而不是 RFC 4629。

send_bye

在完成时发送 RTCP BYE 数据包。

skip_rtcp

不发送 RTCP 发送者报告。

skip_iods bool

跳过写入 iods atom(默认值为 true)。

use_editlist bool

使用编辑列表(默认值为 auto)。

use_stream_ids_as_track_ids bool

使用流 ID 作为轨道 ID(默认值为 false)。

video_track_timescale scale

设置用于视频轨道的时间刻度。范围是 0 到 INT_MAX。如果设置为 0,则时间刻度将根据本机流时间基自动设置。默认值为 0

write_btrt bool

强制或禁用在轨道的 stsd box 中写入比特率框。该框包含轨道的解码缓冲区大小(以字节为单位)、最大比特率和平均比特率。如果无法计算这些值,则将跳过该框。默认值为 -1auto,这将仅在 MP4 模式下写入该框。

write_prft option

写入生产者时间参考框 (PRFT),并在 PRFT 框中为 NTP 字段指定时间源。将值设置为 ‘wallclock’ 以将时间源指定为挂钟时间,将值设置为 ‘pts’ 以将时间源指定为输入数据包的 PTS 值。

write_tmcd bool

指定 on 以强制写入时间码轨道,指定 off 以禁用它,指定 auto 仅为 mov 和 mp4 输出写入时间码轨道(默认)。

将值设置为 ‘pts’ 仅适用于实时编码用例,其中 PTS 值设置为源处的挂钟时间。例如,具有 decklink 捕获源的编码用例,其中 video_ptsaudio_pts 设置为 ‘abs_wallclock’。

4.4.3 示例

  • 使用 ffmpeg 使用 ‘ismv’ 复用器将平滑流媒体内容实时推送到 IIS 上的发布点。
    ffmpeg -re <normal input/transcoding options> -movflags isml+frag_keyframe -f ismv http://server/publishingpoint.isml/Streams(Encoder1)
    

4.5 a64

A64 Commodore 64 视频复用器。

此复用器接受单个 a64_multia64_multi5 编解码器视频流。

4.6 ac4

原始 AC-4 音频复用器。

此复用器接受单个 ac4 音频流。

4.6.1 选项

write_crc bool

启用后,为每个输出的数据包写入 CRC 校验和,默认值为 false

4.7 adts

音频数据传输流复用器。

它接受单个 AAC 流。

4.7.1 选项

write_id3v2 bool

启用以在流的开头写入 ID3v2.4 标签。默认情况下禁用。

write_apetag bool

启用以在流的末尾写入 APE 标签。默认情况下禁用。

write_mpeg2 bool

启用以将 ADTS 帧头中的 MPEG 版本位设置为 1,表示 MPEG-2。默认值为 0,表示 MPEG-4。

4.8 aea

MD STUDIO 音频复用器。

此复用器接受单个 ATRAC1 音频流,具有一个或两个通道,采样率为 44100Hz。

由于 AEA 支持存储音轨标题,此复用器还会将流的元数据中的标题写入容器。

4.9 aiff

音频交换文件格式复用器。

4.9.1 选项

write_id3v2 bool

设置为 1 时启用 ID3v2 标签写入。默认值为 0(禁用)。

id3v2_version bool

选择要写入的 ID3v2 版本。目前仅支持版本 3 和 4(即 ID3v2.3 和 ID3v2.4)。默认版本为 4。

4.10 alp

High Voltage Software 的乐高赛车游戏音频复用器。

它接受单个 ADPCM_IMA_ALP 流,通道数不超过 2 个,采样率不大于 44100 Hz。

扩展名:tun, pcm

4.10.1 选项

type type

设置文件类型。

type 接受以下值

tun

将文件类型设置为音乐。必须具有 22050 Hz 的采样率。

pcm

将文件类型设置为 sfx。

auto

根据输出文件扩展名设置文件类型。.pcm 会导致类型为 pcm,否则会设置类型为 tun(默认)

4.11 amr

3GPP AMR(自适应多速率)音频复用器。

它接受包含 AMR NB 流的单个音频流。

4.12 amv

AMV (Actions Media Video) 格式复用器。

4.13 apm

Ubisoft Rayman 2 APM 音频复用器。

它接受单个 ADPCM IMA APM 音频流。

4.14 apng

动画便携式网络图形复用器。

它接受单个 APNG 视频流。

4.14.1 选项

final_delay delay

强制在每次重复的最后一帧之后延迟,以秒为单位表示。默认值为 0.0

plays repetitions

指定内容播放的次数,0 表示无限循环,1 表示不循环

4.14.2 示例

  • 使用 ffmpeg 生成具有 2 次重复且第一次重复后延迟半秒的 APNG 输出。
    ffmpeg -i INPUT -final_delay 0.5 -plays 2 out.apng
    

4.15 argo_asf

Argonaut Games ASF 音频复用器。

它接受单个 ADPCM 音频流。

4.15.1 选项

version_major version

覆盖文件主版本,指定为整数,默认值为 2

version_minor version

覆盖文件次版本,指定为整数,默认值为 1

name name

将文件名嵌入到文件中,如果未指定,则使用输出文件名。名称将被截断为 8 个字符。

4.16 argo_cvg

Argonaut Games CVG 音频复用器。

它接受单个单声道 ADPCM 22050Hz 音频流。

loopreverb 选项在标头中设置相应的标志,之后可以检索这些标志以相应地处理音频流。

4.16.1 选项

skip_rate_check bool

跳过采样率检查(默认为 false

loop bool

设置循环标志(默认为 false

reverb boolean

设置混响标志(默认为 true

4.17 asf, asf_stream

高级/活动系统(或流式传输)格式音频复用器。

应为流式传输选择‘asf_stream’变体。

请注意,Windows Media Audio (wma) 和 Windows Media Video (wmv) 也使用此复用器。

4.17.1 选项

packet_size size

将复用器数据包大小设置为字节数。通过调整此设置,您可以根据您的来源减少数据碎片或复用器开销。默认值为 3200,最小值为 100,最大值为 64Ki

4.18 ass

ASS/SSA(SubStation Alpha)字幕复用器。

它接受单个 ASS 字幕流。

4.18.1 选项

ignore_readorder bool

立即写入对话事件,即使它们是乱序的,默认值为 false,否则它们将被缓存,直到找到预期的时间事件为止。

4.19 ast

AST(音频流)复用器。

此格式用于在某些 Nintendo Wii 游戏上播放音频。

它接受单个音频流。

loopstartloopend 选项可用于定义文件中循环播放的部分,以供支持此类选项的播放器使用。

4.19.1 选项

loopstart start

指定循环开始位置,以毫秒为单位表示,从 -1INT_MAX,如果设置为 -1,则不指定循环(默认值为 -1),并且 loopend 值将被忽略。

loopend end

指定循环结束位置,以毫秒为单位表示,从 0INT_MAX,默认值为 0,如果设置为 0,则假定为总流时长。

4.20 au

SUN AU 音频复用器。

它接受单个音频流。

4.21 avi

音频视频交错复用器。

AVI 是 Microsoft 开发的专有格式,后来通过 Open DML 规范正式指定。

由于播放器实现的差异,可能需要设置一些选项以确保目标播放器可以正确播放生成的输出。

4.21.1 选项

flipped_raw_rgb bool

如果设置为 true,则为原始 RGB 位图存储正高度,表示位图是自下而上存储的。请注意,此选项不会翻转位图,必须事先手动完成,例如使用‘vflip’过滤器。默认值为 false,表示位图是自上而下存储的。

reserve_index_space size

为文件头中每个流的 OpenDML 主索引保留指定的字节数。默认情况下,如果第一个主索引中没有剩余空间,则附加主索引将嵌入到数据包中,并链接在一起作为索引链。这种索引结构可能会导致某些用例出现问题,例如严格依赖 OpenDML 索引规范的第三方软件,或者文件查找速度较慢的情况。在文件头中保留足够的索引空间可以避免这些问题。

所需的索引空间取决于输出文件的大小,每个千兆字节应约为 16 个字节。如果省略此选项或设置为零,则会猜测所需的索引空间。

默认值为 0

write_channel_mask bool

将声道布局掩码写入音频流标头。

默认情况下启用此选项。禁用声道掩码在特定情况下可能很有用,例如当将多个音频流合并为一个以与仅支持 AVI 中单个音频流的软件兼容时(请参阅 (ffmpeg-filters)ffmpeg-filters 手册中的“amerge”部分)。

4.22 avif

AV1 (开放媒体视频编解码器联盟 1) 图像格式复用器。

此复用器存储使用 AV1 编解码器编码的图像。

它接受一个或两个视频流。如果提供了两个视频流,则第二个视频流应包含一个存储 alpha 掩码的单平面。

如果提供了多个图像,则生成的输出将被视为动画 AVIF,并且可以使用 loop 选项指定循环次数。

这是基于开放媒体联盟在 url https://aomediacodec.github.io/av1-avif 的规范。

4.22.1 选项

loop count

循环播放动画 AVIF 的次数,0 表示无限循环,默认值为 0

movie_timescale timescale

设置电影头框 (mvhd) 中写入的时间刻度。范围是 1 到 INT_MAX。默认值为 1000

4.23 avm2

ShockWave Flash (SWF) / ActionScript 虚拟机 2 (AVM2) 格式复用器。

它接受一个音频流、一个视频流或两者都接受。

4.24 bit

G.729 (.bit) 文件格式复用器。

它接受单个 G.729 音频流。

4.25 caf

Apple CAF (Core Audio Format) 复用器。

它接受单个音频流。

4.26 codec2

Codec2 音频复用器。

它接受单个 codec2 音频流。

4.27 chromaprint

Chromaprint 指纹识别器复用器。

要启用此滤镜的编译,您需要使用 --enable-chromaprint 配置 FFmpeg。

此复用器将音频数据馈送到 Chromaprint 库,该库会为提供的音频数据生成指纹。请参阅:https://acoustid.org/chromaprint

它接受最多 2 个声道的单个有符号本地字节序 16 位原始音频流。

4.27.1 选项

算法 version

选择用于指纹识别的算法版本。范围是 04。版本 3 启用静音检测。默认值为 1

fp_format format

输出指纹的格式。接受以下选项

base64

Base64 压缩指纹(默认)

compressed

二进制压缩指纹

raw

二进制原始指纹

silence_threshold threshold

检测静音的阈值。范围从 -132767,其中 -1 禁用静音检测。静音检测只能与算法的版本 3 一起使用。

为了与 AcoustID 服务一起使用,必须禁用静音检测。默认值为 -1

4.28 crc

CRC(循环冗余校验)复用器。

此复用器计算并打印所有输入音频和视频帧的 Adler-32 CRC。默认情况下,在计算 CRC 之前,音频帧会转换为有符号 16 位原始音频,视频帧会转换为原始视频。

复用器的输出由一行组成,形式为:CRC=0xCRC,其中 CRC 是一个十六进制数字,用 0 填充到 8 位,其中包含所有解码输入帧的 CRC。

另请参阅 framecrc 复用器。

4.28.1 示例

  • 使用 ffmpeg 计算输入的 CRC,并将其存储在文件 out.crc
    ffmpeg -i INPUT -f crc out.crc
    
  • 使用 ffmpeg 通过命令将 CRC 打印到标准输出
    ffmpeg -i INPUT -f crc -
    
  • 您可以使用 ffmpeg 通过指定音频和视频编解码器和格式来选择每个帧的输出格式。例如,要计算转换为 PCM 无符号 8 位 的输入音频和转换为 MPEG-2 视频的输入视频的 CRC,请使用命令
    ffmpeg -i INPUT -c:a pcm_u8 -c:v mpeg2video -f crc -
    

4.29 dash

HTTP 动态自适应流 (DASH) 复用器。

此复用器根据 MPEG-DASH 标准 ISO/IEC 23009-1:2014 和后续标准更新创建分段和清单文件。

有关更多信息,请参阅

此复用器为每个流创建一个 MPD(媒体呈现描述)清单文件和分段文件。分段文件与 MPD 清单文件放在同一目录中。

分段文件名可能包含在标准第 5.3.9.4.4 节中定义的清单 SegmentTemplate 部分中使用的预定义标识符。

可用的标识符为 $RepresentationID$$Number$$Bandwidth$$Time$。除了标准标识符外,还支持 ffmpeg 特定的 $ext$ 标识符。指定时,ffmpeg 会将文件名中的 $ext$ 替换为复用格式的扩展名,例如 mp4webm 等。

4.29.1 选项

adaptation_sets adaptation_sets

将流分配给自适应集,在 MPD 清单的 AdaptationSets 部分中指定。

一个自适应集包含一组或多个作为单个子集访问的流,例如,由用户根据可用带宽选择的不同大小编码的对应流,或具有不同语言的不同音频流。

每个自适应集都以语法指定

id=index,streams=streams

其中 index 必须是数字索引,而 streams 是一个 , 分隔的流索引序列。可以指定多个自适应集,用空格分隔。

要将所有视频(或音频)流映射到自适应集,可以使用 v(或 a)作为流标识符,而不是 ID。

如果未定义任何分配,则默认为每个流使用一个自适应集。

还可以指定以下可选字段

descriptor

定义 ISO/IEC 23009-1:2014/Amd.2:2015 定义的描述符。

例如

<SupplementalProperty schemeIdUri=\"urn:mpeg:dash:srd:2014\" value=\"0,0,0,1,1,2,2\"/>

描述符字符串应该是一个自闭合的 XML 标签。

frag_duration

覆盖使用 frag_duration 选项指定的全局分段持续时间。

frag_type

覆盖使用 frag_type 选项指定的全局分段类型。

seg_duration

覆盖使用 seg_duration 选项指定的全局分段持续时间。

trick_id

将自适应集标记为包含用于所引用自适应集的技巧模式的流。

以下是 adaptation_sets 选项的一些可能值示例

id=0,seg_duration=2,frag_duration=1,frag_type=duration,streams=v id=1,seg_duration=2,frag_type=none,streams=a
id=0,seg_duration=2,frag_type=none,streams=0 id=1,seg_duration=10,frag_type=none,trick_id=0,streams=1
dash_segment_type type

设置 DASH 分段文件类型。

可能的值

auto

将根据流编解码器选择 dash 分段文件格式。这是默认模式。

mp4

dash 分段文件将采用 ISOBMFF/MP4 格式

webm

dash 分段文件将采用 WebM 格式

extra_window_size size

设置在从磁盘删除之前,在清单之外保留的最大分段数。

format_options options_list

使用 : 分隔的键=值参数列表设置容器格式 (mp4/webm) 选项。包含 : 特殊字符的值必须进行转义。

frag_duration duration

设置分段内片段的长度(以秒为单位),也可以设置小数值。

frag_type type

设置分段间隔的类型。

可能的值

auto

每个分段设置一个片段

every_frame

在每一帧处进行分片。

duration

按特定时间间隔分段

pframes

在关键帧和后续 P 帧重新排序时分段(仅限视频,实验性)

global_sidx bool

写入全局 SIDX atom。仅适用于单文件、mp4 输出、非流式模式。

hls_master_name file_name

HLS 主播放列表名称。默认值为 master.m3u8

hls_playlist bool

生成 HLS 播放列表文件。主播放列表使用 hls_master_name 选项指定的文件名生成。为每个流生成一个媒体播放列表文件,文件名为 media_0.m3u8media_1.m3u8 等。

http_opts http_opts

指定传递到底层 HTTP 协议的 : 分隔的键=值选项列表。仅适用于 HTTP 输出。

http_persistent bool

使用持久 HTTP 连接。仅适用于 HTTP 输出。

http_user_agent user_agent

覆盖 HTTP 标头中的 User-Agent 字段。仅适用于 HTTP 输出。

ignore_io_errors bool

在打开和写入期间忽略 IO 错误。对于具有网络输出的长时间运行非常有用。默认情况下禁用此选项。

index_correction bool

启用或禁用分段索引校正逻辑。仅在启用 use_template 且禁用 use_timeline 时适用。默认情况下禁用此选项。

启用后,该逻辑会监视分段索引的流动。如果流的分段索引值未处于预期的实时位置,则该逻辑会校正该索引值。

通常,在实时流式传输用例中需要此逻辑。在长时间运行的流式传输期间,网络带宽波动是常见的。每次波动都可能导致分段索引落后于预期的实时位置。

init_seg_name init_name

用于初始化片段的 DASH 模板名称。默认值为 init-stream$RepresentationID$.$ext$$ext$ 会被替换为片段格式特定的文件扩展名。

ldash bool

启用低延迟 DASH,通过约束某些元素的存在和值来实现。默认情况下禁用。

lhls bool

启用低延迟 HLS (LHLS)。添加带有当前片段 URI 的 #EXT-X-PREFETCH 标签。hls.js 播放器团队正在尝试标准化一个开放的 LHLS 规范。该规范草案可在 https://github.com/video-dev/hlsjs-rfcs/blob/lhls-spec/proposals/0001-lhls.md 找到。

此选项尝试符合上述开放规范。它会自动启用 streaminghls_playlist 选项。这是一个实验性功能。

注意:这不是 Apple 的 LHLS 版本。请参阅 https://datatracker.ietf.org/doc/html/draft-pantos-hls-rfc8216bis

master_m3u8_publish_rate segment_intervals_count

在指定的片段间隔数后,重复发布主播放列表。

max_playback_rate rate

设置最大播放速率,该速率适用于客户端在正常播放期间自动调整播放延迟和缓冲区占用情况。

media_seg_name segment_name

用于媒体片段的 DASH 模板名称。默认值为 chunk-stream$RepresentationID$-$Number%05d$.$ext$$ext$ 会被替换为片段格式特定的文件扩展名。

method method

使用给定的 HTTP 方法来创建输出文件。通常设置为 PUTPOST

min_playback_rate rate

设置最小播放速率,该速率适用于客户端在正常播放期间自动调整播放延迟和缓冲区占用情况。

mpd_profile flags

设置一个或多个 MPD 清单配置文件。

可能的值

dash

MPEG-DASH ISO 基本媒体文件格式直播配置文件

dvb_dash

DVB-DASH 配置文件

默认值为 dash

remove_at_exit bool

启用或禁用在完成后删除所有片段。默认情况下禁用。

seg_duration duration

设置片段长度(以秒为单位)(可以设置小数值)。当启用 use_template 选项且禁用 use_timeline 选项时,该值被视为平均片段时长;对于所有其他用例,该值被视为最小片段时长。

默认值为 5

single_file bool

启用或禁用将所有片段存储在一个文件中,使用字节范围访问。默认情况下禁用。

可以使用 single_file_name 选项指定单个文件的名称,如果未指定,则假定清单文件的基本名称带有输出格式扩展名。

single_file_name file_name

用于清单 baseURL 元素的 DASH 模板名称。暗示 single_file 选项设置为 true。在模板中,$ext$ 会被替换为片段格式特定的文件扩展名。

streaming bool

启用或禁用输出的块流模式。在块流模式下,每个帧都将是一个构成块的 moof 片段。默认情况下禁用。

target_latency target_latency

设置服务的目标延迟(以秒为单位)(可以设置小数值)。仅当启用 streamingwrite_prft 选项时适用。这是一个信息性字段,客户端可以使用它来测量服务的延迟。

timeout timeout

设置以秒为单位表示的套接字 I/O 操作超时(可以设置小数值)。仅适用于 HTTP 输出。

update_period period

为动态内容设置 MPD 更新周期。单位是秒。如果设置为 0,则会自动计算该周期。

默认值为 0

use_template bool

启用或禁用在清单中使用 SegmentTemplate 而不是 SegmentList。默认情况下启用。

use_timeline bool

启用或禁用在 SegmentTemplate 清单部分中使用 SegmentTimeline。默认情况下启用。

utc_timing_url url

将以 ISO 格式返回 UTC 时间戳的页面的 URL,例如 https://time.akamai.com/?iso

window_size size

设置清单中保留的最大片段数,丢弃最旧的片段。这对于直播流非常有用。

如果该值为 0,则清单中保留所有片段。默认值为 0

write_prft write_prft

在支持的流上写入 Producer Reference Time 元素。这还会启用在底层复用器中写入 prft box。仅当启用 utc_url 选项时适用。默认情况下设置为 auto,在这种情况下,复用器将尝试仅在需要它的模式下启用它。

4.29.2 示例

使用 ffmpeg 从实时输入源生成 DASH 输出。

从输入文件生成两个多媒体流,都包含通过 ‘libx264’ 编码的视频流和通过 ‘libfdk_aac’ 编码的音频流。第一个多媒体流包含比特率为 800k 的视频和默认速率的音频,第二个多媒体流包含缩放到 320x170 像素、比特率为 300k 的视频和重采样到 22005 Hz 的音频。

window_size 选项仅保留最新的 5 个片段,默认时长为 5 秒。

ffmpeg -re -i <input> -map 0 -map 0 -c:a libfdk_aac -c:v libx264 \
-b:v:0 800k -profile:v:0 main \
-b:v:1 300k -s:v:1 320x170 -profile:v:1 baseline -ar:a:1 22050 \
-bf 1 -keyint_min 120 -g 120 -sc_threshold 0 -b_strategy 0 \
-use_timeline 1 -use_template 1 -window_size 5 \
-adaptation_sets "id=0,streams=v id=1,streams=a" \
-f dash /path/to/out.mpd

4.30 daud

D-Cinema 音频复用器。

它接受单个 6 声道音频流,该音频流以 96000 Hz 的频率重采样并使用 ‘pcm_24daud’ 编解码器编码。

4.30.1 示例

使用 ffmpeg 将输入音频复用到以 96000Hz 频率重采样的 ‘5.1’ 声道布局

ffmpeg -i INPUT -af aresample=96000,pan=5.1 slow.302

对于 7.0 之前的 ffmpeg 版本,您可能必须使用 ‘asetnsamples’ 滤波器来限制复用数据包的大小,因为此格式不支持复用大于 65535 字节(3640 个采样)的数据包。对于较新的 ffmpeg 版本,音频会自动打包成 36000 字节(2000 个采样)的数据包。

4.31 dv

DV (数字视频) 复用器。

它接受恰好一个 ‘dvvideo’ 视频流和最多两个 ‘pcm_s16’ 音频流。更多约束由视频的属性定义,该属性必须对应于受支持的 DV 视频配置文件和帧率。

4.31.1 示例

使用 ffmpeg 转换输入

ffmpeg -i INPUT -s:v 720x480 -pix_fmt yuv411p -r 29.97 -ac 2 -ar 48000 -y out.dv

4.32 ffmetadata

FFmpeg 元数据复用器。

此复用器将流元数据写入 ‘ffmetadata’ 格式。

有关该格式的信息,请参阅 (ffmpeg-formats) 元数据章节

4.32.1 示例

使用 ffmpeg 从输入文件将元数据提取到 ‘ffmetadata’ 格式的 metadata.ffmeta 文件中

ffmpeg -i INPUT -f ffmetadata metadata.ffmeta

4.33 fifo

FIFO (先进先出) 复用器。

fifo’ 伪复用器允许通过使用先进先出队列并在单独的线程中运行实际的复用器来分离编码和复用。

这在与 tee 复用器结合使用时尤其有用,并且可用于将数据发送到具有不同可靠性/写入速度/延迟的多个目的地。

目标复用器可以从输出名称中选择,或者通过 fifo_format 选项指定。

如果队列已满或输出失败(例如,如果数据包无法写入输出),则 ‘fifo’ 复用器的行为是可选择的。

  • 可以基于实时时间或已处理流的时间,以可配置的重试延迟透明地重新启动输出。
  • 在临时故障期间,可以阻止编码,或者在 FIFO 队列填满时,可以继续透明地丢弃数据包。

API 用户应该意识到,在其 AVFormatContext 中使用的回调函数(interrupt_callbackio_openio_close)必须是线程安全的。

4.33.1 选项

attempt_recovery bool

如果发生故障,尝试恢复输出。当与网络输出一起使用时,这尤其有用,因为它使得透明地重新启动流成为可能。默认情况下,此选项设置为 false

drop_pkts_on_overflow bool

如果设置为 true,则在 fifo 队列填满的情况下,将丢弃数据包,而不是阻塞编码器。这使得可以在不延迟输入的情况下继续流式传输,但代价是省略部分流。默认情况下,此选项设置为 false,因此在这种情况下,编码器将被阻塞,直到复用器处理了一些数据包,并且没有数据包丢失。

fifo_format format_name

指定格式名称。如果无法从输出名称后缀猜测,则此选项很有用。

format_opts options

为底层复用器指定格式选项。复用器选项可以指定为以 ’:’ 分隔的 = 对列表。

max_recovery_attempts count

设置连续不成功的恢复尝试的最大次数,超过此次数后,输出将永久失败。默认情况下,此选项设置为 0(无限制)。

queue_size size

将队列的大小指定为数据包的数量。默认值为 60

recover_any_error bool

如果设置为 true,则无论导致故障的错误类型如何,都将尝试恢复。默认情况下,此选项设置为 false,并且在发生某些(通常是永久性的)错误时,即使 attempt_recovery 选项设置为 true,也不会尝试恢复。

recovery_wait_streamtime bool

如果设置为 false,则在等待恢复尝试时将使用实时时间(即,将在 recovery_wait_time 选项指定的时间后尝试恢复)。

如果设置为 true,则将考虑已处理流的时间(即,将在丢弃与 recovery_wait_time 选项对应的数据包后尝试恢复)。

默认情况下,此选项设置为 false

recovery_wait_time duration

指定在前一次不成功的恢复尝试之后,下一次恢复尝试之前的等待时间(以秒为单位)。默认值为 5

restart_with_keyframe bool

指定是否在从队列溢出或故障恢复后等待关键帧。默认情况下,此选项设置为 false

timeshift duration

缓冲指定数量的数据包并延迟写入输出。请注意,queue_size 选项的值必须足够大,才能存储用于时间偏移的数据包。在输入结束时,fifo 缓冲区将以实时速度刷新。

4.33.2 示例

使用 ffmpeg 流式传输到 RTMP 服务器,即使在临时故障(网络中断)的情况下,也以实时速率继续处理流,并尝试每秒无限期地恢复流。

ffmpeg -re -i ... -c:v libx264 -c:a aac -f fifo -fifo_format flv \
  -drop_pkts_on_overflow 1 -attempt_recovery 1 -recovery_wait_time 1 \
  -map 0:v -map 0:a rtmp://example.com/live/stream_name

4.34 film_cpk

Sega film (.cpk) 复用器。

此格式用作多个 Sega 游戏的内部格式。

有关 Sega film 文件格式的更多信息,请访问 http://wiki.multimedia.cx/index.php?title=Sega_FILM

它最多接受一个 ‘cinepak’ 或原始视频流,以及最多一个音频流。

4.35 filmstrip

Adobe Filmstrip 复用器。

此格式由多个 Adobe 工具使用,以存储生成的胶片导出。它接受单个原始视频流。

4.36 fits

灵活图像传输系统 (FITS) 复用器。

此图像格式用于存储天文数据。

有关格式的更多信息,请访问 https://fits.gsfc.nasa.gov

4.37 flac

原始 FLAC 音频复用器。

此复用器仅接受一个 FLAC 音频流。此外,还可以添加具有 ‘attached_pic’ 配置的图像。

4.37.1 选项

write_header bool

如果设置为 true,则写入文件头,默认为 true

4.37.2 示例

使用 ffmpeg 存储来自输入文件的音频流,以及用于 ‘attached_pic’ 配置的多个图片

ffmpeg -i INPUT -i pic1.png -i pic2.jpg -map 0:a -map 1 -map 2 -disposition:v attached_pic OUTPUT

4.38 flv

Adobe Flash 视频格式复用器。

4.38.1 选项

flvflags flags

可能的值

aac_seq_header_detect

基于音频流数据放置 AAC 序列头。

no_sequence_end

禁用序列结束标签。

no_metadata

禁用元数据标签。

no_duration_filesize

当流结束时,禁用元数据中的时长和文件大小(如果它们等于零)。(用于不可寻址的实时流)。

add_keyframe_index

用于方便寻址;特别是用于 HTTP 伪流。

4.39 framecrc

每个数据包的 CRC(循环冗余校验)测试格式。

此复用器计算并打印每个音频和视频数据包的 Adler-32 CRC。默认情况下,在计算 CRC 之前,音频帧会转换为有符号 16 位原始音频,视频帧会转换为原始视频。

复用器的输出由每个音频和视频数据包的一行组成,格式如下

stream_index, packet_dts, packet_pts, packet_duration, packet_size, 0xCRC

CRC 是一个十六进制数,用 0 填充到 8 位,其中包含数据包的 CRC。

4.39.1 示例

例如,要计算 INPUT 中音频和视频帧的 CRC,转换为原始音频和视频数据包,并将其存储在文件 out.crc

ffmpeg -i INPUT -f framecrc out.crc

要将信息打印到 stdout,请使用命令

ffmpeg -i INPUT -f framecrc -

使用 ffmpeg,可以通过指定音频和视频编解码器来选择在计算每个数据包的 CRC 之前将音频和视频帧编码为的输出格式。例如,要计算每个解码的输入音频帧转换为 PCM 无符号 8 位和每个解码的输入视频帧转换为 MPEG-2 视频的 CRC,请使用命令

ffmpeg -i INPUT -c:a pcm_u8 -c:v mpeg2video -f framecrc -

另请参见 crc 复用器。

4.40 framehash

每个数据包的哈希测试格式。

此复用器计算并打印每个音频和视频数据包的加密哈希。这可用于逐个数据包的相等性检查,而无需对每个数据包进行单独的二进制比较。

默认情况下,在计算哈希之前,音频帧会转换为有符号 16 位原始音频,视频帧会转换为原始视频,但也可以使用显式转换为其他编解码器的输出。默认情况下,它使用 SHA-256 加密哈希函数,但支持多种其他算法。

复用器的输出由每个音频和视频数据包的一行组成,格式如下

stream_index, packet_dts, packet_pts, packet_duration, packet_size, hash

hash 是一个十六进制数,表示计算出的数据包的哈希值。

hash algorithm

使用字符串 algorithm 指定的加密哈希函数。支持的值包括 MD5murmur3RIPEMD128RIPEMD160RIPEMD256RIPEMD320SHA160SHA224SHA256(默认)、SHA512/224SHA512/256SHA384SHA512CRC32adler32

4.40.1 示例

要计算 INPUT 中音频和视频帧的 SHA-256 哈希值,转换为原始音频和视频数据包,并将其存储在文件 out.sha256

ffmpeg -i INPUT -f framehash out.sha256

要将信息打印到 stdout,使用 MD5 哈希函数,请使用命令

ffmpeg -i INPUT -f framehash -hash md5 -

另请参见 hash 复用器。

4.41 framemd5

每个数据包的 MD5 测试格式。

这是 framehash 复用器的一个变体。与该复用器不同,它默认使用 MD5 哈希函数。

4.41.1 示例

计算 INPUT 中音频和视频帧的 MD5 哈希值,将其转换为原始音频和视频数据包,并将其存储在文件 out.md5 中。

ffmpeg -i INPUT -f framemd5 out.md5

要将信息打印到 stdout,请使用命令

ffmpeg -i INPUT -f framemd5 -

另请参阅 framehashmd5 复用器。

4.42 gif

动画 GIF 复用器。

请注意,GIF 格式的时间基数非常大:因此,两个帧之间的延迟不能小于一厘秒。

4.42.1 选项

loop bool

设置输出循环的次数。使用 -1 表示不循环,使用 0 表示无限循环(默认)。

final_delay delay

强制设置最后一帧后的延迟时间(以厘秒为单位)。每个帧都以延迟到下一帧结束。默认值为 -1,这是一个特殊值,用于告知复用器重用之前的延迟。在循环的情况下,您可能需要自定义此值以标记暂停,例如。

4.42.2 示例

编码一个循环 10 次的 GIF,循环之间延迟 5 秒。

ffmpeg -i INPUT -loop 10 -final_delay 500 out.gif

注意 1:如果您希望将帧提取到单独的 GIF 文件中,则需要强制使用 image2 复用器。

ffmpeg -i INPUT -c:v gif -f image2 "out%d.gif"

4.43 gxf

通用交换格式 (GXF) 复用器。

GXF 由 Grass Valley Group 开发,然后由 SMPTE 标准化为 SMPTE 360M,并在 SMPTE RDD 14-2007 中扩展以包括高清视频分辨率。

它最多接受一个编解码器为 ‘mjpeg’、‘mpeg1video’、‘mpeg2video’ 或 ‘dvvideo’ 且分辨率为 ‘512x480’ 或 ‘608x576’ 的视频流,以及多个速率为 48000Hz 且编解码器为 ‘pcm16_le’ 的音频流。

4.44 hash

哈希测试格式。

此复用器计算并打印所有输入音频和视频帧的加密哈希值。这可以用于相等性检查,而无需进行完整的二进制比较。

默认情况下,在计算哈希值之前,音频帧被转换为有符号 16 位原始音频,视频帧被转换为原始视频,但也可以使用显式转换为其他编解码器的输出。时间戳被忽略。默认情况下使用 SHA-256 加密哈希函数,但也支持其他几种算法。

复用器的输出由以下形式的单行组成:algo=hash,其中 algo 是表示所用哈希函数的短字符串,而 hash 是表示计算出的哈希值的十六进制数。

hash algorithm

使用字符串 algorithm 指定的加密哈希函数。支持的值包括 MD5murmur3RIPEMD128RIPEMD160RIPEMD256RIPEMD320SHA160SHA224SHA256(默认)、SHA512/224SHA512/256SHA384SHA512CRC32adler32

4.44.1 示例

计算转换为原始音频和视频的输入的 SHA-256 哈希值,并将其存储在文件 out.sha256 中。

ffmpeg -i INPUT -f hash out.sha256

要将 MD5 哈希值打印到标准输出,请使用命令:

ffmpeg -i INPUT -f hash -hash md5 -

另请参阅 framehash 复用器。

4.45 hds

HTTP 动态流 (HDS) 复用器。

HTTP 动态流,或 HDS,是 Adobe 开发的一种自适应比特率流式传输方法。HDS 通过 HTTP 连接传递 MP4 视频内容。HDS 可用于点播流式传输或实时流式传输。

此复用器会创建一个 .f4m(Adobe Flash Media Manifest File)清单,每个流一个 .abst(Adobe Bootstrap File),以及输出目录中指定的分段文件。

这些需要通过 HTTPS 由 HDS 播放器访问,才能在生成的流上执行播放。

4.45.1 选项

extra_window_size int

从磁盘删除之前,在清单之外保留的片段数量。

min_frag_duration microseconds

最小片段持续时间(以微秒为单位),默认值为 1 秒 (10000000)。

remove_at_exit bool

设置为 true 时,完成时删除所有片段。

window_size int

清单中保留的片段数量,如果设置为与 0 不同的值。默认情况下,所有分段都保留在输出目录中。

4.45.2 示例

使用 ffmpeg 以实时速率将 HDS 文件生成到 output.hds 目录。

ffmpeg -re -i INPUT -f hds -b:v 200k output.hds

4.46 hls

Apple HTTP Live Streaming 复用器,根据 HTTP Live Streaming (HLS) 规范对 MPEG-TS 进行分段。

它创建一个播放列表文件以及一个或多个分段文件。输出文件名指定播放列表文件名。

默认情况下,复用器为生成的每个分段创建一个文件。这些文件与播放列表具有相同的名称,后跟一个序列号和一个 .ts 扩展名。

请确保在编码时需要封闭的 GOP,并将 GOP 大小设置为适合您的分段时间约束。

例如,要使用 ffmpeg 转换输入文件:

ffmpeg -i in.mkv -c:v h264 -flags +cgop -g 30 -hls_time 1 out.m3u8

此示例将生成播放列表 out.m3u8 和分段文件:out0.tsout1.tsout2.ts 等。

另请参阅 segment 复用器,它提供了更通用和灵活的分段器实现,可用于执行 HLS 分段。

4.46.1 选项

hls_init_time duration

设置初始目标分段长度。默认值为 0

duration 必须是时间持续时间规范,请参阅 (ffmpeg-utils)ffmpeg-utils(1) 手册中的“时间持续时间”部分

将在第一个 m3u8 列表上经过此时间后的下一个关键帧上剪切分段。在填充初始播放列表后,ffmpeg 将以等于 hls_time 的持续时间剪切分段。

hls_time duration

设置目标分段长度。默认值为 2。

duration 必须是时间持续时间规范,请参阅 (ffmpeg-utils)ffmpeg-utils(1) 手册中的“时间持续时间”部分。将在经过此时间后的下一个关键帧上剪切分段。

hls_list_size size

设置播放列表条目的最大数量。如果设置为 0,则列表文件将包含所有分段。默认值为 5。

hls_delete_threshold size

设置 hls_flags delete_segments 删除它们之前要保留在磁盘上的未引用分段的数量。增加此值可允许继续客户端下载最近在播放列表中引用的分段。默认值为 1,这意味着早于 hls_list_size+1 的分段将被删除。

hls_start_number_source source

根据指定的源启动播放列表序列号 (#EXT-X-MEDIA-SEQUENCE)。除非设置了 hls_flags single_file,否则它还指定分段和字幕文件名的起始序列号的来源。在任何情况下,如果设置了 hls_flags append_list 并且读取的播放列表序列号大于指定的起始序列号,则该值将用作起始值。

它接受以下值:

generic(默认)

根据 start_number 选项值设置起始编号。

epoch

将起始编号设置为自纪元(1970-01-01 00:00:00)以来的秒数。

epoch_us

将起始编号设置为自纪元(1970-01-01 00:00:00)以来的微秒数。

datetime

根据当前日期/时间(格式为 YYYYmmddHHMMSS)设置起始编号。例如,20161231235759。

start_number number

hls_start_number_source 值为 generic 时,从指定的 number 启动播放列表序列号 (#EXT-X-MEDIA-SEQUENCE)。(这是默认情况。)除非设置了 hls_flags single_file,否则它还指定分段和字幕文件名的起始序列号。默认值为 0。

hls_allow_cache bool

显式设置客户端是否可以 (1) 或必须不 (0) 缓存媒体分段。

hls_base_url baseurl

baseurl 附加到播放列表中的每个条目。对于生成具有绝对路径的播放列表很有用。

请注意,播放列表序列号对于每个分段都必须是唯一的,并且它不应与分段文件名序列号混淆,分段文件名序列号可以是循环的,例如,如果指定了 wrap 选项。

hls_segment_filename filename

设置分段文件名。除非使用 ‘single_file’ 设置了 hls_flags 选项,否则 filename 将用作字符串格式,并附加分段编号。

例如

ffmpeg -i in.nut -hls_segment_filename 'file%03d.ts' out.m3u8

将生成播放列表 out.m3u8 以及分段文件:file000.tsfile001.tsfile002.ts 等。

filename 可以包含完整路径或相对路径规范,但只有不带任何路径的文件名部分会包含在 m3u8 分段列表中。如果指定了相对路径,则创建的分段文件的路径将相对于当前工作目录。当设置了 strftime_mkdir 时,filename 的整个展开值将写入 m3u8 分段列表。

当使用两个或多个变体流设置 var_stream_map 时,filename 模式必须包含字符串“%v”,该字符串将展开为生成的分段文件名中变体流索引的位置。

例如

ffmpeg -i in.ts -b:v:0 1000k -b:v:1 256k -b:a:0 64k -b:a:1 32k \
  -map 0:v -map 0:a -map 0:v -map 0:a -f hls -var_stream_map "v:0,a:0 v:1,a:1" \
  -hls_segment_filename 'file_%v_%03d.ts' out_%v.m3u8

将生成播放列表分段文件集:file_0_000.tsfile_0_001.tsfile_0_002.ts 等以及 file_1_000.tsfile_1_001.tsfile_1_002.ts 等。

字符串“%v”可以出现在文件名或包含文件的最后一个目录名中,但只能在其中一个中出现。(此外,%v可以在最后一个子目录或文件名中出现多次。)如果字符串 %v 出现在目录名中,则会在展开目录名模式后创建子目录。这使得可以在子目录中创建与不同变体流对应的分段。

例如

ffmpeg -i in.ts -b:v:0 1000k -b:v:1 256k -b:a:0 64k -b:a:1 32k \
  -map 0:v -map 0:a -map 0:v -map 0:a -f hls -var_stream_map "v:0,a:0 v:1,a:1" \
  -hls_segment_filename 'vs%v/file_%03d.ts' vs%v/out.m3u8

将生成播放列表分段文件集:vs0/file_000.tsvs0/file_001.tsvs0/file_002.ts 等以及 vs1/file_000.tsvs1/file_001.tsvs1/file_002.ts 等。

strftime bool

filename 上使用 strftime(),以使用本地时间扩展分段文件名。分段号在此模式下也可用,但要使用它,需要在 hls_flag 中设置“second_level_segment_index”,并且 %%d 将是说明符。

例如

ffmpeg -i in.nut -strftime 1 -hls_segment_filename 'file-%Y%m%d-%s.ts' out.m3u8

将生成播放列表 out.m3u8 以及分段文件:file-20160215-1455569023.tsfile-20160215-1455569024.ts 等。注意:在某些系统/环境中,%s 说明符不可用。请参阅 strftime() 文档。

例如

ffmpeg -i in.nut -strftime 1 -hls_flags second_level_segment_index -hls_segment_filename 'file-%Y%m%d-%%04d.ts' out.m3u8

将生成播放列表 out.m3u8 以及分段文件:file-20160215-0001.tsfile-20160215-0002.ts 等。

strftime_mkdir bool

strftime 一起使用时,它将创建选项 hls_segment_filename 的展开值中存在的所有子目录。

例如

ffmpeg -i in.nut -strftime 1 -strftime_mkdir 1 -hls_segment_filename '%Y%m%d/file-%Y%m%d-%s.ts' out.m3u8

将创建一个目录 201560215(如果它不存在),然后生成播放列表 out.m3u8 以及分段文件:20160215/file-20160215-1455569023.ts20160215/file-20160215-1455569024.ts 等。

例如

ffmpeg -i in.nut -strftime 1 -strftime_mkdir 1 -hls_segment_filename '%Y/%m/%d/file-%Y%m%d-%s.ts' out.m3u8

将创建一个目录层次结构 2016/02/15(如果其中任何一个不存在),然后生成播放列表 out.m3u8 以及分段文件:2016/02/15/file-20160215-1455569023.ts2016/02/15/file-20160215-1455569024.ts 等。

hls_segment_options options_list

使用以 :- 分隔的键=值参数列表设置输出格式选项。包含 : 特殊字符的值必须转义。

hls_key_info_file key_info_file

使用 key_info_file 中的信息进行分段加密。key_info_file 的第一行指定写入播放列表的密钥 URI。密钥 URL 用于在播放期间访问加密密钥。第二行指定用于在加密过程中获取密钥的密钥文件的路径。密钥文件以二进制格式读取为单个打包的 16 个八位字节的数组。可选的第三行将初始化向量 (IV) 指定为十六进制字符串,以用于加密,而不是分段序列号(默认)。如果启用了 hls_flags periodic_rekey,则更改 key_info_file 将导致使用新密钥/IV 进行分段加密,并在播放列表中为新密钥 URI/IV 添加条目。

密钥信息文件格式

key URI
key file path
IV (optional)

密钥 URI 示例

http://server/file.key
/path/to/file.key
file.key

密钥文件路径示例

file.key
/path/to/file.key

IV 示例

0123456789ABCDEF0123456789ABCDEF

密钥信息文件示例

http://server/file.key
/path/to/file.key
0123456789ABCDEF0123456789ABCDEF

Shell 脚本示例

#!/bin/sh
BASE_URL=${1:-'.'}
openssl rand 16 > file.key
echo $BASE_URL/file.key > file.keyinfo
echo file.key >> file.keyinfo
echo $(openssl rand -hex 16) >> file.keyinfo
ffmpeg -f lavfi -re -i testsrc -c:v h264 -hls_flags delete_segments \
  -hls_key_info_file file.keyinfo out.m3u8
hls_enc bool

启用 (1) 或禁用 (0) AES128 加密。启用后,生成的每个分段都会被加密,并且加密密钥会保存为 播放列表名称.key。

hls_enc_key key

指定一个 16 字节的密钥来加密分段,默认情况下是随机生成的。

hls_enc_key_url keyurl

如果设置,则将 keyurl 前置到播放列表中密钥文件名之前,而不是 baseurl

hls_enc_iv iv

为每个分段指定 16 字节的初始化向量,而不是自动生成的。

hls_segment_type flags

可能的值

mpegts

以 MPEG-2 传输流格式输出分段文件。这与所有 HLS 版本兼容。

fmp4

以分段 MP4 格式输出分段文件,类似于 MPEG-DASH。fmp4 文件可用于 HLS 版本 7 及更高版本。

hls_fmp4_init_filename filename

设置分段文件头文件的文件名,默认文件名为 init.mp4

启用 strftime 后,filename 将扩展为带有本地时间的分段文件名。

例如

ffmpeg -i in.nut -hls_segment_type fmp4 -strftime 1 -hls_fmp4_init_filename "%s_init.mp4" out.m3u8

将生成如下 init 文件 1602678741_init.mp4

hls_fmp4_init_resend bool

每次刷新 m3u8 文件后重新发送 init 文件,默认为 0

当使用两个或多个变体流设置 var_stream_map 时,filename 模式必须包含字符串“%v”,该字符串指定生成 init 文件名中变体流索引的位置。字符串“%v”可以出现在文件名或包含文件的最后一个目录名中。如果字符串出现在目录名中,则在展开目录名模式后创建子目录。这使得可以在子目录中创建与不同变体流对应的 init 文件。

hls_flags flags

可能的值

single_file

如果设置了此标志,则复用器会将所有分段存储在单个 MPEG-TS 文件中,并在播放列表中使用字节范围。以这种方式生成的 HLS 播放列表的版本号为 4。

例如

ffmpeg -i in.nut -hls_flags single_file out.m3u8

将生成播放列表 out.m3u8 和单个分段文件 out.ts

delete_segments

从播放列表中删除的分段文件会在等于分段持续时间加上播放列表持续时间的时间段后删除。

append_list

将新分段附加到旧分段列表的末尾,并从旧分段列表中删除 #EXT-X-ENDLIST

round_durations

将播放列表文件分段信息中的持续时间信息舍入为整数值,而不是使用浮点数。如果没有其他需要使用更高 HLS 版本的功能,则这将允许 ffmpeg 输出 HLS 版本 2 m3u8。

discont_start

在第一个分段的信息之前,向播放列表添加 #EXT-X-DISCONTINUITY 标记。

omit_endlist

不要在播放列表的末尾附加 EXT-X-ENDLIST 标记。

periodic_rekey

将定期检查 hls_key_info_file 指定的文件,并检测对加密信息的更新。请务必原子地替换此文件,包括包含 AES 加密密钥的文件。

independent_segments

向具有视频分段的播放列表添加 #EXT-X-INDEPENDENT-SEGMENTS 标记,并且保证该播放列表的所有分段都以关键帧开头。

iframes_only

向具有视频分段的播放列表添加 #EXT-X-I-FRAMES-ONLY 标记,并且只能在 #EXT-X-BYTERANGE 模式下播放 I 帧。

split_by_time

允许分段在关键帧之外的帧上开始。当关键帧之间的时间不一致时,这可以改善某些播放器的行为,但可能会使其他播放器的行为更糟,并可能在搜索过程中导致一些奇怪的情况。此标志应与 hls_time 选项一起使用。

program_date_time

生成 EXT-X-PROGRAM-DATE-TIME 标记。

second_level_segment_index

strftime 选项开启时,除了日期/时间值之外,还可以在 hls_segment_filename 选项表达式中使用段索引作为 %%d。要获取带有尾随零的固定宽度数字,可以使用 %%0xd 格式,其中 x 是所需的宽度。

second_level_segment_size

当 strftime 开启时,除了日期/时间值之外,还可以在 hls_segment_filename 选项表达式中使用段大小(以字节为单位计数)作为 %%s。要获取带有尾随零的固定宽度数字,可以使用 %%0xs 格式,其中 x 是所需的宽度。

second_level_segment_duration

当 strftime 开启时,除了日期/时间值之外,还可以在 hls_segment_filename 选项表达式中使用段时长(以微秒为单位计算)作为 %%t。要获取带有尾随零的固定宽度数字,可以使用 %%0xt 格式,其中 x 是所需的宽度。

例如

ffmpeg -i sample.mpeg \
   -f hls -hls_time 3 -hls_list_size 5 \
   -hls_flags second_level_segment_index+second_level_segment_size+second_level_segment_duration \
   -strftime 1 -strftime_mkdir 1 -hls_segment_filename "segment_%Y%m%d%H%M%S_%%04d_%%08s_%%013t.ts" stream.m3u8

将生成如下的段:segment_20170102194334_0003_00122200_0000003000000.tssegment_20170102194334_0004_00120072_0000003000000.ts 等。

temp_file

将段数据写入 filename.tmp,并在段完成后才将其重命名为 filename。

可以配置提供段的 Web 服务器拒绝访问 *.tmp 的请求,以防止在未将正在进行中的段添加到 m3u8 播放列表之前对其进行访问。

此标志还会影响 m3u8 播放列表文件的创建方式。如果设置了此标志,则所有播放列表文件都将写入临时文件,并在完成后重命名,类似于处理段的方式。但是,对于使用 file 协议且 hls_playlist_type 类型不是 ‘vod’ 的播放列表,无论此标志如何,始终写入临时文件。

如果 master_pl_publish_rate 的值不为零,则使用 file 协议指定的任何主播放列表文件(使用 master_pl_name 指定)始终写入临时文件,而不管此标志如何。

hls_playlist_type type

如果 type 是 ‘event’,则在 m3u8 标头中发出 #EXT-X-PLAYLIST-TYPE:EVENT。这强制 hls_list_size 为 0;播放列表只能追加。

如果 type 是 ‘vod’,则在 m3u8 标头中发出 #EXT-X-PLAYLIST-TYPE:VOD。这强制 hls_list_size 为 0;播放列表不得更改。

method method

使用给定的 HTTP 方法创建 hls 文件。

例如

ffmpeg -re -i in.ts -f hls -method PUT http://example.com/live/out.m3u8

将使用 HTTP PUT 方法将所有 mpegts 段文件上传到 HTTP 服务器,并使用相同的方法每 refresh 次更新 m3u8 文件。请注意,HTTP 服务器必须支持给定的文件上传方法。

http_user_agent agent

覆盖 HTTP 标头中的 User-Agent 字段。仅适用于 HTTP 输出。

var_stream_map stream_map

指定一个映射字符串,定义如何将音频、视频和字幕流分组到不同的变体流中。变体流组用空格分隔。

预期的字符串格式如下:"a:0,v:0 a:1,v:1 ...."。这里 a:、v:、s: 分别是指定音频、视频和字幕流的键。允许的值为 0 到 9(仅基于实际使用限制)。

当有两个或多个变体流时,输出文件名模式必须包含字符串 "%v":此字符串指定输出媒体播放列表文件名中变体流索引的位置。字符串 "%v" 可以出现在文件名中,也可以出现在包含文件的最后一个目录名中。如果字符串出现在目录名中,则在展开目录名模式后会创建子目录。这使得可以在子目录中创建变体流。

以下是一些示例。

  • 创建两个 hls 变体流。第一个变体流将包含比特率为 1000k 的视频流和比特率为 64k 的音频流,第二个变体流将包含比特率为 256k 的视频流和比特率为 32k 的音频流。这里,将创建两个文件名为 out_0.m3u8out_1.m3u8 的媒体播放列表。
    ffmpeg -re -i in.ts -b:v:0 1000k -b:v:1 256k -b:a:0 64k -b:a:1 32k \
      -map 0:v -map 0:a -map 0:v -map 0:a -f hls -var_stream_map "v:0,a:0 v:1,a:1" \
      http://example.com/live/out_%v.m3u8
    
  • 如果您希望结果名称中使用有意义的文本而不是索引,则可以为每个或某些变体指定名称。以下示例将创建两个 hls 变体流,如上一个示例所示。但是,这里将创建两个文件名为 out_my_hd.m3u8out_my_sd.m3u8 的媒体播放列表。
    ffmpeg -re -i in.ts -b:v:0 1000k -b:v:1 256k -b:a:0 64k -b:a:1 32k \
      -map 0:v -map 0:a -map 0:v -map 0:a -f hls -var_stream_map "v:0,a:0,name:my_hd v:1,a:1,name:my_sd" \
      http://example.com/live/out_%v.m3u8
    
  • 创建三个 hls 变体流。第一个变体流将是一个比特率为 1000k 的纯视频流,第二个变体流将是一个比特率为 64k 的纯音频流,第三个变体流将是一个比特率为 256k 的纯视频流。这里,将创建三个文件名为 out_0.m3u8out_1.m3u8out_2.m3u8 的媒体播放列表。
    ffmpeg -re -i in.ts -b:v:0 1000k -b:v:1 256k -b:a:0 64k \
      -map 0:v -map 0:a -map 0:v -f hls -var_stream_map "v:0 a:0 v:1" \
      http://example.com/live/out_%v.m3u8
    
  • 在子目录中创建变体流。这里,第一个媒体播放列表创建在 http://example.com/live/vs_0/out.m3u8,第二个创建在 http://example.com/live/vs_1/out.m3u8
    ffmpeg -re -i in.ts -b:v:0 1000k -b:v:1 256k -b:a:0 64k -b:a:1 32k \
      -map 0:v -map 0:a -map 0:v -map 0:a -f hls -var_stream_map "v:0,a:0 v:1,a:1" \
      http://example.com/live/vs_%v/out.m3u8
    
  • 创建两个纯音频和两个纯视频变体流。除了主播放列表中每个变体流的 #EXT-X-STREAM-INF 标签外,还为两个纯音频变体流添加了 #EXT-X-MEDIA 标签,并将它们使用音频组名称“aud_low”和“aud_high”映射到两个纯视频变体流。默认情况下,将创建一个包含所有编码流的单个 hls 变体。
    ffmpeg -re -i in.ts -b:a:0 32k -b:a:1 64k -b:v:0 1000k -b:v:1 3000k  \
      -map 0:a -map 0:a -map 0:v -map 0:v -f hls \
      -var_stream_map "a:0,agroup:aud_low a:1,agroup:aud_high v:0,agroup:aud_low v:1,agroup:aud_high" \
      -master_pl_name master.m3u8 \
      http://example.com/live/out_%v.m3u8
    
  • 创建两个纯音频和一个纯视频变体流。除了主播放列表中每个变体流的 #EXT-X-STREAM-INF 标签外,还为两个纯音频变体流添加了 #EXT-X-MEDIA 标签,并将它们使用音频组名称“aud_low”映射到纯视频变体流,并且音频组的默认状态为 NO 或 YES。默认情况下,将创建一个包含所有编码流的单个 hls 变体。
    ffmpeg -re -i in.ts -b:a:0 32k -b:a:1 64k -b:v:0 1000k \
      -map 0:a -map 0:a -map 0:v -f hls \
      -var_stream_map "a:0,agroup:aud_low,default:yes a:1,agroup:aud_low v:0,agroup:aud_low" \
      -master_pl_name master.m3u8 \
      http://example.com/live/out_%v.m3u8
    
  • 创建两个纯音频和一个纯视频变体流。除了主播放列表中每个变体流的 #EXT-X-STREAM-INF 标签外,还为两个纯音频变体流添加了 #EXT-X-MEDIA 标签,并将它们使用音频组名称“aud_low”映射到纯视频变体流,并且音频组的默认状态为 NO 或 YES,其中一个音频的语言名称为 ENG,另一个音频的语言名称为 CHN。默认情况下,将创建一个包含所有编码流的单个 hls 变体。
    ffmpeg -re -i in.ts -b:a:0 32k -b:a:1 64k -b:v:0 1000k \
      -map 0:a -map 0:a -map 0:v -f hls \
      -var_stream_map "a:0,agroup:aud_low,default:yes,language:ENG a:1,agroup:aud_low,language:CHN v:0,agroup:aud_low" \
      -master_pl_name master.m3u8 \
      http://example.com/live/out_%v.m3u8
    
  • 创建单个变体流。在主播放列表中添加带有 TYPE=SUBTITLES#EXT-X-MEDIA 标签,并带有 webvtt 字幕组名称“subtitle”和可选的字幕名称,例如“English”。确保输入文件至少有一个文本字幕流。
    ffmpeg -y -i input_with_subtitle.mkv \
     -b:v:0 5250k -c:v h264 -pix_fmt yuv420p -profile:v main -level 4.1 \
     -b:a:0 256k \
     -c:s webvtt -c:a mp2 -ar 48000 -ac 2 -map 0:v -map 0:a:0 -map 0:s:0 \
     -f hls -var_stream_map "v:0,a:0,s:0,sgroup:subtitle,sname:English" \
     -master_pl_name master.m3u8 -t 300 -hls_time 10 -hls_init_time 4 -hls_list_size \
     10 -master_pl_publish_rate 10 -hls_flags \
     delete_segments+discont_start+split_by_time ./tmp/video.m3u8
    
cc_stream_map cc_stream_map

映射字符串,指定不同的隐藏字幕组及其属性。隐藏字幕流组用空格分隔。

预期的字符串格式如下:“ccgroup:<group name>,instreamid:<INSTREAM-ID>,language:<language code> ....”。“ccgroup”和“instreamid”是强制属性。“language”是可选属性。

使用此选项配置的隐藏字幕组通过在 var_stream_map 字符串中提供相同的“ccgroup”名称来映射到不同的变体流。

例如

ffmpeg -re -i in.ts -b:v:0 1000k -b:v:1 256k -b:a:0 64k -b:a:1 32k \
  -a53cc:0 1 -a53cc:1 1 \
  -map 0:v -map 0:a -map 0:v -map 0:a -f hls \
  -cc_stream_map "ccgroup:cc,instreamid:CC1,language:en ccgroup:cc,instreamid:CC2,language:sp" \
  -var_stream_map "v:0,a:0,ccgroup:cc v:1,a:1,ccgroup:cc" \
  -master_pl_name master.m3u8 \
  http://example.com/live/out_%v.m3u8

将在主播放列表中为 INSTREAM-ID“CC1”和“CC2”添加两个带有 TYPE=CLOSED-CAPTIONS#EXT-X-MEDIA 标签。此外,它将为两个输出变体流添加带有组名称“cc”的 CLOSED-CAPTIONS 属性。

如果未设置 var_stream_map,则 cc_stream_map 中第一个可用的 ccgroup 将映射到输出变体流。

例如

ffmpeg -re -i in.ts -b:v 1000k -b:a 64k -a53cc 1 -f hls \
  -cc_stream_map "ccgroup:cc,instreamid:CC1,language:en" \
  -master_pl_name master.m3u8 \
  http://example.com/live/out.m3u8

这将在主播放列表中添加一个带有 TYPE=CLOSED-CAPTIONS#EXT-X-MEDIA 标签,组名为 'cc',语言为 'en' (英语),并且 INSTREAM-ID 为 'CC1'。此外,它还会为输出变体流添加一个组名为 'cc' 的 CLOSED-CAPTIONS 属性。

master_pl_name name

创建具有给定名称的 HLS 主播放列表。

例如

ffmpeg -re -i in.ts -f hls -master_pl_name master.m3u8 http://example.com/live/out.m3u8

创建一个名为 master.m3u8 的 HLS 主播放列表,该列表发布在 http://example.com/live/

master_pl_publish_rate count

在指定的段间隔数之后,重复发布主播放列表。

例如

ffmpeg -re -i in.ts -f hls -master_pl_name master.m3u8 \
-hls_time 2 -master_pl_publish_rate 30 http://example.com/live/out.m3u8

创建一个名为 master.m3u8 的 HLS 主播放列表,并保持在每 30 个段之后(即每 60 秒)重复发布它。

http_persistent bool

使用持久 HTTP 连接。仅适用于 HTTP 输出。

timeout timeout

设置套接字 I/O 操作的超时时间。仅适用于 HTTP 输出。

ignore_io_errors bool

在打开、写入和删除期间忽略 IO 错误。对于具有网络输出的长时间运行非常有用。

headers headers

设置自定义 HTTP 标头,可以覆盖内置的默认标头。仅适用于 HTTP 输出。

4.47 iamf

沉浸式音频模型和格式 (IAMF) 混流器。

IAMF 用于为流媒体和离线应用中的各种设备提供沉浸式音频内容。这些应用包括互联网音频流媒体、多播/广播服务、文件下载、游戏、通信、虚拟和增强现实等。在这些应用中,音频可以在各种设备上播放,例如耳机、手机、平板电脑、电视、条形音箱、家庭影院系统和大屏幕。

此格式由开放媒体联盟 (Alliance for Open Media) 推广和设计。

有关此格式的更多信息,请参阅 https://aomedia.org/iamf/

4.48 ico

ICO 文件混流器。

Microsoft 的图标文件格式 (ICO) 有一些严格的限制,应该注意

  • 任何维度的大小都不能超过 256 像素
  • 只能存储 BMP 和 PNG 图像
  • 如果使用 BMP 图像,则必须是以下像素格式之一
    BMP Bit Depth      FFmpeg Pixel Format
    1bit               pal8
    4bit               pal8
    8bit               pal8
    16bit              rgb555le
    24bit              bgr24
    32bit              bgra
    
  • 如果使用 BMP 图像,则必须使用 BITMAPINFOHEADER DIB 标头
  • 如果使用 PNG 图像,则必须使用 rgba 像素格式

4.49 ilbc

Internet 低比特率编解码器 (iLBC) 原始混流器。

它接受单个 'ilbc' 音频流。

4.50 image2, image2pipe

图像文件混流器。

'image2' 混流器将视频帧写入图像文件。

输出文件名由一个模式指定,该模式可用于生成按顺序编号的文件系列。该模式可能包含字符串 "%d" 或 "%0Nd",此字符串指定文件名中表示编号的字符的位置。如果使用 "%0Nd" 形式,则每个文件名中表示数字的字符串将用 0 填充到 N 位。字面字符 '%' 可以在模式中使用字符串 "%%" 指定。

如果模式包含 "%d" 或 "%0Nd",则指定的文件列表中的第一个文件名将包含数字 1,所有后续数字将是连续的。

该模式可能包含一个后缀,用于自动确定要写入的图像文件格式。

例如,模式 "img-%03d.bmp" 将指定 img-001.bmpimg-002.bmp、...、img-010.bmp 等形式的文件名序列。模式 "img%%-%d.jpg" 将指定 img%-1.jpgimg%-2.jpg、...、img%-10.jpg 等形式的文件名序列。

图像混流器支持 .Y.U.V 图像文件格式。此格式的特殊之处在于每个图像帧都由三个文件组成,分别对应 YUV420P 分量。要读取或写入此图像文件格式,请指定 '.Y' 文件的名称。混流器将根据需要自动打开 '.U' 和 '.V' 文件。

'image2pipe' 混流器接受与 'image2' 混流器相同的选项,但会忽略模式验证和扩展,因为它应该写入命令输出而不是实际存储的文件。

4.50.1 选项

frame_pts bool

如果设置为 1,则使用数据包 PTS(表示时间戳)扩展文件名。默认值为 0。

start_number count

从指定的数字开始序列。默认值为 1。

update bool

如果设置为 1,则文件名将始终被解释为文件名,而不是模式,并且相应的文件将不断被新图像覆盖。默认值为 0。

strftime bool

如果设置为 1,则使用 strftime() 中的日期和时间信息扩展文件名。默认值为 0。

atomic_writing bool

将输出写入临时文件,一旦写入完成,该临时文件将重命名为目标文件名。默认情况下禁用。

protocol_opts options_list

将协议选项设置为以 :- 分隔的 key=value 参数列表。包含 : 特殊字符的值必须转义。

4.50.2 示例

  • 使用 ffmpeg 创建文件序列 img-001.jpegimg-002.jpeg、...,从输入视频中每秒获取一张图像
    ffmpeg -i in.avi -vsync cfr -r 1 -f image2 'img-%03d.jpeg'
    

    请注意,使用 ffmpeg 时,如果没有使用 -f 选项指定格式,并且输出文件名指定了图像文件格式,则会自动选择 image2 混流器,因此可以将前面的命令写为

    ffmpeg -i in.avi -vsync cfr -r 1 'img-%03d.jpeg'
    

    还要注意,该模式不一定包含 "%d" 或 "%0Nd",例如,要从输入视频的开头创建一个单独的图像文件 img.jpeg,可以使用命令

    ffmpeg -i in.avi -f image2 -frames:v 1 img.jpeg
    
  • strftime 选项允许您使用日期和时间信息扩展文件名。有关语法的详细信息,请查看 strftime() 函数的文档。

    要从 strftime() "%Y-%m-%d_%H-%M-%S" 模式生成图像文件,可以使用以下 ffmpeg 命令

    ffmpeg -f v4l2 -r 1 -i /dev/video0 -f image2 -strftime 1 "%Y-%m-%d_%H-%M-%S.jpg"
    
  • 使用当前帧的 PTS 设置文件名
    ffmpeg -f v4l2 -r 1 -i /dev/video0 -copyts -f image2 -frame_pts true %d.jpg
    
  • 每秒将桌面内容直接发布到 WebDAV 服务器
    ffmpeg -f x11grab -framerate 1 -i :0.0 -q:v 6 -update 1 -protocol_opts method=PUT http://example.com/desktop.jpg
    

4.51 ircam

Berkeley / IRCAM / CARL 声音文件系统 (BICSF) 格式混流器。

Berkeley/IRCAM/CARL 声音格式,于 1980 年代开发,是早期几种不同的声音文件格式和系统合并的结果,包括由加州大学圣地亚哥分校计算机音频研究实验室 (CARL) 的 Gareth Loy 博士开发的 csound 系统、由巴黎的 Institut de Recherche et Coordination Acoustique / Musique 的 Rob Gross 和 Dan Timis 开发的 IRCAM 声音文件系统以及 Berkeley 快速文件系统。

它最初是作为 Berkeley/IRCAM/CARL 声音文件系统的一部分开发的,该系统是一套旨在为在 Berkeley UNIX 下运行的音频应用程序实现文件系统的程序。它在学术音乐研究中心特别受欢迎,并且在早期计算机生成的作品的创作中多次使用。

此混流器接受包含 PCM 数据的单个音频流。

4.52 ivf

On2 IVF 混流器。

IVF 由 On2 Technologies(以前称为 Duck Corporation)开发,用于存储内部开发的编解码器。

此混流器接受单个 'vp8'、'vp9' 或 'av1' 视频流。

4.53 jacosub

JACOsub 字幕格式混流器。

此混流器接受单个 'jacosub' 字幕流。

有关该格式的更多信息,请参阅 http://unicorn.us.com/jacosub/jscripts.html

4.54 kvag

Simon & Schuster Interactive VAG 混流器。

这种自定义 VAG 容器由一些 Simon & Schuster Interactive 游戏使用,例如“Real War”和“Real War: Rogue States”。

此混流器接受单个 'adpcm_ima_ssi' 音频流。

4.55 lc3

蓝牙 SIG 低复杂度通信编解码器音频 (LC3),或 ETSI TS 103 634 低复杂度通信编解码器增强版 (LC3plus)。

此复用器接受单个 ‘lc3’ 音频流。

4.56 lrc

LRC 歌词文件格式复用器。

LRC(LyRiCs 的缩写)是一种计算机文件格式,用于将歌词与音频文件(如 MP3、Vorbis 或 MIDI)同步。

此复用器接受单个 ‘subrip’ 或 ‘text’ 字幕流。

4.56.1 元数据

以下元数据标签将转换为相应的格式元数据

标题
专辑
艺术家
作者
创建者
编码器
编码器版本

如果未明确设置 ‘encoder_version’,它将自动设置为 libavformat 版本。

4.57 matroska

Matroska 容器复用器。

此复用器实现了 matroska 和 webm 容器规范。

4.57.1 元数据

此复用器中可识别的元数据设置是

标题

为单个轨道设置标题名称。这将映射到作为附件写入的流的 FileDescription 元素。

语言

以 Matroska 语言形式指定轨道的语言。

语言可以是 3 个字母的 ISO-639-2 文献格式(ISO 639-2/B)(例如,“fre” 代表法语),也可以是语言代码与国家代码的组合,用于表示语言中的特殊性(例如,“fre-ca” 代表加拿大法语)。

立体声模式

设置单个视频轨道中两个视角的立体 3D 视频布局。

识别以下值

mono

视频不是立体的

left_right

两个视角并排排列,左眼视角在左侧

bottom_top

两个视角以自下而上的方向排列,左眼视角在底部

top_bottom

两个视角以自上而下的方向排列,左眼视角在顶部

checkerboard_rl

每个视角都以棋盘交错模式排列,左眼视角优先

checkerboard_lr

每个视角都以棋盘交错模式排列,右眼视角优先

row_interleaved_rl

每个视角都由基于行的交错构成,右眼视角是第一行

row_interleaved_lr

每个视角都由基于行的交错构成,左眼视角是第一行

col_interleaved_rl

两个视角以基于列的交错方式排列,右眼视角是第一列

col_interleaved_lr

两个视角以基于列的交错方式排列,左眼视角是第一列

anaglyph_cyan_red

所有帧都采用可通过红青滤镜观看的浮雕格式

right_left

两个视角并排排列,右眼视角在左侧

anaglyph_green_magenta

所有帧都采用可通过绿洋红滤镜观看的浮雕格式

block_lr

双眼交织在一个块中,左眼视角优先

block_rl

双眼交织在一个块中,右眼视角优先

例如,可以使用以下命令行创建 3D WebM 剪辑

ffmpeg -i sample_left_right_clip.mpg -an -c:v libvpx -metadata stereo_mode=left_right -y stereo_clip.webm

4.57.2 选项

reserve_index_space size

默认情况下,此复用器将用于查找的索引(在 Matroska 术语中称为 cues)写入文件末尾,因为它无法提前知道在文件开头为索引保留多少空间。但是,对于某些用例(例如,可查找但速度较慢的流式传输),将索引放在文件开头很有用。

如果此选项设置为非零值,则复用器将在文件头中保留 size 字节的空间,然后在复用完成后尝试在那里写入 cues。如果保留的空间不足,则不会写入任何 cues,文件将被最终化,并且写入尾部将返回错误。对于大多数用例,安全的空间大小应约为每小时视频 50kB。

请注意,只有在输出可查找的情况下才会写入 cues,如果输出不可查找,则此选项将不起作用。

cues_to_front bool

如果设置,复用器将通过在必要时移动主数据,将索引写入文件开头。这可以与 reserve_index_space 结合使用,在这种情况下,只有当最初保留的空间不足时才会移动数据。

如果输出不可查找,则此选项将被忽略。

cluster_size_limit size

在群集中最多存储提供的字节数。

如果未指定,则限制将自动设置为合理的硬编码固定值。

cluster_time_limit duration

在群集中最多存储提供的毫秒数。

如果未指定,则限制将自动设置为合理的硬编码固定值。

dash bool

创建符合 WebM DASH 规范的 WebM 文件。默认情况下,它设置为 false

dash_track_number index

DASH 流的轨道号。默认情况下,它设置为 1

live bool

写入文件,假设它是实时流。默认情况下,它设置为 false

allow_raw_vfw bool

允许原始 VFW 模式。默认情况下,它设置为 false

flipped_raw_rgb bool

如果设置为 true,则为原始 RGB 位图存储正高度,表示位图是自下而上存储的。请注意,此选项不会翻转位图,必须事先手动完成,例如使用‘vflip’过滤器。默认值为 false,表示位图是自上而下存储的。

write_crc32 bool

在每个 1 级元素内部写入 CRC32 元素。默认情况下,它设置为 true。对于 WebM,此选项将被忽略。

default_mode mode

控制如何设置输出轨道的 FlagDefault。它会影响播放器默认应播放哪些轨道。默认模式为 ‘passthrough’。

infer

每个具有默认配置的轨道都将设置 FlagDefault。此外,对于每种类型的轨道(音频、视频或字幕),如果没有具有此类型默认配置的轨道,则会将此类型的第一条轨道标记为默认值(如果存在)。这可以确保即使输入来自缺少默认轨道概念的容器,也可以以合理的方式设置默认标志。

infer_no_subs

此模式与 infer 相同,只是如果不存在具有默认配置的字幕轨道,则不会将任何字幕轨道标记为默认值。

passthrough

在此模式下,当且仅当在相应流的配置中设置了 AV_DISPOSITION_DEFAULT 标志时,才会设置 FlagDefault。

4.58 md5

MD5 测试格式。

这是 hash 复用器的一个变体。与该复用器不同,它默认使用 MD5 哈希函数。

另请参阅 hashframemd5 复用器。

4.58.1 示例

  • 要计算转换为原始音频和视频的输入的 MD5 哈希值,并将其存储在文件 out.md5
    ffmpeg -i INPUT -f md5 out.md5
    
  • 要将 MD5 哈希值打印到标准输出
    ffmpeg -i INPUT -f md5 -
    

4.59 microdvd

MicroDVD 字幕格式复用器。

此复用器接受单个 ‘microdvd’ 字幕流。

4.60 mmf

合成音乐移动应用程序格式 (SMAF) 格式复用器。

SMAF 是 Yamaha 为便携式电子设备(如手机和个人数字助理)指定的音乐数据格式。

此复用器接受单个 ‘adpcm_yamaha’ 音频流。

4.61 mp3

MP3 复用器写入原始 MP3 流,并具有以下可选功能

  • 开头处的 ID3v2 元数据标头(默认启用)。支持 2.3 和 2.4 版本,id3v2_version 私有选项控制使用哪个版本(3 或 4)。将 id3v2_version 设置为 0 将完全禁用 ID3v2 标头。

    复用器支持将附加图片(APIC 帧)写入 ID3v2 标头。图片以单个数据包的视频流形式提供给复用器。可以有任意数量的此类流,每个流对应一个 APIC 帧。流元数据标签 titlecomment 分别映射到 APIC descriptionpicture type。有关允许的图片类型,请参阅 http://id3.org/id3v2.4.0-frames

    请注意,APIC 帧必须在开头写入,因此复用器将缓冲音频帧,直到它获取所有图片为止。因此,建议尽快提供图片,以避免过度缓冲。

  • 在 ID3v2 头部(如果存在)之后紧跟一个 Xing/LAME 帧。默认情况下启用,但仅在输出可寻址时写入。可以使用 write_xing 私有选项禁用它。该帧包含对解码器可能有用的各种信息,例如音频时长或编码器延迟。
  • 位于文件末尾的旧版 ID3v1 标签(默认禁用)。可以使用 write_id3v1 私有选项启用它,但由于其功能非常有限,因此不建议使用。

示例

写入带有 ID3v2.3 头部和 ID3v1 尾部的 mp3 文件

ffmpeg -i INPUT -id3v2_version 3 -write_id3v1 1 out.mp3

要将图片附加到 mp3 文件,请使用 map 选择音频和图片流

ffmpeg -i input.mp3 -i cover.png -c copy -map 0 -map 1
-metadata:s:v title="Album cover" -metadata:s:v comment="Cover (Front)" out.mp3

写入没有任何额外功能的“干净” MP3

ffmpeg -i input.wav -write_xing 0 -id3v2_version 0 out.mp3

4.62 mpegts

MPEG 传输流复用器。

此复用器实现了 ISO 13818-1 和 ETSI EN 300 468 的一部分。

mpegts 复用器中可识别的元数据设置是 service_providerservice_name。如果未设置,service_provider 的默认值为“FFmpeg”,service_name 的默认值为“Service01”。

4.62.1 选项

复用器选项如下:

mpegts_transport_stream_id 整数

设置“transport_stream_id”。这在 DVB 中标识一个转发器。默认值为 0x0001

mpegts_original_network_id 整数

设置“original_network_id”。这是 DVB 中网络的唯一标识符。其主要用途是通过路径“Original_Network_ID, Transport_Stream_ID”唯一标识服务。默认值为 0x0001

mpegts_service_id 整数

设置“service_id”,也称为 DVB 中的节目。默认值为 0x0001

mpegts_service_type 整数

设置节目“service_type”。默认值为 digital_tv。接受以下选项

hex_value

ETSI 300 468 中定义的 0x010xff 之间的任何十六进制值。

digital_tv

数字电视服务。

digital_radio

数字广播服务。

teletext

图文电视服务。

advanced_codec_digital_radio

高级编解码器数字广播服务。

mpeg2_digital_hdtv

MPEG2 数字高清电视服务。

advanced_codec_digital_sdtv

高级编解码器数字标清电视服务。

advanced_codec_digital_hdtv

高级编解码器数字高清电视服务。

mpegts_pmt_start_pid 整数

设置 PMT 的第一个 PID。默认值为 0x1000,最小值为 0x0020,最大值为 0x1ffa。此选项在 m2ts 模式下无效,其中 PMT PID 固定为 0x0100

mpegts_start_pid 整数

设置基本流的第一个 PID。默认值为 0x0100,最小值为 0x0020,最大值为 0x1ffa。此选项在 m2ts 模式下无效,其中基本流 PID 是固定的。

mpegts_m2ts_mode 布尔值

如果设置为 1,则启用 m2ts 模式。默认值为 -1,它禁用 m2ts 模式。

muxrate 整数

设置恒定的复用率。默认值为 VBR。

pes_payload_size 整数

设置最小 PES 数据包负载(以字节为单位)。默认值为 2930

mpegts_flags 标志

设置 mpegts 标志。接受以下选项

resend_headers

在写入下一个数据包之前重新发出 PAT/PMT。

latm

为 AAC 使用 LATM 打包。

pat_pmt_at_frames

在每个视频帧处重新发出 PAT 和 PMT。

system_b

符合系统 B (DVB) 而不是系统 A (ATSC)。

initial_discontinuity

将每个流的初始数据包标记为不连续。

nit

发出 NIT 表。

omit_rai

禁用随机访问指示器的写入。

mpegts_copyts 布尔值

如果值设置为 1,则保留原始时间戳。默认值为 -1,这会导致移动时间戳,使其从 0 开始。

omit_video_pes_length 布尔值

省略视频数据包的 PES 数据包长度。默认值为 1 (true)。

pcr_period 整数

以毫秒为单位覆盖默认的 PCR 重传时间。默认值为 -1,这意味着 PCR 间隔将自动确定:CBR 流使用 20 毫秒,VBR 流使用小于 100 毫秒的帧持续时间的最大倍数。

pat_period 时长

PAT/PMT 表之间的最大时间(以秒为单位)。默认值为 0.1

sdt_period 时长

SDT 表之间的最大时间(以秒为单位)。默认值为 0.5

nit_period 时长

NIT 表之间的最大时间(以秒为单位)。默认值为 0.5

tables_version 整数

设置 PAT、PMT、SDT 和 NIT 版本(默认为 0,有效值包括 0 到 31)。此选项允许更新流结构,以便标准使用者可以检测到更改。为此,请重新打开输出 AVFormatContext(在 API 使用的情况下)或重新启动 ffmpeg 实例,循环更改 tables_version

ffmpeg -i source1.ts -codec copy -f mpegts -tables_version 0 udp://1.1.1.1:1111
ffmpeg -i source2.ts -codec copy -f mpegts -tables_version 1 udp://1.1.1.1:1111
...
ffmpeg -i source3.ts -codec copy -f mpegts -tables_version 31 udp://1.1.1.1:1111
ffmpeg -i source1.ts -codec copy -f mpegts -tables_version 0 udp://1.1.1.1:1111
ffmpeg -i source2.ts -codec copy -f mpegts -tables_version 1 udp://1.1.1.1:1111
...

4.62.2 示例

ffmpeg -i file.mpg -c copy \
     -mpegts_original_network_id 0x1122 \
     -mpegts_transport_stream_id 0x3344 \
     -mpegts_service_id 0x5566 \
     -mpegts_pmt_start_pid 0x1500 \
     -mpegts_start_pid 0x150 \
     -metadata service_provider="Some provider" \
     -metadata service_name="Some Channel" \
     out.ts

4.63 mxf, mxf_d10, mxf_opatom

MXF 复用器。

4.63.1 选项

复用器选项如下:

store_user_comments bool

设置是否应存储用户注释(如果可用)或从不存储。IRT D-10 不允许用户注释。因此,默认情况下为 mxf 和 mxf_opatom 写入注释,但不为 mxf_d10 写入注释

4.64 null

Null 复用器。

此复用器不生成任何输出文件,它主要用于测试或基准测试目的。

例如,要使用 ffmpeg 进行解码基准测试,可以使用以下命令

ffmpeg -benchmark -i INPUT -f null out.null

请注意,以上命令不会读取或写入 out.null 文件,但 ffmpeg 语法要求指定输出文件。

或者,您可以将该命令编写为

ffmpeg -benchmark -i INPUT -f null -

4.65 nut

-syncpoints 标志

更改 nut 中的同步点用法

default 使用正常的低开销寻址辅助工具。
none 完全不使用同步点,降低开销,但使流不可寻址;

不建议使用此选项,因为生成的文件对损坏非常敏感,并且无法寻址。此外,一般来说,同步点的开销可以忽略不计。请注意,可以使用 -write_index 0 禁用所有增长的数据表,从而允许使用有限的内存复用无尽的流,而没有这些缺点。

timestamped 使用挂钟字段扩展同步点。

nonetimestamped 标志是实验性的。

-write_index 布尔值

在末尾写入索引,默认是写入索引。

ffmpeg -i INPUT -f_strict experimental -syncpoints none - | processor

4.66 ogg

Ogg 容器复用器。

-page_duration 时长

首选的页面持续时间,以微秒为单位。复用器将尝试创建大约 duration 微秒长的页面。这允许用户在寻址粒度和容器开销之间做出折衷。默认值为 1 秒。值 0 将填充所有段,使页面尽可能大。值 1 将在大多数情况下有效地使用每页 1 个数据包,以额外容器开销为代价提供较小的寻址粒度。

-serial_offset

用于设置流序列号的序列值。将其设置为不同且足够大的值可确保生成的 ogg 文件可以安全地链接在一起。

4.67 rcwt

RCWT(带时间的原始字幕)是 ccextractor 的原生格式,ccextractor 是一种常用的开源工具,用于处理 608/708 隐藏式字幕 (CC) 源。它可用于存档提取的原始 CC 比特流,并生成用于后续处理或转换的源文件。该格式允许 ccextractor 和 FFmpeg 之间的互操作性,易于解析,并且可用于创建 CC 演示文稿的备份。

此复用器实现了截至 2024 年 3 月的规范,该规范自 2014 年 4 月以来一直稳定且未更改。

此复用器与 ccextractor 复用 RCWT 的方式有一些细微差别。到目前为止,在用 ccextractor 处理输出时没有观察到任何兼容性问题,但情况可能会有所不同,并且输出不会是精确匹配的。

RCWT 的免费规范可以在这里找到:https://github.com/CCExtractor/ccextractor/blob/master/docs/BINARY_FILE_FORMAT.TXT

4.67.1 示例

  • 使用 lavfi 将隐藏字幕提取为 RCWT
    ffmpeg -f lavfi -i "movie=INPUT.mkv[out+subcc]" -map 0:s:0 -c:s copy -f rcwt CC.rcwt.bin
    

4.68 segment, stream_segment, ssegment

基本流分割器。

此复用器将流输出到多个持续时间几乎固定的单独文件中。输出文件名模式可以以类似于 image2 的方式设置,或者如果启用了 strftime 选项,则可以使用 strftime 模板。

stream_segment 是用于写入流输出格式的复用器的变体,即不需要全局标头,建议用于输出到例如 MPEG 传输流段。 ssegmentstream_segment 的较短别名。

每个段都以所选参考流的关键帧开始,该参考流通过 reference_stream 选项设置。

请注意,如果要对视频文件进行精确分割,则需要使输入的关键帧与分割器预期的精确分割时间相对应,否则段复用器将以指定开始时间之后找到的下一个关键帧开始新段。

段复用器最适用于单个恒定帧率视频。

可以选择通过设置 segment_list 选项来生成已创建段的列表。列表类型由 segment_list_type 选项指定。段列表中的条目文件名默认设置为相应段文件的基本名称。

另请参阅 hls 复用器,它为 HLS 分割提供了更具体的实现。

4.68.1 选项

段复用器支持以下选项

increment_tc 1|0

如果设置为 1,则在每个段之间递增时间码。如果选择此选项,则输入需要在第一个视频流中具有时间码。默认值为 0

reference_stream specifier

设置参考流,由字符串 specifier 指定。如果 specifier 设置为 auto,则自动选择参考流。否则,它必须是一个流指定符(请参阅 ffmpeg 手册中的“流指定符”章节),用于指定参考流。默认值为 auto

segment_format format

覆盖内部容器格式,默认情况下,它由文件名扩展名猜测。

segment_format_options options_list

使用以冒号分隔的 key=value 参数列表设置输出格式选项。包含 : 特殊字符的值必须转义。

segment_list name

同时生成一个名为 name 的列表文件。如果未指定,则不会生成列表文件。

segment_list_flags flags

设置影响段列表生成的标志。

它目前支持以下标志

cache

允许缓存(仅影响 M3U8 列表文件)。

live

允许生成适合直播的文件。

segment_list_size size

更新列表文件,使其最多包含 size 个段。如果为 0,则列表文件将包含所有段。默认值为 0。

segment_list_entry_prefix prefix

在每个条目前面添加 prefix。这对于生成绝对路径很有用。默认情况下,不应用任何前缀。

segment_list_type type

选择列表格式。

识别以下值

flat

为已创建的段生成一个平面列表,每行一个段。

csv, ext

为已创建的段生成一个列表,每行一个段,每行匹配格式(逗号分隔值)

segment_filename,segment_start_time,segment_end_time

segment_filename 是复用器根据提供的模式生成的输出文件的名称。如果需要,则应用 CSV 转义(根据 RFC4180)。

segment_start_timesegment_end_time 指定以秒表示的段的开始时间和结束时间。

带有后缀 ".csv"".ext" 的列表文件将自动选择此格式。

ext’ 不赞成使用,而推荐使用 ‘csv’。

ffconcat

为已创建的段生成一个 ffconcat 文件。可以使用 FFmpeg concat 解复用器读取生成的文件。

带有后缀 ".ffcat"".ffconcat" 的列表文件将自动选择此格式。

m3u8

生成扩展的 M3U8 文件,版本 3,符合 http://tools.ietf.org/id/draft-pantos-http-live-streaming

带有后缀 ".m3u8" 的列表文件将自动选择此格式。

如果未指定,则类型由列表文件名后缀猜测。

segment_time time

将段持续时间设置为 time,该值必须是持续时间规范。默认值为“2”。另请参阅 segment_times 选项。

请注意,除非您在给定时间强制参考流的关键帧,否则分割可能不准确。请参阅介绍性说明和下面的示例。

min_seg_duration time

将最小段持续时间设置为 time,该值必须是持续时间规范。这可以防止复用器在低于此值的持续时间结束段。仅在 segment_time 时有效。默认值为“0”。

segment_atclocktime 1|0

如果设置为“1”,则从 00:00 开始按规则的时钟时间间隔分割。 segment_time 中指定的 time 值用于设置分割间隔的长度。

例如,当 segment_time 设置为“900”时,这可以实现在 12:00、12:15、12:30 等时间创建文件。

默认值为“0”。

segment_clocktime_offset duration

在使用 segment_atclocktime 时,使用指定的持续时间延迟段分割时间。

例如,当 segment_time 设置为“900”且 segment_clocktime_offset 设置为“300”时,这可以实现在 12:05、12:20、12:35 等时间创建文件。

默认值为“0”。

segment_clocktime_wrap_duration duration

强制分割器仅当数据包在分割时钟时间后指定的持续时间内到达复用器时才开始新段。这样,您可以使分割器更能适应向后的本地时间跳跃,例如闰秒或从夏令时过渡到标准时间。

默认值是最大可能的持续时间,这意味着无论自上次时钟时间以来经过的时间长短,都开始新段。

segment_time_delta delta

指定选择段开始时间时的精度时间,以持续时间规范表示。默认值为“0”。

当指定 delta 时,如果关键帧的 PTS 满足以下关系,则该关键帧将启动新段

PTS >= start_time - time_delta

当分割视频内容时,此选项很有用,在这种情况下,视频内容始终在 GOP 边界处分割,如果刚好在指定分割时间之前找到关键帧。

特别是可以与 ffmpeg 选项 force_key_frames 结合使用。由于舍入问题,force_key_frames 指定的关键帧时间可能未准确设置,因此,关键帧时间可能恰好设置在指定时间之前。对于恒定帧率视频,1/(2*frame_rate) 的值应解决指定时间和 force_key_frames 设置的时间之间的最坏情况不匹配。

segment_times times

指定分割点的列表。 times 包含以逗号分隔的持续时间规范列表,按升序排列。另请参阅 segment_time 选项。

segment_frames frames

指定分割视频帧号的列表。 frames 包含以逗号分隔的整数列表,按升序排列。

此选项指定每当找到参考流关键帧并且该帧的顺序号(从 0 开始)大于或等于列表中的下一个值时,开始新段。

segment_wrap limit

段索引达到 limit 后回绕。

segment_start_number number

设置第一个段的序号。默认为 0

strftime 1|0

使用 strftime 函数定义要写入的新段的名称。如果选择此项,则输出段名称必须包含 strftime 函数模板。默认值为 0

break_non_keyframes 1|0

如果启用,则允许段在关键帧之外的帧上开始。当关键帧之间的时间不一致时,这可以改善某些播放器的行为,但可能会使其他播放器的行为更糟,并可能在搜索过程中导致一些奇怪的问题。默认为 0

reset_timestamps 1|0

在每个段的开头重置时间戳,以便每个段都以接近零的时间戳开始。它旨在简化生成段的播放。可能不适用于某些复用器/编解码器的组合。默认设置为 0

initial_offset offset

指定要应用于输出数据包时间戳的时间戳偏移量。参数必须是时间持续时间规范,默认为 0。

write_empty_segments 1|0

如果启用,则当在通常段跨越的时间段内没有数据包时,写入一个空段。否则,该段将填充下一个写入的数据包。默认为 0

请确保在编码时需要封闭的 GOP,并将 GOP 大小设置为适合您的分段时间约束。

4.68.2 示例

  • 将文件 in.mkv 的内容复用为段列表 out-000.nutout-001.nut 等,并将生成的段列表写入 out.list
    ffmpeg -i in.mkv -codec hevc -flags +cgop -g 60 -map 0 -f segment -segment_list out.list out%03d.nut
    
  • 分割输入并为输出段设置输出格式选项
    ffmpeg -i in.mkv -f segment -segment_time 10 -segment_format_options movflags=+faststart out%03d.mp4
    
  • 根据 segment_times 选项指定的分割点分割输入文件
    ffmpeg -i in.mkv -codec copy -map 0 -f segment -segment_list out.csv -segment_times 1,2,3,5,8,13,21 out%03d.nut
    
  • 使用 ffmpegforce_key_frames 选项在指定位置强制输入中的关键帧,同时使用段选项 segment_time_delta 来考虑设置关键帧时间时可能发生的舍入操作。
    ffmpeg -i in.mkv -force_key_frames 1,2,3,5,8,13,21 -codec:v mpeg4 -codec:a pcm_s16le -map 0 \
    -f segment -segment_list out.csv -segment_times 1,2,3,5,8,13,21 -segment_time_delta 0.05 out%03d.nut
    

    为了在输入文件中强制关键帧,需要进行转码。

  • 根据 segment_frames 选项指定的帧编号序列分割输入文件
    ffmpeg -i in.mkv -codec copy -map 0 -f segment -segment_list out.csv -segment_frames 100,200,300,500,800 out%03d.nut
    
  • 使用 libx264aac 编码器将 in.mkv 转换为 TS 段
    ffmpeg -i in.mkv -map 0 -codec:v libx264 -codec:a aac -f ssegment -segment_list out.list out%03d.ts
    
  • 分割输入文件,并创建一个 M3U8 直播播放列表(可用作直播 HLS 源)
    ffmpeg -re -i in.mkv -codec copy -map 0 -f segment -segment_list playlist.m3u8 \
    -segment_list_flags +live -segment_time 10 out%03d.mkv
    

4.69 smoothstreaming

Smooth Streaming 复用器生成一组文件(清单、块),适合使用传统 Web 服务器提供服务。

window_size

指定清单中保留的片段数量。默认值为 0(保留所有)。

extra_window_size

指定从磁盘删除之前在清单之外保留的片段数量。默认值为 5。

lookahead_count

指定前瞻片段的数量。默认值为 2。

min_frag_duration

指定最小片段持续时间(以微秒为单位)。默认值为 5000000。

remove_at_exit

指定完成后是否删除所有片段。默认值为 0(不删除)。

4.70 streamhash

每个流的哈希测试格式。

此复用器计算并打印每个流所有输入帧的加密哈希值。这可以用于相等性检查,而无需进行完整的二进制比较。

默认情况下,在计算哈希值之前,音频帧被转换为有符号 16 位原始音频,视频帧被转换为原始视频,但也可以使用显式转换为其他编解码器的输出。时间戳被忽略。默认情况下使用 SHA-256 加密哈希函数,但也支持其他几种算法。

复用器的输出由每行一个流组成,格式为:streamindex,streamtype,algo=hash,其中 streamindex 是映射流的索引,streamtype 是指示流类型的单个字符,algo 是表示所用哈希函数的短字符串,hash 是表示计算出的哈希值的十六进制数字。

hash algorithm

使用字符串 algorithm 指定的加密哈希函数。支持的值包括 MD5murmur3RIPEMD128RIPEMD160RIPEMD256RIPEMD320SHA160SHA224SHA256(默认)、SHA512/224SHA512/256SHA384SHA512CRC32adler32

4.70.1 示例

计算转换为原始音频和视频的输入的 SHA-256 哈希值,并将其存储在文件 out.sha256 中。

ffmpeg -i INPUT -f streamhash out.sha256

要将 MD5 哈希值打印到标准输出,请使用命令:

ffmpeg -i INPUT -f streamhash -hash md5 -

另请参阅 hashframehash 复用器。

4.71 tee

tee 复用器可用于将相同的数据写入多个输出,例如文件或流。例如,它可用于通过网络流式传输视频并同时将其保存到磁盘。

它与为 ffmpeg 命令行工具指定多个输出不同。使用 tee 复用器,音频和视频数据将仅编码一次。使用传统的多个输出,会并行启动多个编码操作,这可能是一个非常昂贵的过程。当直接使用 libavformat API 时,tee 复用器没有用,因为那样可以直接将相同的数据包馈送到多个复用器。

由于 tee 复用器不代表任何特定的输出格式,因此 ffmpeg 无法自动选择输出流。因此,必须使用 -map 指定所有用于输出的流。请参阅下面的示例。

某些编码器可能需要根据输出格式使用不同的选项;使用 tee 复用器无法自动检测到这一点,因此需要显式指定。主要示例是 global_header 标志。

从属输出在提供给复用器的文件名中指定,以“|”分隔。如果任何从属名称包含“|”分隔符、前导或尾随空格或任何特殊字符,则必须对其进行转义(请参阅 (ffmpeg-utils)ffmpeg-utils(1) 手册中的“引用和转义”部分)。

4.71.1 选项

use_fifo bool

如果设置为 1,则将使用 fifo 复用器在单独的线程中处理从属输出。这可以补偿输出的不同速度/延迟/可靠性并设置透明恢复。默认情况下,此功能处于关闭状态。

fifo_options

要传递给 fifo 伪复用器实例的选项。请参阅 fifo

可以为每个从属指定复用器选项,方法是将它们作为以“:”分隔的 key=value 对的列表,放在方括号之间。如果选项值包含特殊字符或“:”分隔符,则必须对其进行转义;请注意,这是第二级转义。

还识别以下特殊选项

f

指定格式名称。如果无法从输出 URL 中猜测,则为必需。

bsfs[/spec]

指定要应用于指定输出的比特流过滤器列表。

可以通过将流说明符附加到以 / 分隔的选项来指定给定的比特流过滤器应用于哪些流。spec 必须是流说明符(请参阅 格式流说明符)。

如果未指定流说明符,则比特流过滤器将应用于输出中的所有流。如果输出包含无法应用比特流过滤器的流,例如将 h264_mp4toannexb 应用于包含音频流的输出,则会导致该输出操作失败。

比特流过滤器的选项必须以 opt=value 的形式指定。

可以指定多个比特流过滤器,以“,”分隔。

use_fifo bool

这允许覆盖单个从属复用器的 tee 复用器 use_fifo 选项。

fifo_options

这允许覆盖单个从属复用器的 tee 复用器 fifo_options。请参阅 fifo

select

选择应映射到从属输出的流,由流说明符指定。如果未指定,则默认为所有映射的流。如果输出格式不接受所有映射的流,则会导致该输出操作失败。

您可以使用多个流指定符,并用逗号 (,) 分隔,例如:a:0,v

onfail

指定输出失败时的行为。可以将其设置为 abort(默认)或 ignore。如果此从属输出发生故障,abort 将导致整个进程失败。ignore 将忽略此输出的故障,因此其他输出将继续不受影响。

4.71.2 示例

  • 编码一些内容,并将其存档到 WebM 文件中,同时通过 UDP 以 MPEG-TS 流式传输
    ffmpeg -i ... -c:v libx264 -c:a mp2 -f tee -map 0:v -map 0:a
      "archive-20121107.mkv|[f=mpegts]udp://10.0.1.255:1234/"
    
  • 与上述相同,但即使输出到本地文件失败(例如本地驱动器已满),也继续流式传输
    ffmpeg -i ... -c:v libx264 -c:a mp2 -f tee -map 0:v -map 0:a
      "[onfail=ignore]archive-20121107.mkv|[f=mpegts]udp://10.0.1.255:1234/"
    
  • 使用 ffmpeg 编码输入,并将输出发送到三个不同的目的地。 dump_extra 比特流过滤器用于向所有输出视频关键帧数据包添加额外的数据信息,这是 MPEG-TS 格式所要求的。选择选项应用于 out.aac,以使其仅包含音频数据包。
    ffmpeg -i ... -map 0 -flags +global_header -c:v libx264 -c:a aac
           -f tee "[bsfs/v=dump_extra=freq=keyframe]out.ts|[movflags=+faststart]out.mp4|[select=a]out.aac"
    
  • 与上述相同,但仅为音频输出选择流 a:1。 请注意,必须执行第二级转义,因为 ":" 是用于分隔选项的特殊字符。
    ffmpeg -i ... -map 0 -flags +global_header -c:v libx264 -c:a aac
           -f tee "[bsfs/v=dump_extra=freq=keyframe]out.ts|[movflags=+faststart]out.mp4|[select=\'a:1\']out.aac"
    

4.72 webm_chunk

WebM Live Chunk 复用器。

此复用器将 WebM 标头和块写入为单独的文件,这些文件可以被支持通过 DASH 进行 WebM 实时流的客户端使用。

4.72.1 选项

此复用器支持以下选项

chunk_start_index

第一个块的索引(默认为 0)。

header

将在其中写入初始化数据的标头的文件名。

audio_chunk_duration

每个音频块的持续时间,以毫秒为单位(默认为 5000)。

4.72.2 示例

ffmpeg -f v4l2 -i /dev/video0 \
       -f alsa -i hw:0 \
       -map 0:0 \
       -c:v libvpx-vp9 \
       -s 640x360 -keyint_min 30 -g 30 \
       -f webm_chunk \
       -header webm_live_video_360.hdr \
       -chunk_start_index 1 \
       webm_live_video_360_%d.chk \
       -map 1:0 \
       -c:a libvorbis \
       -b:a 128k \
       -f webm_chunk \
       -header webm_live_audio_128.hdr \
       -chunk_start_index 1 \
       -audio_chunk_duration 1000 \
       webm_live_audio_128_%d.chk

4.73 webm_dash_manifest

WebM DASH 清单复用器。

此复用器实现了 WebM DASH 清单规范,以生成 DASH 清单 XML。它还支持 DASH 实时流的清单生成。

有关更多信息,请参阅

4.73.1 选项

此复用器支持以下选项

adaptation_sets

此选项具有以下语法:“id=x,streams=a,b,c id=y,streams=d,e”,其中 x 和 y 是自适应集的唯一标识符,而 a、b、c、d 和 e 是相应音频和视频流的索引。可以使用此选项添加任意数量的自适应集。

live

将其设置为 1 以创建实时流 DASH 清单。默认值:0。

chunk_start_index

第一个块的起始索引。这将进入清单中 ‘SegmentTemplate’ 元素的 ‘startNumber’ 属性。默认值:0。

chunk_duration_ms

每个块的持续时间,以毫秒为单位。这将进入清单中 ‘SegmentTemplate’ 元素的 ‘duration’ 属性。默认值:1000。

utc_timing_url

将返回 ISO 格式 UTC 时间戳的页面 URL。这将进入清单中 ‘UTCTiming’ 元素的 ‘value’ 属性。默认值:无。

time_shift_buffer_depth

保证任何表示可用的最小时间(以秒为单位)移位缓冲区。这将进入 ‘MPD’ 元素的 ‘timeShiftBufferDepth’ 属性。默认值:60。

minimum_update_period

清单的最小更新周期(以秒为单位)。这将进入 ‘MPD’ 元素的 ‘minimumUpdatePeriod’ 属性。默认值:0。

4.73.2 示例

ffmpeg -f webm_dash_manifest -i video1.webm \
       -f webm_dash_manifest -i video2.webm \
       -f webm_dash_manifest -i audio1.webm \
       -f webm_dash_manifest -i audio2.webm \
       -map 0 -map 1 -map 2 -map 3 \
       -c copy \
       -f webm_dash_manifest \
       -adaptation_sets "id=0,streams=0,1 id=1,streams=2,3" \
       manifest.xml

5 元数据

FFmpeg 能够将媒体文件的元数据转储到一个简单的 UTF-8 编码的类 INI 文本文件中,然后使用元数据复用器/解复用器将其加载回来。

文件格式如下

  1. 一个文件由一个标头和多个元数据标签组成,这些标签分为多个部分,每个部分都在其自己的行上。
  2. 标头是 ‘;FFMETADATA’ 字符串,后跟一个版本号(现在为 1)。
  3. 元数据标签的形式为 ‘key=value
  4. 紧跟在标头之后的是全局元数据
  5. 在全局元数据之后,可能有包含每个流/每个章节元数据的部分。
  6. 一个部分以大写形式的部分名称(即 STREAM 或 CHAPTER)开始,放在括号中(‘[’、‘]’),并以下一部分或文件末尾结束。
  7. 在章节部分开头,可能有用于开始/结束值的可选时基。它必须采用 ‘TIMEBASE=num/den’ 的形式,其中 numden 是整数。如果缺少时基,则假定开始/结束时间以纳秒为单位。

    接下来,一个章节部分必须包含章节的开始和结束时间,形式为 ‘START=num’、‘END=num’,其中 num 是一个正整数。

  8. 空行和以 ‘;’ 或 ‘#’ 开头的行将被忽略。
  9. 包含特殊字符(‘=’、‘;’、‘#’、‘\’ 和换行符)的元数据键或值必须用反斜杠 ‘\’ 转义。
  10. 请注意,元数据中的空格(例如 ‘foo = bar’)被视为标签的一部分(在上面的示例中,键是 ‘foo ’,值是 ‘ bar’)。

一个 ffmetadata 文件可能如下所示

;FFMETADATA1
title=bike\\shed
;this is a comment
artist=FFmpeg troll team

[CHAPTER]
TIMEBASE=1/1000
START=0
#chapter ends at 0:01:00
END=60000
title=chapter \#1
[STREAM]
title=multi\
line

通过使用 ffmetadata 复用器和解复用器,可以从输入文件中提取元数据到 ffmetadata 文件,然后使用编辑后的 ffmetadata 文件将该文件转码为输出文件。

使用 ffmpeg 提取 ffmetadata 文件如下所示

ffmpeg -i INPUT -f ffmetadata FFMETADATAFILE

可以按如下方式从 FFMETADATAFILE 文件中重新插入已编辑的元数据信息

ffmpeg -i INPUT -i FFMETADATAFILE -map_metadata 1 -codec copy OUTPUT

6 另请参阅

ffmpeg, ffplay, ffprobe, libavformat

7 作者

FFmpeg 开发人员。

有关作者的详细信息,请参阅项目的 Git 历史记录(https://git.ffmpeg.org/ffmpeg),例如,在 FFmpeg 源代码目录中键入命令 git log,或浏览在线存储库:https://git.ffmpeg.org/ffmpeg

特定组件的维护人员在源代码树中的 MAINTAINERS 文件中列出。

本文档于2025 年 1 月 21 日使用 makeinfo 生成。

telepoint.bg 提供托管