前言
Github
地址:Github
地址:
专辑地址:FFplay专辑
13.解复用器
解复用器是FFmpeg
中配置的元素,可以从特定类型的文件中读取多媒体流。
配置FFmpeg
构建时,默认情况下会启用所有支持的分离器。 可以使用configure
选项--list-demuxers
列出所有可用的列表。
可以使用configure
选项--disable-demuxers
禁用所有解复用器,并使用选项--enable-demuxer = DEMUXER
选择性地启用单个解复用器,或使用选项--disable-demuxer = DEMUXER
禁用它。
ff *
工具的选项-demuxers
将显示已启用的多路分离器列表。 使用-formats
可以查看已启用的分路器和多路复用器的组合列表。
下面介绍一些当前可用的分路器。
13.1 aa
可听格式2,3和4分路器。
此分路器用于分离Audible Format 2,3和4(.aa)
文件。
13.2 applehttp
Apple HTTP Live Streaming
分路。
此分离器呈现来自所有变体流的所有AVStream
。 id
字段设置为比特率变量索引号。 通过在AVStreams
上设置discard
标志(通过在ffplay
中按a'
或v
),调用者可以决定实际接收哪些变体流。 流所属的变体的总比特率在名为variant_bitrate
的元数据密钥中可用。
13.3 apng
动画便携式网络图形解复用器。
此分路器用于解复用APNG
文件。 所有标头,但PNG
签名,直到(但不包括)第一个fcTL
块作为extradata
传输。 然后将帧拆分为两个fcTL
之间的所有块,或者最后一个fcTL
和IEND
块之间的块。
-ignore_loop bool
如果设置,则忽略文件中的循环变量。
-max_fps int
每秒帧数的最大帧速率(0表示无限制)。
-default_fps int
如果文件中未指定,则以帧/秒为单位的默认帧速率(0表示尽可能快)。
13.4 asf
高级系统格式解复用器。
此分路器用于解复用ASF文件和MMS网络流。
-no_resync_search bool
不要尝试通过查找某个可选的开始代码来重新同步。
13.5 concat
虚级联脚本解复用器。
这个解复用器从文本文件中读取文件列表和其他指令,并将它们一个接一个地解复用,就好像它们的所有数据包已经被多路复用一样。
调整文件中的时间戳,以便第一个文件从0开始,每个下一个文件从前一个文件结束。 请注意,它是全局完成的,如果所有流的长度不完全相同,则可能会导致间隙。
所有文件必须具有相同的流(相同的编解码器,相同的时基等)。
每个文件的持续时间用于调整下一个文件的时间戳:如果持续时间不正确(因为它是使用比特率计算的,或者因为文件被截断,例如),则可能导致伪像。 duration
指令可用于覆盖存储在每个文件中的持续时间。
13.5.1 语法
该脚本是扩展ASCII
的文本文件,每行一个指令。 空行,前导空格和以#
开头的行将被忽略。 以下指令得到承认:
file path
要读取的文件的路径; 必须使用反斜杠或单引号转义特殊字符和空格。
所有后续与文件相关的指令都适用于该文件。
ffconcat version 1.0
确定脚本类型和版本。 如果为-1
,它还将safe
选项设置为1
。
要使FFmpeg
自动识别格式,该指令必须在脚本的第一行完全按原样出现(没有额外的空格或字节顺序标记)。
duration dur
文件的持续时间。 可以从文件中指定此信息; 如果来自文件的信息不可用或不准确,则在此处指定它可能更有效或有帮助。
如果为所有文件设置了持续时间,则可以在整个连接的视频中进行搜索。
inpoint timestamp
在文件的点。 当解复用器打开文件时,它立即寻找指定的时间戳。 寻求完成,以便所有流可以在In点成功呈现。
该指令最适用于帧内编解码器,因为对于非帧内编解码器,通常会在实际入点之前获得额外的数据包,并且解码的内容很可能在In点之前包含帧。
对于每个文件,文件入点之前的数据包将具有小于计算的文件开始时间戳的时间戳(在第一个文件的情况下为负),并且文件的持续时间(如果未由持续时间指令指定)将减少 基于他们指定的In点。
由于在指定的入点之前的潜在数据包,数据包时间戳可能在两个连接文件之间重叠。
outpoint timestamp
文件的出点。 当分路器在任何流中达到指定的解码时间戳时,它将其作为文件结束条件处理,并从所有流中跳过当前和所有剩余的分组。
出点是独占的,这意味着解复用器不会输出解码时间戳大于或等于Out
点的数据包。
该指令最适用于帧内编解码器和格式,其中所有流都是紧密交错的。 对于非帧内编解码器,通常会在Out point
之后获得带有演示时间戳的附加数据包,因此解码后的内容很可能在Out point
之后也包含帧。 如果流没有紧密交错,可能无法在Out point
之前从所有流中获取所有数据包,并且可能只能解码最早的流直到Out point
。
文件的持续时间(如果未由duration
指令指定)将根据其指定的Out
点减少。
file_packet_metadata key=value
文件包的元数据。 将为每个文件包设置指定的元数据。 可以多次指定此指令以添加多个元数据条目。
stream
在虚拟文件中引入流。 所有后续与流相关的指令都适用于最后引入的流。 必须设置某些流属性,以便识别子文件中的匹配流。 如果脚本中未定义任何流,则会复制第一个文件中的流。
exact_stream_id id
设置流的ID
。 如果给出该指令,则将使用子文件中具有相应id的字符串。 这对于MPEG-PS(VOB)
文件特别有用,其中流的顺序不可靠。
13.5.2 选项
此分离器接受以下选项:
safe
如果设置为1
,则拒绝不安全的文件路径。 如果文件路径不包含协议规范并且是相对的,并且所有组件仅包含可移植字符集中的字符(字母,数字,句点,下划线和连字符)并且在组件的开头没有句点,则认为文件路径是安全的。
如果设置为0
,则接受任何文件名。
默认值为1
。
如果格式是自动探测的,则-1
等于1
,否则为0
。
auto_convert
如果设置为1
,请尝试对数据包数据执行自动转换以使流可连接。 默认值为1
。
目前,唯一的转换是将h264_mp4toannexb
比特流过滤器添加到MP4
格式的H.264
流中。 如果存在分辨率变化,这尤其必要。
segment_time_metadata
如果设置为1
,则每个数据包将包含lavf.concat.start_time
和lavf.concat.duration
数据包元数据值,这些值是连接输出中各个文件段的start_time
和持续时间,以微秒表示。 仅当基于concat
文件已知持续时间元数据时才设置持续时间元数据。 默认值为0
。
13.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
13.6 dash
HTTP
分路器上的动态自适应流传输。
此分离器显示清单中找到的所有AVStream
。 通过在AVStream
上设置丢弃标志,调用者可以决定实际接收哪些流。 每个流将来自
的id
和带宽属性分别镜像为名为id
和variant_bitrate
的元数据键。
13.7 flv, live_flv
Adobe Flash
视频格式解复用器。
此分路器用于解复用FLV
文件和RTMP
网络流。 对于实时网络流,如果强制格式化,则可以使用live_flv
选项而不是flv
来保持时间戳不连续。
ffmpeg -f flv -i myfile.flv ...
ffmpeg -f live_flv -i rtmp:///anything/key ....
-flv_metadata bool
根据onMetaData
数组内容分配流。
13.8 gif
动画GIF
解复用器。
它接受以下选项:
值 | 解释 |
---|---|
min_delay | 设置帧之间的最小有效延迟,以百分之一秒为单位。 范围是0到6000.默认值是2 |
max_gif_delay | 设置帧之间的最大有效延迟,以百分之一秒为单位。 范围是0到65535.默认值是65535(接近11分钟),即规范允许的最大值 |
default_delay | 以百分之一秒为单位设置帧之间的默认延迟。 范围是0到6000.默认值是10 |
ignore_loop | GIF文件可以包含循环一定次数(或无限次)的信息。 如果'ignore_loop'设置为1,则输入中的循环设置将被忽略,并且不会发生循环。 如果设置为0,则将进行循环,并根据GIF循环次数。 默认值为1 |
例如,使用叠加过滤器,在另一个视频上放置一个无限循环的GIF
:
ffmpeg -i input.mp4 -ignore_loop 0 -i input.gif -filter_complex overlay=shortest=1 out.mkv
请注意,在上面的示例中,覆盖滤波器的最短选项用于以最短输入文件的长度结束输出视频,在这种情况下为input.mp4
,因为此示例中的GIF
无限循环。
13.9 hls
HLS
解复用器。
它接受以下选项:
live_start_index
段索引以启动实时流(负值来自末尾)。
allowed_extensions
,
允许hls访问的文件扩展名的分隔列表。
max_reload
尝试重新加载不足列表的最大次数。 默认值为1000
。
http_persistent
使用持久HTTP
连接。 仅适用于HTTP
流。 默认情况下启用。
http_multiple
使用多个HTTP
连接下载HTTP
段。 默认情况下为HTTP / 1.1
服务器启用。
13.10 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-2.jpg 形式的文件名序列。 ..,i%m%g-10.jpg 等。请注意,模式不一定必须包含 %d 或%0Nd ,例如,要转换单个图像文件img.jpeg ,可以使用以下命令:ffmpeg -i img.jpeg img.png |
glob | 选择glob 通配符模式类型。该模式被解释为 glob() 模式。 只有在使用globbing 支持编译libavformat 时才能选择此选项。 |
glob_sequence (deprecated, will be removed) | 选择混合的glob通配符/序列模式。 如果 libavformat 版本是使用globbing 支持编译的,并且提供的模式在%*?[] {} 中包含至少一个glob 元字符,前面是未转义的% ,则该模式将被解释为glob() 模式 ,否则它被解释为序列模式。所有 glob 特殊字符%*?[] {} 必须以% 为前缀。 要转义文字% ,应使用%% 。例如,模式 foo - %* 。jpeg 将匹配所有以foo- 为前缀并以.jpeg 结尾的文件名,以及foo - %?%?%?. jpeg 将匹配所有前缀为foo- 的文件名 ,后跟三个字符的序列,并以.jpeg 结尾。不推荐使用此模式类型,而支持 glob 和sequence 。默认值为 glob_sequence 。 |
pixel_format
设置要读取的图像的像素格式。 如果未指定,则从序列中的第一个图像文件猜测像素格式。
START_NUMBER
设置与图像文件模式匹配的文件的索引以开始读取。 默认值为0。
start_number_range
设置索引间隔范围,以便在从start_number开始查找序列中的第一个图像文件时进行检查。 默认值为5。
ts_from_file
如果设置为1,则将帧时间戳设置为图像文件的修改时间。 请注意,未提供时间戳的单调性:图像的顺序与没有此选项的顺序相同。 默认值为0.如果设置为2,则将帧时间戳设置为图像文件的修改时间,精确到纳秒级。
video_size
设置要读取的图像的视频大小。 如果未指定,则从序列中的第一个图像文件中猜出视频大小。
13.10.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
13.11 libgme
Game Music Emu
库是视频游戏音乐文件模拟器的集合。
有关详细信息,请参阅http://code.google.com/p/game-music-emu/。
有些文件有多个轨道。 解复用器默认选择第一首曲目。 track_index
选项可用于选择不同的曲目。 跟踪索引从0
开始。分路器将轨道数导出为轨道元数据条目。
对于非常大的文件,可能必须调整max_size
选项。
13.12 libopenmpt
基于libopenmpt
的模块分离器
有关更多信息,请参阅https://lib.openmpt.org/libopenmpt/。
有些文件有多个子(tracks
),可以使用subsong
选项设置。
它接受以下选项:
subsong
设置子索引。 这可以是all
,auto
或子项的索引。 子索引从0
开始。默认为auto
。
默认值是让libopenmpt
选择。
layout
设置通道布局。 有效值为1
,2
和4
通道布局。 默认值为STEREO
。
sample_rate
将libopenmpt
的采样率设置为输出。 范围从1000
到INT_MAX
。 默认值为48000
。
13.13 mov/mp4/3gp/QuickTime
QuickTime / MP4
解复用器。
该分路器接受以下选项:
enable_drefs
启用加载外部轨道,默认情况下禁用。 在某些用例中,启用此功能理论上可能会泄漏信息。
use_absolute_path
允许通过绝对路径加载外部轨道,默认情况下禁用。 启用此功能会带来安全风险。 只有在知道源是非恶意的情况下才应启用它。
13.14 mpegts
MPEG-2
传输流解复用器。
该分路器接受以下选项:
resync_size
设置查找新同步的大小限制。 默认值为65536
。
fix_teletext_pts
使用从图文电视流所属的第一节目的PCR计算的时间戳来覆盖图文电视数据包PTS
和DTS
值,并且不被丢弃。 默认值为1
,如果希望图文电视数据包PTS
和DTS
值不受影响,请将此选项设置为0
。
ts_packetsize
输出选项,以字节为单位承载原始数据包大小 显示检测到的原始数据包大小,不能由用户设置。
scan_all_pmts
扫描并组合所有PMT
。 该值是一个整数,其值从-1
到1
(-1
表示自动设置,1
表示启用,0
表示禁用)。 默认值为-1
。
13.15 mpjpeg
MJPEG
封装在多部分MIME
解复用器中。
该分路器允许读取MJPEG
,其中每个帧被表示为multipart / x-mixed-replace
流的一部分。
strict_mime_boundary
默认实现将宽松标准应用于多部分MIME
边界检测,以防止使用大量现有端点进行回归而不生成正确的MIME MJPEG
流。 通过将此选项设置为1
来启用此选项将导致更严格地检查边界值。
13.16 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
13.17 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
引用将从读取脚本时的当前时间获取,并且脚本布局将根据该引用被冻结。 这意味着如果直接播放脚本,实际时间将匹配绝对时间戳直到声音控制器的时钟精度,但如果用户以某种方式暂停播放或搜索,则所有时间都将相应地移位。
13.18 tedcaptions
用于TED
演讲的JSON
字幕。
TED
不提供字幕的链接,但可以从页面中猜到它们。 FFmpeg
源代码树中的tools / bookmarklets.html
文件包含一个用于公开它们的书签。
此分离器接受以下选项:
start_time
设置TED
通话的开始时间,以毫秒为单位。 默认值为15000
(15
秒)。 它用于将字幕与可下载视频同步,因为它们包含15s
简介。
示例:将字幕转换为大多数播放器理解的格式:
ffmpeg -i http://www.ted.com/talks/subtitles/id/1/lang/en talk1-en.srt