⚠️ 这是一个非官方翻译网站,与 FFmpeg 项目无关。准确信息请参阅原文(https://ffmpeg.org/ffmpeg-formats.html)

FFmpeg 格式文档

1 描述

本文档介绍 libavformat 库提供的受支持格式(muxer 和 demuxer)。

2 格式选项

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

可以在 FFmpeg 工具中通过 -option value 的形式设置选项,也可以直接在 AVFormatContext 选项中设置值,或使用 libavutil/opt.h API 以编程方式设置。

受支持的选项列表如下:

avioflags flags (input/output)

可选值:

‘direct’

减少缓冲。

probesize integer (input)

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

max_probe_packets integer (input)

设置探测 codec 时缓冲的数据包的最大数量。默认值为 2500 个数据包。

packetsize integer (output)

设置数据包大小。

fflags flags

设置格式标志。其中一些仅针对有限数量的格式实现。

输入文件可用的取值:

‘discardcorrupt’

丢弃已损坏的数据包。

‘fastseek’

为某些格式启用快速但不精确的定位。

‘genpts’

在存在 DTS 的情况下生成缺失的 PTS。

‘igndts’

如果同时设置了 PTS,则忽略 DTS。当设置了 PTS 时,DTS 的值会被设为 NOPTS。当设置了 nofillin 标志时,该选项会被忽略。

‘ignidx’

忽略索引。

‘nobuffer’

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

‘nofillin’

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

‘noparse’

禁用 AVParsers,同时也需要 +nofillin

‘sortdts’

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

输出文件可用的取值:

‘autobsf’

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

‘bitexact’

只写入与平台、构建和时间无关的数据。这确保了文件和数据的校验和在不同平台间可复现且一致。主要用于回归测试。

‘flush_packets’

立即写出数据包。

‘shortest’

在最短的流结束时停止封装。此时可能需要增大 max_interleave_delta,以避免在 EOF 之前刷新较长的流。

seek2any integer (input)

若设为 1,则在 demuxer 层面支持时允许定位到非 keyframe。默认值为 0。

analyzeduration integer (input)

指定探测输入时分析的微秒数。较大的值可以检测到更准确的信息,但会增加延迟。默认值为 5,000,000 微秒,即 5 秒。

cryptokey hexadecimal string (input)

设置解密密钥。

indexmem integer (input)

设置用于时间戳索引所使用的最大内存(每条流)。

rtbufsize integer (input)

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

fdebug flags (input/output)

打印特定的调试信息。

可选值:

‘ts’

打印时间戳信息。

‘id3v2’

在解封装包含 ID3v2 标签的文件时,打印 ID3v2 帧数据。

max_delay integer (input/output)

以微秒为单位设置最大的封装或解封装延迟。

fpsprobesize integer (input)

设置用于探测帧率所使用的帧数。

audio_preload integer (output)

以微秒为单位设置音频数据包应提前交织的时间。

chunk_duration integer (output)

以微秒为单位设置每个 chunk 的时长。

chunk_size integer (output)

以字节为单位设置每个 chunk 的大小。

err_detect, f_err_detect flags (input)

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

可选值:

‘crccheck’

验证内嵌的 CRC。

‘bitstream’

检测偏离 bitstream 规范的情况。

‘buffer’

检测不正确的 bitstream 长度。

‘explode’

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

‘careful’

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

‘compliant’

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

‘aggressive’

将正常的 encoder 不应做出的行为视为错误。

max_interleave_delta integer (output)

设置用于交织的最大缓冲时长。该时长以微秒为单位,默认值为 10000000(10 秒)。

为确保所有流都被正确交织,libavformat 在真正向输出文件写入任何数据包之前,会等待每条流至少有一个数据包为止。当某些流是“稀疏”的(即连续数据包之间存在较大间隔)时,这可能导致过度缓冲。

该字段指定 封装队列中第一个和最后一个数据包的时间戳之间允许的最大差值,超过该差值后,libavformat 会输出一个数据包,而不论是否已为所有流都排入了数据包。

若设为 0,libavformat 会持续缓冲数据包,直到每条流都有一个数据包为止,而不论已缓冲数据包之间的最大时间戳差值是多少。

use_wallclock_as_timestamps integer (input)

若设为 1,则使用系统时钟(wallclock)作为时间戳。默认值为 0。

avoid_negative_ts integer (output)

可选值:

‘make_non_negative’

偏移时间戳使其变为非负值。另请注意,这只影响开头的负时间戳,不影响非单调的负时间戳。

‘make_zero’

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

‘auto (default)’

在目标格式要求时启用偏移。

‘disabled’

禁用时间戳偏移。

启用偏移时,所有输出时间戳都会偏移相同的量。与不进行偏移相比,音频、视频和字幕之间的不同步情况及相对时间戳差异都会被保留。

skip_initial_bytes integer (input)

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

correct_ts_overflow integer (input)

若设为 1,则纠正单个时间戳溢出。默认值为 1。

flush_packets integer (output)

在每个数据包之后刷新底层 I/O 流。默认值为 -1(自动),表示由底层协议决定;1 表示启用,效果是降低延迟;0 表示禁用,在某些情况下可能提高 IO 吞吐量。

output_ts_offset offset (output)

设置输出时间偏移量。

offset 必须是一个时长(time duration)的指定,请参阅 (ffmpeg-utils) ffmpeg-utils(1) 手册中的“Time duration”一节

该偏移量由 muxer 添加到输出时间戳上。

指定正偏移量意味着相应的流会被延迟 offset 中指定的时长。默认值为 0(表示不应用任何偏移)。

format_whitelist list (input)

以 "," 分隔的允许使用的 demuxer 列表。默认情况下允许所有 demuxer。

dump_separator string (input)

用于分隔命令行中打印的流参数各字段的分隔符。例如,要用换行符和缩进分隔各字段:

ffprobe -dump_separator "
                          "  -i ~/videos/matrixbench_mpeg2.mpg

max_streams integer (input)

指定流的最大数量。可用于拒绝那些因流数量过多而需要占用过多资源的文件。

skip_estimate_duration_from_pts bool (input)

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

duration_probesize integer (input)

当确实需要在文件末尾对 PTS 进行额外探测时(目前是 MPEG-PS 和 MPEG-TS),以字节为单位设置用于估计输入时长的探测大小。该选项面向那些希望自行获得更精确时长探测的用户,或者由于使用了 concat demuxer 而间接需要它的用户。典型的使用场景是高比特率、高视频缓冲、且视频与音频结尾处 PTS 相近的 MPEG-TS CBR:在这种场景下,最后一个视频数据包与最后一个音频数据包之间存在较大的物理间隔,因此必须读取大量字节才能获得视频流的时长。另一种使用场景是,由于帧重排序,默认的探测行为只能读到并非流最后一帧的单个视频帧,导致时长不准确。设置该选项即便对小文件也会有性能影响,因为探测大小是固定的。默认行为是一种通用的折中方案,具有较强的自适应性,但探测大小不会为了不惜一切代价获取流时长而被扩大。必须是不小于 1 的整数,或为 0 以使用默认行为。

strict, f_strict integer (input/output)

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

可选值:

‘very’

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

‘strict’

严格遵循规范中的一切内容,无论后果如何

‘normal’ ‘unofficial’

允许非官方扩展

‘experimental’

允许非标准化的实验性内容,即实验性(尚未完成/正在开发中/未经充分测试)的 decoder 和 encoder。注意:实验性 decoder 可能带来安全风险,请勿使用其解码不受信任的输入。

2.1 格式流指定符

格式流指定符(format stream specifier)允许选择一个或多个匹配特定属性的流。

流指定符的确切语义由 libavformat/avformat.h 头文件中声明的 avformat_match_stream_specifier() 函数定义,并记录在 (ffmpeg) ffmpeg(1) 手册中的“Stream specifiers”一节 中。

3 Demuxers

demuxer 是 FFmpeg 中的一种配置元素,能够从特定类型的文件中读取多媒体流。

在配置 FFmpeg 构建时,所有受支持的 demuxer 默认都会启用。可以使用 configure 选项 --list-demuxers 列出所有可用的 demuxer。

可以使用 configure 选项 --disable-demuxers 禁用所有 demuxer,也可以使用选项 --enable-demuxer=DEMUXER 有选择地启用单个 demuxer,或使用选项 --disable-demuxer=DEMUXER 禁用它。

ff* 工具的 -demuxers 选项会显示已启用的 demuxer 列表。使用 -formats 可以查看已启用的 demuxer 和 muxer 的合并列表。

以下是目前部分可用 demuxer 的说明。

3.1 aa

Audible Format 2、3 和 4 demuxer。

该 demuxer 用于解封装 Audible Format 2、3 和 4(.aa)文件。

3.2 aac

原始的 Audio Data Transport Stream AAC demuxer。

该 demuxer 用于解封装包含单条 AAC 流以及其中任意 ID3v1/2 或 APE 标签的 ADTS 输入。

3.3 apng

Animated Portable Network Graphics(动态 PNG)demuxer。

该 demuxer 用于解封装 APNG 文件。除 PNG 签名外,直到(但不包括)第一个 fcTL 块为止的所有文件头都会作为 extradata 传递。随后,帧会被拆分为两个 fcTL 块之间的所有块,或最后一个 fcTL 块与 IEND 块之间的所有块。

-ignore_loop bool

若设置,则忽略文件中的循环变量。默认启用。

-max_fps int

以每秒帧数表示的最大帧率。默认值 0 表示不设上限。

-default_fps int

当文件中未指定帧率时使用的默认帧率(以每秒帧数表示,0 表示尽可能快)。默认值为 15。

3.4 asf

Advanced Systems Format demuxer。

该 demuxer 用于解封装 ASF 文件和 MMS 网络流。

-no_resync_search bool

不尝试通过查找某个可选的起始码来重新同步。

3.5 concat

虚拟连接(concatenation)脚本 demuxer。

该 demuxer 从文本文件中读取文件列表及其他指令,并依次对它们进行解封装,效果就如同所有数据包已被封装在一起。

文件中的时间戳会被调整,使第一个文件从 0 开始,之后每个文件都从前一个文件结束的位置开始。请注意,这一调整是全局进行的,如果所有流的长度并不完全一致,可能会产生间隔。

所有文件必须具有相同的流(相同的 codec、相同的时间基等)。

每个文件的时长会被用于调整下一个文件的时间戳:如果时长不正确(例如因为它是根据比特率计算出来的,或者文件被截断),就可能产生伪影。可以使用 duration 指令来覆盖每个文件中存储的时长。

3.5.1 语法

该脚本是一个扩展 ASCII 编码的文本文件,每行一条指令。空行、行首空格以及以 ’#’ 开头的行都会被忽略。可识别以下指令:

file path

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

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

ffconcat version 1.0

标识脚本的类型和版本。

为使 FFmpeg 能够自动识别该格式,该指令必须原样(不含多余空格或字节序标记)出现在脚本的第一行。

duration dur

文件的时长。该信息也可以从文件本身获取;如果文件中的信息不可用或不准确,在此处指定可能更高效或有帮助。

如果为所有文件都设置了时长,就可以在整个连接后的视频中进行定位。

inpoint timestamp

文件的入点。当 demuxer 打开文件时,会立即定位到指定的时间戳。定位的方式确保所有流都能在入点处成功呈现。

该指令在帧内(intra frame)codec 上效果最好,因为对于非帧内 codec,通常会在实际入点之前得到额外的数据包,解码后的内容很可能也会包含入点之前的帧。

对于每个文件,位于该文件入点之前的数据包的时间戳会小于该文件计算得出的起始时间戳(对第一个文件而言为负值),并且文件的时长(如果未通过 duration 指令指定)会根据其指定的入点相应缩短。

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

outpoint timestamp

文件的出点。当 demuxer 在任意一条流中到达指定的解码时间戳时,会将其作为文件结束的情况处理,并跳过所有流的当前及其余全部数据包。

出点是不含边界的(exclusive),也就是说 demuxer 不会输出解码时间戳大于或等于出点的数据包。

该指令在帧内 codec 以及所有流都紧密交织的格式上效果最好。对于非帧内 codec,通常会得到额外的、呈现时间戳位于出点之后的数据包,因此解码后的内容很可能也会包含出点之后的帧。如果你的流没有紧密交织,你可能无法在出点之前获得所有流的全部数据包,也可能只能解码到出点为止的最早的那条流。

文件的时长(如果未通过 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 value

该流的 codec。

stream_extradata hex_string

以十六进制编码表示的该流的 extradata。

chapter id start end

添加一个章节。id 是唯一标识符,可以是较小的连续数字。

3.5.2 选项

该 demuxer 接受以下选项:

safe

若设为 1,则拒绝不安全的文件路径和指令。一个文件路径被视为安全,需满足:不包含协议说明、是相对路径,且所有组成部分都只包含可移植字符集(字母、数字、句点、下划线和连字符)中的字符,并且各组成部分开头都不是句点。

若设为 0,则接受任意文件名。

默认值为 1。

auto_convert

若设为 1,则尝试对数据包数据进行自动转换,使各流可以连接。默认值为 1。

目前,唯一的转换是为 MP4 格式中的 H.264 流添加 h264_mp4toannexb bitstream 过滤器。当存在分辨率变化时,这一点尤其必要。

segment_time_metadata

若设为 1,则每个数据包都会包含 lavf.concat.start_time 和 lavf.concat.duration 这两个数据包元数据值,分别表示连接后输出中各文件片段的起始时间和时长,均以微秒表示。duration 元数据仅在能够根据 concat 文件确定其值时才会被设置。默认值为 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

Dynamic Adaptive Streaming over HTTP(DASH)demuxer。

该 demuxer 会呈现 manifest 中找到的所有 AVStream。调用方可以通过设置 AVStream 上的 discard 标志来决定实际接收哪些流。每条流都会将 <Representation> 中的 idbandwidth 属性分别映射为名为 "id" 和 "variant_bitrate" 的元数据键。

3.6.1 选项

该 demuxer 接受以下选项:

cenc_decryption_key

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

cenc_decryption_keys

由 16 字节 key ID => 16 字节密钥(均以十六进制表示)组成的字典,用于解密使用 ISO Common Encryption(CENC/AES-128 CTR;ISO/IEC 23001-7)加密的文件。

3.7 dvdvideo

DVD-Video demuxer,基于 libdvdnav 和 libdvdread 实现。

可以直接将 DVD title(具体来说是顺序排列的 PGC)导入到转换流程中。在给定菜单坐标的情况下(尽力而为),也可以对菜单素材(如背景视频或音频)进行解封装。

接受块设备(DVD 驱动器)、ISO 文件和目录结构作为输入。在其中一种输入前加上 -f dvdvideo 即可启用该 demuxer。

该 demuxer 不包含任何形式的解密代码。处理加密 DVD 需自行解决,不应期待在这方面获得支持。

底层播放由 libdvdnav 处理,结构解析由 libdvdread 处理。FFmpeg 必须在启用 GPL 库支持的情况下构建,并带有 configure 开关 --enable-libdvdnav--enable-libdvdread

你需要提供所需的“title number”,或确切的 PGC/PG 坐标。许多开源 DVD 播放器和工具都可以帮助提供这一信息。如果未指定,demuxer 会默认使用 title 1,这对许多光盘都适用。不过,由于该格式的灵活性,建议手动检查。有许多光盘的制作方式很奇怪,或带有无效的文件头。

如果输入是真实的 DVD 驱动器,请注意,有些驱动器在读取光盘上的坏扇区时可能会静默失败,转而返回随机比特位,这实际上就是损坏的数据。这一现象在老化或已损坏的光盘上尤其明显。检测这种损坏需要进行二次读取和完整性检查。这不是 FFmpeg 的问题。

3.7.1 背景

DVD-Video 并不是传统意义上那种可直接访问的线性容器格式。相反,它支持对精心封装、存放在无文件头 VOB 文件中的 MPEG-PS 流进行复杂的、按程序控制的播放。对最终用户而言,这些流被简单地称为“title”,但实际的逻辑播放顺序是由 title 内一个或多个“PGC”(Program Group Chain,节目组链)定义的。而 PGC 又由多个“PG”(Program,节目)组成,它们才是实际的视频片段(对典型的影片而言,是按顺序排列的)。PGC 结构以及流布局和元数据都保存在需要解析的 IFO 文件中。可以简单地把 PGC 理解为播放列表。

真正的 DVD 播放器依靠用户通过菜单进行的 GUI 交互,以及内部虚拟机(VM)来驱动解封装的方向。通常,用户要么通过菜单进行导航,要么被自动重定向到所选的 PGC。在这一过程及后续播放期间,DVD 播放器的内部 VM 还会维护状态,并执行可能在播放过程中造成跳转到不同扇区的指令。这正是需要用到 libdvdnav 的原因,因为在许多情况下,仅仅线性读取光盘上的 MPEG-PS 数据块(VOB)并不足以生成正确的顺序。

还有许多其他 DVD 结构(这是一个很大的话题)在此不做讨论。特别是 NAV 数据包,会被该 demuxer 用于构建精确的时间信息,但不会作为流输出。若想获得较好的整体理解,请参阅:https://code.videolan.org/videolan/libdvdnav/-/blob/master/doc/dvd_structures

3.7.2 选项

该 demuxer 接受以下选项:

title int

要播放的 title 编号。如果未设置 pgc 和 pg,则必须设置该项。不适用于菜单。默认值为 0(自动),目前该值只会选择第一个可用的 title(title 1),并向用户提示相应的影响。

chapter_start int

起始的章节(chapter),即 PTT(part-of-title)编号。不适用于菜单。默认值为 1。

chapter_end int

结束的章节(chapter),即 PTT(part-of-title)编号。不适用于菜单。默认值为 0,这是一个特殊值,表示在最后一个可能的章节处结束。

angle int

视频视角(angle)编号,本质上指的是由 VOB 中交织的多个替代帧组成的一条额外视频流。不适用于菜单。默认值为 1。

region int

用于播放的区域代码。有些光盘可能会据此在不同区域默认使用特定的视角播放。若以真实 DVD 驱动器作为输入,该选项不会影响其区域代码。不适用于菜单。默认值为 0,即 "world"。

menu bool

解封装菜单素材而不是导航播放某个 title。需要提供菜单的确切坐标(menu_lu、menu_vts、pgc、pg)。默认值为 false。

menu_lu int

要解封装的菜单语言。在 DVD 中,菜单是按语言分组的。默认值为 1,即第一个语言单元。

menu_vts int

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

pgc int

配合 pg 使用、用于开始播放的入口 PGC。可作为设置 title 的替代方案。目前不支持章节标记。菜单必须显式设置该项。默认值为 0,即根据 title 的值自动解析。

pg int

配合 pgc 使用、用于开始播放的入口 PG。可作为设置 title 的替代方案。目前不支持章节标记。默认值为 1,即该 PGC 的第一个 PG。

preindex bool

启用该选项可获得精确的章节(PTT)标记和时长测量,但这需要进行较慢的第二遍读取,以便从 NAV 数据包中索引章节标记的时间戳。对真实的光驱来说,这是一项并不理想的额外工作。建议将该选项与保存在硬盘上的 DVD 结构备份配合使用,速度会更快。与 pgc 和 pg 不兼容。默认值为 0,即 false。

trim bool

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

3.7.3 示例

  • 从给定的 DVD 结构中打开 title 3:

    ffmpeg -f dvdvideo -title 3 -i <path to DVD> ...
    
  • 从给定的 DVD 结构中打开 title 1 的第 3 到 6 章:

    ffmpeg -f dvdvideo -chapter_start 3 -chapter_end 6 -title 1 -i <path to DVD> ...
    
  • 仅从给定的 DVD 结构中打开 title 1 的第 5 章:

    ffmpeg -f dvdvideo -chapter_start 5 -chapter_end 5 -title 1 -i <path to DVD> ...
    
  • 解封装 VTS 1、PGC 1 中语言为 1、从 PG 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 Multimedia 格式 demuxer。

该格式被多款 Electronic Arts 游戏使用。

3.8.1 选项

merge_alpha bool

通常,VP6 的 alpha 通道(如果存在)会作为第二条视频流返回;通过设置该选项,可以让 demuxer 返回单一的视频流,其中除普通视频外还包含 alpha 通道。

3.9 imf

Interoperable Master Format demuxer。

该 demuxer 会呈现 IMF Composition 中找到的音频和视频流,具体规范见 SMPTE ST 2067-2

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

如果未指定 -assetmaps,该 demuxer 会在与 CPL 相同的目录中查找名为 ASSETMAP.xml 的文件。

3.10 flv, live_flv, kux

Adobe Flash Video Format demuxer。

该 demuxer 用于解封装 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

忽略前一个 tag 的大小值。

-flv_full_metadata bool

输出 onMetadata 的全部内容。

3.11 gif

Animated GIF demuxer。

它接受以下选项:

min_delay

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

max_gif_delay

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

default_delay

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

ignore_loop

GIF 文件可以包含循环特定次数(或无限循环)的信息。如果 ignore_loop 设为 1,输入中的循环设置会被忽略,也就不会循环播放。若设为 0,则会按照 GIF 中的设置循环相应的次数。默认值为 1。

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

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

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

3.12 hls

HLS demuxer

Apple HTTP Live Streaming(HLS)demuxer。

该 demuxer 会呈现所有 variant 流中的全部 AVStream。id 字段被设为比特率 variant 的索引号。调用方可以通过设置 AVStream 上的 discard 标志(在 ffplay 中按 ’a’ 或 ’v’ 键)来决定实际接收哪些 variant 流。该流所属 variant 的总比特率可以通过名为 "variant_bitrate" 的元数据键获取。

它接受以下选项:

live_start_index

开始播放直播流时使用的 segment 索引(负值表示从末尾计数)。

prefer_x_start

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

allowed_extensions

以 ’,’ 分隔的、hls 被允许访问的文件扩展名列表。

extension_picky

此选项会阻止不允许的扩展名参与探测。除 mpegts(始终允许)外,它还要求所有可用的 segment 都具有与格式匹配的扩展名。建议正确设置白名单,而不要依赖扩展名。默认启用。

max_reload

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

m3u8_hold_counters

当 m3u8 刷新但没有新 segment 时,加载 m3u8 的最大次数。默认值为 1000。

http_persistent

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

http_multiple

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

http_seekable

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

seg_format_options

使用以 : 分隔的 key=value 列表,为媒体 segment 的 demuxer 设置选项。

seg_max_retry

出错时重新加载某个 segment 的最大次数,适用于不希望因网络错误而跳过 segment 的情况。默认值为 0。

3.13 image2

Image file demuxer。

该 demuxer 从由某个模式(pattern)指定的图像文件列表中读取数据。该模式的语法和含义由 pattern_type 选项指定。

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

序列中所有文件的图像尺寸、pixel format 和格式都必须一致。

该 demuxer 接受以下选项:

framerate

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

loop

若设为 1,则循环播放输入。默认值为 0。

pattern_type

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

pattern_type 接受以下取值之一。

none

禁用模式匹配,因此视频将只包含指定的图像。如果你不想将多个图像组合成序列,且文件名中可能包含特殊的模式字符,就应该使用该选项。

sequence

选择序列模式类型,用于指定一组按连续编号索引的文件序列。

序列模式可以包含字符串 "%d" 或 "%0Nd",用于指定该模式所匹配的每个文件名中,表示连续编号的字符所在的位置。如果使用 "%d0Nd" 这种形式,则每个文件名中表示数字的字符串会用 0 补齐,N 为表示该数字的 0 填充位数总数。字面字符 ’%’ 可以在模式中用字符串 "%%" 表示。

如果序列模式包含 "%d" 或 "%0Nd",该模式所指定文件列表中的第一个文件名必须包含一个介于 start_number 与 start_number+start_number_range-1 之间(含两端)的数字,此后的所有数字都必须是连续的。

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

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

ffmpeg -i img.jpeg img.png

glob

选择 glob 通配符模式类型。

该模式会按照 glob() 模式来解释。只有当 libavformat 编译时启用了 globbing 支持,才能选择该模式类型。

默认值为 sequence。

pixel_format

设置要读取的图像的 pixel format。若未指定,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.jpeg、img-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

设置要解封装的曲目索引。该 demuxer 只能导出一条曲目。曲目索引从 0 开始。默认选取第一条曲目。曲目数量会作为 tracks 元数据条目导出。

sample_rate

设置导出曲目的采样率。范围为 1000 到 999999。默认值为 44100。

max_size (bytes)

该 demuxer 会将整个文件缓冲到内存中。调整此值可设置最大缓冲区大小,这同时也是可读取文件大小的上限。默认值为 50 MiB。

3.15 libmodplug

基于 ModPlug 的模块 demuxer

参见 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 ms 之间。默认值为 0。

bass_amount

应用低音增强,也称为 XBass 或 megabass。范围为 0(安静)到 100(响亮)。默认值为 0。

bass_range

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

surround_depth

应用 Dolby Pro-Logic 环绕声效果。范围为 0(安静)到 100(强烈)。默认值为 0。

surround_delay

设置环绕声延迟(毫秒),会被限制在 5-40 ms 之间。默认值为 0。

max_size

该 demuxer 会将整个文件缓冲到内存中。调整此值可设置最大缓冲区大小,这同时也是可读取文件大小的上限。范围为 0 到 100 MiB。0 表示取消缓冲区大小限制(不推荐)。默认值为 5 MiB。

video_stream_expr

使用 eval API 求值的字符串,用于为生成的视频流分配颜色。可用变量有 xywhtspeedtempoorderpatternrow

video_stream

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

video_stream_w

以 ’chars’ 为单位设置视频帧宽度,其中一个 char 表示 8 个像素。范围为 20-512。默认值为 30。

video_stream_h

以 ’chars’ 为单位设置视频帧高度,其中一个 char 表示 8 个像素。范围为 20-512。默认值为 30。

video_stream_ptxt

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

3.16 libopenmpt

基于 libopenmpt 的模块 demuxer

更多信息参见 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 mcc

用于 MacCaption MCC 文件的 demuxer,支持 MCC 1.0 和 2.0 版本。MCC 文件存储 VANC 数据,其中可以包含隐藏式字幕(EIA-608 和 CEA-708)、辅助时间码、pan-scan 数据等。默认情况下,出于向后兼容考虑,MCC demuxer 只提取 EIA-608 和 CEA-708 隐藏式字幕并返回 EIA_608 流,忽略其他所有 VANC 数据。可以通过设置 -eia608_extract 0,将其改为在 SMPTE_436M_ANC 数据流中返回全部 VANC 数据

3.17.1 示例

  • 将 MCC 文件转换为 Scenarist(SCC)格式:
    ffmpeg -i CC.mcc -c:s copy CC.scc
    

注意,SCC 格式仅支持 EIA-608,因此会丢弃 CEA-708 扩展等其他所有数据。

  • 将 MCC 文件合并到 MXF 文件中:
    ffmpeg -i video_and_audio.mxf -eia608_extract 0 -i CC.mcc -c copy -map 0 -map 1 out.mxf
    

这会保留全部 VANC 数据,并将其作为 SMPTE_436M_ANC 数据流插入输出的 MXF 文件中。

3.18 mov/mp4/3gp

用于 Quicktime File Format 和 ISO/IEC Base Media File Format(ISO/IEC 14496-12 或 MPEG-4 Part 12,ISO/IEC 15444-12 或 JPEG 2000 Part 12)的 demuxer。

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

3.18.1 选项

该 demuxer 接受以下选项:

enable_drefs

启用外部轨道的加载,默认禁用。启用此选项在某些使用场景下理论上可能泄露信息。

use_absolute_path

允许通过绝对路径加载外部轨道,默认禁用。启用此选项存在安全风险,只有在确认来源无恶意时才应启用。

seek_streams_individually

定位(seek)时,分别在每个流中识别最近的点,并从识别出的点开始解封装该流中的数据包。与从头线性解封装相比,这可能导致数据包顺序不同。默认值为 true。

ignore_editlist

忽略所有 edit list atom。该 demuxer 默认会修改流索引,以反映 edit list 描述的时间线。默认值为 false。

advanced_editlist

修改流索引以反映 edit list 描述的时间线。要使此选项生效,必须将 ignore_editlist 设为 false。如果 ignore_editlist 和此选项都设为 false,则只会修改流索引的起始部分,以反映 edit list 描述的初始停留时间或起始时间戳。默认值为 true。

ignore_chapters

不解析章节,这也包括 GoPro 的 ’HiLight’ 标签/时刻。注意,只有当输入可定位(seekable)时才会解析章节。默认值为 false。

use_mfra_for

对于可定位的分段(fragmented)输入,如果存在 media fragment random access box,则据此设置分段的起始时间戳。

可使用以下选项:

‘auto’

自动检测将 mfra 时间戳设为 PTS 还是 DTS (默认值)

‘dts’

将 mfra 时间戳设为 DTS

‘pts’

将 mfra 时间戳设为 PTS

‘0’

不使用 mfra box 设置时间戳

use_tfdt

对于分段输入,将分段的起始时间戳设为 tfdt box 中 baseMediaDecodeTime 的值。默认启用,此时会优先使用 tfdt box 来设置 DTS。禁用后则改用 sidx box 中的 earliest_presentation_time。无论哪种情况,只要 mfra box 可用且 use_mfra_for 设为 pts 或 dts,就会使用其中的时间戳。

export_all

将 udta box 内无法识别的 box 导出为元数据条目,box 类型的前四个字符会被设为键(key)。默认值为 false。

export_xmp

将 XMP_ box 和 uuid box 的全部内容导出为一个字符串,键为 xmp。注意,如果设置了 export_all 而未设置此选项,XMP_ box 的内容仍会被导出,但键会是 XMP_。默认值为 false。

activation_bytes

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

audible_fixed_key

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

decryption_key

用于解密使用 ISO Common Encryption(CENC/AES-128 CTR;ISO/IEC 23001-7)加密的文件的默认 16 字节密钥(十六进制)。

decryption_keys

用于解密使用 ISO Common Encryption(CENC/AES-128 CTR;ISO/IEC 23001-7)加密的文件的字典,键为 16 字节密钥 ID,值为 16 字节密钥,两者均为十六进制。

max_stts_delta

trak 的 stts box 中写入的极大样本增量(sample delta)有时可能是有意为之,但通常是写入错误,或者是在被当作有符号 32 位整数处理时,用来存储 dts 校正所需的负值。此选项允许用户设置一个上限,超过该上限的增量会被限制为 1。当值大于该上限、且转换为 int32 后为负数时,会被用来调整后续的 dts。

单位为轨道的时间刻度(time scale)。范围为 0 到 UINT_MAX。默认值为 UINT_MAX - 48000*10,这样可以为 48 kHz 音频流提供最长 10 秒的 dts 校正,同时覆盖 uint32 范围的 99.9%。

interleaved_read

在 demuxer 层面交织多条轨道的数据包。对于交织效果较差的文件,由于 MOV/MP4 对数据包的放置位置没有要求,不同轨道数据包之间的巨大间隔可能导致播放问题,此选项可以避免这一情况。但对于交织效果非常差的文件,这可能因需要在各轨道之间来回定位而导致过度定位(seek),因此禁用该选项可以避免 I/O 问题,但会牺牲播放效果。

3.18.2 Audible AAX

Audible AAX 文件是经过加密的 M4B 文件,可以通过指定 4 字节的 activation secret 来解密。

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

3.19 mpegts

MPEG-2 传输流(transport stream)demuxer。

该 demuxer 接受以下选项:

resync_size

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

skip_unknown_pmt

跳过 PAT 中未定义的节目所对应的 PMT。默认值为 0。

fix_teletext_pts

使用根据图文电视(teletext)流所属且未被丢弃的第一个节目的 PCR 计算出的时间戳,覆盖图文电视数据包的 PTS 和 DTS 值。默认值为 1;如果希望保持图文电视数据包的 PTS 和 DTS 值不变,请将此选项设为 0。

ts_packetsize

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

scan_all_pmts

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

merge_pmt_versions

当 PMT 版本更新、基本流(elementary stream)迁移到不同 PID 时,复用已有的流。默认值为 0。

max_packet_size

设置该 demuxer 发出的数据包的最大大小(字节)。超过此大小的负载会被拆分到多个数据包中。范围为 1 到 INT_MAX/2。默认值为 204800 字节。

3.20 mpjpeg

封装在 multi-part MIME 中的 MJPEG demuxer。

该 demuxer 支持读取 MJPEG,每一帧都表示为 multipart/x-mixed-replace 流的一部分。

strict_mime_boundary

默认实现对多部分 MIME 边界检测采用较宽松的标准,以避免与许多现有的、未生成规范 MIME MJPEG 流的终端产生兼容性倒退。将此选项设为 1 启用后,会对边界值进行更严格的检查。

3.21 rawvideo

原始视频 demuxer。

该 demuxer 允许读取原始视频数据。由于没有说明假定的视频参数的头部信息,用户必须自行指定这些参数,才能正确解码数据。

该 demuxer 接受以下选项:

framerate

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

pixel_format

设置输入视频的 pixel format。默认值为 yuv420p

stride

以字节为单位设置帧的行大小,仅在存在额外填充时才需要。对于多平面格式,stride 是各平面行大小组成的列表。

video_size

设置输入视频的尺寸,此值必须显式指定。

例如,要用 ffplay 读取 rawvideo 文件 input.raw,假定 pixel format 为 rgb24、视频尺寸为 320x240、帧率为每秒 10 帧,可使用以下命令:

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

ffplay 读取 rawvideo,假定 pixel format 为 yuv420p、视频尺寸为 1080x1920,Y 平面每行有 8 字节填充,UV 平面有 4 字节填充,

ffplay -f rawvideo -pixel_format yuv420p -video_size 1080x1920 -stride 1088,544,544 input.raw

3.22 rcwt

RCWT(Raw Captions With Time)是 ccextractor 原生使用的一种格式,ccextractor 是常用于处理 608/708 隐藏式字幕(CC)来源的开源工具。有关该格式的更多信息,参见 (ffmpeg-formats)rcwtenc

该 demuxer 实现了截至 2024 年 3 月的规范,该规范自 2014 年 4 月以来一直保持稳定、未作更改。

3.22.1 示例

  • 使用内置 decoder 将 CC 渲染为 ASS:
    ffmpeg -i CC.rcwt.bin CC.ass
    

注意,如果输出看起来是空的,可能需要手动设置 decoder 的 data_field 选项,以选取所需的 CC 子流。

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

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

3.23 sbg

SBaGen 脚本 demuxer。

该 demuxer 读取 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 基准会取自脚本被读取时的当前时刻,脚本布局会依据该基准被冻结。也就是说,如果脚本被直接播放,实际时间会在声卡控制器时钟精度范围内与绝对时间戳一致;但如果用户以某种方式暂停播放或进行定位(seek),所有时间都会相应地发生偏移。

3.24 tedcaptions

TED Talks 使用的 JSON 字幕。

TED 并未提供字幕的直接链接,但可以从页面中推测得到。FFmpeg 源码树中的 tools/bookmarklets.html 文件包含一个用于将其暴露出来的 bookmarklet。

该 demuxer 接受以下选项:

start_time

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

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

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

3.25 vapoursynth

Vapoursynth 封装器。

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

该 demuxer 接受以下选项:

max_script_size

该 demuxer 会将整个脚本缓冲到内存中。调整此值可设置最大缓冲区大小,这同时也是可读取脚本大小的上限。默认值为 1 MiB。

3.26 w64

Sony Wave64 音频 demuxer。

该 demuxer 接受以下选项:

max_size

参见 wav demuxer 中的同名选项。

3.27 wav

RIFF Wave 音频 demuxer。

该 demuxer 接受以下选项:

ignore_length bool

设置后会忽略 data 块的大小,并持续读取直到文件末尾。这对读取头部未正确更新、已损坏或不完整的文件可能有用,但对 data 块之后含有非音频块的文件会产生误判。默认为禁用。

max_size

以字节为单位指定解封装后数据包的最大大小。默认设为 0,表示会根据输入格式自动选择合理的值。

3.28 webp

动画 WebP demuxer。

它接受以下选项:

-min_delay int

以毫秒为单位设置帧间的最小有效延迟。范围为 0 到 60000。默认值为 10。

-max_webp_delay int

以毫秒为单位设置帧间的最大有效延迟。范围为 0 到 16777215。默认值为 16777215(超过四小时),这是规范允许的最大值。

-default_delay int

以毫秒为单位设置帧间的默认延迟。范围为 0 到 60000。默认值为 100。

-ignore_loop bool

WebP 文件可以包含循环特定次数(或无限循环)的信息。如果将 ignore_loop 设为 true,则会忽略输入中的循环设置,不会发生循环。如果设为 false,则会发生循环,并按照 WebP 中的设置循环相应的次数。默认值为 true。

usebgcolor bool

WebP 文件在 ANIM 块中包含背景色提示,但 WebP 规范并不要求查看器应用程序必须使用它。如果将 usebgcolor 设为 true,则会使用该背景色提示,否则背景将使用透明黑色。默认值为 false。

4 Muxers

muxer 是 FFmpeg 中可配置的元素,用于将多媒体流写入特定类型的文件。

配置 FFmpeg 构建时,所有受支持的 muxer 默认都会启用。可以使用 configure 选项 --list-muxers 列出所有可用的 muxer。

可以使用 configure 选项 --disable-muxers 禁用所有 muxer,并使用 --enable-muxer=MUXER / --disable-muxer=MUXER 选项有选择地启用/禁用单个 muxer。

ff* 工具的 -muxers 选项会显示已启用 muxer 的列表。使用 -formats 可查看已启用 demuxer 和 muxer 的合并列表。

以下描述了一些当前可用的 muxer。

4.1 原始 muxer

本节介绍原始(raw)muxer。它们只接受与指定 codec 匹配的单个流,不存储时间戳或元数据。除非另有说明,可识别的扩展名与 muxer 名称相同。

本节包含以下 muxer,同时给出媒体类型,以及用于根据输出扩展名自动选择该 muxer 的其他扩展名。

‘ac3 audio

Dolby Digital(也称为 AC-3)。

‘adx audio

CRI Middleware ADX 音频。

当输出可定位(seekable)且样本总数可以用 32 位存储时,此 muxer 会在第一个数据包起始附近写入样本总数。

‘aptx audio

aptX(Audio Processing Technology for Bluetooth)

‘aptx_hd audio (aptxdh)’

aptX HD(Audio Processing Technology for Bluetooth)音频

‘avs2 video (avs, avs2)’

AVS2-P2(Audio Video Standard - Second generation - Part 2)/ IEEE 1857.4 视频

‘avs3 video (avs3)’

AVS3-P2(Audio Video Standard - Third generation - Part 2)/ IEEE 1857.10 视频

‘cavsvideo video (cavs)’

中国 AVS(Audio Video Standard - First generation)

‘codec2raw audio

Codec 2 音频。

未注册扩展名,因此需要提供格式名称,例如使用 ffmpeg CLI 工具的 -f codec2raw

‘data any

通用数据 muxer。

此 muxer 接受任意类型、任意 codec 的单个流。必须使用 ffmpeg CLI 工具的 -map 选项来选择输入流。

未注册扩展名,因此需要提供格式名称,例如使用 ffmpeg CLI 工具的 -f data

‘dfpwm audio (dfpwm)’

原始 DFPWM1a(Dynamic Filter Pulse With Modulation)音频 muxer。

‘dirac video (drc, vc2)’

BBC Dirac 视频。

Dirac Pro codec 是其子集,已标准化为 SMPTE VC-2。

‘dnxhd video (dnxhd, dnxhr)’

Avid DNxHD 视频。

已标准化为 SMPTE VC-3,支持 DNxHR 流。

‘dts audio

DTS Coherent Acoustics(DCA)音频

‘eac3 audio

Dolby Digital Plus,也称为 Enhanced AC-3

‘evc video (evc)’

MPEG-5 Essential Video Coding(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 大端("left-justified")音频。

未注册扩展名,因此需要提供格式名称,例如使用 ffmpeg CLI 工具的 -f g726

‘g726le audio

ITU-T G.726 小端("right-justified")音频。

未注册扩展名,因此需要提供格式名称,例如使用 ffmpeg CLI 工具的 -f g726le

‘gsm audio

Global System for Mobile Communications 音频

‘h261 video

ITU-T H.261 视频

‘h263 video

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

‘h264 video (h264, 264)’

ITU-T H.264 / MPEG-4 Part 10 AVC 视频。如果 bitstream 处于 length-prefixed 模式,应转换为 Annex B 语法。

‘hevc video (hevc, h265, 265)’

ITU-T H.265 / MPEG-H Part 2 HEVC 视频。如果 bitstream 处于 length-prefixed 模式,应转换为 Annex B 语法。

‘m4v video

MPEG-4 Part 2 视频

‘mjpeg video (mjpg, mjpeg)’

Motion JPEG 视频

‘mlp audio

Meridian Lossless Packing,也称为 Packed PCM

‘mp2 audio (mp2, m2a, mpa)’

MPEG-1 Audio Layer II 音频

‘mpeg1video video (mpg, mpeg, m1v)’

MPEG-1 Part 2 视频。

‘mpeg2video video (m2v)’

ITU-T H.262 / MPEG-2 Part 2 视频

‘obu video

AV1 low overhead Open Bitstream Units muxer。

流的所有 temporal unit 中都会插入 temporal delimiter OBU。

‘rawvideo video (yuv, rgb)’

原始未压缩视频。

‘sbc audio (sbc, msbc)’

Bluetooth SIG low-complexity subband codec 音频

‘truehd audio (thd)’

Dolby TrueHD 音频

‘vc1 video

SMPTE 421M / VC-1 视频

4.1.1 示例

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

由于 rawvideo muxer 不存储与尺寸和格式相关的信息,在解封装该文件时必须提供这些信息:

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

4.2 原始 PCM muxer

本节介绍原始 PCM(Pulse-Code Modulation)音频 muxer。

它们只接受与指定 codec 匹配的单个流,不存储时间戳或元数据。可识别的扩展名与 muxer 名称相同。

本节包含以下 muxer,括号中还给出了用于根据输出扩展名自动选择该 muxer 的可选附加扩展名。

‘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 Archimedes VIDC

4.3 MPEG-1/MPEG-2 节目流 muxer

本节介绍属于 MPEG-1 和 MPEG-2 Systems 家族的格式。

MPEG-1 Systems 格式(也称为 ISO/IEEC 11172-1 或 MPEG-1 节目流)已被采用为 VCD(Video Compact Disc)中存储媒体轨道的格式。

MPEG-2 Systems 标准(也称为 ISO/IEEC 13818-1)定义了两种容器格式,一种称为传输流,另一种称为节目流;本节只介绍后者。

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

本节包含以下 muxer。

‘mpeg (mpg,mpeg)’

MPEG-1 Systems / MPEG-1 节目流 muxer。

‘vcd’

MPEG-1 Systems / MPEG-1 节目流(VCD)muxer。

此 muxer 可用于生成 VCD(Video Compact Disc)存储设备所接受格式的轨道。

除少数差异外,与 ‘mpeg’ muxer 相同。

‘vob’

MPEG-2 节目流(VOB)muxer。

‘dvd’

MPEG-2 节目流(DVD VOB)muxer。

此 muxer 可用于生成 DVD(Digital Versatile Disc)存储设备所接受格式的轨道。

除少数差异外,与 ‘vob’ muxer 相同。

‘svcd (vob)’

MPEG-2 节目流(SVCD VOB)muxer。

此 muxer 可用于生成 SVCD(Super Video Compact Disc)存储设备所接受格式的轨道。

除少数差异外,与 ‘vob’ muxer 相同。

4.3.1 选项

muxrate rate

设置用户定义的封装码率,以 bits/s 为单位表示。若未指定,则使用自动计算出的封装码率。默认值为 0

preload delay

设置初始的 demux-decode 延迟,以微秒为单位。默认值为 500000

4.4 MOV/MPEG-4/ISOMBFF muxer

本节介绍属于 QuickTime / MOV 家族的格式,包括 MPEG-4 Part 14 格式和 ISO base media file format(ISOBMFF)。这些格式共享基于 ISO base media file format(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。

它包含以下 muxer。

‘3gp’

面向 3G UMTS 多媒体服务的第三代合作伙伴计划(3GPP)格式

‘3g2’

面向 3G CDMA2000 多媒体服务的第三代合作伙伴计划 2(3GP2 或 3GPP2)格式,与 ‘3gp’ 类似,但有一些扩展和限制

‘f4v’

Adobe Flash Video 格式

‘ipod’

MPEG-4 音频文件格式,与 MOV/MP4 相同,但限定只能包含音频流,通常用 Apple ipod 设备播放

‘ismv’

Microsoft IIS(Internet Information Services)Smooth Streaming Audio/Video(ISMV 或 ISMA)格式。基于 MPEG-4 Part 14 格式,带有若干不兼容的变体,用于向 Microsoft IIS 服务器流式传输媒体文件。

‘mov’

.mov 扩展名标识的 QuickTime player 格式

‘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’ muxer 都支持分段化。通常,MOV/MP4 文件会将所有数据包的元数据都存储在一个位置。

这些数据通常写在文件末尾,但可以通过在 -movflags 中添加 +faststart,或使用 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

覆盖主品牌(major brand)。

empty_hdlr_name bool

启用后跳过在 hdlr box 内写入名称。默认为 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

指定音频 profile atom 的 iods 编号(从 -1 到 255),默认为 -1

iods_video_profile profile

指定视频 profile atom 的 iods 编号(从 -1 到 255),默认为 -1

ism_lookahead num_entries

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

min_frag_duration duration

不创建时长短于 duration 微秒的分段

moov_size bytes

在文件开头为 moov atom 预留空间,而不是将 moov atom 放在文件末尾。若预留的空间不足,封装将会失败。

mov_gamma gamma

指定 gama atom 的伽马值(0 到 10 之间的十进制数),默认为 0.0,必须与 + movflags 一并设置

movflags flags

设置各类封装开关。可使用以下标志:

‘cmaf’

写出与 CMAF(Common Media Application Format)兼容的分段化 MP4 输出

‘dash’

写出与 DASH(Dynamic Adaptive Streaming over HTTP)兼容的分段化 MP4 输出

‘default_base_moof’

与 ‘omit_tfhd_offset’ 标志类似,此标志同样会避免在 tfhd atom 中写入绝对的 base_data_offset 字段,但其实现方式是改用新的 default-base-is-moof 标志。此标志是 14496-12:2012 中新增的。在某些情况下这可能使分段更易于解析(避免了根据前一个 track fragment 的隐式末尾来计算 track fragment 位置)。

‘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’

在每个视频 keyframe 处开始新的分段

‘global_sidx’

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

‘isml’

创建实时 smooth streaming feed(用于推送到发布点)

‘negative_cts_offsets’

启用 CTTS box 的版本 1,其中 CTS 偏移量可以为负。这使得首个采样的 DTS/CTS 可以为零,并减少了某些情况(例如带 B 帧的视频轨道)对编辑列表的需求。此外,还能提升与 DASH-IF 互操作性指南的一致性。

写入 ‘ismv’(Smooth Streaming)文件时会隐式设置此选项。

‘omit_tfhd_offset’

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

‘prefer_icc’

在写入 colr atom 时,若流数据包的 side data 中存在 ICC profile,则优先使用它

‘rtphint’

向输出文件添加 RTP hinting 轨道

‘separate_moof’

为每个轨道写入单独的 moof(movie fragment)atom。通常所有轨道的数据包会写入同一个 moof atom(效率略高),但设置此选项后,muxer 会为每个轨道写入一对 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

设置写入 movie header box(mvhd)中的时间刻度。范围为 1 到 INT_MAX。默认为 1000

rtpflags flags

向输出文件添加 RTP hinting 轨道。

可使用以下标志:

‘h264_mode0’

对 RTP 中的 H.264 使用 mode 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

使用 edit list(默认值为 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 内写入 bitrate box。该 box 包含解码缓冲区大小(字节)、最大比特率和平均比特率。如果这些值都无法计算,则该 box 会被跳过。默认为 -1auto,此时仅在 MP4 模式下写入该 box。

write_prft option

写入 producer time reference box(PRFT),为 PRFT box 中的 NTP 字段指定时间来源。将值设为 ‘wallclock’ 可指定时间来源为墙钟时间,设为 ‘pts’ 可指定时间来源为输入数据包的 PTS 值。

write_tmcd bool

指定 on 以强制写入 timecode 轨道,off 以禁用,auto(默认)则仅对 mov 和 mp4 输出写入 timecode 轨道。

将值设为 ‘pts’ 仅适用于实时编码场景,此时 PTS 值在源端被设置为墙钟时间。例如,某个使用 decklink 采集源的编码场景中,video_pts 和 audio_pts 被设为 ‘abs_wallclock’。

4.4.3 示例

  • 使用 ffmpeg 通过 ‘ismv’ muxer 将 Smooth Streaming 内容实时推送到 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 视频 muxer。

此 muxer 只接受单个 a64_multia64_multi5 codec 的视频流。

4.6 ac4

原始 AC-4 音频 muxer。

此 muxer 只接受单个 ac4 音频流。

4.6.1 选项

write_crc bool

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

4.7 adts

Audio Data Transport Stream muxer。

它只接受单个 AAC 流。

4.7.1 选项

write_id3v2 bool

启用后在流开头写入 ID3v2.4 标签。默认禁用。

write_apetag bool

启用后在流末尾写入 APE 标签。默认禁用。

write_mpeg2 bool

启用后将 ADTS 帧头中的 MPEG version 位设为 1,表示 MPEG-2。默认为 0,表示 MPEG-4。

4.8 aea

MD STUDIO 音频 muxer。

此 muxer 只接受单个 ATRAC1 音频流,可为单声道或双声道,采样率为 44100Hz。

由于 AEA 支持存储曲目标题,此 muxer 还会将流元数据中的标题写入 container。

4.9 aiff

Audio Interchange File Format muxer。

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 的 Lego Racers 游戏音频 muxer。

它只接受单个声道数不超过 2、采样率不超过 44100 Hz 的 ADPCM_IMA_ALP 流。

扩展名: tunpcm

4.10.1 选项

type type

设置文件类型。

type 接受以下值:

‘tun’

将文件类型设为 music。采样率必须为 22050 Hz。

‘pcm’

将文件类型设为 sfx。

‘auto’

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

4.11 amr

3GPP AMR(Adaptive Multi-Rate)音频 muxer。

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

4.12 amv

AMV(Actions Media Video)格式 muxer。

4.13 apm

Ubisoft Rayman 2 APM 音频 muxer。

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

4.14 apng

Animated Portable Network Graphics muxer。

它只接受单个 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 音频 muxer。

它只接受单个 ADPCM 音频流。

4.15.1 选项

version_major version

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

version_minor version

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

name name

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

4.16 argo_cvg

Argonaut Games CVG 音频 muxer。

它只接受单声道、采样率为 22050Hz 的单个 ADPCM 音频流。

loop 和 reverb 选项会设置头部中相应的标志,随后可以取出这些标志来相应地处理音频流。

4.16.1 选项

skip_rate_check bool

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

loop bool

设置 loop 标志(默认为 false

reverb boolean

设置 reverb 标志(默认为 true

4.17 asf, asf_stream

Advanced / Active Systems(或 Streaming)Format 音频 muxer。

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

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

4.17.1 选项

packet_size size

以字节数设置 muxer 数据包大小。通过调整此设置,可根据数据源情况减少数据碎片或 muxer 开销。默认值为 3200,最小值为 100,最大值为 64Ki

4.18 ass

ASS/SSA(SubStation Alpha)字幕 muxer。

它只接受单个 ASS 字幕流。

4.18.1 选项

ignore_readorder bool

立即写入对话事件,即使顺序有误,默认为 false,否则会缓存这些事件,直到找到预期的时间事件为止。

4.19 ast

AST(Audio Stream)muxer。

此格式用于在部分任天堂 Wii 游戏中播放音频。

它只接受单个音频流。

loopstart 和 loopend 选项可用于为支持这些选项的播放器定义文件中要循环播放的区间。

4.19.1 选项

loopstart start

以毫秒指定循环起始位置,范围为 -1INT_MAX,若设为 -1 则表示未指定循环(默认为 -1),此时 loopend 值会被忽略。

loopend end

以毫秒指定循环结束位置,范围为 0INT_MAX,默认为 0,若设为 0 则视为整个流的时长。

4.20 au

SUN AU 音频 muxer。

它只接受单个音频流。

4.21 avi

Audio Video Interleaved muxer。

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

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

4.21.1 选项

flipped_raw_rgb bool

设为 true 时,为原始 RGB 位图存储正值高度,表示位图按自下而上的方式存储。注意,此选项不会翻转位图,翻转须事先手动完成,例如使用 ‘vflip’ 滤镜。默认为 false,表示位图按自上而下的方式存储。

reserve_index_space size

为文件头内每个流的 OpenDML master index 预留指定字节数的空间。默认情况下,若第一个 master index 中空间不足,额外的 master index 会内嵌在数据包中,并以索引链的形式链接在一起。这种索引结构在某些用例中可能造成问题,例如严格依赖 OpenDML 索引规范的第三方软件,或文件定位(seeking)较慢的情况。在文件头中预留足够的索引空间可避免这些问题。

所需的索引空间取决于输出文件大小,大致应为每 GB 16 字节。若省略此选项或设为 0,则会自动估算所需的索引空间。

默认值为 0

write_channel_mask bool

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

此选项默认启用。在特定场景中禁用声道掩码可能会有用,例如将多个音频流合并为一个,以便与仅支持 AVI 中单个音频流的软件兼容(参见 (ffmpeg-filters)ffmpeg-filters 手册中的 “amerge” 一节)。

4.22 avif

AV1(Alliance for Open Media Video codec 1)图像格式 muxer。

此 muxer 存储使用 AV1 codec 编码的图像。

它接受一或两路视频流。若提供两路视频流,第二路应只包含一个存储 alpha 遮罩的 plane。

若提供多张图像,则生成的输出会被视为动态 AVIF,循环次数可通过 loop 选项指定。

这基于 Alliance for Open Media 发布的规范,网址为 https://aomediacodec.github.io/av1-avif

4.22.1 选项

loop count

动态 AVIF 的循环次数,0 表示无限循环,默认为 0

movie_timescale timescale

设置写入 movie header box(mvhd)中的时间刻度。范围为 1 到 INT_MAX。默认为 1000

4.23 avm2

ShockWave Flash(SWF)/ ActionScript Virtual Machine 2(AVM2)格式 muxer。

它接受一路音频流、一路视频流,或两者兼有。

4.24 bit

G.729(.bit)文件格式 muxer。

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

4.25 caf

Apple CAF(Core Audio Format)muxer。

它只接受单个音频流。

4.26 codec2

Codec2 音频 muxer。

它只接受单个 codec2 音频流。

4.27 chromaprint

Chromaprint 指纹生成 muxer。

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

此 muxer 将音频数据送入 Chromaprint 库,由该库为所提供的音频数据生成指纹。参见: https://acoustid.org/chromaprint

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

4.27.1 选项

algorithm version

选择用于生成指纹的算法版本。范围为 04。版本 3 会启用静音检测。默认为 1

fp_format format

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

‘base64’

Base64 压缩指纹 (默认)

‘compressed’

二进制压缩指纹

‘raw’

二进制原始指纹

silence_threshold threshold

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

使用 AcoustID 服务时必须禁用静音检测。默认值为 -1

4.28 crc

CRC(Cyclic Redundancy Check)muxer。

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

muxer 的输出由一行形如 CRC=0xCRC 的内容组成,其中 CRC 是补零至 8 位的十六进制数,表示所有已解码输入帧的 CRC。

另请参见 framecrc muxer。

4.28.1 示例

  • 使用 ffmpeg 计算输入的 CRC,并存入文件 out.crc:

    ffmpeg -i INPUT -f crc out.crc
    
  • 使用 ffmpeg 通过以下命令将 CRC 打印到 stdout:

    ffmpeg -i INPUT -f crc -
    
  • 可以通过 ffmpeg 指定音频和视频 codec 与格式,来选择每帧的输出格式。例如,要计算转换为 PCM unsigned 8-bit 的输入音频,以及转换为 MPEG-2 video 的输入视频的 CRC,使用以下命令:

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

4.29 dash

Dynamic Adaptive Streaming over HTTP(DASH)muxer。

此 muxer 按照 MPEG-DASH 标准 ISO/IEC 23009-1:2014 及后续标准更新创建分段和清单文件。

更多信息请参见:

此 muxer 会为每路流创建一个 MPD(Media Presentation Description)清单文件和分段文件。分段文件与 MPD 清单文件放在同一目录下。

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

可用的标识符有 $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 定义 descriptor。

例如:

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

descriptor 字符串应为自闭合的 XML 标签。

frag_duration

覆盖用 frag_duration 选项指定的全局分段时长。

frag_type

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

seg_duration

覆盖用 seg_duration 选项指定的全局分段时长。

trick_id

将某个自适应集标记为包含用于所引用自适应集 Trick Mode 的流。

以下是 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 分段文件格式将根据流 codec 选择。这是默认模式。

‘mp4’

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

‘webm’

DASH 分段文件将采用 WebM 格式

extra_window_size size

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

format_options options_list

使用以 : 分隔的 key=value 参数列表,设置 container 格式(mp4/webm)选项。包含 : 特殊字符的值须转义。

frag_duration duration

设置分段内各片段的时长(秒),可设置小数值。

frag_type type

设置分段化的时间间隔类型。

可选值:

‘auto’

每个分段设置一个片段

‘every_frame’

在每一帧处分片段

‘duration’

按固定的时间间隔分片段

‘pframes’

在 keyframe 及随后的 P 帧重排序处分片段(仅视频,实验性功能)

global_sidx bool

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

hls_master_name file_name

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

hls_playlist bool

生成 HLS 播放列表文件。主播放列表以 hls_master_name 选项指定的文件名生成。每路流会生成一个媒体播放列表文件,文件名为 media_0.m3u8、media_1.m3u8 等。

http_opts http_opts

指定传给底层 HTTP 协议的、以 : 分隔的 key=value 选项列表。仅适用于 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

通过限制部分元素的出现和取值,启用 Low-latency Dash。默认禁用。

lhls bool

启用 Low-latency HLS(LHLS)。为当前分段的 URI 添加 #EXT-X-PREFETCH 标签。hls.js 播放器方面正尝试将其标准化为开放的 LHLS 规范。草案规范见 https://github.com/video-dev/hlsjs-rfcs/blob/lhls-spec/proposals/0001-lhls.md

此选项试图与上述开放规范保持一致。它会自动启用 streaming 和 hls_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 清单 profile。

可选值:

‘dash’

MPEG-DASH ISO Base media file format live profile

‘dvb_dash’

DVB-DASH profile

默认值为 dash

remove_at_exit bool

结束时启用或禁用删除所有分段。默认禁用。

seg_duration duration

设置分段长度(秒,可设置小数值)。当启用 use_template 选项且禁用 use_timeline 选项时,该值被视为平均分段时长;在其他所有用例中则视为最小分段时长。

默认值为 5

single_file bool

启用或禁用将所有分段存储在单个文件中、通过字节范围访问的方式。默认禁用。

单文件的名称可通过 single_file_name 选项指定,若未指定则采用清单文件的基名加输出格式扩展名。

single_file_name file_name

用于 MPD baseURL 元素的 DASH 模板名称。指定此项即隐含将 single_file 选项设为 true。模板中,$ext$ 会替换为该分段格式对应的文件扩展名。

availability_start_time_ms milliseconds

以 Unix 纪元毫秒数设置 MPD availabilityStartTime 属性。若设为 0,则在写入第一个数据包时使用墙钟时间。这对于需要在重启后保持稳定可用起始时间的直播输出很有用。

streaming bool

启用或禁用输出的分块流式(chunk streaming)模式。在分块流式模式下,每一帧都会是构成一个分块的 moof 片段。默认禁用。

suggested_presentation_delay duration

设置 MPD suggestedPresentationDelay 属性。若设为 0,则使用最后一个分段的时长。

target_latency target_latency

设置服务所面向的目标延迟(秒,可设置小数值)。仅在启用 streaming 和 write_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 元素。这也会在底层 muxer 中启用写入 prft box。仅在启用 utc_url 选项时适用。默认设为 auto,此时 muxer 只会在需要时尝试启用它。

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 音频 muxer。

它接受使用 ‘pcm_24daud’ codec 编码、重采样至 96000 Hz 的单路 6 声道音频流。

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(Digital Video)muxer。

它恰好接受一路 ‘dvvideo’ 视频流,以及最多两路 ‘pcm_s16’ 音频流。其余约束由视频的属性以及帧率决定:视频必须对应受支持的 DV 视频 profile。

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 元数据 muxer。

该 muxer 以 ‘ffmetadata’ 格式写入流的元数据。

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

4.32.1 示例

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

ffmpeg -i INPUT -f ffmetadata metadata.ffmeta

4.33 fifo

FIFO(First-In First-Out)muxer。

‘fifo’ 伪 muxer 通过使用先进先出队列,并在单独的线程中运行实际的 muxer,实现了编码与封装的分离。

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

目标 muxer 既可以根据输出名称选择,也可以通过 fifo_format 选项指定。

当队列写满,或输出失败(例如数据包无法写入输出)时,‘fifo’ muxer 的行为可以选择:

  • 可以根据实时时间或已处理流的时间,通过可配置的重试间隔延迟,透明地重新启动输出。
  • 编码过程可以在临时失败期间被阻塞,也可以在 FIFO 队列写满时透明地丢弃数据包并继续运行。

API 用户应当注意,其 AVFormatContext 内使用的回调函数(interrupt_callbackio_openio_close)必须是线程安全的。

4.33.1 选项

attempt_recovery bool

发生失败时,尝试恢复输出。这在与网络输出一起使用时尤其有用,因为它使透明地重新启动流媒体传输成为可能。默认情况下,此选项设为 false

drop_pkts_on_overflow bool

若设为 true,则当 fifo 队列写满时,会丢弃数据包,而不是阻塞 encoder。这使得可以在不延迟输入的情况下继续流式传输,但代价是会遗漏部分流内容。默认情况下此选项设为 false,此时 encoder 会被阻塞,直到 muxer 处理了部分数据包为止,不会丢失任何数据包。

fifo_format format_name

指定格式名称。当无法从输出名称的后缀猜测格式时有用。

format_opts options

为底层 muxer 指定格式选项。muxer 选项可以指定为以 ’:’ 分隔的 key=value 列表。

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

指定从队列溢出或失败中恢复后,是否等待 keyframe。此选项默认设为 false

timeshift duration

缓冲指定数量的数据包,并延迟写入输出。注意,queue_size 选项的值必须足够大,才能存储用于 timeshift 的数据包。输入结束时,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)muxer。

该格式曾作为若干 Sega 游戏的内部格式使用。

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

它最多接受一路 ‘cinepak’ 或 raw 视频流,以及最多一路音频流。

4.35 filmstrip

Adobe Filmstrip muxer。

该格式被若干 Adobe 工具用于存储生成的 filmstrip 导出内容。它接受单路 raw 视频流。

4.36 fits

Flexible Image Transport System(FITS)muxer。

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

有关该格式的详细信息,请访问 https://fits.gsfc.nasa.gov

4.37 flac

Raw FLAC 音频 muxer。

该 muxer 恰好接受一路 FLAC 音频流。此外,还可以添加 disposition 为 ‘attached_pic’ 的图像。

4.37.1 选项

write_header bool

若设为 true 则写入文件头,默认值为 true

4.37.2 示例

使用 ffmpeg 存储输入文件中的音频流,并附带若干以 ‘attached_pic’ disposition 使用的图片:

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 Video Format muxer。

4.38.1 选项

flvflags flags

可选值:

‘aac_seq_header_detect’

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

‘no_sequence_end’

禁用序列结束标签。

‘no_metadata’

禁用元数据标签。

‘no_duration_filesize’

当流结束时时长和文件大小的元数据均为零时,禁用它们。(用于不可定位的直播流)。

‘add_keyframe_index’

用于便于定位(seeking),尤其是在 HTTP 伪流场景下。

4.39 framecrc

逐包 CRC(Cyclic Redundancy Check,循环冗余校验)测试格式。

该 muxer 会为每个音频和视频数据包计算并打印 Adler-32 CRC。默认情况下,在计算 CRC 之前,音频帧会被转换为有符号 16 位 raw 音频,视频帧会被转换为 raw 视频。

该 muxer 的输出由每个音频和视频数据包各一行组成,格式为:

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

CRC 是一个用 0 补齐到 8 位的十六进制数,表示该数据包的 CRC。

4.39.1 示例

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

ffmpeg -i INPUT -f framecrc out.crc

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

ffmpeg -i INPUT -f framecrc -

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

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

另请参阅 crc muxer。

4.40 framehash

逐包哈希测试格式。

该 muxer 会为每个音频和视频数据包计算并打印加密哈希值,可用于逐包相等性检查,而无需对每个数据包分别进行二进制比较。

默认情况下,在计算哈希值之前,音频帧会被转换为有符号 16 位 raw 音频,视频帧会被转换为 raw 视频,但也可以使用显式转换为其他 codec 后的输出。默认使用 SHA-256 加密哈希函数,但也支持其他几种算法。

该 muxer 的输出由每个音频和视频数据包各一行组成,格式为:

stream_index, packet_dts, packet_pts, packet_duration, packet_size, hash

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

hash algorithm

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

4.40.1 示例

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

ffmpeg -i INPUT -f framehash out.sha256

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

ffmpeg -i INPUT -f framehash -hash md5 -

另请参阅 hash muxer。

4.41 framemd5

逐包 MD5 测试格式。

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

4.41.1 示例

要计算 INPUT 中转换为 raw 音频和视频数据包后的音频和视频帧的 MD5 哈希值,并将其存储到 out.md5 文件中:

ffmpeg -i INPUT -f framemd5 out.md5

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

ffmpeg -i INPUT -f framemd5 -

另请参阅 framehash 和 md5 muxer。

4.42 gif

动画 GIF muxer。

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

4.42.1 选项

loop bool

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

final_delay delay

强制设置最后一帧之后的延迟(以厘秒表示)。每一帧结束时都有一段延迟,直至下一帧。默认值为 -1,这是一个特殊值,用于告知 muxer 复用前一个延迟值。在循环的情况下,你可能希望自定义该值,例如用来标记一段暂停。

4.42.2 示例

编码一个循环 10 次的 gif,循环之间的延迟为 5 秒:

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

注 1:如果你希望将帧提取为单独的 GIF 文件,需要强制使用 image2 muxer:

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

4.43 gxf

General eXchange Format(GXF)muxer。

GXF 最初由 Grass Valley Group 开发,随后由 SMPTE 标准化为 SMPTE 360M,并在 SMPTE RDD 14-2007 中进行扩展,加入了高清视频分辨率支持。

它最多接受一路视频流,其 codec 为 ‘mjpeg’、‘mpeg1video’、‘mpeg2video’ 之一,或为分辨率是 ‘512x480’ 或 ‘608x576’ 的 ‘dvvideo’;以及若干路速率为 48000Hz、codec 为 ‘pcm16_le’ 的音频流。

4.44 hash

哈希测试格式。

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

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

该 muxer 的输出由单独一行组成,格式为 algo=hash,其中 algo 是表示所用哈希函数的简短字符串,hash 是表示所计算哈希值的十六进制数。

hash algorithm

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

4.44.1 示例

要计算转换为 raw 音频和视频后的输入的 SHA-256 哈希值,并将其存储到 out.sha256 文件中:

ffmpeg -i INPUT -f hash out.sha256

要将 MD5 哈希值打印到 stdout,请使用以下命令:

ffmpeg -i INPUT -f hash -hash md5 -

另请参阅 framehash muxer。

4.45 hds

HTTP Dynamic Streaming(HDS)muxer。

HTTP dynamic streaming(即 HDS)是 Adobe 开发的一种自适应比特率流媒体传输方法。HDS 通过 HTTP 连接传输 MP4 视频内容,可用于点播或直播。

该 muxer 会创建一个 .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 muxer,根据 HTTP Live Streaming(HLS)规范对 MPEG-TS 进行分段。

它会创建一个播放列表文件,以及一个或多个分段文件。输出文件名即为播放列表的文件名。

默认情况下,该 muxer 会为生成的每个分段创建一个文件。这些文件与播放列表同名,后跟一个序号和 .ts 扩展名。

请务必在编码时要求使用 closed GOP,并将 GOP 大小设置为与分段时长限制相匹配。

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

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

该示例会生成播放列表 out.m3u8,以及分段文件 out0.ts、out1.ts、out2.ts 等。

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

4.46.1 选项

hls_init_time duration

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

duration 必须是一个时间长度规范,参见 (ffmpeg-utils)ffmpeg-utils(1) 手册中的时间长度一节

在第一个 m3u8 列表中,经过这段时间后,会在下一个 keyframe 处切分分段。初始播放列表填满后,ffmpeg 会以等于 hls_time 的时长切分分段。

hls_time duration

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

duration 必须是一个时间长度规范,参见 (ffmpeg-utils)ffmpeg-utils(1) 手册中的时间长度一节。经过这段时间后,会在下一个 keyframe 处切分分段。

hls_list_size size

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

hls_delete_threshold size

设置在 hls_flags delete_segments 删除未被引用的分段之前,保留在磁盘上的未引用分段数量。增大该值可以让客户端继续下载最近曾在播放列表中被引用过的分段。默认值为 1,意味着早于 hls_list_size+1 的分段会被删除。

hls_start_number_source source

根据指定的 source 来确定播放列表序列号(#EXT-X-MEDIA-SEQUENCE)的起始值。除非设置了 hls_flags single_file,否则它也用于指定分段和字幕文件名起始序号的来源。无论哪种情况,若设置了 hls_flags append_list 且读取到的播放列表序列号大于指定的起始序列号,则会使用该读取到的值作为起始值。

可接受的值有:

generic (default)

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

epoch

将起始编号设置为自 epoch(1970-01-01 00:00:00)起经过的秒数。

epoch_us

将起始编号设置为自 epoch(1970-01-01 00:00:00)起经过的微秒数。

datetime

根据当前日期/时间,以 YYYYmmddHHMMSS 的形式设置起始编号,例如 20161231235759。

start_number number

当 hls_start_number_source 的值为 generic(这是默认情况)时,播放列表序列号(#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

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

例如:

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

将生成播放列表 out.m3u8,以及分段文件 file000.ts、file001.ts、file002.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.ts、file_0_001.ts、file_0_002.ts 等,以及 file_1_000.ts、file_1_001.ts、file_1_002.ts 等。

字符串 "%v" 可以出现在 filename 中,也可以出现在包含该文件的最后一级目录名中,但只能出现在其中之一。(此外,%v 可以在最后一级子目录或 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 'vs%v/file_%03d.ts' vs%v/out.m3u8

将生成播放列表的分段文件集: vs0/file_000.ts、vs0/file_001.ts、vs0/file_002.ts 等,以及 vs1/file_000.ts、vs1/file_001.ts、vs1/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.ts、file-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.ts、file-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.ts、20160215/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.ts、2016/02/15/file-20160215-1455569024.ts 等。

hls_segment_options options_list

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

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 加密。启用后,生成的每个分段都会被加密,加密密钥会保存为 playlist name.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 Transport Stream 格式输出分段文件。这与所有 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

将生成类似 1602678741_init.mp4 的 init 文件。

hls_fmp4_init_resend bool

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

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

hls_flags flags

可选值:

‘single_file’

若设置了该 flag,muxer 会将所有分段存储在单个 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’

当播放列表包含视频分段,且该播放列表的所有分段都保证以 keyframe 开始时,为其添加 #EXT-X-INDEPENDENT-SEGMENTS 标签。

‘iframes_only’

为包含视频分段、且只能在 #EXT-X-BYTERANGE 模式下播放 I 帧的播放列表添加 #EXT-X-I-FRAMES-ONLY 标签。

‘split_by_time’

允许分段从非 keyframe 的帧开始。这可以改善某些播放器在 keyframe 间隔不一致时的表现,但也可能使另一些播放器的表现变差,并可能在定位(seeking)时引发一些异常。该 flag 应与 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.ts、segment_20170102194334_0004_00120072_0000003000000.ts 等。

‘temp_file’

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

提供分段服务的 Web 服务器可以配置为拒绝对 *.tmp 的请求,以防止在分段被添加到 m3u8 播放列表之前访问正在处理中的分段。

该 flag 也会影响 m3u8 播放列表文件的创建方式。若设置了该 flag,所有播放列表文件都会先写入一个临时文件,并在完成后重命名,处理方式与分段类似。但对于使用 file 协议、且 hls_playlist_type 类型不是 ‘vod’ 的播放列表,无论是否设置该 flag,都始终会先写入临时文件。

如果 master_pl_publish_rate 的值不为零,那么使用 file 协议、通过 master_pl_name 指定的主播放列表文件(若存在),无论是否设置该 flag,都始终会写入临时文件。

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 method 创建 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" 可以出现在 filename 中,也可以出现在包含该文件的最后一级目录名中。如果该字符串出现在目录名中,则会在目录名模式展开后创建子目录。这样便可以在子目录中创建变体流。

下面给出几个示例。

  • 创建两个 hls 变体流。第一个变体流将包含比特率为 1000k 的视频流和比特率为 64k 的音频流,第二个变体流将包含比特率为 256k 的视频流和比特率为 32k 的音频流。此处会创建两个媒体播放列表,文件名分别为 out_0.m3u8 和 out_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.m3u8 和 out_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.m3u8、out_1.m3u8 和 out_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

指定不同隐藏式字幕组及其属性的 map 字符串。各隐藏式字幕流组之间以空格分隔。

期望的字符串格式类似于 "ccgroup:,instreamid:,language: ...."。’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

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

ignore_io_errors bool

忽略打开、写入和删除过程中的 IO 错误。适用于使用网络输出的长时间运行场景。

headers headers

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

4.47 iamf

Immersive Audio Model and Formats (IAMF) muxer。

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

该格式由 Alliance for Open Media 推动和设计。

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

4.48 ico

ICO 文件 muxer。

Microsoft 的图标文件格式(ICO)有一些需要注意的严格限制:

  • 尺寸在任何维度上都不能超过 256 像素
  • 只能存储 BMP 和 PNG 图像
  • 如果使用 BMP 图像,必须是以下 pixel format 之一:

    BMP Bit Depth      FFmpeg Pixel Format
    1bit               pal8
    4bit               pal8
    8bit               pal8
    16bit              rgb555le
    24bit              bgr24
    32bit              bgra
    
  • 如果使用 BMP 图像,必须使用 BITMAPINFOHEADER DIB 头

  • 如果使用 PNG 图像,必须使用 rgba pixel format

4.49 ilbc

Internet Low Bitrate Codec (iLBC) raw muxer。

只接受单个 ‘ilbc’ 音频流。

4.50 image2, image2pipe

图像文件 muxer。

‘image2’ muxer 将视频帧写入图像文件。

输出文件名通过模式指定,可用于生成一系列按顺序编号的文件。模式中可以包含字符串 "%d" 或 "%0Nd",该字符串指定文件名中表示编号的字符所在的位置。如果使用 "%0Nd" 形式,每个文件名中表示编号的字符串会被补零到 N 位。字面字符 ’%’ 可以在模式中用字符串 "%%" 表示。

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

模式中可以包含用于自动判断待写入图像文件格式的后缀。

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

该图像 muxer 支持 .Y.U.V 图像文件格式。这种格式的特殊之处在于,每个图像帧由 YUV420P 各分量对应的三个文件组成。要读写这种图像文件格式,需指定 ’.Y’ 文件的名称。muxer 会根据需要自动打开 ’.U’ 和 ’.V’ 文件。

‘image2pipe’ muxer 接受与 ‘image2’ muxer 相同的选项,但会忽略模式验证和展开,因为它假定写入的是命令输出而非实际保存的文件。

4.50.1 选项

frame_pts bool

设为 1 时,用数据包的 PTS(presentation time stamp)展开文件名。默认值为 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.jpeg、img-002.jpeg、…… 一系列文件:
    ffmpeg -i in.avi -fps_mode cfr -r 1 -f image2 'img-%03d.jpeg'
    

请注意,使用 ffmpeg 时,如果不通过 -f 选项指定格式,且输出文件名指定了图像文件格式,则会自动选择 image2 muxer,因此前面的命令可以写成:

    ffmpeg -i in.avi -fps_mode 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 Sound Filesystem (BICSF) 格式的 muxer。

Berkeley/IRCAM/CARL Sound Format 开发于 20 世纪 80 年代,是对此前多种不同声音文件格式和系统进行整合的成果,其中包括 UC San Diego 的 Computer Audio Research Lab(CARL)由 Dr Gareth Loy 开发的 csound 系统、巴黎 Institut de Recherche et Coordination Acoustique / Musique 由 Rob Gross 和 Dan Timis 开发的 IRCAM 声音文件系统,以及 Berkeley Fast Filesystem。

它最初是作为 Berkeley/IRCAM/CARL Sound Filesystem 的一部分开发的,这是一套旨在为运行于 Berkeley UNIX 上的音频应用实现文件系统的程序。它在学术音乐研究中心中尤其流行,并多次被用于早期计算机生成作品的创作。

此 muxer 只接受包含 PCM 数据的单个音频流。

4.52 ivf

On2 IVF muxer。

IVF 由 On2 Technologies(原名 Duck Corporation)开发,用于存储其内部开发的 codec。

此 muxer 只接受单个 ‘vp8’、‘vp9’ 或 ‘av1’ 视频流。

4.53 jacosub

JACOsub 字幕格式的 muxer。

此 muxer 只接受单个 ‘jacosub’ 字幕流。

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

4.54 kvag

Simon & Schuster Interactive VAG muxer。

一些 Simon & Schuster Interactive 的游戏使用这种自定义的 VAG container,例如 "Real War" 和 "Real War: Rogue States"。

此 muxer 只接受单个 ‘adpcm_ima_ssi’ 音频流。

4.55 lc3

Bluetooth SIG Low Complexity Communication Codec audio(LC3),或 ETSI TS 103 634 Low Complexity Communication Codec plus(LC3plus)。

此 muxer 只接受单个 ‘lc3’ 音频流。

4.56 lrc

LRC 歌词文件格式的 muxer。

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

此 muxer 只接受单个 ‘subrip’ 或 ‘text’ 字幕流。

4.56.1 选项

precision number

设置时间戳小数(秒以下)部分使用的小数位数。范围为 16。默认值为 2,即厘秒。

4.56.2 元数据

以下元数据标签会转换为该格式对应的元数据:

title album artist author creator encoder encoder_version

如果未显式设置 ‘encoder_version’,会自动设置为 libavformat 的版本。

4.57 matroska

Matroska container 的 muxer。

此 muxer 实现了 matroska 和 webm 的 container 规范。

4.57.1 元数据

此 muxer 可识别的元数据设置如下:

title

设置提供给单个轨道的标题名称。对于作为附件写入的流,这会映射到 FileDescription 元素。

language

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

语言可以是 3 个字母的文献用 ISO-639-2(ISO 639-2/B)形式(例如法语的 "fre"),也可以是语言代码与国家代码组合而成、用于表示语言特殊变体的形式(例如加拿大法语的 "fre-ca")。

stereo_mode

设置单个视频轨道中两个视点的立体 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’

所有帧均为可通过红青滤色片观看的 anaglyph 格式

‘right_left’

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

‘anaglyph_green_magenta’

所有帧均为可通过绿品红滤色片观看的 anaglyph 格式

‘block_lr’

两眼交织在一个 Block 中,左眼视点在前

‘block_rl’

两眼交织在一个 Block 中,右眼视点在前

例如,可以使用以下命令行创建 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

默认情况下,此 muxer 会将用于定位的索引(Matroska 术语中称为 cues)写在文件末尾,因为它无法事先知道应在文件开头为索引预留多少空间。但在某些场景下——例如可以定位但速度较慢的流媒体——把索引放在文件开头会更有用。

如果将此选项设置为非零值,muxer 会在文件头中预留 size 字节的空间,并在封装完成时尝试将 cues 写入其中。如果预留的空间不够,Cues 将不会被写入,文件会被完成(finalize),并且写入 trailer 时会返回错误。对大多数场景而言,安全的大小约为每小时视频 50kB。

请注意,cues 只有在输出可定位时才会写入;如果不可定位,此选项不起作用。

cues_to_front bool

设置后,muxer 会在必要时移动主数据,将索引写在文件开头。这可以与 reserve_index_space 组合使用,此时只有在最初预留的空间不足时才会移动数据。

如果输出不可定位,此选项将被忽略。

cluster_size_limit size

每个 cluster 中最多存储指定的字节数。

如果未指定,该限制会自动设为一个合理的硬编码固定值。

cluster_time_limit duration

每个 cluster 中最多存储指定的毫秒数。

如果未指定,该限制会自动设为一个合理的硬编码固定值。

dash bool

创建符合 WebM DASH 规范的 WebM 文件。默认设置为 false

dash_track_number index

DASH 流的轨道编号。默认设置为 1

live bool

按直播流的方式写入文件。默认设置为 false

allow_raw_vfw bool

允许 raw VFW 模式。默认设置为 false

flipped_raw_rgb bool

设为 true 时,为 raw RGB 位图存储正的高度值,表示位图按自下而上的方式存储。请注意,此选项并不会翻转位图,翻转必须事先手动完成,例如使用 ‘vflip’ 滤镜。默认为 false,表示位图按自上而下的方式存储。

write_crc32 bool

在每个 Level 1 元素内部写入一个 CRC32 元素。默认设置为 true。此选项对 WebM 无效。

default_mode mode

控制如何设置输出轨道的 FlagDefault。这会影响播放器默认应播放哪些轨道。默认模式为 ‘passthrough’。

‘infer’

disposition 为 default 的每个轨道都会设置 FlagDefault。此外,对于每种类型的轨道(音频、视频或字幕),如果不存在该类型 disposition 为 default 的轨道,则该类型的第一个轨道(如果存在)会被标记为 default。这确保了即使输入源自没有 default 轨道概念的 container,default 标志也能以合理的方式被设置。

‘infer_no_subs’

此模式与 infer 相同,区别在于如果不存在 disposition 为 default 的字幕轨道,则不会有任何字幕轨道被标记为 default。

‘passthrough’

在此模式下,只有当对应流的 disposition 中设置了 AV_DISPOSITION_DEFAULT 标志时,FlagDefault 才会被设置。

4.58 md5

MD5 测试格式。

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

另请参阅 hash 和 framemd5 muxer。

4.58.1 示例

  • 计算将输入转换为 raw 音频和视频后的 MD5 哈希值,并存储到文件 out.md5 中:

    ffmpeg -i INPUT -f md5 out.md5
    
  • 将 MD5 哈希值输出到标准输出:

    ffmpeg -i INPUT -f md5 -
    

4.59 mcc

用于 MacCaption MCC 文件的 muxer,支持 MCC 1.0 和 2.0 版本。MCC 文件存储 VANC 数据,其中可以包含 closed caption(EIA-608 和 CEA-708)、辅助时间码、pan-scan 数据等。

4.59.1 选项

muxer 的选项如下:

override_time_code_rate

覆盖输出中的 Time Code Rate 值。默认会尝试从流的 time_base 推断,但这通常不奏效。

use_u_alias

对字节序列 E1h 00h 00h 00h 使用 U 别名。默认禁用,因为部分 .mcc 文件在该序列有 2 个还是 3 个零字节上存在分歧。

mcc_version

MCC 文件格式的版本。必须是 1 或 2,默认为 2。

creation_program

创建程序。默认值为当前版本的 FFmpeg。

creation_time

创建时间。默认值为当前时间。

4.59.2 示例

  • 从 MXF 文件中提取一个 MXF SMPTE_436M_ANC 流,并以 30 fps 写入一个 MCC 文件。

    ffmpeg -i input.mxf -c copy -map 0:d -override_time_code_rate 30 out.mcc
    
  • 从 .mp4 文件中提取 EIA-608/CTA-708 closed caption,并以 29.97 fps 写入一个 MCC 文件。

    ffmpeg -f lavfi -i "movie=input.mp4[out+subcc]" -c:s copy -map 0:s -override_time_code_rate 30000/1001 out.mcc
    

4.60 microdvd

MicroDVD 字幕格式的 muxer。

此 muxer 只接受单个 ‘microdvd’ 字幕流。

4.61 mmf

Synthetic music Mobile Application Format(SMAF)格式的 muxer。

SMAF 是 Yamaha 为手机、个人数字助理等便携式电子设备制定的音乐数据格式。

此 muxer 只接受单个 ‘adpcm_yamaha’ 音频流。

4.62 mp3

MP3 muxer 写出 raw MP3 流,并具备以下可选功能:

  • 开头的 ID3v2 元数据头(默认启用)。支持 2.3 和 2.4 版本,id3v2_version 私有选项用于控制使用哪个版本(3 或 4)。将 id3v2_version 设为 0 会完全禁用 ID3v2 头。

此 muxer 支持将附加图片(APIC 帧)写入 ID3v2 头。图片以只含单个数据包的视频流形式提供给 muxer。此类流可以有任意数量,每个流对应一个 APIC 帧。流的元数据标签 title 和 comment 分别映射到 APIC 的 description 和 picture type。允许的 picture type 请参阅 http://id3.org/id3v2.4.0-frames

请注意,APIC 帧必须写在开头,因此 muxer 会缓冲音频帧,直到获得全部图片为止。因此建议尽早提供图片,以避免过度缓冲。

  • 紧随 ID3v2 头(如果存在)之后的 Xing/LAME 帧。默认启用,但只有在输出可定位时才会写入。可以使用 write_xing 私有选项禁用它。该帧包含一些可能对 decoder 有用的信息,例如音频时长或 encoder 延迟。
  • 文件末尾的旧式 ID3v1 标签(默认禁用)。可以通过 write_id3v1 私有选项启用,但由于其功能非常有限,不建议使用。

示例:

写出带 ID3v2.3 头和 ID3v1 footer 的 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.63 mpegts

MPEG 传输流的 muxer。

此 muxer 实现了 ISO 13818-1 和 ETSI EN 300 468 的部分内容。

mpegts muxer 可识别的元数据设置是 service_providerservice_name。如果未设置,service_provider 的默认值为 ‘FFmpeg’,service_name 的默认值为 ‘Service01’。

4.63.1 选项

muxer 的选项如下:

mpegts_transport_stream_id integer

设置 ‘transport_stream_id’。用于标识 DVB 中的一个转发器。默认值为 0x0001

mpegts_original_network_id integer

设置 ‘original_network_id’。这是 DVB 中网络的唯一标识符。其主要用途是通过 ‘Original_Network_ID, Transport_Stream_ID’ 这一路径唯一地标识一项服务。默认值为 0xff01

mpegts_service_id integer

设置 ‘service_id’,在 DVB 中也称为 program。默认值为 0x0001

mpegts_service_type integer

设置 program 的 ‘service_type’。默认值为 digital_tv。接受以下选项:

‘hex_value’

ETSI 300 468 中定义的 0x010xff 之间的任意十六进制值。

‘digital_tv’

数字电视服务。

‘digital_radio’

数字广播服务。

‘teletext’

图文电视(teletext)服务。

‘advanced_codec_digital_radio’

Advanced Codec 数字广播服务。

‘mpeg2_digital_hdtv’

MPEG2 数字高清电视服务。

‘advanced_codec_digital_sdtv’

Advanced Codec 数字标清电视服务。

‘advanced_codec_digital_hdtv’

Advanced Codec 数字高清电视服务。

‘hevc_digital_hdtv’

HEVC 数字电视服务。

mpegts_pmt_start_pid integer

设置 PMT 的起始 PID。默认值为 0x1000,最小值为 0x0020,最大值为 0x1ffa。在 PMT PID 固定为 0x0100 的 m2ts 模式下,此选项不起作用。

mpegts_start_pid integer

为基本流设置起始 PID。默认值为 0x0100,最小值为 0x0020,最大值为 0x1ffa。在基本流 PID 被固定的 m2ts 模式下,此选项不起作用。

mpegts_m2ts_mode boolean

设为 1 时启用 m2ts 模式。默认值为 -1,即禁用 m2ts 模式。

muxrate integer

设置固定的 muxrate。默认为 VBR。

pes_payload_size integer

以字节为单位设置 PES 数据包的最小负载量。默认值为 2930

mpegts_flags flags

设置 mpegts 标志。接受以下选项:

‘resend_headers’

在写入下一个数据包之前重新发送 PAT/PMT。

‘latm’

对 AAC 使用 LATM 打包方式。

‘pat_pmt_at_frames’

每个视频帧都重新发送 PAT 和 PMT。

‘system_b’

遵循 System B(DVB)而非 System A(ATSC)。

‘initial_discontinuity’

将每个流的第一个数据包标记为 discontinuity。

‘nit’

发送 NIT 表。

‘omit_rai’

禁止写入 random access indicator。

mpegts_copyts boolean

值设为 1 时保留原始时间戳。默认值为 -1,此时会对时间戳进行偏移,使其从 0 开始。

omit_video_pes_length boolean

省略视频数据包的 PES 数据包长度。默认值为 1(true)。

pcr_period integer

以毫秒为单位覆盖默认的 PCR 重传时间。默认值为 -1,表示 PCR 间隔会自动确定:CBR 流使用 20 ms,VBR 流使用小于 100 ms 的、帧时长的最大整数倍。

pat_period duration

以秒为单位设置 PAT/PMT 表之间的最大间隔时间。默认值为 0.1

sdt_period duration

以秒为单位设置 SDT 表之间的最大间隔时间。默认值为 0.5

nit_period duration

以秒为单位设置 NIT 表之间的最大间隔时间。默认值为 0.5

tables_version integer

设置 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.63.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.64 mxf, mxf_d10, mxf_opatom

MXF muxer。

4.64.1 选项

muxer 的选项如下:

store_user_comments bool

设置在用户注释可用时是否存储,或者是否始终不存储。IRT D-10 不允许用户注释。因此默认情况下,mxf 和 mxf_opatom 会写入用户注释,而 mxf_d10 不会

4.65 null

Null muxer。

此 muxer 不生成任何输出文件,主要用于测试或基准测试。

例如,要用 ffmpeg 对解码进行基准测试,可以使用以下命令:

ffmpeg -benchmark -i INPUT -f null out.null

请注意,上面的命令不会读写 out.null 文件,但指定输出文件是 ffmpeg 语法所要求的。

也可以将该命令写成:

ffmpeg -benchmark -i INPUT -f null -

4.66 nut

-syncpoints flags

更改 nut 中 syncpoint 的使用方式:

default 使用普通的低开销定位辅助方式。 none 完全不使用 syncpoint,可降低开销,但会使流变得不可定位;

不建议使用此选项,因为生成的文件对损坏非常敏感,且无法定位。此外,syncpoint 带来的开销通常可以忽略不计。请注意,可以使用 -write_index 0 禁用所有不断增长的数据表,从而在内存有限的情况下封装无限长的流,且不存在上述缺点。

timestamped 用一个 wallclock 字段扩展 syncpoint。

none 和 timestamped 标志是实验性的。

-write_index bool

在末尾写入索引,默认会写入索引。

ffmpeg -i INPUT -f_strict experimental -syncpoints none - | processor

4.67 ogg

Ogg container 的 muxer。

-page_duration duration

首选的 page 时长,以微秒为单位。muxer 会尝试创建长度约为 duration 微秒的 page。这让用户可以在定位粒度和 container 开销之间做出取舍。默认值为 1 秒。值为 0 时会填满所有 segment,使 page 尽可能大。值为 1 时,在多数情况下实际上每个 page 只包含 1 个数据包,以额外的 container 开销为代价换取更精细的定位粒度。

-serial_offset value

用于设置流序列号的起始序列值。将其设为足够大且各不相同的值,可以确保生成的 ogg 文件能够安全地被链接(chain)。

4.68 pdv

Playdate Video muxer。

此 muxer 写出 Panic 公司 Playdate SDK 所使用的 Playdate 视频 container。它需要可定位的输出,以及单个 PDV 视频流。

max_frames frames

在文件头中为最多 frames 个视频帧预留空间。此选项为必填项。

4.69 rcwt

RCWT(Raw Captions With Time)是 ccextractor(一款用于处理 608/708 closed caption(CC)源的常用开源工具)原生使用的格式。它可用于归档原始提取出的 CC bitstream,也可用于生成供后续处理或转换使用的源文件。该格式实现了 ccextractor 与 FFmpeg 之间的互操作性,解析简单,并可用于为 CC 呈现内容创建备份。

此 muxer 实现了截至 2024 年 3 月的规范,该规范自 2014 年 4 月以来一直保持稳定、未曾更改。

此 muxer 在封装 RCWT 的方式上与 ccextractor 存在一些细微差异。到目前为止,尚未因此观察到用 ccextractor 处理其输出时出现兼容性问题,但效果可能因情况而异,输出也不会与 ccextractor 逐位一致。

可以在这里找到 RCWT 的免费规范:https://github.com/CCExtractor/ccextractor/blob/master/docs/BINARY_FILE_FORMAT.TXT

4.69.1 示例

  • 使用 lavfi 将 closed caption 提取为 RCWT:
    ffmpeg -f lavfi -i "movie=INPUT.mkv[out+subcc]" -map 0:s:0 -c:s copy -f rcwt CC.rcwt.bin
    

4.70 segment, stream_segment, ssegment

基本的流分段器。

此 muxer 将流输出为若干个时长几乎固定的独立文件。输出文件名模式可以按照与 image2 类似的方式设置,若启用了 strftime 选项,也可以使用 strftime 模板。

stream_segment 是此 muxer 的一个变体,用于写入不需要全局头的流式输出格式,推荐用于例如输出到 MPEG 传输流分段。ssegmentstream_segment 的简短别名。

每个分段都以所选参考流的一个 keyframe 开始,参考流通过 reference_stream 选项设置。

请注意,如果希望对视频文件进行精确分割,需要让输入的 keyframe 与分段器期望的确切分割时刻对应,否则 segment muxer 会用指定开始时间之后找到的下一个 keyframe 来开始新的分段。

segment muxer 在处理帧率恒定的单一视频时效果最佳。

通过设置 segment_list 选项,还可以选择生成已创建分段的列表。列表类型由 segment_list_type 选项指定。分段列表中的条目文件名默认设置为对应分段文件的 basename。

另请参阅 hls muxer,它为 HLS 分段提供了更专门的实现。

4.70.1 选项

segment muxer 支持以下选项:

increment_tc 1|0

设为 1 时,在每个分段之间递增 timecode。若选择此项,输入的第一个视频流需要包含 timecode。默认值为 0

reference_stream specifier

设置由字符串 specifier 指定的参考流。如果 specifier 设为 auto,参考流会被自动选择。否则它必须是一个用于指定参考流的流指定符(参见 ffmpeg 手册中的“Stream specifiers”章节)。默认值为 auto

segment_format format

覆盖内部的 container 格式,默认会根据文件名的扩展名进行猜测。

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。适用于生成绝对路径。默认不附加任何 prefix。

segment_list_type type

选择列表格式。

可识别以下值:

‘flat’

为已创建的分段生成一个扁平列表,每行一个分段。

‘csv, ext’

为已创建的分段生成一个列表,每行一个分段,每行都符合以下格式(逗号分隔值):

segment_filename,segment_start_time,segment_end_time

segment_filename 是 muxer 根据所提供的模式生成的输出文件名。如有需要,会按 RFC4180 应用 CSV 转义。

segment_start_time 和 segment_end_time 以秒为单位表示分段的开始和结束时间。

后缀为 ".csv"".ext" 的列表文件会自动选择此格式。

‘ext’ 已弃用,推荐使用 ‘csv’。

‘ffconcat’

为已创建的分段生成一个 ffconcat 文件。生成的文件可以用 FFmpeg 的 concat demuxer 读取。

后缀为 ".ffcat"".ffconcat" 的列表文件会自动选择此格式。

‘m3u8’

生成一个符合 http://tools.ietf.org/id/draft-pantos-http-live-streaming 的扩展 M3U8 文件(版本 3)。

后缀为 ".m3u8" 的列表文件会自动选择此格式。

如果未指定,类型会根据列表文件名的后缀猜测。

segment_time time

将分段时长设为 time,该值必须是 duration 规范。默认值为 "2"。另请参阅 segment_times 选项。

请注意,除非在指定时刻强制参考流出现 keyframe,否则分割可能不精确。请参阅前面的说明和下面的示例。

min_seg_duration time

将分段的最小时长设为 time,该值必须是 duration 规范。这可以防止 muxer 在时长低于此值时结束分段。仅在与 segment_time 一起使用时有效。默认值为 "0"。

segment_atclocktime 1|0

设为 "1" 时,从 00:00 起按固定的钟表时刻间隔进行分割。segment_time 中指定的时间值用于设置分割间隔的长度。

例如将 segment_time 设为 "900" 时,就可以在 12:00、12:15、12:30 等时刻创建文件。

默认值为 "0"。

segment_clocktime_offset duration

使用 segment_atclocktime 时,将分段的分割时刻延后指定的 duration。

例如将 segment_time 设为 "900"、segment_clocktime_offset 设为 "300" 时,就可以在 12:05、12:20、12:35 等时刻创建文件。

默认值为 "0"。

segment_clocktime_wrap_duration duration

强制分段器仅在数据包于分段时刻之后的指定 duration 内到达 muxer 时才开始新的分段。这样可以让分段器在本地时间向后跳变时更加稳健,例如闰秒,或从夏令时切换回标准时间。

默认值为可能的最大 duration,这意味着无论距离上一个钟表时刻经过了多长时间,都会开始新的分段。

segment_time_delta delta

以 duration 规范的形式,指定为某个分段选择开始时间时所用的精度时间。默认值为 "0"。

指定 delta 后,如果某个 keyframe 的 PTS 满足以下关系,它就会开始一个新的分段:

PTS >= start_time - time_delta

当分割总是在 GOP 边界处进行的视频内容时,如果在指定分割时刻之前恰好找到一个 keyframe,此选项会很有用。

它尤其可以与 ffmpeg 的 force_key_frames 选项结合使用。由于舍入问题,force_key_frames 指定的 keyframe 时刻可能无法精确设置,结果可能导致 keyframe 时刻恰好设置在指定时刻之前。对于恒定帧率的视频,1/(2*frame_rate) 这个值应能应对指定时刻与 force_key_frames 所设置时刻之间最坏情况的偏差。

segment_times times

指定一系列分割点。times 包含一个以逗号分隔、按升序排列的 duration 规范列表。另请参阅 segment_time 选项。

segment_frames frames

指定一系列用于分割的视频帧编号。frames 包含一个以逗号分隔、按升序排列的整数列表。

此选项指定:每当找到参考流的一个 keyframe,且该帧的序号(从 0 开始)大于或等于列表中的下一个值时,就开始一个新的分段。

segment_wrap limit

当分段索引达到 limit 后,重新从头开始循环。

segment_start_number number

设置第一个分段的序列号。默认值为 0

strftime 1|0

使用 strftime 函数定义待写入的新分段的名称。若选择此项,输出的分段名称中必须包含 strftime 函数模板。默认值为 0

break_non_keyframes 1|0

启用后,允许分段在非 keyframe 的帧上开始。当 keyframe 之间的时间间隔不一致时,这会改善部分播放器的表现,但在其他播放器上可能会使情况变差,并可能在定位时引发一些异常。默认值为 0

reset_timestamps 1|0

在每个分段开头重置时间戳,使每个分段都以接近零的时间戳开始。其目的是便于播放生成的分段。对某些 muxer/codec 组合可能不起作用。默认设为 0

initial_offset offset

指定要应用于输出数据包时间戳的时间戳偏移量。该参数必须是 time duration 规范,默认值为 0。

write_empty_segments 1|0

启用后,如果在某个分段通常应跨越的时间段内没有数据包,就写入一个空分段。否则,该分段会被随后写入的下一个数据包填充。默认值为 0

请务必在编码时要求 closed GOP,并设置 GOP 大小以适应分段时长的限制。

4.70.2 示例

  • 将 in.mkv 文件的内容重新封装为 out-000.nut、out-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
    
  • 使用 ffmpeg 的 force_key_frames 选项在指定位置强制生成输入的 keyframe,并配合 segment 选项 segment_time_delta 来吸收设置 keyframe 时间时可能产生的舍入误差。

    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
    

若要强制让输入文件生成 keyframe,则需要转码。

  • 根据 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 encoder 将 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.71 smoothstreaming

Smooth Streaming muxer 会生成一组文件(清单、分块),适合通过常规 Web 服务器提供服务。

window_size

指定清单中保留的分片数量。默认值为 0(保留全部)。

extra_window_size

指定分片从磁盘删除前,在清单之外保留的数量。默认值为 5。

lookahead_count

指定预读分片的数量。默认值为 2。

min_frag_duration

指定分片的最小时长(以微秒为单位)。默认值为 5000000。

remove_at_exit

指定结束时是否删除所有分片。默认值为 0(不删除)。

4.72 streamhash

按流进行哈希测试的格式。

该 muxer 会以每个流为单位,计算并输出所有输入帧的加密哈希值。这可用于在无需完整二进制比较的情况下进行相等性检查。

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

该 muxer 的输出由每个流一行构成,格式为 streamindex,streamtype,algo=hash,其中 streamindex 是映射流的索引,streamtype 是表示流类型的单个字符,algo 是表示所用哈希函数的简短字符串,hash 是表示计算出的哈希值的十六进制数。

hash algorithm

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

4.72.1 示例

要计算输入转换为 raw 音频和视频后的 SHA-256 哈希值,并存储到文件 out.sha256 中:

ffmpeg -i INPUT -f streamhash out.sha256

要将 MD5 哈希值输出到标准输出,可使用以下命令:

ffmpeg -i INPUT -f streamhash -hash md5 -

另请参阅 hash 和 framehash muxer。

4.73 tee

tee muxer 可用于将同一份数据写入多个输出(例如文件或流)。例如,它可以用来在通过网络流式传输视频的同时,将其保存到磁盘。

这与在 ffmpeg 命令行工具中指定多个输出不同。使用 tee muxer 时,音频和视频数据只会被编码一次。而使用常规的多路输出,则会并行启动多个编码操作,这可能是代价非常高昂的过程。当直接使用 libavformat API 时,tee muxer 并不实用,因为这种情况下可以直接将相同的数据包送入多个 muxer。

由于 tee muxer 不代表任何特定的输出格式,ffmpeg 无法自动选择输出流。因此,所有需要输出的流都必须使用 -map 指定。请参阅下面的示例。

某些 encoder 可能需要根据输出格式使用不同的选项,而这种自动检测在 tee muxer 中无法生效,因此需要显式指定。最主要的例子就是 global_header 标志。

从属输出在提供给 muxer 的文件名中指定,用 ’|’ 分隔。如果任何从属名称中包含 ’|’ 分隔符、前导或尾随空格,或任何特殊字符,则必须对其进行转义(参见 (ffmpeg-utils)ffmpeg-utils(1) 手册中的 "Quoting and escaping" 一节)。

4.73.1 选项

use_fifo bool

若设为 1,从属输出将使用 fifo muxer 在独立线程中处理。这样可以补偿各输出之间速度、延迟、可靠性的差异,并实现透明的故障恢复。默认情况下此功能处于关闭状态。

fifo_options

传递给 fifo 伪 muxer 实例的选项。参见 fifo。

muxer 选项可以通过在方括号内、以 ’:’ 分隔的 key=value 键值对列表形式,为每个从属输出单独前置指定。如果选项值中包含特殊字符或 ’:’ 分隔符,则必须进行转义;请注意这属于二级转义。

还可以识别以下特殊选项:

f

指定格式名称。如果无法从输出 URL 推断出格式,则此项为必填。

bsfs[/spec]

指定要应用于指定输出的 bitstream 过滤器列表。

可以通过在选项后附加以 / 分隔的流指定符,来指定某个 bitstream 过滤器应用于哪些流。spec 必须是一个流指定符(参见 Format stream specifiers)。

如果未指定流指定符,则 bitstream 过滤器会应用于输出中的所有流。如果输出中包含无法应用该 bitstream 过滤器的流,则该输出操作会失败,例如将 h264_mp4toannexb 应用于包含音频流的输出。

bitstream 过滤器的选项必须以 opt=value 的形式指定。

可以指定多个 bitstream 过滤器,用 "," 分隔。

use_fifo bool

这允许为单个从属 muxer 覆盖 tee muxer 的 use_fifo 选项。

fifo_options

这允许为单个从属 muxer 覆盖 tee muxer 的 fifo_options 选项。参见 fifo。

select

通过流指定符选择应映射到从属输出的流。如果未指定,默认使用所有已映射的流。如果输出格式不接受所有已映射的流,则该输出操作会失败。

可以使用逗号(,)分隔多个流指定符,例如:a:0,v

onfail

指定输出失败时的行为。可以设置为 abort(默认)或 ignoreabort 会导致在该从属输出失败时整个进程失败。ignore 会忽略该输出的失败,使其他输出不受影响继续运行。

4.73.2 示例

  • 编码内容,同时将其归档为 WebM 文件,并以 MPEG-TS 格式通过 UDP 流式传输:

    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 编码输入,并将输出发送到三个不同的目标。按照 MPEG-TS 格式的要求,使用 dump_extra bitstream 过滤器为所有输出的视频 keyframe 数据包添加 extradata 信息。对 out.aac 应用 select 选项,使其只包含音频数据包。

    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.74 wav

RIFF Wave Audio muxer。

4.74.1 选项

rf64 mode

选择是否使用 RF64 文件格式来代替 RIFF。RF64 支持大于 4 GB 的文件,但 RF64 的支持不如 RIFF 普及。

支持识别以下模式:

‘auto’

开始时写入标准 RIFF 文件,以保持与不支持 RF64 的软件的兼容性,但如果输出文件增长超过 4 GB,则切换为 RF64。会使用 JUNK 块在头部预留少量额外空间,这个块应被所有符合规范的 RIFF 读取器忽略,但极少数过于简单的 WAV 读取器可能会因此产生混淆。

‘always’

无论文件大小如何,始终使用 RF64 格式。输出文件将只能被兼容 RF64 的软件读取,不再是标准的 RIFF WAVE 文件。

‘never’

始终使用普通的 RIFF,绝不使用 RF64。此模式与旧版软件的兼容性最好,但如果输出文件增长超过 4 GB,data 块中的 32 位大小字段将无法再正确表示文件大小,大多数音频软件将无法读取部分或全部数据。(可以使用 wav demuxer 的 ignore_length 选项来恢复此类文件。)这是默认模式。

write_bext bool

若启用,则添加包含扩展音频元数据的 Broadcast Wave Format BEXT 块。默认值为 false。

write_peak mode

若启用,则添加 Peak Envelope 块(EBU Tech 3285 Supplement 3)。默认值为 off。

‘off’

不添加 Peak Envelope 块。

‘on’

添加 Peak Envelope 块,并根据 peak_block_sizepeak_formatpeak_ppv 选项计算峰值。

‘only’

on 类似,但跳过实际音频数据的写入(不会向文件写入 data 块,只会写入 Peak Envelope 及其他元数据块。)

peak_block_size int

用于生成每个峰值帧的音频采样数,最大为 65536。默认值为 256。

peak_format format

峰值包络数据的格式(1:uint8,2:uint16)。默认值为 2(uint16)。

peak_ppv int

每个峰值对应的峰值点数(1 或 2)。默认值为 2。

4.75 webm_chunk

WebM 直播分块 muxer。

此 muxer 会将 WebM 头部和分块作为单独的文件写出,支持通过 DASH 使用 WebM Live 流的客户端可以消费这些文件。

4.75.1 选项

此 muxer 支持以下选项:

chunk_start_index

第一个分块的索引(默认值为 0)。

header

用于写入初始化数据的头部文件的文件名。

audio_chunk_duration

每个音频分块的时长(毫秒,默认值为 5000)。

4.75.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.76 webm_dash_manifest

WebM DASH 清单 muxer。

此 muxer 实现了 WebM DASH Manifest 规范,用于生成 DASH 清单 XML。它也支持为 DASH 直播流生成清单。

更多信息请参阅:

4.76.1 选项

此 muxer 支持以下选项:

adaptation_sets

此选项的语法如下: "id=x,streams=a,b,c id=y,streams=d,e",其中 x 和 y 是 adaptation set 的唯一标识符,a、b、c、d、e 是对应音频和视频流的索引。可以使用此选项添加任意数量的 adaptation set。

live

设为 1 可创建直播流 DASH 清单。默认值:0。

chunk_start_index

第一个分块的起始索引。此值会写入清单中 ‘SegmentTemplate’ 元素的 ‘startNumber’ 属性。默认值:0。

chunk_duration_ms

每个分块的时长(毫秒)。此值会写入清单中 ‘SegmentTemplate’ 元素的 ‘duration’ 属性。默认值:1000。

utc_timing_url

返回 ISO 格式 UTC 时间戳的页面 URL。此值会写入清单中 ‘UTCTiming’ 元素的 ‘value’ 属性。默认值:None。

time_shift_buffer_depth

保证任意 Representation 可用的最小时移缓冲时间(秒)。此值会写入 ‘MPD’ 元素的 ‘timeShiftBufferDepth’ 属性。默认值:60。

minimum_update_period

清单的最小更新周期(秒)。此值会写入 ‘MPD’ 元素的 ‘minimumUpdatePeriod’ 属性。默认值:0。

4.76.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

4.77 whip

按照 WHIP(WebRTC-HTTP ingestion protocol)规范,支持亚秒级延迟流式传输的 WebRTC(Real-Time Communication)muxer。

这是一项实验性功能。

它使用 HTTP 作为信令协议来交换 SDP capability 和 ICE lite candidate。然后使用 STUN binding 请求和响应,在 UDP 上建立会话。随后发起 DTLS 握手以交换 SRTP 加密密钥。最后将视频和音频帧拆分为 RTP 数据包,并使用 SRTP 对其加密。

请确保视频使用不含 B 帧的 H.264,音频 codec 使用 Opus。例如,使用 ffmpeg 将输入文件转换为 WebRTC 的方法如下:

ffmpeg -re -i input.mp4 -acodec libopus -ar 48000 -ac 2 \
  -vcodec libx264 -profile:v baseline -tune zerolatency -threads 1 -bf 0 \
  -f whip "http://localhost:1985/rtc/v1/whip/?app=live&stream=livestream"

在此示例中,我们使用了低延迟选项,最终实现了约 150ms 的端到端延迟。

4.77.1 选项

此 muxer 支持以下选项:

handshake_timeout integer

以毫秒为单位设置 ICE 和 DTLS 握手的超时时间。默认值为 5000。

timeout integer

以秒为单位设置套接字 I/O 操作的超时时间。仅适用于 HTTP 输出。默认值为 -1。

pkt_size integer

以字节为单位设置发送的 RTP 数据包的最大大小。默认值为 1200。

ts_buffer_size integer

以字节为单位设置底层协议的缓冲区大小。默认值为 -1(自动)。UDP 会自动选择合理的值。

whip_flags flags

可选值:

‘dtls_active’

muxer 将尝试设置 dtls active 角色,并发送第一个 client hello。

rtp_history integer

设置要保存的 RTP 历史记录条目数。默认值为 512。

authorization string

用于 WHIP Authorization 的可选 Bearer token。

cert_file string

用于 DTLS 的可选证书文件路径。

key_file string

用于 DTLS 的可选私钥文件路径。

5 元数据

FFmpeg 能够将媒体文件中的元数据导出为简单的 UTF-8 编码、类似 INI 的文本文件,然后使用 metadata muxer/demuxer 将其重新读回。

文件格式如下:

  1. 文件由一个头部和若干元数据标签组成,这些标签被划分到不同的小节中,每个标签各占一行。
  2. 头部是一个 ‘;FFMETADATA’ 字符串,后跟一个版本号(目前为 1)。
  3. 元数据标签采用 ‘key=value’ 的形式
  4. 头部之后紧接着是全局元数据
  5. 全局元数据之后,可能会有包含每个流/每个章节元数据的小节。
  6. 一个小节以大写的小节名称(即 STREAM 或 CHAPTER)加中括号(‘[’, ‘]’)开头,并在下一个小节开始或文件结束处结束。
  7. 章节小节的开头可以有一个可选的、用于 start/end 值的时间基。它必须采用 ‘TIMEBASE=num/den’ 的形式,其中 num 和 den 均为整数。如果省略时间基,则 start/end 时间会被视为以纳秒为单位。

接下来,章节小节必须包含 ‘START=num’、‘END=num’ 形式的章节起止时间,其中 num 为正整数。

  1. 空行以及以 ‘;’ 或 ‘#’ 开头的行会被忽略。
  2. 元数据的键或值中若包含特殊字符(‘=’, ‘;’, ‘#’, ‘\’ 以及换行符),必须用反斜杠 ‘\’ 转义。
  3. 请注意,元数据中的空白字符(例如 ‘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 muxer 和 demuxer,可以将输入文件中的元数据提取到 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 文件里。

主机托管由 telepoint.bg 提供