1 描述
本文档介绍了 libavformat 库提供的受支持格式(复用器和解复用器)。
2 格式选项
libavformat 库提供了一些通用全局选项,可在所有复用器和解复用器上设置。此外,每个复用器或解复用器可能支持所谓的私有选项,这些选项特定于该组件。
可以通过在 FFmpeg 工具中指定 -option 值来设置选项,或者通过在 AVFormatContext 选项中明确设置值或使用 libavutil/opt.h API 进行编程使用。
支持的选项列表如下:
- avioflags flags (input/output)
可能的值:
- ‘direct’
减少缓冲。
- probesize integer (input)
设置探测大小(以字节为单位),即要分析以获取流信息的数据大小。如果信息分散到流中,则更高的值将能够检测到更多信息,但会增加延迟。必须是不小于 32 的整数。默认为 5000000。
- max_probe_packets integer (input)
设置探测编解码器时缓冲数据包的最大数量。默认为 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’
根据输出格式的要求自动应用比特流过滤器。默认启用。
- ‘bitexact’
仅写入与平台、构建和时间无关的数据。这可确保文件和数据校验和可重现且在平台之间匹配。其主要用途是回归测试。
- ‘flush_packets’
立即写出数据包。
- ‘shortest’
在最短流的末尾停止多路复用。可能需要增加 max_interleave_delta 以避免在 EOF 之前刷新较长的流。
- seek2any integer (input)
如果设置为 1,则允许在解复用器级别上搜索非关键帧(如果支持)。默认值为 0。
- analyzeduration integer (input)
指定分析多少微秒来探测输入。更高的值将能够检测到更准确的信息,但会增加延迟。默认值为 5,000,000 微秒 = 5 秒。
- cryptokey hexadecimal string (input)
设置解密密钥。
- indexmem integer (input)
设置用于时间戳索引(每个流)的最大内存。
- rtbufsize integer (input)
设置用于缓冲实时帧的最大内存。
- fdebug flags (input/output)
打印特定的调试信息。
可能的值:
- ‘ts’
- max_delay integer (input/output)
设置最大复用或解复用延迟(微秒)。
- fpsprobesize integer (input)
设置用于探测 fps 的帧数。
- audio_preload integer (output)
设置音频数据包应提前交错的微秒数。
- chunk_duration integer (output)
设置每个块的微秒数。
- chunk_size integer (output)
设置每个块的大小(以字节为单位)。
- err_detect, f_err_detect flags (input)
设置错误检测标志。 f_err_detect 已弃用,应仅通过 ffmpeg 工具使用。
可能的值:
- ‘crccheck’
验证嵌入的 CRC。
- ‘bitstream’
检测比特流规范偏差。
- ‘buffer’
检测不正确的比特流长度。
- ‘explode’
检测到轻微错误时中止解码。
- ‘careful’
将违反规范且未在实际中发现的内容视为错误。
- ‘compliant’
将所有不符合规范的内容视为错误。
- ‘aggressive’
考虑一下一个理智的编码器不应该做的错误。
- max_interleave_delta integer (output)
设置交错的最大缓冲持续时间。持续时间以微秒表示,默认为 10000000(10 秒)。
为确保所有流都正确交错,libavformat 将等待,直到每个流至少有一个数据包,然后才将任何数据包实际写入输出文件。当某些流“稀疏”(即连续数据包之间存在较大间隙)时,这可能会导致过度缓冲。
此字段指定多路复用队列中第一个和最后一个数据包的时间戳之间的最大差异,超过此差异,libavformat 将输出一个数据包,无论它是否已为所有流排队一个数据包。
如果设置为 0,libavformat 将继续缓冲数据包,直到每个流都有一个数据包,而不管缓冲数据包之间的最大时间戳差异如何。
- use_wallclock_as_timestamps integer (input)
如果设置为 1,则使用挂钟作为时间戳。默认值为 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)
设置输出时间偏移。
偏移必须是时间持续时间规范,请参阅 (ffmpeg-utils)ffmpeg-utils(1) 手册中的时间持续时间部分。
偏移量由多路复用器添加到输出时间戳。
指定正偏移量意味着相应的流延迟偏移量中指定的时间持续时间。默认值为 0(表示不应用偏移)。
- format_whitelist list (input)
“,”分隔的允许解复用器列表。默认情况下,所有解复用器均允许。
- 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 解复用器的用户。典型的用例是具有高比特率、高视频缓冲和结尾清理的 MPEG-TS CBR,视频和音频的 PTS 相似:在这种情况下,最后一个视频数据包和最后一个音频数据包之间的较大物理间隙使得必须读取许多字节才能获得视频流持续时间。另一个用例是默认探测行为仅达到单个视频帧,由于帧重新排序,该视频帧不是流的最后一个视频帧,因此持续时间不准确。设置此选项会对性能产生影响,即使对于小文件也是如此,因为探测大小是固定的。默认行为是一种通用的权衡,在很大程度上是自适应的,但探测大小不会不惜一切代价来获取流持续时间。必须是不小于 1 的整数,默认行为为 0。
- strict, f_strict integer (input/output)
指定如何严格遵循标准。f_strict 已弃用,应仅通过 ffmpeg 工具使用。
可能的值:
- ‘very’
严格遵守规范或参考软件的较旧更严格版本
- ‘strict’
严格遵守规范中的所有内容,无论后果如何
- ‘normal’
- ‘unofficial’
允许非官方扩展
- ‘experimental’
允许非标准化的实验性事物、实验性(未完成/正在进行中/未经充分测试)解码器和编码器。注意:实验性解码器可能带来安全风险,请勿将其用于解码不受信任的输入。
2.1 格式流说明符
格式流说明符允许选择一个或多个与特定属性匹配的流。
流说明符的确切语义由在libavformat/avformat.h标头中声明的 avformat_match_stream_specifier() 函数定义,并在 ffmpeg(1) 手册中的 (ffmpeg)Stream specifiers 部分中记录。
3 解复用器
解复用器是 FFmpeg 中配置的元素,可以从特定类型的文件中读取多媒体流。
配置 FFmpeg 版本时,所有支持的解复用器都默认启用。您可以使用配置选项 --list-demuxers 列出所有可用的解复用器。
您可以使用配置选项 --disable-demuxers 禁用所有解复用器,并使用选项 --enable-demuxer=DEMUXER 有选择地启用单个解复用器,或者使用选项 --disable-demuxer=DEMUXER 禁用它。
ff* 工具的选项 -demuxers 将显示已启用的解复用器的列表。使用 -formats 查看已启用的解复用器和复用器的组合列表。
以下是一些当前可用的解复用器的描述。
3.1 aa
Audible 格式 2、3 和 4 解复用器。
此解复用器用于解复用 Audible 格式 2、3 和 4 (.aa) 文件。
3.2 aac
原始音频数据传输流 AAC 解复用器。
此解复用器用于对包含单个 AAC 流以及其中的任何 ID3v1/2 或 APE 标签的 ADTS 输入进行解复用。
3.3 apng
动画便携式网络图形解复用器。
此解复用器用于对 APNG 文件进行解复用。除 PNG 签名之外的所有标头(直到(但不包括)第一个 fcTL 块)都作为额外数据传输。然后将帧拆分为两个 fcTL 块之间的所有块,或最后一个 fcTL 和 IEND 块之间的所有块。
- -ignore_loop bool
如果设置,则忽略文件中的循环变量。默认启用。
- -max_fps int
最大帧速率(以帧/秒为单位)。默认值为 0,表示无限制。
- -default_fps int
文件中未指定时,默认帧速率(以帧/秒为单位)(0 表示尽可能快)。默认值为 15。
3.4 asf
高级系统格式解复用器。
此解复用器用于解复用 ASF 文件和 MMS 网络流。
- -no_resync_search bool
不要尝试通过查找某个可选的起始代码来重新同步。
3.5 concat
虚拟串联脚本解复用器。
此解复用器从文本文件中读取文件列表和其他指令,并将它们一个接一个地解复用,就好像它们的所有数据包都被复用在一起一样。
文件中的时间戳经过调整,以便第一个文件从 0 开始,并且每个下一个文件都从前一个文件结束的位置开始。请注意,这是全局进行的,如果所有流的长度不完全相同,则可能导致间隙。
所有文件必须具有相同的流(相同的编解码器、相同的时间基准等)。
每个文件的持续时间用于调整下一个文件的时间戳:如果持续时间不正确(例如,因为它是使用比特率计算的,或者因为文件被截断),则会导致伪影。持续时间指令可用于覆盖存储在每个文件中的持续时间。
3.5.1 语法
该脚本是扩展 ASCII 的文本文件,每行一个指令。空行、前导空格和以“#”开头的行将被忽略。以下指令被识别:
- file path
要读取的文件的路径;特殊字符和空格必须用反斜杠或单引号转义。
所有后续文件相关指令均适用于该文件。
- ffconcat version 1.0
标识脚本类型和版本。
要使 FFmpeg 自动识别格式,此指令必须完全按原样(没有多余的空格或字节顺序标记)出现在脚本的第一行。
- duration dur
文件的持续时间。此信息可以从文件中指定;如果文件中的信息不可用或不准确,在此处指定可能会更有效或更有帮助。
如果为所有文件设置了持续时间,则可以在整个连接的视频中进行搜索。
- inpoint timestamp
文件的入点。当解复用器打开文件时,它会立即搜索到指定的时间戳。搜索是为了确保所有流都可以在入点成功呈现。
此指令最适合用于帧内编解码器,因为对于非帧内编解码器,您通常会在实际入点之前获得额外的数据包,并且解码的内容很可能也包含入点之前的帧。
对于每个文件,文件入点之前的数据包的时间戳将小于计算的文件开始时间戳(第一个文件的情况下为负数),并且文件的持续时间(如果持续时间指令未指定)将根据其指定的入点减少。
由于在指定的入点之前可能存在数据包,因此两个连接文件之间的数据包时间戳可能会重叠。
- outpoint timestamp
文件的出点。当解复用器在任何流中达到指定的解码时间戳时,它会将其作为文件结束条件处理,并跳过当前和所有流中所有剩余的数据包。
出点是独占的,这意味着解复用器不会输出解码时间戳大于或等于出点的数据包。
此指令最适合帧内编解码器和所有流紧密交错的格式。对于非帧内编解码器,您通常会在出点之后获得带有显示时间戳的额外数据包,因此解码的内容很可能也会包含出点之后的帧。如果您的流不是紧密交错的,您可能无法在出点之前从所有流中获得所有数据包,并且您可能只能解码出点之前最早的流。
文件的持续时间(如果持续时间指令未指定)将根据其指定的出点减少。
- 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
流的编解码器。
- stream_extradata hex_string
字符串的附加数据,以十六进制编码。
- chapter id start end
添加章节。id 是唯一标识符,可能很小且连续。
3.5.2 选项
此解复用器接受以下选项:
- safe
如果设置为 1,则拒绝不安全的文件路径和指令。如果文件路径不包含协议规范且是相对的,并且所有组件仅包含可移植字符集中的字符(字母、数字、句点、下划线和连字符),并且组件开头没有句点,则认为文件路径是安全的。
如果设置为 0,则接受任何文件名。
默认值为 1。
- auto_convert
如果设置为 1,则尝试对数据包数据执行自动转换以使流可连接。默认值为 1。
目前,唯一的转换是将 h264_mp4toannexb 比特流过滤器添加到 MP4 格式的 H.264 流中。这在分辨率发生变化时尤其必要。
- segment_time_metadata
如果设置为 1,则每个数据包将包含 lavf.concat.start_time 和 lavf.concat.duration 数据包元数据值,它们是 start_time 和连接输出中各个文件段的持续时间(以微秒为单位)。仅当根据连接文件已知持续时间元数据时才会设置持续时间元数据。默认值为 0。
3.5.3 示例
- 使用绝对文件名并包含一些注释:
# my first filename file /mnt/share/file-1.wav # my second filename including whitespace file '/mnt/share/file 2.wav' # my third filename including whitespace plus single quote file '/mnt/share/file 3'\''.wav' - 允许输入格式自动探测,使用安全文件名并设置第一个文件的持续时间:
ffconcat version 1.0 file file-1.wav duration 20.0 file subdir/file-2.wav
3.6 dash
通过 HTTP 解复用器进行动态自适应流传输。
此解复用器显示清单中找到的所有 AVStream。通过在 AVStream 上设置丢弃标志,调用者可以决定实际接收哪些流。每个流将来自 <Representation> 的 id 和带宽属性镜像为分别名为“id”和“variant_bitrate”的元数据键。
3.6.1 选项
此解复用器接受以下选项:
- cenc_decryption_key
16 字节密钥(十六进制),用于解密使用 ISO 通用加密(CENC/AES-128 CTR;ISO/IEC 23001-7)加密的文件。
3.7 dvdvideo
DVD-Video 解复用器,由 libdvdnav 和 libdvdread 提供支持。
可以直接将 DVD 标题(特别是连续 PGC)提取到转换管道中。菜单资产(例如背景视频或音频)也可以在给定菜单坐标的情况下进行解复用(尽最大努力)。目前不支持搜索。
接受块设备(DVD 驱动器)、ISO 文件和目录结构。在其中一个输入前使用 -f dvdvideo 激活。
此解复用器没有任何类型的解密代码。您只能自己处理加密 DVD,不应期望获得相关支持。
底层播放由 libdvdnav 处理,结构解析由 libdvdread 处理。FFmpeg 必须使用可用的 GPL 库支持以及配置开关 --enable-libdvdnav 和 --enable-libdvdread 进行构建。
您需要提供所需的“标题编号”或准确的 PGC/PG 坐标。许多开源 DVD 播放器和工具可以帮助提供此信息。如果未指定,解复用器将默认为适用于许多光盘的标题 1。但是,由于格式的灵活性,建议手动检查。有许多光盘的创作方式奇怪或标头无效。
如果输入是真正的 DVD 驱动器,请注意,有些驱动器可能会在读取光盘的坏扇区时默默失败,而是返回随机位,这实际上是损坏的数据。这在老化或腐烂的光盘上尤其明显。需要第二次传递和完整性检查才能检测到损坏。这不是 FFmpeg 的问题。
3.7.1 背景
DVD-Video 不是传统意义上的直接可访问的线性容器格式。相反,它允许对存储在无头 VOB 文件中的经过仔细混合的 MPEG-PS 流进行复杂且程序化的播放。对于最终用户来说,这些流被简单地称为“标题”,但实际的逻辑播放顺序由标题中的一个或多个“PGC”或节目组链定义。PGC 又由多个“PG”或“节目”组成,它们是实际的视频片段(对于典型的视频功能,按顺序排列)。PGC 结构以及流布局和元数据都存储在需要解析的 IFO 文件中。PGC 可以更简单地被视为播放列表。
实际的 DVD 播放器依靠通过菜单和内部 VM 进行的用户 GUI 交互来驱动解复用的方向。通常,用户要么通过菜单导航,要么自动重定向到他们选择的 PGC。在此过程和随后的播放过程中,DVD 播放器的内部 VM 还会保持状态并执行可在播放期间跳转到不同扇区的指令。这就是 libdvdnav 参与的原因,因为在许多情况下,对光盘上的 MPEG-PS blob(VOB)的线性读取不足以产生正确的序列。
还有许多其他 DVD 结构(一个很长的主题),这里就不讨论了。特别是 NAV 数据包,由该解复用器处理以建立准确的时间,但不作为流发出。为了更好地理解,请参阅: https://code.videolan.org/videolan/libdvdnav/-/blob/master/doc/dvd_structures
3.7.2 选项
此解复用器接受以下选项:
- title int
要播放的标题编号。如果pgc和pg未设置,则必须设置。不适用于菜单。默认值为 0(自动),当前仅选择第一个可用标题(标题 1)并通知用户相关影响。
- chapter_start int
章节或 PTT(部分标题)的起始编号。不适用于菜单。默认值为 1。
- chapter_end int
章节或 PTT(部分标题)的结束编号。不适用于菜单。默认值为 0,这是一个特殊值,表示在最后一个可能的章节处结束。
- angle int
视频角度编号,指的是本质上由 VOB 中交错的交替帧组成的附加视频流。不适用于菜单。默认值为 1。
- region int
用于播放的区域代码。某些光盘可能会使用此代码默认在不同区域以特定角度播放。如果用作输入,此选项不会影响真实 DVD 驱动器的区域代码。不适用于菜单。默认值为 0,“世界”。
- menu bool
解复用菜单资产而不是导航标题。需要菜单的精确坐标(menu_lu、menu_vts、pgc、pg)。默认值为 false。
- menu_lu int
要解复用的菜单语言。在 DVD 中,菜单按语言分组。默认值为 0,即第一个语言单元。
- menu_vts int
菜单所在的 VTS,如果是 VMG 菜单(根级),则为 0。默认值为 0,即 VMG 菜单。
- pgc int
与 pg 结合开始播放的 PGC 条目。设置标题的替代方法。目前不支持章节标记。必须为菜单明确设置。默认值为 0,自动从标题值解析。
- pg int
与 pgc 结合使用以开始播放的条目 PG。设置标题的替代方法。目前不支持章节标记。默认值为 0,自动从标题值解析,或从菜单的开头(PG 1)开始。
- preindex bool
启用此选项可获得准确的章节 (PTT) 标记和持续时间测量,这需要缓慢的第二遍读取才能从 NAV 数据包中索引章节标记时间戳。对于真正的光驱来说,这是不理想的额外工作。建议将此选项与存储在硬盘上的 DVD 结构备份一起使用,这样速度更快。与 pgc 和 pg 不兼容。不适用于菜单。默认值为 0,false。
- trim bool
从头开始跳过填充单元(即短于 1 秒的单元)。许多光盘在 PGC 的开头都有填充段,通常包含用于控制真实 DVD 播放器缓冲速度的垃圾数据,没有其他实质性数据值。不适用于菜单。默认值为 1,true。
3.7.3 示例
- 从给定的 DVD 结构打开标题 3:
ffmpeg -f dvdvideo -title 3 -i - 从给定的 DVD 结构打开标题 1 中的第 3-6 章:
ffmpeg -f dvdvideo -chapter_start 3 -chapter_end 6 -title 1 -i - 从给定的 DVD 结构仅打开标题 1 中的第 5 章:
ffmpeg -f dvdvideo -chapter_start 5 -chapter_end 5 -title 1 -i - 从 VTS 1、PGC 1 开始,使用语言 1 的解复用菜单,从 PG 开始1:
ffmpeg -f dvdvideo -menu 1 -menu_lu 1 -menu_vts 1 -pgc 1 -pg 1 -i
3.8 ea
Electronic Arts 多媒体格式解复用器。
此格式由各种 Electronic Arts 游戏使用。
3.8.1 选项
- merge_alpha bool
通常,VP6 alpha 通道(如果存在)作为辅助视频流返回,通过设置此选项,您可以使解复用器返回除普通视频外还包含 alpha 通道的单个视频流。
3.9 imf
可互操作主格式解复用器。
此解复用器呈现在 IMF 合成中找到的音频和视频流,如 SMPTE ST 2067-2 中所述。
ffmpeg [-assetmaps <path of ASSETMAP1>,<path of ASSETMAP2>,...] -i <path of CPL> ...
如果未指定 -assetmaps,解复用器将在与 CPL 相同的目录中查找名为 ASSETMAP.xml 的文件。
3.10 flv、live_flv、kux
Adobe Flash 视频格式解复用器。
此解复用器用于解复用 FLV 文件和 RTMP 网络流。对于实时网络流,如果强制使用格式,则可以使用 live_flv 选项而不是 flv 来避免时间戳不连续。KUX 是优酷平台上使用的 flv 变体。
ffmpeg -f flv -i myfile.flv ...
ffmpeg -f live_flv -i rtmp://<any.server>/anything/key ....
- -flv_metadata bool
根据 onMetaData 数组内容分配流。
- -flv_ignore_prevtag bool
忽略前一个标签值的大小。
- -flv_full_metadata bool
输出 onMetadata 的所有上下文。
3.11 gif
动画 GIF 解复用器。
它接受以下选项:
- min_delay
以百分之一秒为单位设置帧之间的最小有效延迟。范围为 0 到 6000。默认值为 2。
- max_gif_delay
以百分之一秒为单位设置帧之间的最大有效延迟。范围是 0 到 65535。默认值是 65535(接近十一分钟),这是规范允许的最大值。
- default_delay
以百分之一秒为单位设置帧之间的默认延迟。范围是 0 到 6000。默认值是 10。
- ignore_loop
GIF 文件可以包含循环一定次数(或无限次)的信息。如果ignore_loop设置为 1,则输入的循环设置将被忽略,不会发生循环。如果设置为 0,则会发生循环,并根据 GIF 循环次数。默认值为 1。
例如,使用覆盖滤镜,将无限循环的 GIF 放置在另一个视频上:
ffmpeg -i input.mp4 -ignore_loop 0 -i input.gif -filter_complex overlay=shortest=1 out.mkv
请注意,在上面的示例中,覆盖滤镜的最短选项用于以最短输入文件的长度结束输出视频,在本例中为input.mp4因为本例中的 GIF 无限循环。
3.12 hls
HLS 解复用器
Apple HTTP Live Streaming 解复用器。
此解复用器显示所有变体流中的所有 AVStream。id 字段设置为比特率变体索引号。通过在 AVStream 上设置丢弃标志(在 ffplay 中按“a”或“v”),调用者可以决定实际接收哪些变体流。流所属变体的总比特率可在名为“variant_bitrate”的元数据键中找到。
它接受以下选项:
- live_start_index
开始直播流的片段索引(负值从末尾开始)。
- prefer_x_start
如果在播放列表中,最好使用 #EXT-X-START,而不是 live_start_index。
- allowed_extensions
hls 允许访问的文件扩展名的“,”分隔列表。
- max_reload
尝试重新加载不充分列表的最大次数。默认值为 1000。
- m3u8_hold_counters
m3u8 刷新时无新片段时加载的最大次数。默认值为 1000。
- http_persistent
使用持久 HTTP 连接。仅适用于 HTTP 流。默认启用。
- http_multiple
使用多个 HTTP 连接下载 HTTP 段。对于 HTTP/1.1 服务器,默认启用。
- http_seekable
使用 HTTP 部分请求下载 HTTP 段。0 = 禁用,1 = 启用,-1 = 自动,默认为自动。
- seg_format_options
使用以 : 分隔的键值对列表设置媒体片段解复用器的选项。
- seg_max_retry
发生错误时重新加载片段的最大次数,当不希望在网络错误时跳过片段时很有用。默认值为 0。
3.13 image2
图像文件解复用器。
此解复用器从由模式指定的图像文件列表中读取。模式的语法和含义由选项 pattern_type 指定。
模式可能包含后缀,用于自动确定文件中包含的图像的格式。
序列中所有文件的每个图像的大小、像素格式和格式必须相同。
此解复用器接受以下选项:
- framerate
设置视频流的帧速率。默认值为 25。
- loop
如果设置为 1,则循环输入。默认值为 0。
- pattern_type
选择用于解释所提供文件名的模式类型。
pattern_type 接受以下值之一。
- none
禁用模式匹配,因此视频将仅包含指定的图像。如果您不想从多幅图像创建序列,并且文件名可能包含特殊模式字符,则应使用此选项。
- sequence
选择序列模式类型,用于指定按顺序编号索引的文件序列。
序列模式可能包含字符串“%d”或“%0Nd”,用于指定与模式匹配的每个文件名中表示顺序编号的字符的位置。如果使用“%d0Nd”格式,则表示每个文件名中数字的字符串是用 0 填充的,N 是代表数字的用 0 填充的数字总数。可以在模式中使用字符串“%%”指定文字字符“%”。
如果序列模式包含“%d”或“%0Nd”,则模式指定的文件列表的第一个文件名必须包含一个介于start_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 使用通配符支持编译时才可选择此选项。
- glob_sequence (deprecated, will be removed)
选择混合的 glob 通配符/序列模式。
如果您的 libavformat 版本是使用 glob 支持编译的,并且提供的模式在 %*?[]{} 中包含至少一个 glob 元字符,且该字符前面有一个未转义的“%”,则该模式将被解释为 glob() 模式,否则将被解释为序列模式。
所有 glob 特殊字符 %*?[]{} 都必须以“%”为前缀。要转义文字“%”,您应使用“%%”。
例如,模式 foo-%*.jpeg 将匹配所有以“foo-”为前缀并以“.jpeg”结尾的文件名,而 foo-%?%?%?.jpeg 将匹配所有以“foo-”为前缀、后跟三个字符序列并以“.jpeg”结尾的文件名。
此模式类型已弃用,取而代之的是 glob 和 serial。
默认值为 glob_sequence。
- pixel_format
设置要读取的图像的像素格式。如果未指定,则从序列中的第一个图像文件猜测像素格式。
- start_number
设置与图像文件模式匹配的文件的索引以开始读取。默认值为 0。
- start_number_range
设置查找序列中的第一个图像文件时要检查的索引间隔范围,从 start_number 开始。默认值为 5。
- ts_from_file
如果设置为 1,将设置帧时间戳为图像文件的修改时间。请注意,不提供时间戳的单调性:图像的顺序与没有此选项时相同。默认值为 0。如果设置为 2,将帧时间戳设置为图像文件的修改时间(纳秒精度)。
- video_size
设置要读取的图像的视频大小。如果未指定,则视频大小将从序列中的第一个图像文件中猜测。
- export_path_metadata
如果设置为 1,将向输入中找到的元数据添加两个额外字段,使它们也可用于其他过滤器(有关示例,请参阅 drawtext 过滤器)。默认值为 0。额外字段如下所述:
- lavf.image2dec.source_path
对应于正在读取的输入文件的完整路径。
- lavf.image2dec.source_basename
对应于正在读取的文件的名称。
3.13.1 示例
- 使用 ffmpeg 从文件序列 img-001.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
设置要解复用的轨道的索引。解复用器只能导出一个轨道。音轨索引从 0 开始。默认选择第一个音轨。音轨数将作为音轨元数据条目导出。
- sample_rate
设置导出音轨的采样率。范围是 1000 到 999999。默认值为 44100。
- max_size (bytes)
解复用器将整个文件缓冲到内存中。调整此值以设置最大缓冲区大小,这反过来又充当可读取文件大小的上限。默认值为 50 MiB。
3.15 libmodplug
基于 ModPlug 的模块解复用器
请参阅 https://github.com/Konstanty/libmodplug
它将导出一个 2 通道 16 位 44.1 kHz 音频流。可选地,可以导出带有或不带有打印元数据的 pal8 16 色视频流。
它接受以下选项:
- noise_reduction
应用简单的低通滤波器。可以是 1(开)或 0(关)。默认值为 0。
- reverb_depth
设置混响量。范围为 0-100。默认值为 0。
- reverb_delay
设置延迟(以毫秒为单位),限制为 40-250 毫秒。默认值为 0。
- bass_amount
应用低音扩展,又称 XBass 或 megabass。范围为 0(安静)至 100(响亮)。默认值为 0。
- bass_range
设置截止频率,即低音频率的上限。范围为 10-100 Hz。默认值为 0。
- surround_depth
应用杜比 Pro-Logic 环绕效果。范围为 0(安静)至 100(重度)。默认值为 0。
- surround_delay
设置环绕延迟(以毫秒为单位),限制为 5-40 毫秒。默认值为 0。
- max_size
解复用器将整个文件缓冲到内存中。调整此值以设置最大缓冲区大小,这反过来又充当可读取文件大小的上限。范围为 0 到 100 MiB。0 取消缓冲区大小限制(不推荐)。默认值为 5 MiB。
- video_stream_expr
使用 eval API 评估的字符串,用于为生成的视频流分配颜色。可以使用的变量有 x、y、w、h、t、速度、节奏、顺序、模式和行。
- video_stream
生成视频流。可以是 1(开)或 0(关)。默认值为 0。
- video_stream_w
以“chars”为单位设置视频帧宽度,其中一个字符表示 8 个像素。范围是 20-512。默认值为 30。
- video_stream_h
以“字符”为单位设置视频帧高度,一个字符表示 8 个像素。范围为 20-512。默认值为 30。
- video_stream_ptxt
打印视频流上的元数据。包括速度、节奏、顺序、模式、行和 ts(以毫秒为单位的时间)。可以是 1(开启)或 0(关闭)。默认值为 1。
3.16 libopenmpt
基于 libopenmpt 的模块解复用器
有关更多信息,请参阅 https://lib.openmpt.org/libopenmpt/。
某些文件有多个子歌曲(曲目),可以使用subsong选项进行设置。
它接受以下选项:
- subsong
设置子歌曲索引。这可以是“全部”、“自动”或子歌曲的索引。子歌曲索引从 0 开始。默认值为“自动”。
默认值是让 libopenmpt 选择。
- layout
设置通道布局。有效值为 1、2 和 4 通道布局。默认值为 STEREO。
- sample_rate
设置 libopenmpt 输出的采样率。范围从 1000 到 INT_MAX。该值默认值为 48000。
3.17 mov/mp4/3gp
Quicktime 文件格式和 ISO/IEC 基本媒体文件格式 (ISO/IEC 14496-12 或 MPEG-4 第 12 部分、ISO/IEC 15444-12 或 JPEG 2000 第 12 部分) 的解复用器。
已注册的扩展名:mov、mp4、m4a、3gp、3g2、mj2、psp、m4b、ism、ismv、isma、f4v
3.17.1 选项
此解复用器接受以下选项:
- enable_drefs
启用加载外部轨道,默认情况下禁用。启用此功能理论上可能会在某些用例中泄露信息。
- use_absolute_path
允许通过绝对路径加载外部轨道,默认情况下禁用。启用此功能会带来安全风险。只有在已知来源无恶意的情况下才应启用此功能。
- seek_streams_individually
在搜索时,分别识别每个流中的最近点,并从识别点对该流中的数据包进行解复用。与从头开始线性解复用相比,这可能导致数据包序列不同。默认值为 true。
- ignore_editlist
忽略任何编辑列表原子。默认情况下,解复用器会修改流索引以反映编辑列表描述的时间线。默认值为 false。
- advanced_editlist
修改流索引以反映编辑列表描述的时间线。必须将 ignore_editlist 设置为 false 才能使此选项有效。如果 ignore_editlist 和此选项都设置为 false,则仅修改流索引的开头以反映编辑列表描述的初始停留时间或起始时间戳。默认值为 true。
- ignore_chapters
不解析章节。这包括 GoPro 的“HiLight”标签/时刻。请注意,只有当输入可搜索时才会解析章节。默认值为 false。
- use_mfra_for
对于可搜索的碎片输入,从媒体片段随机访问框设置片段的起始时间戳(如果存在)。
以下选项可用:
- ‘auto’
自动检测是否将 mfra 时间戳设置为 PTS 或 DTS(默认)
- ‘dts’
将 mfra 时间戳设置为 DTS
- ‘pts’
将 mfra 时间戳设置为PTS
- ‘0’
不要使用 mfra 框设置时间戳
- use_tfdt
对于分片输入,将片段的起始时间戳设置为来自 tfdt 框的 baseMediaDecodeTime。默认启用,将优先使用 tfdt 框设置 DTS。禁用以使用来自 sidx 框的 earliest_presentation_time。无论哪种情况,如果 mfra 框中的时间戳可用且 use_mfra_for 设置为 pts 或 dts,则将使用来自 mfra 框的时间戳。
- export_all
将 udta 框内无法识别的框导出为元数据条目。框类型的前四个字符设置为键。默认值为 false。
- export_xmp
将 XMP_ 框和 uuid 框的全部内容导出为带有键 xmp 的字符串。请注意,如果设置了 export_all 而未设置此选项,则仍会导出 XMP_ 框的内容,但键为 XMP_。默认值为 false。
- activation_bytes
解密 Audible AAX 和 AAX+ 文件需要 4 字节密钥。请参阅下面的 Audible AAX 子部分。
- audible_fixed_key
用于处理 Audible AAX/AAX+ 文件的固定密钥。它已预设,因此无需指定。
- decryption_key
16 字节密钥(十六进制),用于解密使用 ISO 通用加密 (CENC/AES-128 CTR;ISO/IEC 23001-7) 加密的文件。
- max_stts_delta
有时可能会有意写入 trak 的 stts 框中的非常高的样本增量,但通常它们是错误写入的,或者用于在被视为有符号的 32 位整数时存储 dts 校正的负值。此选项允许用户设置上限,超过此上限,增量将被限制为 1。如果转换为 int32 时为负数,则大于该限制的值将用于调整后续 dts。
单位是轨道时间尺度。范围是 0 到 UINT_MAX。默认值为 UINT_MAX - 48000*10,允许对 48 kHz 音频流进行长达 10 秒的 dts 校正,同时容纳 99.9% 的 uint32 范围。
- interleaved_read
在解复用器级别交错来自多个轨道的数据包。对于交错严重的文件,这可以防止由不同轨道中的数据包之间的较大间隙引起的播放问题,因为 MOV/MP4 没有数据包放置要求。但是,由于在轨道之间进行搜索,这可能会导致对非常严重的交错文件进行过度搜索,因此禁用它可能会防止 I/O 问题,但会以播放为代价。
3.17.2 Audible AAX
Audible AAX 文件是加密的 M4B 文件,可以通过指定 4 字节激活密钥来解密。
ffmpeg -activation_bytes 1CEB00DA -i test.aax -vn -c:a copy output.mp4
3.18 mpegts
MPEG-2 传输流解复用器。
此解复用器接受以下选项:
- resync_size
设置查找新同步的大小限制。默认值为 65536。
- skip_unknown_pmt
跳过 PAT 中未定义的节目的 PMT。默认值为 0。
- fix_teletext_pts
使用从第一个节目的 PCR 计算出的时间戳覆盖图文电视数据包 PTS 和 DTS 值,图文电视流是该节目的一部分并且不会被丢弃。默认值为 1,如果您希望图文电视数据包 PTS 和 DTS 值不受影响,请将此选项设置为 0。
- ts_packetsize
输出选项,以字节为单位,包含原始数据包大小。显示检测到的原始数据包大小,用户无法设置。
- scan_all_pmts
扫描并合并所有 PMT。该值是一个整数,取值范围从 -1 到 1(-1 表示自动设置,1 表示启用,0 表示禁用)。默认值为 -1。
- merge_pmt_versions
当 PMT 版本更新且基本流移动到不同的 PID 时,重新使用现有流。默认值为 0。
- max_packet_size
设置解复用器发出的数据包的最大大小(以字节为单位)。超过此大小的有效负载将拆分为多个数据包。范围为 1 到 INT_MAX/2。默认值为 204800 字节。
3.19 mpjpeg
封装在多部分 MIME 解复用器中的 MJPEG。
此解复用器允许读取 MJPEG,其中每个帧都表示为 multipart/x-mixed-replace 流的一部分。
- strict_mime_boundary
默认实现将宽松的标准应用于多部分 MIME 边界检测,以防止出现大量现有端点未生成正确 MIME MJPEG 流的回归。通过将此选项设置为 1 来启用它将导致对边界值的更严格检查。
3.20 rawvideo
原始视频解复用器。
此解复用器允许读取原始视频数据。由于没有指定假定视频参数的标头,因此用户必须指定它们才能正确解码数据。
此解复用器接受以下选项:
- framerate
设置输入视频帧速率。默认值为 25。
- pixel_format
设置输入视频像素格式。默认值为 yuv420p。
- video_size
设置输入视频大小。必须明确指定此值。
例如,要使用 ffplay 读取 rawvideo 文件input.raw,假设像素格式为 rgb24,视频大小为 320x240,帧速率为每秒 10 张图像,请使用以下命令:
ffplay -f rawvideo -pixel_format rgb24 -video_size 320x240 -framerate 10 input.raw
3.21 rcwt
RCWT(带时间的原始字幕)是 ccextractor 的原生格式,ccextractor 是一种常用的开源工具,用于处理 608/708 隐藏式字幕 (CC) 源。有关格式的更多信息,请参阅 (ffmpeg-formats)rcwtenc。
此解复用器实现了截至 2024 年 3 月的规范,该规范自 2014 年 4 月以来一直保持稳定且未发生改变。
3.21.1 示例
- 使用内置解码器将 CC 渲染为 ASS:
- 将 RCWT 备份转换为 Scenarist (SCC) 格式:
3.22 sbg
SBaGen 脚本解复用器。
此解复用器读取 SBaGen http://uazu.net/sbagen/ 使用的脚本语言,以生成双耳节拍会话。SBG 脚本如下所示:
-SE
a: 300-2.5/3 440+4.5/0
b: 300-2.5/0 440+4.5/3
off: -
NOW == a
+0:07:00 == b
+0:14:00 == a
+0:21:00 == b
+0:30:00 off
SBG 脚本可以混合绝对和相对时间戳。如果脚本仅使用绝对时间戳(包括脚本开始时间)或仅使用相对时间戳,则其布局是固定的,转换很简单。另一方面,如果脚本混合了两种时间戳,则相对时间戳的 NOW 参考将从读取脚本时的当前时间中获取,并且脚本布局将根据该参考冻结。这意味着,如果直接播放脚本,实际时间将与绝对时间戳匹配,直至声音控制器的时钟精度,但如果用户以某种方式暂停播放或搜索,所有时间都将相应移动。
3.23 tedcaptions
TED 演讲使用的 JSON 字幕。
TED 不提供字幕链接,但可以从页面中猜出。FFmpeg 源代码树中的 tools/bookmarklets.html 文件包含一个书签小程序来显示它们。
此解复用器接受以下选项:
- start_time
设置 TED 演讲的开始时间(以毫秒为单位)。默认值为 15000(15 秒)。它用于将字幕与可下载视频同步,因为它们包含 15 秒的介绍。
示例:将字幕转换为大多数玩家理解的格式:
ffmpeg -i http://www.ted.com/talks/subtitles/id/1/lang/en talk1-en.srt
3.24 vapoursynth
Vapoursynth 包装器。
出于安全考虑,Vapoursynth 脚本不会被自动检测,因此必须强制输入格式。对于 ff* CLI 工具,请在输入 -i yourscript.vpy 之前添加 -f vapoursynth。
此解复用器接受以下选项:
- max_script_size
解复用器将整个脚本缓冲到内存中。调整此值以设置最大缓冲区大小,这反过来又充当可读取脚本大小的上限。默认值为 1 MiB。
3.25 w64
Sony Wave64 音频解复用器。
此解复用器接受以下选项:
- max_size
请参阅 wav 解复用器的相同选项。
3.26 wav
RIFF Wave 音频解复用器。
此解复用器接受以下选项:
- max_size
指定解复用数据包的最大数据包大小(以字节为单位)。默认情况下,此值设置为 0,这意味着根据输入格式选择一个合理的值。
4 个复用器
复用器是 FFmpeg 中的配置元素,允许将多媒体流写入特定类型的文件。
配置 FFmpeg 构建时,默认情况下会启用所有支持的复用器。您可以使用配置选项 --list-muxers 列出所有可用的复用器。
您可以使用配置选项 --disable-muxers 禁用所有复用器,并使用选项 --enable-muxer=MUXER / --disable-muxer=MUXER 有选择地启用/禁用单个复用器。
ff* 工具的选项 -muxers 将显示已启用复用器的列表。使用 -formats 可查看已启用解复用器和复用器的组合列表。
以下是一些当前可用的复用器的描述。
4.1 原始复用器
本节介绍原始复用器。它们接受与指定编解码器匹配的单个流。它们不存储时间戳或元数据。除非另有说明,否则识别的扩展名与复用器名称相同。
它包括以下复用器。还显示了媒体类型和用于从输出扩展中自动选择复用器的最终扩展。
- ‘ac3 audio’
Dolby Digital,也称为 AC-3。
- ‘adx audio’
CRI Middleware ADX 音频。
当输出可寻址且计数可以以 32 位存储时,此复用器将在第一个数据包的开头附近写出总样本计数。
- ‘aptx audio’
aptX(蓝牙音频处理技术)
- ‘aptx_hd audio (aptxdh)’
aptX HD(蓝牙音频处理技术)音频
- ‘avs2 video (avs, avs2)’
AVS2-P2(音频视频标准 - 第二代 - 第 2 部分)/IEEE 1857.4视频
- ‘avs3 video (avs3)’
AVS3-P2(音频视频标准 - 第三代 - 第 2 部分)/ IEEE 1857.10 视频
- ‘cavsvideo video (cavs)’
中文 AVS(音频视频标准 - 第一代)
- ‘codec2raw audio’
编解码器 2 音频。
未注册扩展名,因此必须提供格式名称,例如使用 ffmpeg CLI 工具 -f codec2raw。
- ‘data any’
通用数据复用器。
此复用器接受任何类型的任何编解码器的单个流。必须使用 ffmpeg CLI 工具的 -map 选项选择输入流。
未注册扩展名,因此必须提供格式名称,例如使用 ffmpeg CLI 工具 -f data。
- ‘dfpwm audio (dfpwm)’
原始 DFPWM1a(带调制的动态滤波器脉冲)音频复用器。
- ‘dirac video (drc, vc2)’
BBC Dirac 视频。
Dirac Pro 编解码器是一个子集,标准化为 SMPTE VC-2。
- ‘dnxhd video (dnxhd, dnxhr)’
Avid DNxHD 视频。
标准化为 SMPTE VC-3。接受 DNxHR 流。
- ‘dts audio’
DTS 相干声学 (DCA) 音频
- ‘eac3 audio’
Dolby Digital Plus,也称为增强型 AC-3
- ‘evc video (evc)’
MPEG-5 基本视频编码 (EVC) / EVC / MPEG-5 第 1 部分 EVC视频
- ‘g722 audio’
ITU-T G.722 音频
- ‘g723_1 audio (tco, rco)’
ITU-T G.723.1 音频
- ‘g726 audio’
ITU-T G.726 大端(“左对齐”)音频。
未注册扩展名,因此必须提供格式名称,例如使用 ffmpeg CLI 工具 -f g726。
- ‘g726le audio’
ITU-T G.726 小端(“右对齐”)音频。
未注册扩展名,因此必须提供格式名称,例如使用 ffmpeg CLI 工具 -f g726le。
- ‘gsm audio’
全球移动通信系统音频
- ‘h261 video’
ITU-T H.261 视频
- ‘h263 video’
ITU-T H.263 / H.263-1996、H.263+ / H.263-1998 / H.263 版本 2 视频
- ‘h264 video (h264, 264)’
ITU-T H.264 / MPEG-4 第 10 部分 AVC 视频。如果比特流处于长度前缀模式,则应将其转换为附件 B 语法。
- ‘hevc video (hevc, h265, 265)’
ITU-T H.265 / MPEG-H 第 2 部分 HEVC 视频。如果比特流处于长度前缀模式,则应将其转换为附件 B 语法。
- ‘m4v video’
MPEG-4 第 2 部分视频
- ‘mjpeg video (mjpg, mjpeg)’
Motion JPEG 视频
- ‘mlp audio’
Meridian 无损打包,也称为打包 PCM
- ‘mp2 audio (mp2, m2a, mpa)’
MPEG-1 音频第 II 层音频
- ‘mpeg1video video (mpg, mpeg, m1v)’
MPEG-1 第 2 部分视频。
- ‘mpeg2video video (m2v)’
ITU-T H.262 / MPEG-2 第 2 部分视频
- ‘obu video’
AV1 低开销开放比特流单元复用器。
时间分隔符 OBU 将插入到流的所有时间单元中。
- ‘rawvideo video (yuv, rgb)’
原始未压缩视频。
- ‘sbc audio (sbc, msbc)’
蓝牙 SIG 低复杂度子带编解码器音频
- ‘truehd audio (thd)’
Dolby TrueHD 音频
- ‘vc1 video’
SMPTE 421M / VC-1 视频
4.1.1示例
- 使用 ffmpeg 的“rawvideo”复用器存储原始视频帧:
ffmpeg -f lavfi -i testsrc -t 10 -s hd1080p testsrc.yuv 由于 rawvideo 复用器不存储与大小和格式相关的信息,因此在对文件进行解复用时必须提供此信息: ffplay -video_size 1920x1080 -pixel_format rgb24 -f rawvideo testsrc.rgb
4.2 原始 PCM 复用器
本节介绍原始 PCM(脉冲编码调制)音频复用器。
它们接受与指定编解码器匹配的单个流。它们不存储时间戳或元数据。识别的扩展名与复用器名称相同。
它包括以下复用器。用于从输出扩展中自动选择复用器的可选附加扩展名也显示在括号中。
- ‘alaw (al)’
PCM A 律
- ‘f32be’
PCM 32 位浮点大端字节序
- ‘f32le’
PCM 32 位浮点小端字节序
- ‘f64be’
PCM 64 位浮点大端字节序
- ‘f64le’
PCM 64 位浮点小端字节序
- ‘mulaw (ul)’
PCM 多律
- ‘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 程序流复用器
本节介绍属于 MPEG-1 和 MPEG-2 系统系列的格式。
MPEG-1 系统格式(也称为 ISO/IEEC 11172-1 或 MPEG-1 程序流)已被用于 VCD(视频光盘)中存储的媒体轨道格式。
MPEG-2 系统标准(也称为 ISO/IEEC 13818-1)涵盖两种容器格式,一种称为传输流,一种称为程序流;本文仅介绍后者。
MPEG-2 程序流格式(也称为 VOB,因为相应的文件扩展名)是 MPEG-1 程序流的扩展:除了支持音频和视频流的不同编解码器外,它还存储字幕和导航元数据。MPEG-2 程序流已被用于在 SVCD 和 DVD 存储设备中存储媒体流。
本节包括以下复用器。
- ‘mpeg (mpg,mpeg)’
MPEG-1 系统/MPEG-1 程序流复用器。
- ‘vcd’
MPEG-1 系统/MPEG-1 程序流 (VCD) 复用器。
此复用器可用于生成 VCD(视频光盘)存储设备接受的格式的音轨。
它与‘mpeg’复用器相同,但略有不同。
- ‘vob’
MPEG-2 程序流 (VOB) 复用器。
- ‘dvd’
MPEG-2 程序流 (DVD VOB) 复用器。
此复用器可用于生成 DVD(数字多功能光盘)存储设备接受的格式的曲目。
这与‘vob’复用器相同,但略有不同。
- ‘svcd (vob)’
MPEG-2 程序流 (SVCD VOB) 复用器。
此复用器可用于生成 SVCD(超级视频光盘)存储设备接受的格式的曲目。
这与‘vob’复用器相同,但略有不同。
4.3.1 选项
- muxrate rate
设置用户定义的复用速率,以位数/秒表示。如果未指定,则采用自动计算的复用速率。默认值为 0。
- preload delay
设置初始解复用解码延迟(以微秒为单位)。默认值为 500000。
4.4 MOV/MPEG-4/ISOMBFF 多路复用器
本节介绍属于 QuickTime / MOV 系列的格式,包括 MPEG-4 Part 14 格式和 ISO 基本媒体文件格式 (ISOBMFF)。这些格式基于 ISO 基本媒体文件格式 (ISOBMFF) 共享一个通用结构。
MOV 格式最初是为与 Apple QuickTime 一起使用而开发的。它后来被用作 MPEG-4 第 1 部分(后来的第 14 部分)格式的基础,也称为 ISO/IEC 14496-1。该格式随后被推广为 ISOBMFF,也称为 MPEG-4 第 12 部分格式、ISO/IEC 14496-12 或 ISO/IEC 15444-12。
它包括以下复用器。
- ‘3gp’
用于 3G UMTS 多媒体服务的第三代合作伙伴计划 (3GPP) 格式
- ‘3g2’
用于 3G CDMA2000 多媒体服务的第三代合作伙伴计划 2 (3GP2 或 3GPP2) 格式,类似于‘3gp’,但有扩展和限制
- ‘f4v’
Adobe Flash 视频格式
- ‘ipod’
MPEG-4 音频文件格式,与 MOV/MP4 相同,但仅限于包含音频流,通常使用 Apple ipod 播放设备
- ‘ismv’
Microsoft IIS(Internet 信息服务)流畅流式音频/视频 (ISMV 或 ISMA) 格式。此格式基于 MPEG-4 Part 14 格式,但有一些不兼容的变体,用于为 Microsoft IIS 服务器流式传输媒体文件。
- ‘mov’
.mov 扩展名标识的 QuickTime 播放器格式
- ‘mp4’
MP4 或 MPEG-4 Part 14 格式
- ‘psp’
PlayStation Portable MP4/MPEG-4 Part 14 格式变体。此格式基于 MPEG-4 Part 14 格式,但有一些不兼容的变体,用于在 PlayStation 设备上播放文件。
4.4.1 碎片化
‘mov’、‘mp4’ 和 ‘ismv’ 多路复用器支持碎片化。通常,MOV/MP4 文件会将所有数据包的所有元数据存储在一个位置。
这些数据通常写在文件末尾,但可以通过将 +faststart 添加到 -movflags 或使用 qt-faststart 工具将其移动到开头,以便更好地播放。
碎片文件由多个碎片组成,其中数据包和有关这些数据包的元数据存储在一起。写入碎片文件的优点是即使写入中断,文件也可以解码(而普通 MOV/MP4 如果没有正确完成则无法解码),并且在写入非常长的文件时需要的内存较少(因为写入普通 MOV/MP4 文件会将有关每个数据包的信息存储在内存中,直到文件关闭)。缺点是它与其他应用程序的兼容性较差。
通过设置定义如何将文件切割成碎片的选项之一来启用碎片:
- frag_duration
- frag_size
- min_frag_duration
- movflags +frag_keyframe
- movflags +frag_custom
如果指定了多个条件,则当满足指定条件之一时会切割碎片。例外情况是选项min_frag_duration,必须满足该选项才能应用任何其他条件。
4.4.2 选项
- brand brand_string
覆盖主要品牌。
- empty_hdlr_name bool
启用跳过在 hdlr 框内写入名称。默认值为 false。
- encryption_key key
以十六进制格式设置媒体加密密钥
- encryption_kid kid
以十六进制格式设置媒体加密密钥标识符
- encryption_scheme scheme
配置加密方案,允许的值为“none”和“cenc-aes-ctr”
- frag_duration duration
创建持续时间为微秒的片段。
- frag_interleave number
在片段内交错样本(连续样本的最大数量,越低交错越紧密,但开销越大。默认情况下设置为 0。
- frag_size size
创建包含最多 size 个有效负载数据的片段
- iods_audio_profile profile
指定音频配置文件原子的 iods 数量(从 -1 到 255),默认值为 -1
- iods_video_profile profile
指定视频配置文件原子的 iods 数量(从 -1 到 255),默认值为-1
- ism_lookahead num_entries
指定 ISM 文件的前瞻条目数(从 0 到 255),默认值为 0
- min_frag_duration duration
不创建长度小于持续时间微秒的片段
- moov_size bytes
在文件开头为 moov 原子保留空间,而不是将 moov 原子放在末尾。如果保留的空间不足,则多路复用失败。
- mov_gamma gamma
指定伽马原子的伽马值(0 到 10 之间的十进制数),默认值为 0.0,必须与 + movflags 一起设置
- movflags flags
设置各种多路复用开关。可以使用以下标志:
- ‘cmaf’
写入兼容 CMAF(通用媒体应用格式)的碎片化 MP4 输出
- ‘dash’
写入兼容 DASH(HTTP 上的动态自适应流)的碎片化 MP4 输出
- ‘default_base_moof’
与“omit_tfhd_offset”标志类似,此标志避免在 tfhd 原子中写入绝对 base_data_offset 字段,而是使用新的 default-base-is-moof 标志来实现。此标志是 14496-12:2012 中的新标志。在某些情况下,这可能会使片段更容易解析(避免根据前一个轨道片段的隐式结尾计算轨道片段位置)。
- ‘delay_moov’
延迟写入初始 moov,直到第一个片段被剪切,或直到第一个片段刷新
- ‘disable_chpl’
禁用 Nero 章节标记 (chpl atom)。通常,Nero 章节和 QuickTime 章节轨道都会写入文件。设置此选项后,将仅写入 QuickTime 章节轨道。使用某些标记程序(如 mp3Tag 2.61a 和 iTunes 11.3)重新处理文件时,Nero 章节可能会导致失败,其他版本很可能也会受到影响。
- ‘faststart’
运行第二遍,将索引(moov atom)移动到文件开头。此操作可能需要一段时间,并且在碎片输出等各种情况下不起作用,因此默认情况下不启用。
- ‘frag_custom’
允许调用者手动选择何时剪切片段,方法是调用 av_write_frame(ctx, NULL) 来写入一个包含迄今为止写入的数据包的片段。 (这仅适用于集成 libavformat 的其他应用程序,而不是 ffmpeg。)
- ‘frag_discont’
表示下一个片段与之前的片段不连续
- ‘frag_every_frame’
每个帧的片段
- ‘frag_keyframe’
在每个视频关键帧处开始一个新片段
- ‘global_sidx’
在文件开头写入全局 sidx 索引
- ‘isml’
创建实时流畅流媒体源(用于推送到发布点)
- ‘negative_cts_offsets’
启用 CTTS 框版本 1 的使用,其中 CTS 偏移量可以为负数。这使得初始样本的 DTS/CTS 为零,并减少了某些情况下(例如带有 B 帧的视频轨道)对编辑列表的需求。此外,还简化了与 DASH-IF 互操作性指南的一致性。
在写入“ismv”(平滑流)文件时隐式设置此选项。
- ‘omit_tfhd_offset’
不要在 tfhd 原子中写入任何绝对 base_data_offset。这避免将片段与文件/流中的绝对字节位置绑定。
- ‘prefer_icc’
如果写入 colr atom,则优先使用 ICC 配置文件(如果该配置文件存在于流数据包端数据中)。
- ‘rtphint’
将 RTP 提示轨道添加到输出文件
- ‘separate_moof’
为每个轨道写入一个单独的 moof(电影片段)原子。通常情况下,所有轨道的数据包都写入 moof atom(效率略高),但设置此选项后,复用器会为每个轨道写入一个 moof/mdat 对,从而更容易分离轨道。
- ‘skip_sidx’
跳过 sidx atom 的写入。当 sidx atom 导致的比特率开销很高时,此选项可用于 sidx atom 不是强制性的情况。当启用‘global_sidx’标志时,此选项将被忽略。
- ‘skip_trailer’
跳过为碎片文件写入 mfra/tfra/mfro 尾部
- ‘use_metadata_tags’
使用 mdta atom 作为元数据
- ‘write_colr’
即使未指定颜色信息,也写入 colr atom。此标志是实验性的,可能会重命名或更改,请勿在脚本中使用。
- ‘write_gama’
写入已弃用的 gama 原子
- ‘hybrid_fragmented’
为了可恢复性 - 将输出文件作为碎片文件写入。这允许在写入时读取中间文件(特别是如果写入过程不干净地中止)。写入完成后,文件将转换为常规的非碎片文件,这更兼容并且允许更轻松、更快地查找。
如果写入中止,可以手动重新混合中间文件以获取已写入未完成文件的常规非碎片文件。
- movie_timescale scale
设置电影标题框 (mvhd) 中写入的时间刻度。范围为 1 到 INT_MAX。默认值为 1000。
- rtpflags flags
将 RTP 提示轨道添加到输出文件。
可以使用以下标志:
- ‘h264_mode0’
在 RTP 中对 H.264 使用模式 0
- ‘latm’
对 AAC 使用 MP4A-LATM 打包,而不是 MPEG4-GENERIC
- ‘rfc2190’
对 H.264 使用 RFC 2190 打包,而不是 RFC 4629 H.263
- ‘send_bye’
完成时发送 RTCP BYE 数据包
- ‘skip_rtcp’
不发送 RTCP 发送方报告
- skip_iods bool
跳过写入 iods atom(默认值为 true)
- use_editlist bool
使用编辑列表(默认值为 auto)
- use_stream_ids_as_track_ids bool
使用流 ID 作为轨道 ID(默认值为 false)
- video_track_timescale scale
设置用于视频轨道的时间刻度。范围为 0 到 INT_MAX。如果设置为 0,则时间刻度将根据本机流时间基准自动设置。默认值为 0。
- write_btrt bool
强制或禁用在轨道的 stsd 框内写入比特率框。该框包含解码缓冲区大小(以字节为单位)、轨道的最大比特率和平均比特率。如果无法计算这些值,则将跳过该框。默认值为 -1 或自动,这将仅在 MP4 模式下写入框。
- write_prft option
使用指定的时间源为 PRFT 框中的 NTP 字段写入生产者时间参考框 (PRFT)。将值设置为“wallclock”以将时间源指定为挂钟时间,将“pts”以将时间源指定为输入数据包的 PTS 值。
- write_tmcd bool
指定 on 可强制写入时间码轨道,off 可禁用它,auto 可仅为 mov 和 mp4 输出写入时间码轨道(默认)。
将值设置为“pts”仅适用于实时编码用例,其中 PTS 值设置为源处的挂钟时间。例如,具有 decklink 捕获源的编码用例,其中 video_pts 和 audio_pts 设置为“abs_wallclock”。
4.4.3 示例
- 使用 ffmpeg 的“ismv”复用器将 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 视频复用器。
此复用器接受单个 a64_multi 或 a64_multi5 编解码器视频流。
4.6 ac4
原始 AC-4 音频复用器。
此复用器接受单个 ac4 音频流。
4.6.1 选项
- write_crc bool
启用时,将每个数据包的 CRC 校验和写入输出,默认为 false
4.7 adts
音频数据传输流复用器。
它接受单个 AAC 流。
4.7.1 选项
- write_id3v2 bool
启用在流的开头写入 ID3v2.4 标签。默认禁用。
- write_apetag bool
启用在流的结尾写入 APE 标签。默认禁用。
- write_mpeg2 bool
启用将 ADTS 帧头中的 MPEG 版本位设置为 1,表示 MPEG-2。默认值为 0,表示 MPEG-4。
4.8 aea
MD STUDIO 音频复用器。
此复用器接受具有一个或两个通道和 44100Hz 采样率的单个 ATRAC1 音频流。
由于 AEA 支持存储曲目标题,因此此复用器还会将标题从流的元数据写入容器。
4.9 aiff
音频交换文件格式复用器。
4.9.1 选项
- write_id3v2 bool
设置为 1 时启用 ID3v2 标签写入。默认值为 0(禁用)。
- id3v2_version bool
选择要写入的 ID3v2 版本。目前仅支持版本 3 和 4(又名 ID3v2.3 和 ID3v2.4)。默认为版本 4。
4.10 alp
High Voltage Software 的 Lego Racers 游戏音频复用器。
它接受单个 ADPCM_IMA_ALP 流,通道数不超过 2 个,采样率不超过 44100 Hz。
扩展名:tun、pcm
4.10.1 选项
- type type
设置文件类型。
类型接受以下值:
- ‘tun’
将文件类型设置为音乐。采样率必须为 22050 Hz。
- ‘pcm’
将文件类型设置为 sfx。
- ‘auto’
根据输出文件扩展名设置文件类型。.pcm 导致类型 pcm,否则设置类型 tun。(默认)
4.11 amr
3GPP AMR(自适应多速率)音频复用器。
它接受包含 AMR NB 流的单个音频流。
4.12 amv
AMV(Actions Media Video)格式复用器。
4.13 apm
Ubisoft Rayman 2 APM 音频复用器。
它接受单个 ADPCM IMA APM 音频流。
4.14 apng
动画便携式网络图形复用器。
它接受单个 APNG 视频流。
4.14.1 选项
- final_delay delay
强制在每次重复的最后一帧后延迟(以秒为单位)。默认值为 0.0。
- plays repetitions
指定播放内容的次数,0 表示无限循环,1 表示不循环
4.14.2 示例
- 使用 ffmpeg 生成重复 2 次的 APNG 输出,第一次重复后延迟半秒:
ffmpeg -i INPUT -final_delay 0.5 -plays 2 out.apng
4.15 argo_asf
Argonaut Games ASF 音频复用器。
它接受单个 ADPCM 音频流。
4.15.1 选项
- version_major version
覆盖文件主版本,指定为整数,默认值为 2
- version_minor version
覆盖文件次版本,指定为整数,默认值为 1
- name name
将文件名嵌入文件,如果未指定,则使用输出文件名。名称被截断为 8 个字符。
4.16 argo_cvg
Argonaut Games CVG 音频复用器。
它接受单个单通道 ADPCM 22050Hz 音频流。
loop和reverb选项在标头中设置相应的标志,稍后可以检索这些标志以相应地处理音频流。
4.16.1 选项
- skip_rate_check bool
跳过采样率检查(默认为 false)
- loop bool
设置循环标志(默认为 false)
- reverb boolean
设置混响标志(默认为 true)
4.17 asf, asf_stream
高级/活动系统(或流式传输)格式音频复用器。
应选择“asf_stream”变体进行流式传输。
请注意,Windows Media Audio (wma) 和 Windows Media Video (wmv) 也使用此复用器。
4.17.1 选项
- packet_size size
将复用器数据包大小设置为字节数。通过调整此设置,您可以根据源减少数据碎片或复用器开销。默认值为 3200,最小值为 100,最大值为 64Ki。
4.18 ass
ASS/SSA (SubStation Alpha) 字幕复用器。
它接受单个 ASS 字幕流。
4.18.1 选项
- ignore_readorder bool
立即写入对话事件,即使它们是无序的,默认值为 false,否则它们将被缓存,直到找到预期的时间事件。
4.19 ast
AST(音频流)复用器。
此格式用于在某些 Nintendo Wii 游戏上播放音频。
它接受单个音频流。
...
指定循环结束位置(以毫秒为单位),从 0 到 INT_MAX,默认值为 0,如果设置为 0,则假定总流持续时间。
4.20 au
SUN AU 音频复用器。
它接受单个音频流。
4.21 avi
音频视频交错复用器。
AVI 是 Microsoft 开发的专有格式,后来通过 Open DML 规范正式指定。
由于播放器实现的差异,可能需要设置一些选项以确保生成的输出可以由目标播放器正确播放。
4.21.1 选项
- flipped_raw_rgb bool
如果设置为 true,则存储原始 RGB 位图的正高度,这表示位图自下而上存储。请注意,此选项不会翻转位图,这必须事先手动完成,例如通过使用“vflip”过滤器。默认值为 false,表示位图自上而下存储。
- reserve_index_space size
在文件头中为每个流的 OpenDML 主索引保留指定数量的字节。默认情况下,如果第一个主索引中没有剩余空间,则附加主索引将嵌入数据包中,并链接在一起作为索引链。这种索引结构可能会在某些用例中导致问题,例如第三方软件严格依赖 OpenDML 索引规范或文件查找速度很慢。在文件头中保留足够的索引空间可以避免这些问题。
所需的索引空间取决于输出文件大小,大约为每 GB 16 字节。当省略此选项或将其设置为零时,将猜测所需的索引空间。
默认值为 0。
- write_channel_mask bool
将通道布局掩码写入音频流标头。
此选项默认启用。禁用通道掩码在特定情况下很有用,例如,将多个音频流合并为一个以兼容仅支持 AVI 中单个音频流的软件(请参阅 (ffmpeg-filters)ffmpeg-filters 手册中的“amerge”部分)。
4.22 avif
AV1(开放媒体视频编解码器联盟 1)图像格式复用器。
此复用器存储使用 AV1 编解码器编码的图像。
它接受一个或两个视频流。如果提供了两个视频流,则第二个视频流应包含一个存储 alpha 掩码的平面。
如果提供了多个图像,则生成的输出将被视为动画 AVIF,并且可以使用loop选项指定循环次数。
这是基于开放媒体联盟的规范,网址为 https://aomediacodec.github.io/av1-avif。
4.22.1 选项
- loop count
动画 AVIF 的循环次数,0 指定无限循环,默认为 0
- movie_timescale timescale
设置写入电影标题框 (mvhd) 的时间刻度。范围为 1 至 INT_MAX。默认值为 1000。
4.23 avm2
ShockWave Flash (SWF) / ActionScript Virtual Machine 2 (AVM2) 格式复用器。
它接受一个音频流、一个视频流或两者。
4.24 bit
G.729 (.bit) 文件格式复用器。
它接受单个 G.729 音频流。
4.25 caf
Apple CAF (核心音频格式) 复用器。
它接受单个音频流。
4.26 codec2
Codec2 音频音频复用器。
它接受单个 codec2 音频流。
4.27 chromaprint
Chromaprint 指纹复用器。
要启用此过滤器的编译,您需要使用 --enable-chromaprint 配置 FFmpeg。
此复用器将音频数据提供给 Chromaprint 库,该库为提供的音频数据生成指纹。请参阅:https://acoustid.org/chromaprint
它采用最多 2 个通道的单个有符号的本机字节序 16 位原始音频流。
4.27.1 选项
- algorithm version
选择指纹识别算法的版本。范围为 0 到 4。版本 3 启用静音检测。默认值为 1。
- fp_format format
输出指纹的格式。接受以下选项:
- ‘base64’
Base64 压缩指纹(默认)
- ‘compressed’
二进制压缩指纹
- ‘raw’
二进制原始指纹
- silence_threshold threshold
检测静音的阈值。范围从 -1 到 32767,其中 -1 禁用静音检测。静音检测只能与算法的第 3 版一起使用。
必须禁用静音检测才能与 AcoustID 服务一起使用。默认值为 -1。
4.28 crc
CRC(循环冗余校验)复用器。
此复用器计算并打印所有输入音频和视频帧的 Adler-32 CRC。默认情况下,在计算 CRC 之前,音频帧会转换为带符号的 16 位原始音频,视频帧会转换为原始视频。
复用器的输出由一行组成,格式为:CRC=0xCRC,其中 CRC 是一个十六进制数,用 0 填充为 8 位数字,包含所有解码输入帧的 CRC。
另请参阅 framecrc 复用器。
4.28.1 示例
- 使用 ffmpeg 计算输入的 CRC,并将其存储在文件 out.crc 中:
ffmpeg -i INPUT -f crc out.crc - 使用 ffmpeg 以下命令将 CRC 打印到 stdout:
ffmpeg -i INPUT -f crc - - 您可以通过指定音频和视频编解码器和格式来使用 ffmpeg 选择每个帧的输出格式。例如,要计算转换为 PCM 无符号 8 位的输入音频和转换为 MPEG-2 视频的输入视频的 CRC,请使用以下命令:
ffmpeg -i INPUT -c:a pcm_u8 -c:v mpeg2video -f crc -
4.29 dash
动态自适应 HTTP 流 (DASH) 复用器。
此复用器根据 MPEG-DASH 标准 ISO/IEC 23009-1:2014 和以下标准更新创建片段和清单文件。
有关更多信息,请参阅:
- ISO DASH 规范:http://standards.iso.org/ittf/PubliclyAvailableStandards/c065274_ISO_IEC_23009-1_2014.zip
- WebM DASH 规范:https://sites.google.com/a/webmproject.org/wiki/adaptive-streaming/webm-dash-specification
此复用器为每个流创建一个 MPD(媒体演示描述)清单文件和段文件。片段文件放置在 MPD 清单文件的同一目录中。
片段文件名可能包含清单 SegmentTemplate 部分中使用的预定义标识符,如标准第 5.3.9.4.4 节中定义。
可用的标识符为 $RepresentationID$、$Number$、$Bandwidth$ 和 $Time$。除了标准标识符外,还支持特定于 ffmpeg 的 $ext$ 标识符。指定后,ffmpeg 将用多路复用格式的扩展名(如 mp4、webm 等)替换文件名中的 $ext$。
4.29.1 选项
- adaptation_sets adaptation_sets
将流分配给 MPD 清单 AdaptationSets 部分中指定的适配集。
自适应集包含一组作为单个子集访问的一个或多个流,例如,用户可根据可用带宽选择以不同大小编码的相应流,或使用不同语言的不同音频流。
每个自适应集都使用以下语法指定:
id=index,streams=streams 其中 index 必须是数字索引,streams 是一系列以 , 分隔的流索引。可以指定多个自适应集,以空格分隔。
要将所有视频(或音频)流映射到自适应集,可以使用 v(或 a)作为流标识符而不是 ID。
当未定义分配时,默认为每个流设置一个自适应集。
还可以指定以下可选字段:
- descriptor
按照 ISO/IEC 23009-1:2014/Amd.2:2015 定义描述符。
例如:
<SupplementalProperty schemeIdUri=\"urn:mpeg:dash:srd:2014\" value=\"0,0,0,1,1,2,2\"/> 描述符字符串应为自闭合 XML 标记。
- frag_duration
使用frag_duration选项覆盖指定的全局片段持续时间。
- frag_type
使用frag_type选项覆盖指定的全局片段类型。
- seg_duration
使用seg_duration选项覆盖指定的全局段持续时间。
- trick_id
将适配集标记为包含用于引用适配集的 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 段文件格式。这是默认模式。
- ‘mp4’
短划线片段文件将采用 ISOBMFF/MP4 格式
- ‘webm’
短划线片段文件将采用 WebM 格式
- extra_window_size size
设置从磁盘中删除之前保留在清单之外的最大片段数。
- format_options options_list
使用 : 分隔的 key=value 参数列表设置容器格式 (mp4/webm) 选项。包含 : 特殊字符的值必须转义。
- frag_duration duration
设置片段内片段的长度(以秒为单位),也可以设置小数值。
- frag_type type
设置分段间隔的类型。
可能的值:
- ‘auto’
每个片段设置一个片段
- ‘every_frame’
每个帧的片段
- ‘duration’
特定时间的片段间隔
- ‘pframes’
关键帧处的片段以及随后的 P 帧重新排序(仅限视频,实验性)
- global_sidx bool
写入全局 SIDX 原子。仅适用于单个文件、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 协议的 :-separated 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
通过限制某些元素的存在和值来启用低延迟 Dash。默认情况下禁用此功能。
- lhls bool
启用低延迟 HLS (LHLS)。添加带有当前片段 URI 的 #EXT-X-PREFETCH 标签。hls.js 播放器人员正在尝试标准化开放的 LHLS 规范。草案规范可在“https://github.com/video-dev/hlsjs-rfcs/blob/lhls-spec/proposals/0001-lhls.md”获得。
此选项尝试遵守上述开放规范。它会自动启用流媒体和 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 方法创建输出文件。通常设置为 PUT 或 POST。
- min_playback_rate rate
设置适当的最小播放速率,以便在客户端正常播放期间自动调整播放延迟和缓冲区占用率。
- mpd_profile flags
设置一个或多个 MPD 清单配置文件。
可能的值:
- ‘dash’
MPEG-DASH ISO 基本媒体文件格式实时配置文件
- ‘dvb_dash’
DVB-DASH 配置文件
默认值为 dash。
- remove_at_exit bool
启用或禁用完成后删除所有片段。默认情况下禁用。
- seg_duration duration
以秒为单位设置片段长度(可以设置小数值)。当启用 use_template 选项并禁用 use_timeline 选项时,该值被视为平均片段持续时间,对于所有其他用例,该值被视为最短片段持续时间。
默认值为 5。
- single_file bool
启用或禁用将所有片段存储在一个文件中,使用字节范围进行访问。默认情况下禁用此功能。
可以使用 single_file_name 选项指定单个文件的名称,如果未指定,则假定清单文件的基本名称和输出格式扩展名。
- single_file_name file_name
用于清单 baseURL 元素的 DASH 模板名称。暗示 single_file 选项设置为 true。在模板中,$ext$ 被替换为特定于片段格式的文件扩展名。
- streaming bool
启用或禁用输出的块流模式。在块流模式下,每个帧将是一个形成块的 moof 片段。默认情况下禁用此功能。
- target_latency target_latency
设置服务的预期目标延迟(以秒为单位)(可以设置小数值)。仅在启用 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
在支持的流上写入生产者参考时间元素。这还允许在底层复用器中写入 prft 框。仅在启用 utc_url 选项时适用。默认情况下,它设置为自动,在这种情况下,复用器将仅在需要它的模式下尝试启用它。
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 音频复用器。
它接受使用“pcm_24daud”编解码器编码的以 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(数字视频)复用器。
它只接受一个“dvvideo”视频流和最多两个“pcm_s16”音频流。视频属性定义了更多约束,该属性必须与 DV 视频支持的配置文件相对应,并且与帧速率有关。
4.31.1 示例
使用 ffmpeg 转换输入:
ffmpeg -i INPUT -s:v 720x480 -pix_fmt yuv411p -r 29.97 -ac 2 -ar 48000 -y out.dv
4.32 ffmetadata
FFmpeg 元数据复用器。
此复用器以“ffmetadata”格式写入流元数据。
有关格式的信息,请参阅 (ffmpeg-formats) 元数据章节。
4.32.1 示例
使用 ffmpeg 将输入文件中的元数据提取到 ‘ffmetadata’ 格式的 metadata.ffmeta 文件中:
ffmpeg -i INPUT -f ffmetadata metadata.ffmeta
4.33 fifo
FIFO(先进先出)复用器。
‘fifo’ 伪复用器允许通过使用先进先出队列并在单独的线程中运行实际复用器来分离编码和复用。
这与 tee 复用器结合使用时特别有用,可用于将数据发送到具有不同可靠性/写入速度/延迟的多个目的地。
目标复用器可以从输出名称中选择,也可以通过 fifo_format 选项指定。
如果队列已满或输出失败(例如,如果无法将数据包写入输出),则“fifo”复用器的行为是可选的:
- 可以根据实时时间或处理流的时间透明地重新启动输出,重试之间的延迟可配置。
- 在临时故障期间可以阻止编码,或者在 FIFO 队列已满的情况下继续透明地丢弃数据包。
API 用户应注意,其 AVFormatContext 中使用的回调函数(interrupt_callback、io_open 和 io_close)必须是线程安全的。
4.33.1 选项
- attempt_recovery bool
如果发生故障,则尝试恢复输出。这在与网络输出一起使用时特别有用,因为它可以透明地重新启动流式传输。默认情况下,此选项设置为 false。
- drop_pkts_on_overflow bool
如果设置为 true,则在 fifo 队列已满的情况下,数据包将被丢弃而不是阻止编码器。这样就可以继续流式传输而不会延迟输入,但代价是忽略部分流。默认情况下,此选项设置为 false,因此在这种情况下,编码器将被阻止,直到多路复用器处理一些数据包并且没有丢失任何数据包。
- fifo_format format_name
指定格式名称。如果无法从输出名称后缀中猜出格式名称,则很有用。
- format_opts options
指定底层多路复用器的格式选项。多路复用器选项可以指定为以“:”分隔的键=值对列表。
- max_recovery_attempts count
设置连续失败恢复尝试的最大次数,超过此次数输出将永久失败。默认情况下,此选项设置为 0(无限制)。
- queue_size size
将队列大小指定为数据包数。默认值为 60。
- recover_any_error bool
如果设置为 true,则无论导致失败的错误类型如何,都将尝试恢复。默认情况下,此选项设置为 false,如果出现某些(通常是永久性的)错误,即使 attempt_recovery 选项设置为 true,也不会尝试恢复。
- recovery_wait_streamtime bool
如果设置为 false,则在等待恢复尝试时使用实际时间(即,将在 recovery_wait_time 选项指定的时间后尝试恢复)。
如果设置为 true,则改为考虑已处理流的时间(即,将在丢弃与 recovery_wait_time 选项相对应的数据包后尝试恢复)。
默认情况下,此选项设置为 false。
- recovery_wait_time duration
指定上一次恢复尝试失败后,在下一次恢复尝试之前等待的时间(以秒为单位)。默认值为 5。
- restart_with_keyframe bool
指定从队列溢出或故障中恢复后是否等待关键帧。默认情况下,此选项设置为 false。
- timeshift duration
缓冲指定数量的数据包并延迟写入输出。请注意,queue_size选项的值必须足够大,才能存储用于时间移位的数据包。在输入结束时,fifo 缓冲区以实时速度刷新。
4.33.2 示例
使用 ffmpeg 流式传输到 RTMP 服务器,即使出现临时故障(网络中断),也继续以实时速率处理流,并尝试无限期地每秒恢复流式传输:
ffmpeg -re -i ... -c:v libx264 -c:a aac -f fifo -fifo_format flv \
-drop_pkts_on_overflow 1 -attempt_recovery 1 -recovery_wait_time 1 \
-map 0:v -map 0:a rtmp://example.com/live/stream_name
4.34 film_cpk
世嘉电影 (.cpk) 复用器。
此格式被用作多款世嘉游戏的内部格式。
有关 Sega 电影文件格式的更多信息,请访问 http://wiki.multimedia.cx/index.php?title=Sega_FILM。
它最多接受一个“cinepak”或原始视频流,最多接受一个音频流。
4.35 胶片
Adobe 胶片复用器。
此格式由多种 Adobe 工具用于存储生成的胶片导出。它接受单个原始视频流。
4.36 fits
灵活图像传输系统 (FITS) 复用器。
此图像格式用于存储天文数据。
有关格式的更多信息,请访问 https://fits.gsfc.nasa.gov。
4.37 flac
原始 FLAC 音频复用器。
此复用器只接受一个 FLAC 音频流。此外,还可以使用“attached_pic”配置添加图像。
4.37.1 选项
- write_header bool
如果设置为 true,则写入文件头,默认为 true
4.37.2 示例
使用 ffmpeg 存储来自输入文件的音频流,以及使用‘attached_pic’配置的几张图片:
ffmpeg -i INPUT -i pic1.png -i pic2.jpg -map 0:a -map 1 -map 2 -disposition:v attached_pic OUTPUT
4.38 flv
Adobe Flash 视频格式多路复用器。
4.38.1 选项
- flvflags flags
可能的值:
- ‘aac_seq_header_detect’
根据音频流数据放置 AAC 序列头。
- ‘no_sequence_end’
禁用序列结束标记。
- ‘no_metadata’
禁用元数据标记。
- ‘no_duration_filesize’
当元数据中的持续时间和文件大小在流结束时等于零时,禁用它们。(用于不可搜索的实时流)。
- ‘add_keyframe_index’
用于方便搜索;特别是对于 HTTP 伪流。
4.39 framecrc
每个数据包的 CRC(循环冗余校验)测试格式。
此复用器计算并打印每个音频和视频数据包的 Adler-32 CRC。默认情况下,在计算 CRC 之前,音频帧会转换为有符号的 16 位原始音频,视频帧会转换为原始视频。
复用器的输出由以下格式的每个音频和视频数据包的一行组成:
stream_index, packet_dts, packet_pts, packet_duration, packet_size, 0xCRC
CRC 是一个十六进制数,用 0 填充为 8 位数字,包含数据包的 CRC。
4.39.1 示例
例如,要计算INPUT中音频和视频帧的 CRC,将其转换为原始音频和视频数据包,并将其存储在文件out.crc中:
ffmpeg -i INPUT -f framecrc out.crc
要将信息打印到 stdout,请使用以下命令:
ffmpeg -i INPUT -f framecrc -
使用 ffmpeg,您可以通过指定音频和视频编解码器,在计算每个数据包的 CRC 之前选择音频和视频帧的编码输出格式。例如,要计算转换为 PCM 无符号 8 位的每个解码输入音频帧的 CRC 以及转换为 MPEG-2 视频的每个解码输入视频帧的 CRC,请使用以下命令:
ffmpeg -i INPUT -c:a pcm_u8 -c:v mpeg2video -f framecrc -
另请参阅 crc muxer。
4.40 framehash
每个数据包的哈希测试格式。
此复用器计算并打印每个音频和视频数据包的加密哈希。这可用于逐个数据包的相等性检查,而无需对每个数据包单独进行二进制比较。
默认情况下,在计算哈希之前,音频帧会转换为带符号的 16 位原始音频,视频帧会转换为原始视频,但也可以使用显式转换为其他编解码器的输出。它默认使用 SHA-256 加密哈希函数,但支持其他几种算法。
复用器的输出由以下格式的每个音频和视频数据包的一行组成:
stream_index, packet_dts, packet_pts, packet_duration, packet_size, hash
hash 是一个十六进制数,表示数据包的计算哈希值。
- hash algorithm
使用字符串算法指定的加密哈希函数。支持的值包括 MD5、murmur3、RIPEMD128、RIPEMD160、RIPEMD256、RIPEMD320、SHA160、SHA224、SHA256(默认)、SHA512/224、SHA512/256、SHA384、SHA512、CRC32 和 adler32。
4.40.1 示例
要计算INPUT中音频和视频帧的 SHA-256 哈希值,将其转换为原始音频和视频数据包,并将其存储在文件 out.sha256 中:
ffmpeg -i INPUT -f framehash out.sha256
要使用 MD5 哈希函数将信息打印到 stdout,请使用以下命令:
ffmpeg -i INPUT -f framehash -hash md5 -
另请参阅哈希复用器。
4.41 framemd5
每个数据包的 MD5 测试格式。
这是 framehash 复用器的变体。与该复用器不同,它默认使用 MD5 哈希函数。
4.41.1 示例
要计算 INPUT 中音频和视频帧的 MD5 哈希值,将其转换为原始音频和视频数据包,并将其存储在文件 out.md5 中:
ffmpeg -i INPUT -f framemd5 out.md5
要将信息打印到 stdout,请使用以下命令:
ffmpeg -i INPUT -f framemd5 -
另请参阅 framehash 和 md5 多路复用器。
4.42 gif
动画 GIF 多路复用器。
请注意,GIF 格式具有非常大的时间基准:因此两帧之间的延迟不能小于一厘秒。
4.42.1 选项
- loop bool
设置循环输出的次数。使用 -1 表示不循环,使用 0 表示无限循环(默认)。
- final_delay delay
强制在最后一帧后延迟(以厘秒表示)。每一帧都以延迟结束,直到下一帧。默认值为 -1,这是一个特殊值,用于告诉多路复用器重新使用上一个延迟。如果出现循环,您可能需要自定义此值以标记暂停。
4.42.2 示例
对循环 10 次的 gif 进行编码,循环之间间隔 5 秒:
ffmpeg -i INPUT -loop 10 -final_delay 500 out.gif
注 1:如果您希望将帧提取到单独的 GIF 文件中,则需要强制使用 image2 复用器:
ffmpeg -i INPUT -c:v gif -f image2 "out%d.gif"
4.43 gxf
通用交换格式 (GXF) 多路复用器。
GXF 由 Grass Valley Group 开发,随后由 SMPTE 标准化为 SMPTE 360M,并在 SMPTE RDD 14-2007 中进行了扩展,以包含高清视频分辨率。
它最多接受一个视频流,其编解码器为‘mjpeg’、‘mpeg1video’、‘mpeg2video’、‘dvvideo’,分辨率为‘512x480’或‘608x576’,以及多个音频流,其速率为 48000Hz,编解码器为‘pcm16_le’。
4.44 hash
哈希测试格式。
此复用器计算并打印所有输入音频和视频帧的加密哈希。这可用于相等性检查,而无需进行完整的二进制比较。
默认情况下,在计算哈希之前,音频帧会转换为带符号的 16 位原始音频,视频帧会转换为原始视频,但也可以使用显式转换为其他编解码器的输出。时间戳被忽略。它默认使用 SHA-256 加密哈希函数,但支持其他几种算法。
muxer 的输出由一行组成,格式为:algo=hash,其中 algo 是一个短字符串,表示使用的哈希函数,hash 是一个十六进制数,表示计算出的哈希值。
- hash algorithm
使用字符串算法指定的加密哈希函数。支持的值包括 MD5、murmur3、RIPEMD128、RIPEMD160、RIPEMD256、RIPEMD320、SHA160、SHA224、SHA256(默认)、SHA512/224、SHA512/256、SHA384、SHA512、CRC32 和 adler32。
4.44.1 示例
要计算转换为原始音频和视频的输入的 SHA-256 哈希值,并将其存储在文件 out.sha256 中:
ffmpeg -i INPUT -f hash out.sha256
要将 MD5 哈希值打印到标准输出,请使用以下命令:
ffmpeg -i INPUT -f hash -hash md5 -
另请参阅 framehash 多路复用器。
4.45 hds
HTTP 动态流 (HDS) 多路复用器。
HTTP 动态流 (HDS) 是 Adobe 开发的一种自适应比特率流方法。HDS 通过 HTTP 连接提供 MP4 视频内容。HDS 可用于点播流或直播流。
此多路复用器为每个流创建一个 .f4m (Adobe Flash Media Manifest File) 清单、一个 .abst (Adobe Bootstrap File),并在指定为输出的目录中创建分段文件。
HDS 播放器需要通过 HTTPS 访问这些内容,才能播放生成的流。
4.45.1 选项
- extra_window_size int
从磁盘删除之前保留在清单之外的片段数
- min_frag_duration microseconds
最短片段持续时间(以微秒为单位),默认值为 1 秒 (10000000)
- remove_at_exit bool
设置为时,完成后删除所有片段true
- window_size int
如果设置为非 0 的值,则保留在清单中的片段数。默认情况下,所有片段都保留在输出目录中。
4.45.2 示例
使用 ffmpeg 以实时速率生成 HDS 文件到output.hds目录:
ffmpeg -re -i INPUT -f hds -b:v 200k output.hds
4.46 hls
Apple HTTP Live Streaming 复用器,根据 HTTP Live Streaming (HLS) 规范对 MPEG-TS 进行分段。
它会创建一个播放列表文件以及一个或多个片段文件。输出文件名指定播放列表文件名。
默认情况下,多路复用器会为生成的每个片段创建一个文件。这些文件的名称与播放列表相同,后跟一个序列号和一个 .ts 扩展名。
确保在编码时要求封闭的 GOP,并设置 GOP 大小以符合片段时间限制。
例如,要使用 ffmpeg 转换输入文件:
ffmpeg -i in.mkv -c:v h264 -flags +cgop -g 30 -hls_time 1 out.m3u8
此示例将生成播放列表、out.m3u8 和片段文件:out0.ts、out1.ts、out2.ts 等。
另请参阅片段多路复用器,它提供了更通用、更灵活的分段器实现,可用于执行 HLS 分段。
4.46.1 选项
- hls_init_time duration
设置初始目标片段长度。默认值为 0。
duration 必须是时间长度规范,请参阅 (ffmpeg-utils)ffmpeg-utils(1) 手册中的时间长度部分。
在第一个 m3u8 列表上经过此时间后,片段将在下一个关键帧上被剪切。在初始播放列表填满后,ffmpeg 将以等于 hls_time 的持续时间剪切片段。
- hls_time duration
设置目标片段长度。默认值为 2。
duration 必须是时间长度规范,请参阅 (ffmpeg-utils)ffmpeg-utils(1) 手册中的时间长度部分。此时间过后,片段将在下一个关键帧上被剪切。
- hls_list_size size
设置播放列表条目的最大数量。如果设置为 0,列表文件将包含所有片段。默认值为 5。
- hls_delete_threshold size
设置在 hls_flags delete_segments 删除之前保留在磁盘上的未引用片段的数量。增加此值以允许继续客户端下载播放列表中最近引用的片段。默认值为 1,表示将删除早于 hls_list_size+1 的片段。
- hls_start_number_source source
根据指定的来源启动播放列表序列号 (#EXT-X-MEDIA-SEQUENCE)。除非设置了 hls_flags single_file,否则它还会指定片段和字幕文件名的起始序列号的来源。无论如何,如果设置了 hls_flags append_list 并且读取的播放列表序列号大于指定的起始序列号,则该值将用作起始值。
它接受以下值:
- generic (default)
根据 start_number 选项值设置起始编号。
- epoch
将起始编号设置为自纪元 (1970-01-01 00:00:00) 以来的秒数。
- epoch_us
将起始编号设置为自纪元 (1970-01-01 00:00:00) 以来的微秒数。
- datetime
根据当前日期/时间将起始编号设置为 YYYYmmddHHMMSS。例如20161231235759。
- start_number number
当 hls_start_number_source 值为通用时,从指定数字开始播放列表序列号 (#EXT-X-MEDIA-SEQUENCE)。(这是默认情况。)除非设置了 hls_flags single_file,否则它还会指定片段和字幕文件名的起始序列号。默认值为 0。
- hls_allow_cache bool
明确设置客户端是否可以 (1) 或不得 (0) 缓存媒体片段。
- hls_base_url baseurl
将 baseurl 附加到播放列表中的每个条目。用于生成具有绝对路径的播放列表。
请注意,播放列表序列号对于每个片段必须是唯一的,并且不要将其与片段文件名序列号混淆,后者可以是循环的,例如,如果指定了 wrap 选项。
- hls_segment_filename filename
设置片段文件名。除非使用‘single_file’设置hls_flags选项,否则文件名将用作附加了片段编号的字符串格式。
例如:
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 设置了两个或更多变体流时,文件名模式必须包含字符串“%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”可能出现在文件名中,也可能出现在包含该文件的最后一个目录名中,但只能出现在其中一个目录中。(此外,%v 可能在最后一个子目录或文件名中出现多次。)如果字符串 %v 出现在目录名中,则在扩展目录名模式后会创建子目录。这样就可以在子目录中创建与不同变体流相对应的片段。
例如:
ffmpeg -i in.ts -b:v:0 1000k -b:v:1 256k -b:a:0 64k -b:a:1 32k \ -map 0:v -map 0:a -map 0:v -map 0:a -f hls -var_stream_map "v:0,a:0 v:1,a:1" \ -hls_segment_filename 'vs%v/file_%03d.ts' vs%v/out.m3u8 将生成播放列表片段文件集:vs0/file_000.ts、vs0/file_001.ts、vs0/file_002.ts 等,以及 vs1/file_000.ts、vs1/file_001.ts、vs1/file_002.ts 等。
- strftime bool
对文件名使用 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 periodical_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 加密。启用后,生成的每个片段都会被加密,加密密钥会保存为播放列表名称.密钥。
- hls_enc_key key
指定一个 16 八位字节密钥来加密片段,默认情况下它是随机生成的。
- hls_enc_key_url keyurl
如果设置,keyurl 会添加到播放列表中的关键文件名前面,而不是 baseurl。
- hls_enc_iv iv
为每个片段指定 16 个八位字节的初始化向量,而不是自动生成的向量。
- hls_segment_type flags
可能的值:
- ‘mpegts’
以 MPEG-2 传输流格式输出片段文件。这与所有 HLS 版本兼容。
- ‘fmp4’
以分段 MP4 格式输出片段文件,类似于 MPEG-DASH。fmp4 文件可用于 HLS 版本 7 及更高版本。
- hls_fmp4_init_filename filename
设置片段文件头文件的文件名,默认文件名为 init.mp4。
启用 strftime 后,文件名将扩展为带本地时间的片段文件名。
例如:
ffmpeg -i in.nut -hls_segment_type fmp4 -strftime 1 -hls_fmp4_init_filename "%s_init.mp4" out.m3u8 将生成类似 1602678741_init.mp4 的初始化。
- hls_fmp4_init_resend bool
每次 m3u8 文件刷新后重新发送初始化文件,默认为 0。
当 var_stream_map 设置了两个或更多变体流时,文件名模式必须包含字符串“%v”,此字符串指定变体流索引在生成的初始化文件名中的位置。字符串“%v”可能出现在文件名中,也可能出现在包含该文件的最后一个目录名中。如果该字符串出现在目录名中,则在扩展目录名模式后会创建子目录。这样就可以在子目录中创建与不同变体流相对应的初始化文件。
- hls_flags flags
可能的值:
- ‘single_file’
如果设置了此标志,则复用器会将所有片段存储在单个 MPEG-TS 文件中,并在播放列表中使用字节范围。以此方式生成的 HLS 播放列表的版本号为 4。
例如:
ffmpeg -i in.nut -hls_flags single_file out.m3u8 将生成播放列表 out.m3u8 和单个片段文件 out.ts。
- ‘delete_segments’
从播放列表中删除的片段文件将在片段持续时间加上播放列表持续时间后被删除。
- ‘append_list’
将新片段附加到旧片段列表的末尾,并从旧片段列表中删除 #EXT-X-ENDLIST。
- ‘round_durations’
将播放列表文件片段信息中的持续时间信息四舍五入为整数值,而不是使用浮点数。如果没有其他功能需要使用更高的 HLS 版本,那么这将允许 ffmpeg 输出 HLS 版本 2 的 m3u8。
- ‘discont_start’
在播放列表中的第一个片段信息之前添加 #EXT-X-DISCONTINUITY 标签。
- ‘omit_endlist’
请勿在播放列表末尾附加 EXT-X-ENDLIST 标签。
- ‘periodic_rekey’
hls_key_info_file 指定的文件将定期检查并检测加密信息的更新。请确保自动替换此文件,包括包含 AES 加密密钥的文件。
- ‘independent_segments’
将 #EXT-X-INDEPENDENT-SEGMENTS 标签添加到包含视频片段的播放列表,并且该播放列表的所有片段都保证以关键帧开头。
- ‘iframes_only’
将 #EXT-X-I-FRAMES-ONLY 标签添加到包含视频片段且只能在 #EXT-X-BYTERANGE 模式下播放 I 帧的播放列表。
- ‘split_by_time’
允许片段从关键帧以外的帧开始。当关键帧之间的时间不一致时,这可以改善某些播放器的行为,但可能会使其他播放器的情况变得更糟,并可能导致搜索过程中出现一些异常。此标志应与 hls_time 选项一起使用。
- ‘program_date_time’
生成 EXT-X-PROGRAM-DATE-TIME 标签。
- ‘second_level_segment_index’
当启用strftime选项时,除了日期/时间值外,还可以在 hls_segment_filename 选项表达式中使用段索引作为 %%d。要获取带有尾随零的固定宽度数字,可以使用 %%0xd 格式,其中 x 是所需宽度。
- ‘second_level_segment_size’
当 strftime 开启时,除了日期/时间值外,还可以在 hls_segment_filename 选项表达式中使用段大小(以字节为单位)作为 %%s。要获取带有尾随零的固定宽度数字,可以使用 %%0xs 格式,其中 x 是所需宽度。
- ‘second_level_segment_duration’
当 strftime 开启时,除了日期/时间值外,还可以在 hls_segment_filename 选项表达式中使用段持续时间(以微秒计算)作为 %%t。要获取带有尾随零的固定宽度数字,可以使用 %%0xt 格式,其中 x 是所需宽度。
例如:
ffmpeg -i sample.mpeg \ -f hls -hls_time 3 -hls_list_size 5 \ -hls_flags second_level_segment_index+second_level_segment_size+second_level_segment_duration \ -strftime 1 -strftime_mkdir 1 -hls_segment_filename "segment_%Y%m%d%H%M%S_%%04d_%%08s_%%013t.ts" stream.m3u8 将生成如下段:segment_20170102194334_0003_00122200_0000003000000.ts、segment_20170102194334_0004_00120072_0000003000000.ts 等。
- ‘temp_file’
将段数据写入filename.tmp并仅在片段已完成。
提供片段的 Web 服务器可以配置为拒绝对 *.tmp 的请求,以防止在将正在进行的片段添加到 m3u8 播放列表之前访问它们。
此标志还会影响 m3u8 播放列表文件的创建方式。如果设置了此标志,则所有播放列表文件都将写入临时文件并在完成后重命名,类似于处理片段的方式。但无论此标志如何,具有文件协议且 hls_playlist_type 类型不是“vod”的播放列表始终会写入临时文件。
如果使用 master_pl_name 指定的主播放列表文件(如果有),具有文件协议,则无论此标志如何,如果master_pl_publish_rate值不为零,则始终会写入临时文件。
- hls_playlist_type type
如果类型为“event”,则在 m3u8 标头中发出 #EXT-X-PLAYLIST-TYPE:EVENT。这会将 hls_list_size 强制为 0;播放列表只能附加。
如果类型为“vod”,则在 m3u8 标头中发出 #EXT-X-PLAYLIST-TYPE:VOD。这会将 hls_list_size 强制为 0;播放列表不得更改。
- method method
使用给定的 HTTP 方法创建 hls 文件。
例如:
ffmpeg -re -i in.ts -f hls -method PUT http://example.com/live/out.m3u8 将使用 HTTP PUT 方法将所有 mpegts 片段文件上传到 HTTP 服务器,并使用相同方法每次刷新时更新 m3u8 文件。请注意,HTTP 服务器必须支持给定的文件上传方法。
- http_user_agent agent
覆盖 HTTP 标头中的 User-Agent 字段。仅适用于 HTTP 输出。
- var_stream_map stream_map
指定一个映射字符串,定义如何将音频、视频和字幕流分组为不同的变体流。变体流组以空格分隔。
预期的字符串格式如下:“a:0,v:0 a:1,v:1 ....”。其中 a:、v:、s: 分别是指定音频、视频和字幕流的键。允许值为 0 到 9(仅根据实际使用情况进行限制)。
当有两个或更多变体流时,输出文件名模式必须包含字符串“%v”:此字符串指定变体流索引在输出媒体播放列表文件名中的位置。字符串“%v”可能存在于文件名中,也可能存在于包含该文件的最后一个目录名中。如果目录名称中存在该字符串,则在扩展目录名称模式后创建子目录。这样就可以在子目录中创建变体流。
以下是几个示例。
• 创建两个 hls 变体流。第一个变体流将包含比特率为 1000k 的视频流和比特率为 64k 的音频流,第二个变体流将包含比特率为 256k 的视频流和比特率为 32k 的音频流。这里将创建两个文件名分别为 out_0.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”。确保输入文件至少有一个文本字幕流。
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" \ -master_pl_name master.m3u8 -t 300 -hls_time 10 -hls_init_time 4 -hls_list_size \ 10 -master_pl_publish_rate 10 -hls_flags \ delete_segments+discont_start+split_by_time ./tmp/video.m3u8 - cc_stream_map cc_stream_map
映射字符串,指定不同的隐藏字幕组及其属性。隐藏字幕流组以空格分隔。
预期字符串格式如下:“ccgroup:<group name>,instreamid:<INSTREAM-ID>,language:<language code> ....”。’ccgroup’ 和 ’instreamid’ 是必需属性。’language’ 是可选属性。
使用此选项配置的隐藏字幕组通过在 var_stream_map 字符串中提供相同的“ccgroup”名称映射到不同的变体流。
例如:
ffmpeg -re -i in.ts -b:v:0 1000k -b:v:1 256k -b:a:0 64k -b:a:1 32k \ -a53cc:0 1 -a53cc:1 1 \ -map 0:v -map 0:a -map 0:v -map 0:a -f hls \ -cc_stream_map "ccgroup:cc,instreamid:CC1,language:en ccgroup:cc,instreamid:CC2,language:sp" \ -var_stream_map "v:0,a:0,ccgroup:cc v:1,a:1,ccgroup:cc" \ -master_pl_name master.m3u8 \ http://example.com/live/out_%v.m3u8 将在主播放列表中为 INSTREAM-ID“CC1”和“CC2”添加两个 TYPE=CLOSED-CAPTIONS 的 #EXT-X-MEDIA 标签。此外,它将为两个输出变体流添加组名为“cc”的 CLOSED-CAPTIONS 属性。
如果未设置 var_stream_map,则 cc_stream_map 中第一个可用的 ccgroup 将映射到输出变体流。
例如:
ffmpeg -re -i in.ts -b:v 1000k -b:a 64k -a53cc 1 -f hls \ -cc_stream_map "ccgroup:cc,instreamid:CC1,language:en" \ -master_pl_name master.m3u8 \ http://example.com/live/out.m3u8 这将在组名为“cc”、语言为“en”(英语)且 INSTREAM-ID 为“CC1”的主播放列表中添加 TYPE=CLOSED-CAPTIONS 的 #EXT-X-MEDIA 标签。此外,它还将为输出变体流添加组名为“cc”的 CLOSED-CAPTIONS 属性。
- master_pl_name name
使用给定名称创建 HLS 主播放列表。
例如:
ffmpeg -re -i in.ts -f hls -master_pl_name master.m3u8 http://example.com/live/out.m3u8 创建名为master.m3u8的 HLS 主播放列表,该播放列表在 http://example.com/live/ 上发布。
- master_pl_publish_rate count
每隔指定数量的片段间隔重复发布主播放列表。
例如:
ffmpeg -re -i in.ts -f hls -master_pl_name master.m3u8 \ -hls_time 2 -master_pl_publish_rate 30 http://example.com/live/out.m3u8 创建名为master.m3u8的 HLS 主播放列表,并每隔 30 个片段(即每隔 60 秒)重复发布一次。
- http_persistent bool
使用持久 HTTP 连接。仅适用于 HTTP 输出。
- timeout timeout
设置套接字 I/O 操作的超时。仅适用于 HTTP 输出。
- ignore_io_errors bool
在打开、写入和删除期间忽略 IO 错误。适用于具有网络输出的长时间运行。
- headers headers
设置自定义 HTTP 标头,可以覆盖内置默认标头。仅适用于 HTTP 输出。
4.47 iamf
沉浸式音频模型和格式 (IAMF) 多路复用器。
IAMF 用于在流媒体和离线应用程序中的各种设备上提供沉浸式音频内容。这些应用程序包括互联网音频流、多播/广播服务、文件下载、游戏、通信、虚拟和增强现实等。在这些应用中,音频可以在各种设备上播放,例如耳机、手机、平板电脑、电视、条形音箱、家庭影院系统和大屏幕。
此格式由开放媒体联盟推广和设计。
有关此格式的更多信息,请参阅 https://aomedia.org/iamf/。
4.48 ico
ICO 文件复用器。
Microsoft 的图标文件格式 (ICO) 有一些严格的限制,需要注意:
- 大小在任何维度上都不能超过 256 像素
- 只能存储 BMP 和 PNG 图像
- 如果使用 BMP 图像,则必须是以下像素格式之一:
BMP Bit Depth FFmpeg Pixel Format 1bit pal8 4bit pal8 8bit pal8 16bit rgb555le 24bit bgr24 32bit bgra - 如果使用 BMP 图像,则必须使用 BITMAPINFOHEADER DIB 标头
- 如果使用 PNG 图像,则必须使用rgba 像素格式
4.49 ilbc
互联网低比特率编解码器 (iLBC) 原始复用器。
它接受单个‘ilbc’音频流。
4.50 image2、image2pipe
图像文件复用器。
“image2”多路复用器将视频帧写入图像文件。
输出文件名由模式指定,可用于生成按顺序编号的文件系列。模式可能包含字符串“%d”或“%0Nd”,此字符串指定表示文件名中编号的字符的位置。如果使用“%0Nd”格式,则表示每个文件名中数字的字符串将用 0 填充为 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 等的文件名序列。
图像复用器支持 .Y.U.V 图像文件格式。此格式的特殊之处在于,每个图像帧由三个文件组成,每个文件对应一个 YUV420P 组件。要读取或写入此图像文件格式,请指定 ’.Y’ 文件的名称。多路复用器将根据需要自动打开 ’.U’ 和 ’.V’ 文件。
‘image2pipe’ 多路复用器接受与‘image2’ 多路复用器相同的选项,但忽略模式验证和扩展,因为它应该写入命令输出而不是实际存储的文件。
4.50.1 选项
- frame_pts bool
如果设置为 1,则使用数据包 PTS(显示时间戳)扩展文件名。默认值为 0。
- start_number count
从指定数字开始序列。默认值为 1。
- update bool
如果设置为 1,则文件名将始终被解释为文件名,而不是模式,并且相应的文件将被新图像不断覆盖。默认值为 0。
- strftime bool
如果设置为 1,则使用 strftime() 中的日期和时间信息扩展文件名。默认值为 0。
- atomic_writing bool
将输出写入临时文件,写入完成后将重命名为目标文件名。默认为禁用。
- protocol_opts options_list
将协议选项设置为 : 分隔的 key=value 参数列表。包含 : 特殊字符的值必须转义。
4.50.2 示例
- 使用 ffmpeg 创建文件序列 img-001.jpeg、img-002.jpeg、...,每秒从输入视频中获取一张图像:
ffmpeg -i in.avi -vsync cfr -r 1 -f image2 'img-%03d.jpeg' 请注意,使用 ffmpeg 时,如果未使用 -f 选项指定格式,并且输出文件名指定了图像文件格式,则会自动选择 image2 多路复用器,因此前面的命令可以写成: ffmpeg -i in.avi -vsync cfr -r 1 'img-%03d.jpeg' 还请注意,模式不一定包含“%d”或“%0Nd”,例如创建单个图像文件img.jpeg 从输入视频的开头开始,您可以使用以下命令: ffmpeg -i in.avi -f image2 -frames:v 1 img.jpeg - strftime 选项允许您使用日期和时间信息扩展文件名。查看 strftime() 函数的文档以了解语法。
要从 strftime()“%Y-%m-%d_%H-%M-%S”模式生成图像文件,可以使用以下 ffmpeg 命令: ffmpeg -f v4l2 -r 1 -i /dev/video0 -f image2 -strftime 1 "%Y-%m-%d_%H-%M-%S.jpg" - 使用当前帧的 PTS 设置文件名:
ffmpeg -f v4l2 -r 1 -i /dev/video0 -copyts -f image2 -frame_pts true %d.jpg - 每秒将桌面内容直接发布到 WebDAV 服务器:
ffmpeg -f x11grab -framerate 1 -i :0.0 -q:v 6 -update 1 -protocol_opts method=PUT http://example.com/desktop.jpg
4.51 ircam
Berkeley / IRCAM / CARL 声音文件系统 (BICSF) 格式复用器。
Berkeley/IRCAM/CARL 声音格式于 20 世纪 80 年代开发,是几种早期声音文件格式和系统合并的结果,包括加州大学圣地亚哥分校计算机音频研究实验室 (CARL) 的 Gareth Loy 博士开发的 csound 系统、巴黎音乐与声学研究所的 Rob Gross 和 Dan Timis 开发的 IRCAM 声音文件系统以及 Berkeley 快速文件系统。
它最初是作为 Berkeley/IRCAM/CARL 声音文件系统的一部分开发的,该文件系统是一套程序,旨在为在 Berkeley UNIX 下运行的音频应用程序实现文件系统。它在学术音乐研究中心特别受欢迎,并多次用于早期计算机生成的乐曲创作。
此复用器接受包含 PCM 数据的单个音频流。
4.52 ivf
On2 IVF 复用器。
IVF 由 On2 Technologies(前身为 Duck Corporation)开发,用于存储内部开发的编解码器。
此复用器接受单个“vp8”、“vp9”或“av1”视频流。
4.53 jacosub
JACOsub 字幕格式复用器。
此复用器接受单个“jacosub”字幕流。
有关格式的更多信息,请参阅 http://unicorn.us.com/jacosub/jscripts.html。
4.54 kvag
Simon & Schuster Interactive VAG 多路复用器。
此自定义 VAG 容器由 Simon & Schuster Interactive 的一些游戏使用,例如“Real War”和“Real War: Rogue States”。
此多路复用器接受单个“adpcm_ima_ssi”音频流。
4.55 lc3
蓝牙 SIG 低复杂度通信编解码器音频 (LC3) 或 ETSI TS 103 634 低复杂度通信编解码器 plus (LC3plus)。
此复用器接受单个“lc3”音频流。
4.56 lrc
LRC 歌词文件格式复用器。
LRC(LyRiCs 的缩写)是一种计算机文件格式,可将歌词与音频文件(如 MP3、Vorbis 或 MIDI)同步。
此复用器接受单个“subrip”或“text”字幕流。
4.56.1 元数据
以下元数据标签将转换为相应元数据的格式:
- title
- album
- artist
- author
- creator
- encoder
- encoder_version
如果未明确设置“encoder_version”,则会自动设置为 libavformat 版本。
4.57 matroska
Matroska 容器复用器。
此复用器实现了 matroska 和 webm 容器规范。
4.57.1 元数据
此复用器中可识别的元数据设置为:
- 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’
所有帧都采用立体照片格式,可通过红青色滤镜查看
- ‘right_left’
两个视图并排排列,右眼视图在左侧
- ‘anaglyph_green_magenta’
所有帧都采用立体照片格式,可通过绿洋红色滤镜查看
- ‘block_lr’
双眼在一个区块中,左眼视图第一
- ‘block_rl’
双眼在一个块中,右眼视图是第一个
例如,可以使用以下命令行创建 3D WebM 剪辑:
ffmpeg -i sample_left_right_clip.mpg -an -c:v libvpx -metadata stereo_mode=left_right -y stereo_clip.webm
4.57.2 选项
- reserve_index_space size
默认情况下,此多路复用器将搜索索引(在 Matroska 术语中称为提示)写入文件末尾,因为它无法提前知道在文件开头留出足够的空间用于索引。但是对于某些用例(例如可以进行查找但速度较慢的流式传输),将索引放在文件开头很有用。
如果将此选项设置为非零值,则多路复用器将在文件头中保留 size 字节的空间,然后在多路复用完成时尝试在那里写入提示。如果保留的空间不足,则不会写入任何提示,文件将被最终确定,并且写入预告片将返回错误。对于大多数用例来说,安全的大小应该是每小时视频约 50kB。
请注意,只有当输出可查找时才会写入提示,如果输出不可查找,则此选项无效。
- cues_to_front bool
如果设置,多路复用器将通过移动主数据(如有必要)将索引写入文件开头。这可以与 reserve_index_space 结合使用,在这种情况下,只有当最初保留的空间不足时才会移动数据。
如果输出不可寻址,则忽略此选项。
- cluster_size_limit size
最多在群集中存储提供的字节数。
如果未指定,则将限制自动设置为合理的硬编码固定值。
- cluster_time_limit duration
最多在群集中存储提供的毫秒数。
如果未指定,则限制会自动设置为合理的硬编码固定值。
- dash bool
创建符合 WebM DASH 规范的 WebM 文件。默认情况下,它设置为 false。
- dash_track_number index
DASH 流的轨道编号。默认情况下,它设置为 1。
- live bool
假设它是实时流,则写入文件。默认情况下,它设置为 false。
- allow_raw_vfw bool
允许原始 VFW 模式。默认情况下,设置为 false。
- flipped_raw_rgb bool
如果设置为 true,则存储原始 RGB 位图的正高度,这表示位图自下而上存储。请注意,此选项不会翻转位图,这必须事先手动完成,例如通过使用“vflip”过滤器。默认值为 false,表示位图自上而下存储。
- write_crc32 bool
在每个 1 级元素内写入一个 CRC32 元素。默认情况下,它设置为 true。对于 WebM,此选项将被忽略。
- default_mode mode
控制如何设置输出轨道的 FlagDefault。它会影响播放器默认播放哪些轨道。默认模式为‘passthrough’。
- ‘infer’
每个具有默认处置的轨道都将设置 FlagDefault。此外,对于每种类型的轨道(音频、视频或字幕),如果不存在具有此类型默认处置的轨道,则此类型的第一个轨道将被标记为默认(如果存在)。这可确保即使输入来自缺乏默认轨道概念的容器,也能以合理的方式设置默认标志。
- ‘infer_no_subs’
此模式与推断相同,不同之处在于,如果不存在具有默认配置的字幕轨道,则不会将任何字幕轨道标记为默认。
- ‘passthrough’
在此模式下,当且仅当在相应流的配置中设置了 AV_DISPOSITION_DEFAULT 标志时,才会设置 FlagDefault。
4.58 md5
MD5 测试格式。
这是哈希复用器的一个变体。与该复用器不同,它默认使用 MD5 哈希函数。
另请参阅哈希和 framemd5 复用器。
4.58.1 示例
- 计算转换为原始音频和视频的输入的 MD5 哈希值,并将其存储在文件 out.md5 中:
ffmpeg -i INPUT -f md5 out.md5 - 将 MD5 哈希值打印到标准输出:
ffmpeg -i INPUT -f md5 -
4.59 microdvd
MicroDVD 字幕格式复用器。
此复用器接受单个“microdvd”字幕流。
4.60 mmf
合成音乐移动应用格式 (SMAF) 复用器。
SMAF 是 Yamaha 为便携式电子设备(如移动电话和个人数字助理)指定的音乐数据格式。
此复用器接受单个‘adpcm_yamaha’音频流。此复用器接受单个‘adpcm_yamaha’音频流。
4.61 mp3
MP3 复用器使用以下可选功能写入原始 MP3 流:
- 开头的 ID3v2 元数据标头(默认启用)。支持版本 2.3 和 2.4,id3v2_version 私有选项控制使用哪个版本(3 或 4)。将 id3v2_version 设置为 0 可完全禁用 ID3v2 标头。
- ID3v2 标头后面紧接着的 Xing/LAME 帧(如果存在)。默认情况下启用该帧,但只有当输出可查找时才会写入。可以使用 write_xing 私有选项禁用该帧。该帧包含可能对解码器有用的各种信息,例如音频持续时间或编码器延迟。
- 文件末尾的旧式 ID3v1 标签(默认情况下禁用)。可以使用 write_id3v1 私有选项启用该帧,但由于其功能非常有限,因此不建议使用它。
示例:
使用 ID3v2.3 标头和 ID3v1 页脚编写 mp3:
ffmpeg -i INPUT -id3v2_version 3 -write_id3v1 1 out.mp3
要将图片附加到 mp3 文件,请使用映射选择音频和图片流:
ffmpeg -i input.mp3 -i cover.png -c copy -map 0 -map 1
-metadata:s:v title="Album cover" -metadata:s:v comment="Cover (Front)" out.mp3
编写不带任何额外功能的“干净”MP3:
ffmpeg -i input.wav -write_xing 0 -id3v2_version 0 out.mp3
4.62 mpegts
MPEG 传输流复用器。
此复用器实现了 ISO 13818-1 和 ETSI EN 300 468 的一部分。
mpegts 复用器中可识别的元数据设置是 service_provider 和 service_name。如果未设置,则 service_provider 的默认值为‘FFmpeg’,service_name 的默认值为‘Service01’。
4.62.1 选项
复用器选项为:
- 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’对服务进行唯一标识。默认值为 0x0001。
- mpegts_service_id integer
设置“service_id”,在 DVB 中也称为节目。默认值为 0x0001。
- mpegts_service_type integer
设置节目“service_type”。默认值为 digital_tv。接受以下选项:
- ‘hex_value’
ETSI 300 468 中定义的 0x01 到 0xff 之间的任何十六进制值。
- ‘digital_tv’
数字电视服务。
- ‘digital_radio’
数字广播服务。
- ‘teletext’
图文电视服务。
- ‘advanced_codec_digital_radio’
高级编解码器数字广播服务。
- ‘mpeg2_digital_hdtv’
MPEG2 数字高清电视服务。
- ‘advanced_codec_digital_sdtv’
高级编解码器数字标清电视服务。
- ‘advanced_codec_digital_hdtv’
高级编解码器数字高清电视服务。
- mpegts_pmt_start_pid integer
设置 PMT 的第一个 PID。默认值为 0x1000,最小值为 0x0020,最大值为 0x1ffa。此选项在 m2ts 模式下无效,因为 PMT PID 固定为 0x0100。
- mpegts_start_pid integer
设置基本流的第一个 PID。默认值为 0x0100,最小值为 0x0020,最大值为 0x1ffa。此选项在基本流 PID 固定的 m2ts 模式下无效。
- mpegts_m2ts_mode boolean
如果设置为 1,则启用 m2ts 模式。默认值为 -1,禁用 m2ts 模式。
- muxrate integer
设置恒定复用率。默认值为 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’
符合系统 B (DVB) 而不是系统 A (ATSC)。
- ‘initial_discontinuity’
将每个流的初始数据包标记为不连续。
- ‘nit’
发出 NIT 表。
- ‘omit_rai’
禁用随机访问指示符的写入。
- mpegts_copyts boolean
如果值设置为 1,则保留原始时间戳。默认值为 -1,这会导致时间戳移动,使其从 0 开始。
- omit_video_pes_length boolean
省略视频数据包的 PES 数据包长度。默认值为 1(真)。
- pcr_period integer
覆盖默认的 PCR 重传时间(以毫秒为单位)。默认值为 -1,表示将自动确定 PCR 间隔:CBR 流使用 20 毫秒,VBR 流使用小于 100 毫秒的帧持续时间的最高倍数。
- 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.62.2 示例
ffmpeg -i file.mpg -c copy \
-mpegts_original_network_id 0x1122 \
-mpegts_transport_stream_id 0x3344 \
-mpegts_service_id 0x5566 \
-mpegts_pmt_start_pid 0x1500 \
-mpegts_start_pid 0x150 \
-metadata service_provider="Some provider" \
-metadata service_name="Some Channel" \
out.ts
4.63 mxf、mxf_d10、mxf_opatom
MXF 多路复用器。
4.63.1 选项
多路复用器选项包括:
- store_user_comments bool
设置是否应存储用户评论(如果可用)或从不存储。IRT D-10 不允许用户评论。因此,默认为 mxf 和 mxf_opatom 写入评论,但不为 mxf_d10 写入评论
4.64 null
空多路复用器。
此多路复用器不生成任何输出文件,主要用于测试或基准测试目的。
例如,要使用 ffmpeg 对解码进行基准测试,您可以使用以下命令:
ffmpeg -benchmark -i INPUT -f null out.null
请注意,上述命令不会读取或写入 out.null 文件,但 ffmpeg 语法要求指定输出文件。
或者,您可以将命令写为:
ffmpeg -benchmark -i INPUT -f null -
4.65 nut
- -syncpoints flags
更改 nut 中的同步点用法:
- default 使用正常的低开销查找辅助。
- none 根本不使用同步点,减少开销但使流不可查找;
不建议使用此选项,因为生成的文件非常容易损坏,并且无法进行查找。另外,一般来说,同步点的开销可以忽略不计。注意,-write_index 0 可用于禁用所有不断增长的数据表,从而允许在内存有限的情况下多路复用无限流,而不会出现这些缺点。
- timestamped 使用 wallclock 字段扩展同步点。
none 和 timestamped 标志是实验性的。
- -write_index bool
在最后写入索引,默认是写入索引。
ffmpeg -i INPUT -f_strict experimental -syncpoints none - | processor
4.66 ogg
Ogg 容器复用器。
- -page_duration duration
首选页面持续时间,以微秒为单位。复用器将尝试创建持续时间约为微秒的页面。这允许用户在寻道粒度和容器开销之间进行折衷。默认值为 1 秒。值为 0 将填充所有段,使页面尽可能大。值为 1 将在大多数情况下有效地使用每页 1 个数据包,以额外的容器开销为代价提供较小的寻道粒度。
- -serial_offset value
用于设置流序列号的序列值。将其设置为不同的且足够大的值可确保生成的 ogg 文件可以安全地链接。
4.67 rcwt
RCWT(带时间的原始字幕)是 ccextractor 的原生格式,ccextractor 是一种常用的开源工具,用于处理 608/708 隐藏式字幕 (CC) 源。它可用于存档原始提取的 CC 比特流并生成源文件以供以后处理或转换。该格式允许 ccextractor 和 FFmpeg 之间互操作,易于解析,可用于创建 CC 演示文稿的备份。
此复用器实现了截至 2024 年 3 月的规范,该规范自 2014 年 4 月以来一直保持稳定且未发生改变。
此复用器与 ccextractor 复用 RCWT 的方式有一些细微差别。到目前为止,在使用 ccextractor 处理输出时,尚未观察到兼容性问题,但里程可能会有所不同,并且输出不会完全匹配。
RCWT 的免费规范可在此处找到:https://github.com/CCExtractor/ccextractor/blob/master/docs/BINARY_FILE_FORMAT.TXT
4.67.1 示例
- 使用 lavfi 将隐藏字幕提取到 RCWT:
ffmpeg -f lavfi -i "movie=INPUT.mkv[out+subcc]" -map 0:s:0 -c:s copy -f rcwt CC.rcwt.bin
4.68 段、stream_segment、ssegment
基本流分段器。
此多路复用器将流输出到多个几乎固定持续时间的单独文件中。输出文件名模式可以采用与 image2 类似的方式设置,或者如果启用了 strftime 选项,则使用 strftime 模板。
stream_segment 是用于写入流输出格式(即不需要全局标头)的复用器变体,建议用于输出(例如)MPEG 传输流片段。ssegment 是 stream_segment 的简称。
每个片段都以所选参考流的关键帧开始,该关键帧通过 reference_stream 选项设置。
请注意,如果您想要准确分割视频文件,则需要使输入关键帧与分段器预期的准确分割时间相对应,否则片段复用器将使用在指定开始时间之后找到的下一个关键帧开始新片段。
片段复用器最适合单个恒定帧速率视频。
或者,它可以通过设置选项segment_list 来生成已创建片段的列表。列表类型由segment_list_type选项指定。片段列表中的条目文件名默认设置为相应片段文件的基本名称。
另请参阅hls muxer,它为HLS分段提供了更具体的实现。
4.68.1选项
片段 muxer支持以下选项:
- increment_tc 1|0
如果设置为1,则在每个片段之间增加时间码如果选择此选项,则输入需要在第一个视频流中有一个时间码。默认值为 0。
- reference_stream specifier
设置由字符串说明符指定的参考流。如果说明符设置为 auto,则会自动选择参考。否则它必须是指定参考流的流说明符(请参阅 ffmpeg 手册中的“流说明符”一章)。默认值为 auto。
- segment_format format
覆盖内部容器格式,默认情况下,它由文件扩展名猜测。
- segment_format_options options_list
使用 : 分隔的 key=value 参数列表设置输出格式选项。包含 : 特殊字符的值必须转义。
- segment_list name
还生成名为 name 的列表文件。如果未指定,则不会生成列表文件。
- segment_list_flags flags
设置影响片段列表生成的标志。
目前支持以下标志:
- ‘cache’
允许缓存(仅影响 M3U8 列表文件)。
- ‘live’
允许实时友好文件生成。
- segment_list_size size
更新列表文件,使其最多包含 size 个段。如果为 0,列表文件将包含所有段。默认值为 0。
- segment_list_entry_prefix prefix
在每个条目前添加前缀。用于生成绝对路径。默认情况下不应用任何前缀。
- segment_list_type type
选择列表格式。
可识别以下值:
- ‘flat’
为创建的段生成一个平面列表,每行一个段。
- ‘csv, ext’
为创建的段生成一个列表,每行一个段,每行匹配以下格式(逗号分隔的值):
segment_filename,segment_start_time,segment_end_time segment_filename 是多路复用器根据提供的模式生成的输出文件的名称。如果需要,则应用 CSV 转义(根据 RFC4180)。
fragment_start_time 和 fragment_end_time 指定片段的开始和结束时间(以秒为单位)。
带有后缀“.csv”或“.ext”的列表文件将自动选择此格式。
“ext”已弃用,取而代之的是“csv”。
- ‘ffconcat’
为创建的片段生成 ffconcat 文件。可以使用 FFmpeg concat 解复用器读取生成的文件。
带有后缀“.ffcat”或“.ffconcat”的列表文件将自动选择此格式。
- ‘m3u8’
生成扩展的 M3U8 文件,版本 3,符合 http://tools.ietf.org/id/draft-pantos-http-live-streaming。
带有后缀“.m3u8”的列表文件将自动选择此格式。
如果未指定,则从列表文件名后缀中猜测类型。
- segment_time time
将片段持续时间设置为时间,该值必须是持续时间规范。默认值为“2”。另请参阅segment_times 选项。
请注意,除非您在给定时间强制使用参考流关键帧,否则拆分可能不准确。请参阅下面的介绍性通知和示例。
- min_seg_duration time
将最小片段持续时间设置为时间,该值必须是持续时间规范。这可防止多路复用器在持续时间低于此值时结束片段。仅对segment_time 有效。默认值为“0”。
- segment_atclocktime 1|0
如果设置为“1”,则从 00:00 开始按固定时钟时间间隔拆分。 fragment_time中指定的时间值用于设置分割间隔的长度。
例如,将segment_time设置为“900”,则可以在12:00、12:15、12:30等时间创建文件。
默认值为“0”。
- segment_clocktime_offset duration
使用segment_atclocktime时,以指定的持续时间延迟分段分割时间。
例如,将segment_time设置为“900”,将segment_clocktime_offset设置为“300”,则可以在12:05、12:20、12:35等时间创建文件。
默认值为“0”。
- segment_clocktime_wrap_duration duration
强制分段器仅在数据包在分段时钟时间之后的指定持续时间内到达复用器时才开始新分段。这样,您可以使分段器更能适应向后的本地时间跳跃,例如闰秒或从夏令时转换为标准时间。
默认是最大可能持续时间,这意味着无论自上次时钟时间以来经过了多少时间,都会开始新分段。
- segment_time_delta delta
指定选择分段开始时间时的准确时间,以持续时间规范表示。默认值为“0”。
当指定增量时,如果关键帧的 PTS 满足以下关系,则该关键帧将开始新的片段:
PTS >= start_time - time_delta 此选项在分割视频内容时很有用,因为视频内容总是在 GOP 边界处分割,以防在指定的分割时间之前找到关键帧。
特别是可以与 ffmpeg 选项 force_key_frames 结合使用。由于舍入问题,force_key_frames 指定的关键帧时间可能无法准确设置,结果可能是关键帧时间刚好设置在指定时间之前。对于恒定帧速率视频,值 1/(2*frame_rate) 应该可以解决指定时间与 force_key_frames 设置的时间之间最坏情况不匹配的问题。
- segment_times times
指定分割点列表。times 包含以逗号分隔的持续时间规范列表,按递增顺序排列。另请参阅segment_time选项。
- segment_frames frames
指定分割视频帧编号列表。frames 包含以逗号分隔的整数列表,按递增顺序排列。
此选项指定每当找到参考流关键帧并且帧的序列号(从 0 开始)大于或等于列表中的下一个值时开始新的片段。
- segment_wrap limit
达到限制后环绕片段索引。
- segment_start_number number
设置第一个片段的序列号。默认为 0。
- strftime 1|0
使用 strftime 函数定义要写入的新片段的名称。如果选择此选项,则输出片段名称必须包含 strftime 函数模板。默认值为 0。
- break_non_keyframes 1|0
如果启用,则允许片段从关键帧以外的帧开始。当关键帧之间的时间不一致时,这可以改善某些播放器的行为,但可能会使其他播放器的情况变得更糟,并可能导致搜索过程中出现一些异常。默认为 0。
- reset_timestamps 1|0
在每个片段的开头重置时间戳,以便每个片段都以接近零的时间戳开始。这是为了简化生成的片段的播放。可能无法与某些多路复用器/编解码器组合一起使用。默认情况下设置为 0。
- initial_offset offset
指定要应用于输出数据包时间戳的时间戳偏移量。参数必须是时间持续时间规范,默认为 0。
- write_empty_segments 1|0
如果启用,如果在片段通常跨越的时间段内没有数据包,则写入一个空片段。否则,该片段将用下一个写入的数据包填充。默认为 0。
确保在编码时要求封闭的 GOP,并设置 GOP 大小以适合您的片段时间限制。
4.68.2 示例
- 将文件 in.mkv 的内容重新混合为 out-000.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 选项强制关键帧在指定位置输入的帧,以及分段选项segment_time_delta,以考虑设置关键帧时间时可能进行的舍入。
为了强制输入文件的关键帧,需要进行转码。ffmpeg -i in.mkv -force_key_frames 1,2,3,5,8,13,21 -codec:v mpeg4 -codec:a pcm_s16le -map 0 \ -f segment -segment_list out.csv -segment_times 1,2,3,5,8,13,21 -segment_time_delta 0.05 out%03d.nut - 通过根据segment_frames选项指定的帧号序列分割输入文件来分段输入文件:
ffmpeg -i in.mkv -codec copy -map 0 -f segment -segment_list out.csv -segment_frames 100,200,300,500,800 out%03d.nut - 使用 libx264 和 aac 编码器将 in.mkv 转换为 TS 片段:
ffmpeg -i in.mkv -map 0 -codec:v libx264 -codec:a aac -f ssegment -segment_list out.list out%03d.ts - 对输入文件进行分段,并创建 M3U8 直播播放列表(可用作直播 HLS 源):
ffmpeg -re -i in.mkv -codec copy -map 0 -f segment -segment_list playlist.m3u8 \ -segment_list_flags +live -segment_time 10 out%03d.mkv
4.69 smoothstreaming
Smooth Streaming 多路复用器生成一组文件(清单、块),适合与传统 Web 服务器配合使用。
- window_size
指定清单中保存的片段数。默认 0(保留全部)。
- extra_window_size
指定从磁盘删除之前保留在清单之外的片段数。默认 5。
- lookahead_count
指定前瞻片段数。默认 2。
- min_frag_duration
指定最短片段持续时间(以微秒为单位)。默认 5000000。
- remove_at_exit
指定完成时是否删除所有片段。默认 0(不删除)。
4.70 streamhash
每个流哈希测试格式。
此多路复用器根据每个流计算并打印所有输入帧的加密哈希。这可用于相等性检查,而无需进行完整的二进制比较。
默认情况下,在计算哈希值之前,音频帧会转换为带符号的 16 位原始音频,视频帧会转换为原始视频,但也可以使用显式转换为其他编解码器的输出。时间戳会被忽略。默认情况下,它使用 SHA-256 加密哈希函数,但支持其他几种算法。
多路复用器的输出由每条流一行组成,格式为:streamindex、streamtype、algo=hash,其中 streamindex 是映射流的索引,streamtype 是一个表示流类型的单个字符,algo 是一个表示所用哈希函数的短字符串,hash 是一个表示计算出的哈希值的十六进制数。
- hash algorithm
使用字符串算法指定的加密哈希函数。支持的值包括 MD5、murmur3、RIPEMD128、RIPEMD160、RIPEMD256、RIPEMD320、SHA160、SHA224、SHA256(默认)、SHA512/224、SHA512/256、SHA384、SHA512、CRC32 和 adler32。
4.70.1 示例
要计算转换为原始音频和视频的输入的 SHA-256 哈希值,并将其存储在文件 out.sha256 中:
ffmpeg -i INPUT -f streamhash out.sha256
要将 MD5 哈希值打印到 stdout,请使用以下命令:
ffmpeg -i INPUT -f streamhash -hash md5 -
另请参阅 hash 和 framehash 多路复用器。
4.71 tee
tee 多路复用器可用于将相同的数据写入多个输出,例如文件或流。例如,它可用于通过网络传输视频并同时将其保存到磁盘。
这与为 ffmpeg 命令行工具指定多个输出不同。使用 tee 复用器,音频和视频数据将仅编码一次。使用传统的多个输出,将启动多个并行编码操作,这可能是一个成本非常高的过程。直接使用 libavformat API 时,tee 复用器没有用,因为这样可以将相同的数据包直接提供给多个复用器。
由于 tee 复用器不代表任何特定的输出格式,因此 ffmpeg 无法自动选择输出流。因此,必须使用 -map 指定所有用于输出的流。请参阅下面的示例。
某些编码器可能需要根据输出格式使用不同的选项;tee 复用器无法自动检测这一点,因此需要明确指定。主要示例是 global_header 标志。
从属输出在提供给复用器的文件名中指定,以“|”分隔。如果任何从属名称包含“|”分隔符、前导或尾随空格或任何特殊字符,则必须对其进行转义(请参阅 (ffmpeg-utils)ffmpeg-utils(1) 手册中的“引用和转义”部分)。
4.71.1 选项
- use_fifo bool
如果设置为 1,从属输出将使用 fifo 多路复用器在单独的线程中处理。这允许补偿输出的不同速度/延迟/可靠性并设置透明恢复。默认情况下,此功能处于关闭状态。
- fifo_options
传递给 fifo 伪多路复用器实例的选项。请参阅 fifo。
可以为每个从属设备指定多路复用器选项,方法是将它们作为由方括号之间的“:”分隔的键=值对列表添加到前面。如果选项值包含特殊字符或“:”分隔符,则必须对其进行转义;请注意,这是第二级转义。
还可以识别以下特殊选项:
- f
指定格式名称。如果无法从输出 URL 中猜出,则必填。
- bsfs[/spec]
指定要应用于指定输出的比特流过滤器列表。
可以通过将流说明符附加到以 / 分隔的选项来指定给定比特流过滤器适用于哪些流。 spec 必须是流说明符(请参阅格式流说明符)。
如果未指定流说明符,则比特流过滤器将应用于输出中的所有流。如果输出包含无法应用比特流过滤器的流,这将导致该输出操作失败,例如将 h264_mp4toannexb 应用于包含音频流的输出。
比特流过滤器的选项必须以 opt=value 的形式指定。
可以指定多个比特流过滤器,以“,”分隔。
- use_fifo bool
这允许覆盖单个从属复用器的 tee muxer use_fifo 选项。
- fifo_options
这允许覆盖单个从属复用器的 tee muxer fifo_options。请参阅 fifo。
- select
选择应映射到从属输出的流,由流说明符指定。如果未指定,则默认为所有映射的流。如果输出格式不接受所有映射的流,这将导致该输出操作失败。
您可以使用多个流说明符,用逗号 (,) 分隔,例如:a:0,v
- onfail
指定输出失败时的行为。这可以设置为中止(默认)或忽略。如果此从属输出失败,中止将导致整个过程失败。忽略将忽略此输出的失败,因此其他输出将继续而不受影响。
4.71.2 示例
- 对某些内容进行编码,并将其存档在 WebM 文件中并通过 UDP 将其作为 MPEG-TS 进行流式传输:
ffmpeg -i ... -c:v libx264 -c:a mp2 -f tee -map 0:v -map 0:a "archive-20121107.mkv|[f=mpegts]udp://10.0.1.255:1234/" - 如上所述,但即使输出到本地文件失败(例如本地驱动器已满)也继续流式传输:
ffmpeg -i ... -c:v libx264 -c:a mp2 -f tee -map 0:v -map 0:a "[onfail=ignore]archive-20121107.mkv|[f=mpegts]udp://10.0.1.255:1234/" - 使用 ffmpeg 对输入进行编码,并将输出发送到三个不同的目的地。dump_extra 比特流过滤器用于根据 MPEG-TS 格式的要求向所有输出视频关键帧数据包添加额外数据信息。select 选项应用于 out.aac,以使其仅包含音频数据包。
ffmpeg -i ... -map 0 -flags +global_header -c:v libx264 -c:a aac -f tee "[bsfs/v=dump_extra=freq=keyframe]out.ts|[movflags=+faststart]out.mp4|[select=a]out.aac" - 与上文相同,但仅选择流 a:1 作为音频输出。请注意,必须执行第二级转义,因为“:”是用于分隔选项的特殊字符。
ffmpeg -i ... -map 0 -flags +global_header -c:v libx264 -c:a aac -f tee "[bsfs/v=dump_extra=freq=keyframe]out.ts|[movflags=+faststart]out.mp4|[select=\'a:1\']out.aac"
4.72 webm_chunk
WebM Live Chunk 复用器。
此复用器将 WebM 标头和块写出为单独的文件,可供通过 DASH 支持 WebM Live 流的客户端使用。
4.72.1 选项
此多路复用器支持以下选项:
- chunk_start_index
第一个块的索引(默认为 0)。
- header
将在其中写入初始化数据的标头的文件名。
- audio_chunk_duration
每个音频块的持续时间(以毫秒为单位)(默认为 5000)。
4.72.2 示例
ffmpeg -f v4l2 -i /dev/video0 \
-f alsa -i hw:0 \
-map 0:0 \
-c:v libvpx-vp9 \
-s 640x360 -keyint_min 30 -g 30 \
-f webm_chunk \
-header webm_live_video_360.hdr \
-chunk_start_index 1 \
webm_live_video_360_%d.chk \
-map 1:0 \
-c:a libvorbis \
-b:a 128k \
-f webm_chunk \
-header webm_live_audio_128.hdr \
-chunk_start_index 1 \
-audio_chunk_duration 1000 \
webm_live_audio_128_%d.chk
4.73 webm_dash_manifest
WebM DASH 清单复用器。
此复用器实现 WebM DASH 清单规范以生成 DASH 清单 XML。它还支持 DASH 直播流的清单生成。
有关更多信息,请参阅:
- WebM DASH 规范:https://sites.google.com/a/webmproject.org/wiki/adaptive-streaming/webm-dash-specification
- ISO DASH 规范:http://standards.iso.org/ittf/PubliclyAvailableStandards/c065274_ISO_IEC_23009-1_2014.zip
4.73.1 选项
此复用器支持以下选项:
- adaptation_sets
此选项具有以下语法:“id=x,streams=a,b,c id=y,streams=d,e”,其中 x 和 y 是适配集的唯一标识符,a、b、c、d 和 e 是相应音频和视频流的索引。使用此选项可以添加任意数量的适配集。
- live
将其设置为 1 以创建实时流 DASH 清单。默认值:0。
- chunk_start_index
第一个块的起始索引。这将进入清单中“SegmentTemplate”元素的“startNumber”属性。默认值:0。
- chunk_duration_ms
每个块的持续时间(以毫秒为单位)。这将进入清单中“SegmentTemplate”元素的“duration”属性。默认值:1000。
- utc_timing_url
将返回 ISO 格式的 UTC 时间戳的页面的 URL。这将进入清单中“UTCTiming”元素的“value”属性。默认值:无。
- time_shift_buffer_depth
保证任何表示可用的最小时间(以秒为单位)移位缓冲区。这将进入“MPD”元素的“timeShiftBufferDepth”属性。默认值:60。
- minimum_update_period
清单的最小更新周期(以秒为单位)。这将放在“MPD”元素的“minimumUpdatePeriod”属性中。默认值:0。
4.73.2 示例
ffmpeg -f webm_dash_manifest -i video1.webm \
-f webm_dash_manifest -i video2.webm \
-f webm_dash_manifest -i audio1.webm \
-f webm_dash_manifest -i audio2.webm \
-map 0 -map 1 -map 2 -map 3 \
-c copy \
-f webm_dash_manifest \
-adaptation_sets "id=0,streams=0,1 id=1,streams=2,3" \
manifest.xml
5 元数据
FFmpeg 能够将媒体文件中的元数据转储到简单的 UTF-8 编码的 INI 类文本文件中,然后使用元数据复用器/解复用器将其加载回来。
文件格式如下:
- 文件由一个标题和多个元数据标签组成,这些标签分为几部分,每部分占一行。
- 标题是一个‘;FFMETADATA’字符串,后面跟着版本号(现在为 1)。
- 元数据标签的形式为‘key=value’
- 标题后面紧接着全局元数据
- 全局元数据之后可能有包含每个流/每个章节元数据的部分。
- 部分以大写部分名称(即 STREAM 或 CHAPTER)开头,括在括号中(‘[’、‘]’),以下一节或文件结尾结束。
- 在章节部分的开头,可能有一个可选的时间基准,用于开始/结束值。它必须采用“TIMEBASE=num/den”的形式,其中 num 和 den 是整数。如果缺少时间基准,则开始/结束时间将假定为纳秒。
- 空行和以“;”或“#”开头的行将被忽略。
- 包含特殊字符(“=”、“;”、“#”、“\”和换行符)的元数据键或值必须使用反斜杠“\”进行转义。
- 请注意,元数据中的空格(例如“foo = bar”)被视为标签的一部分(在上面的示例中,键为“foo”,值为“bar”)。
ffmetadata 文件可能如下所示:
;FFMETADATA1
title=bike\\shed
;this is a comment
artist=FFmpeg troll team
[CHAPTER]
TIMEBASE=1/1000
START=0
#chapter ends at 0:01:00
END=60000
title=chapter \#1
[STREAM]
title=multi\
line
通过使用 ffmetadata 多路复用器和解复用器,可以将元数据从输入文件提取到 ffmetadata 文件,然后使用编辑后的 ffmetadata 文件将文件转码为输出文件。
使用 ffmpeg 提取 ffmetadata 文件的步骤如下:
ffmpeg -i INPUT -f ffmetadata FFMETADATAFILE
可以从 FFMETADATAFILE 文件重新插入编辑后的元数据信息,操作如下:
ffmpeg -i INPUT -i FFMETADATAFILE -map_metadata 1 -codec copy OUTPUT