1. join
2. concat连接媒体文件
2.1 具有相同编解码器的文件的串联
2.1.1 Concat demuxer
2.1.2 Concat protocol
2.2 连接不同编解码器的文件
2.2.1 Concat filter
2.2.2 使用外部脚本
2.3 自动生成输入文件
2.3.1 Linux-bash
2.3.2 Windows
2.4 concat选项
3. mux 复用
4. AudioChannel-mix
5 both-play
5.1 overlay 覆盖选项说明
5.2. Examples 举例
1. join
3.13 如何 Join 视频文件?
“join”视频文件是很模糊的。下面的列表解释了不同类型的“join”,并指出了这些在 FFmpeg 中是如何解决的。join 视频文件可能意味着:
- concat 连接: one after the other 将它们一个接一个地放置:这被称为连接concatenate 它们(简而言之:concat)详见: https://ffmpeg.org/faq.html#How-can-I-concatenate-video-files
- mux 复用: together in the same file 将它们放在同一个文件中,让用户在不同版本之间进行选择(例如:不同的音频语言):这被称为将 它们multiplex复用在一起(简称:mux),并且通过简单地调用 ffmpeg 与几个 -i 选项。
- channels 声道 (audio): to put all channels together in a single stream. 将所有通道放在一个流中(例如:两个单声道流到一个立体声流中):有时会调用它来 合并它们,并且可以使用amerge过滤器来完成。
- mix 混合 (audio): to play one on top of the other. 一个在另一个之上播放:这被称为mix混合 它们,可以通过首先将它们合并成一个流然后使用pan过滤器随意混合通道来完成。
- both 同时播放 (video): display both together 将两者一起显示,并排显示或一个显示在另一部分的顶部;它可以使用overlay视频过滤器来完成。
2. concat连接媒体文件
如果您的媒体文件具有完全相同的编解码器和编解码器参数,您可以按照“连接具有相同编解码器的文件”中所述将它们连接起来。
如果您有不同编解码器的媒体,您可以按照下面的“连接不同编解码器的文件”中的说明将它们连接起来。
2.1 具有相同编解码器的文件的串联
2.1.1 Concat demuxer
您可以在文档中阅读有关 concat demuxer 的信息。这个解复用器从一个文本文件中读取一系列文件和其他指令,并一个接一个地解复用它们,就好像它们的所有数据包都被混合在一起一样。所有文件必须具有相同的流(相同的编解码器、相同的时基等),但可以包装在不同的容器格式中。
mylist.txt是包含如下内容的文件列表
file '/path/to/file1.wav'
file '/path/to/file2.wav'
ffmpeg -f concat -safe 0 -i mylist.txt -c copy output.wav
-safe 0 如果路径是相对的,则不需要。
$ ffmpeg -f concat -i g1.txt -c copy output.mkv
您还可以循环播放视频。此示例将循环input.mkv10 次:
for i in {1..10}; do printf "file '%s'\n" input.mkv >> mylist.txt; done
ffmpeg -f concat -i mylist.txt -c copy output.mkv
2.1.2 Concat protocol
demuxer在流级别工作,而 concat 协议在文件级别工作。可以连接某些文件(MPEG-2 传输流,可能还有其他文件)。这类似于cat在类 UNIX 系统或Windows 上的copy。
以下命令连接三个 MPEG-2 TS 文件并连接它们而不重新编码:
$ ffmpeg -i "concat:input1.ts|input2.ts|input3.ts" -c copy output.ts
$ ffmpeg -i "concat:g1.mkv|g2.mkv" -c copy output.mkv
注: 看起来不支持mkv, 参照以上写法(原始文件g1.mkv g2.mkv 各10s). 输出总10s, 视频合并为一个流(一个被覆盖所以永远看不到); 音频则合并为一个流(就是同时播放的效果).
使用中间文件
如果您有 MP4 文件,可以通过首先将它们转码为 MPEG-2 传输流来无损地连接这些文件。对于 H.264 视频和 AAC 音频,可以使用以下内容:
ffmpeg -i input1.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts intermediate1.ts
ffmpeg -i input2.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts intermediate2.ts
ffmpeg -i "concat:intermediate1.ts|intermediate2.ts" -c copy -bsf:a aac_adtstoasc output.mp4
使用命名管道避免中间文件
如果您使用的系统支持命名管道,则可以使用它们来避免创建中间文件。这会将 stderr(ffmpeg 将所有写入的数据发送到它)发送到/dev/null,以避免使命令行混乱:
mkfifo temp1 temp2
ffmpeg -y -i input1.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts temp1 2> /dev/null & \
ffmpeg -y -i input2.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts temp2 2> /dev/null & \
ffmpeg -f mpegts -i "concat:temp1|temp2" -c copy -bsf:a aac_adtstoasc output.mp4
需要 -y 额外的开关来强制 ffmpeg 写入现有文件temp1和temp2,它们是命名管道。如果没有开关,在后台运行的前两个 ffmpeg 程序将不会产生任何输出,因为它们等待交互式是/否回答是否覆盖现有文件的问题。
2.2 连接不同编解码器的文件
在很多情况下,输入文件会有不同的编解码器或不同的编解码器属性,这使得无法使用上述任何一种方法。
2.2.1 Concat filter
有关更多信息,请参阅concat 过滤器文档。该过滤器适用于同步视频和音频流的片段。所有段必须具有相同数量的每种类型的流,这也将是输出的流数。
注意:过滤器与流复制不兼容;你不能用-c copy这种方法。由于您必须重新编码视频和音频流,并且重新编码可能会引入压缩伪影,因此请确保添加正确的目标比特率bitrate 或质量quality设置。有关更多信息,请参阅编码指南。
要使 concat 过滤器工作,输入必须具有相同的帧尺寸(例如,1920x1080 像素)并且应该具有相同的帧速率。因此,你可能至少需要添加一个 scale or scale2ref 拼接视频前过滤器。少数其他属性也必须匹配,例如流纵横比stream aspect ratio。有关更多信息,请参阅过滤器的文档。
假设我们有三个要连接的文件——每个文件都有一个视频和音频流。concat 过滤器命令如下所示:
ffmpeg -i input1.mp4 -i input2.webm -i input3.mov \
-filter_complex "[0:v:0][0:a:0][1:v:0][1:a:0][2:v:0][2:a:0]concat=n=3:v=1:a=1[outv][outa]" \
-map "[outv]" -map "[outa]" output.mkv
现在,让我们剖析该命令。我们首先指定所有输入文件,然后实例化一个-filter_complex过滤器图——这是需要的,而不是-filter:v因为它有多个输入和输出。
[0:v:0][0:a:0][1:v:0][1:a:0][2:v:0][2:a:0]
告诉 ffmpeg 从输入文件中获取哪些流并将其作为输入发送到 concat 过滤器。在这种情况下,视频流 0 [0:v:0] 和音频流 0 [0:a:0] 来自输入 0(input1.mp4在本例中),视频流 0 [1:v:0] 和音频流 0 [ 1:v:0] 来自输入 1 ( input2.webm) 等。
concat=n=3:v=1:a=1[outv][outa]'
这是 concat 过滤器本身。n=3告诉过滤器有三个输入段;v=1告诉它每个片段将有一个视频流;a=1告诉它每段将有一个音频流。然后过滤器连接这些段并产生两个输出流。[outv]和[outa]是这些输出流的名称。请注意,过滤器部分周围的引号是必需的。
然后,您可以在其他过滤器中重新使用这些流,或将它们映射到输出文件:
-map "[outv]" -map "[outa]" output.mkv
这告诉 ffmpeg 使用 concat 过滤器的结果,而不是直接来自输入文件的流。
ffmpeg -i g1.mkv -i g2.mkv -filter_complex "[0:v:0][0:a:0][1:v:0][1:a:0]concat=n=2:v=1:a=1[outv][outa]" -map "[outv]" -map "[outa]" output.mkv
2.2.2 使用外部脚本
有一个名为mmcat的 Bash 脚本对于不包含concat过滤器的旧版本 ffmpeg 很有用。
2.3 自动生成输入文件
2.3.1 Linux-bash
with a bash for loop
$ for f in *.wav; do echo "file '$f'" >> mylist.txt; done
or with printf
$ printf "file '%s'\n" *.wav > mylist.txt
即时更改播放列表文件
concat demuxer 仅在需要时打开引用的文件。这使我们能够在 demuxer 后面原子地交换引用的文件,以便能够将 concat demuxer 用作可更改的实时源。查看以下示例文件 list.txt:
ffconcat version 1.0
file dummy.mxf
file dummy.mxf
dummy.mxf 被引用两次,以确保 concat demuxer 在它到达时重新打开文件。将此与无限循环结合起来,您就完成了:
$ ffmpeg -re -stream_loop -1 -i list.txt -flush_packets 0 -f mpegts udp://127.0.0.1:5000?pkt_size=1316
现在您可以通过简单的移动命令更改循环剪辑:
$ mv next_clip.mxf dummy.mxf
自动附加到列表文件
如果当前不存在下一个剪辑,则连接不起作用,因为在读取整个列表之前不会开始解码。但是,可以引用当前列表末尾的另一个列表。以下脚本为此机制提供了一个示例:
https://trac.ffmpeg.org/wiki/Concatenate#demuxer
请注意,递归引用播放列表文件将导致 ffmpeg 最终耗尽文件描述符(或其他资源),因为 ffmpeg 仅在播放列表完成时关闭播放列表文件,但在上面的示例中,由于递归链接实际上没有播放列表文件结尾。
2.3.2 Windows
Command-line:
(for %i in (*.wav) do @echo file '%i') > mylist.txt
Powershell:
foreach ($i in Get-ChildItem .\*.wav) {echo "file '$i'" >> mylist.txt}
bat-file:
(for %%i in (*.wav) do @echo file '%%i') > mylist.txt
2.4 concat选项
3.4.2 Options
20.4.2 Options
此多路分配器接受以下选项:
-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。
3. mux 复用
2个视频流, 选择播放, 并不首位相接. 音频只保留了1个.
$ ffmpeg -i g0.mkv -i h0.mkv -map 0:0 -map 1:0 -map 0:1 -c copy ot2.mkv
2个视频流, 2个音频流, 选择播放.
$ ffmpeg -i g0.mkv -i h0.mkv -map 0:0 -map 1:0 -map 0:1 -map 1:1 -c copy ot2.mkv
$ ffmpeg -i g0.mkv -i h0.mkv -i a1.flv -map 0:0 -map 1:0 -map 2:0 -map 0:1 -c copy ot2.mkv
$ ffmpeg -i g0.mkv -i h0.mkv -i a1.flv -i a2.mp4 -i c0.mkv -map 0:0 -map 1:0 -map 2:0 -map 3:0 -map 4:0 -map 0:1 -map 4:1 -c copy ot2.mkv
更多视频融合为流, 不编译, 速度也能快. 分辨率不同, 也都会保留各自的分辨率.
4. AudioChannel-mix
2.8 Channel Layout 通道布局
下表摘录自如下页面:
Picture |
https://trac.ffmpeg.org/wiki/AudioChannelManipulation |
|
[1.1-4] stereo → mono stream Downmix both channels 下缩两个通道 Use -ac 将单个立体声流混合成单声道流。立体声流的两个通道都将被缩混到流中: $ ffmpeg -i stereo.flac -ac 1 mono.flac 警告:任何异相立体声都会抵消。 以下滤波器图可用于在缩混之前使立体声同相异相: -af "asplit[a],aphasemeter=video=0,ametadata=select:key=lavfi.aphasemeter.phase:value=-0.005:function=less,pan=1c|c0=c0,aresample=async=1:first_pts=0,[a]amix" |
|
[1.2] 立体声 → 单声道 Choose a specific channel 选择特定频道 Use channelsplit or pan 此示例使用 channelsplit 音频过滤器仅包含正确的通道: $ ffmpeg -i stereo.wav -filter_complex "[0:a]channelsplit=channel_layout=stereo:channels=FR[right]" -map "[right]" front_right.wav $ ffmpeg -i stereo.wav -af "pan=mono|c0=c1" mono.m4a 或者,您可以c0=FR改用。如果想要左声道,请使用c0=c0或c0=FL。 |
|
[2-5] stereo → 2 × mono files Use channelsplit or -map_channel or pan 使用 channelsplit 音频过滤器将立体声输入中的每个通道输出到单独的单声道文件: $ ffmpeg -i stereo.wav -filter_complex "[0:a]channelsplit=channel_layout=stereo[left][right]" -map "[left]" left.wav -map "[right]" right.wav $ ffmpeg -i stereo.wav -map_channel 0.0.0 left.wav -map_channel 0.0.1 right.wav $ ffmpeg -i stereo.wav -filter_complex "[0:a]pan=1c|c0=c0[left];[0:a]pan=1c|c0=c1[right]" -map "[left]" left.wav -map "[right]" right.wav |
|
[3] stereo → 2 × mono streams Use channelsplit 使用 channelsplit 音频过滤器将立体声输入中的每个通道输出到一个输出文件中的单个单声道流: $ ffmpeg -i in.mp3 -filter_complex "[0:a]channelsplit=channel_layout=stereo" output.mka |
|
[4-1.1] mono → stereo Use -ac or amerge 从一个单声道输入创建立体声输出: $ ffmpeg -i input.mp3 -ac 2 output.m4a $ ffmpeg -i input.mp3 -filter_complex "[0:a][0:a]amerge=inputs=2[a]" -map "[a]" output.m4a 注意:这些示例不会从单声道输入神奇地创建“真正的”立体声输出,而只是将相同的音频放入输出的左右声道(两个声道将相同)。 |
|
[5-2] 2 × mono → stereo Use join or amerge 使用 join 音频过滤器从两个单声道输入创建立体声输出: $ ffmpeg -i left.mp3 -i right.mp3 -filter_complex "[0:a][1:a]join=inputs=2:channel_layout=stereo[a]" -map "[a]" output.mp3 $ ffmpeg -i left.mp3 -i right.mp3 -filter_complex "[0:a][1:a]amerge=inputs=2[a]" -map "[a]" output.mka |
|
[10] stereo → stereo Mix both stereo channels to stereo 两个立体声通道混合为立体声 pan 输出的左右声道将分别包含输入的左右声道: $ ffmpeg -i input.mp3 -af "pan=stereo|c0<c0+c1|c1<c0+c1" output.ogg |
|
[11] Switch stereo channels 切换立体声通道 Use channelmap or pan or -map_channel 使用 channelmap 音频过滤器将左声道切换到右声道和右声道切换到左声道: $ ffmpeg -i stereo.mp3 -filter_complex "channelmap=map=FL-FR|FR-FL:channel_layout=stereo" output.mp3 $ ffmpeg -i stereo.ogg -af pan=stereo|c0=c1|c1=c0 output.wav $ ffmpeg -i stereo.ogg -map_channel 0.0.1 -map_channel 0.0.0 output.wav |
|
[12] Mute a channel 静音 Use pan or -map_channel 此示例使用 pan 音频过滤器将第一个通道(左前)静音,但保持第二个通道(右前)不变: $ ffmpeg -i stereo.wav -af "pan=stereo|c1=c1" output.wav $ ffmpeg -i stereo.wav -map_channel -1 -map_channel 0.0.1 output.wav |
Picture |
https://trac.ffmpeg.org/wiki/AudioChannelManipulation |
|
[8] 5.1 → stereo Use -ac or pan 要缩混,您可以简单地使用-ac 2: $ ffmpeg -i 6channels.wav -ac 2 stereo.wav 注意: 默认情况下,使用-ac 2LFE 通道时省略。请参见“数字音频压缩标准(文件A / 52:2012) ”,部分6.1.12和7.8的更多信息缩混。 http://atsc.org/wp-content/uploads/2015/03/A52-201212-17.pdf ffmpeg集成了一个默认的向下混音(和向上混音)系统,-ac除非您有非常特殊的需求,否则该系统应该优先于(选项)而不是 pan 过滤器。 如果您想映射特定频道并删除其余频道,您可以使用 pan 音频过滤器。这会将FL输入的(左前)映射到 FL输出的 ,并将输入的FR(右前)映射到FR输出的 : $ ffmpeg -i 6channels.wav -af "pan=stereo|c0=FL|c1=FR" stereo.wav 您还可以按编号映射特定频道。此示例将输入的第一个和第三个通道映射到输出的第一个和第二个通道。 $ ffmpeg -i 6channels.wav -af "pan=stereo|c0=c0|c1=c2" output.wav 如果将=通道规范中的 替换为<,则该规范的增益将被重新归一化,使总数为 1,从而避免削波噪声。有关其他信息和示例,请参阅声像音频过滤器文档。 https://ffmpeg.org/ffmpeg-filters.html#pan |
|
[9.1] 2 × stereo → stereo (a.fl + b.fl → c.FL; a.fr + b.fr → c.FR) Use amerge和pan or -ac 使用amerge和pan音频过滤器将两个立体声输入合并为一个立体声输出: $ ffmpeg -i input1.wav -i input2.wav -filter_complex "[0:a][1:a]amerge=inputs=2,pan=stereo|c0<c0+c2|c1<c1+c3[a]" -map "[a]" output.mp3 $ ffmpeg -i input1.wav -i input2.wav -filter_complex "[0:a][1:a]amerge=inputs=2[a]" -map "[a]" -ac 2 output.mp3 注意:使用 pan 音频过滤器产生的输出可能与使用 产生的输出不同-ac 2,因此您必须聆听输出或查看音频统计信息,以确定哪种输出适合您. https://trac.ffmpeg.org/wiki/AudioChannelManipulation#Statistics |
|
[9.2] (a.fl + fr → c.FL; b.fl + fr → c.FR) Use amerge和pan 与上面类似的情况,而是使用第一个输入的左右声道使左声道输出,并使用第二个输入的左右声道使输出的右声道。 只需更改平移过滤器中的通道规格: $ ffmpeg -i input1.wav -i input2.wav -filter_complex "[0:a][1:a]amerge=inputs=2,pan=stereo|c0<c0+c1|c1<c2+c3[a]" -map "[a]" output.mp3 在这种情况下必须使用声像音频过滤器,而不是-ac 2与前面的示例不同。 |
https://trac.ffmpeg.org/wiki/AudioChannelManipulation |
[6-7] 6 × mono → 5.1 Use join or amerge 使用 join 音频过滤器将 6 个单声道输入合并为一个 5.1(6 声道)输出: $ ffmpeg -i front_left.wav -i front_right.wav -i front_center.wav -i lfe.wav -i back_left.wav -i back_right.wav \ -filter_complex "[0:a][1:a][2:a][3:a][4:a][5:a]join=inputs=6:channel_layout=5.1[a]" -map "[a]" output.wav 加入音频过滤器还允许您手动选择布局: $ ffmpeg -i front_left.wav -i front_right.wav -i front_center.wav -i lfe.wav -i back_left.wav -i back_right.wav \ -filter_complex "[0:a][1:a][2:a][3:a][4:a][5:a]join=inputs=6:channel_layout=5.1:map=0.0-FL|1.0-FR|2.0-FC|3.0-LFE|4.0-BL|5.0-BR[a]" -map "[a]" output.wav 另一种使用amerge音频过滤器的方法比上面显示的连接过滤器灵活一些: $ ffmpeg -i front_left.wav -i front_right.wav -i front_center.wav -i lfe.wav -i back_left.wav -i back_right.wav \ -filter_complex "[0:a][1:a][2:a][3:a][4:a][5:a]amerge=inputs=6[a]" -map "[a]" output.wav 使用 amerge,所有输入必须具有相同的采样率和格式。如果输入的持续时间不同,则输出将以最短的时间停止。 |
[7-6] 5.1 → 6 × mono Use channelsplit 使用 channelsplit 音频过滤器将 5.1 声道输入拆分为单独的每声道文件: $ ffmpeg -i in.wav \ -filter_complex "channelsplit=channel_layout=5.1[FL][FR][FC][LFE][BL][BR]" \ -map "[FL]" front_left.wav \ -map "[FR]" front_right.wav \ -map "[FC]" front_center.wav \ -map "[LFE]" lfe.wav \ -map "[BL]" back_left.wav \ -map "[BR]" back_right.wav |
[13] Remap channels 重新映射 Use channelmap
channelmap 音频滤波器可以重新安排信道的布局。例如,要在 5.1 输入中切换 FL 和 FR 通道:
$ ffmpeg -i input.wav -filter_complex "channelmap=map=FL-FR|FR-FL|FC-FC|LFE-LFE|BL-BL|BR-BR:channel_layout=5.1" output.wav
[14] Virtual Binaural Acoustics 虚拟双耳声学 sofalizer
FFmpeg 可以使用 sofalizer 音频过滤器生成虚拟双耳声学文件。输入支持大多数已知的通道布局,并且输出始终是立体声。
$ ffmpeg -i input.wav -af sofalizer=/path/to/sofa/file output.flac
[15] Multiple channel layouts 多通道布局 pan
此示例使用 pan 音频过滤器将两个布局 (5.1+2.0) 组合成一个任意布局:
$ ffmpeg -i input -filter_complex "pan=5.1+downmix|FL=c0|FR=c1|FC=c2|LFE=c3|BL=c4|BR=c5|DL=c6|DR=c7[a]" -map "[a]" out.wav
示例中的输出产生了一个具有 8 个通道的音频流。
本节用到的主要选项及过滤器:
- 分/合 -ac
- 分/合 -map_channel
- 分/合 channelmap
- 分/合 pan
- 分 channelsplit
- 合 join
- 合 amerge
5. both-play
both 同时播放 (video): display both together 将两者一起显示,并排显示或一个显示在另一部分的顶部;它可以使用overlay视频过滤器来完成。
5.1 overlay 覆盖选项说明
将一个视频叠加在另一个视频上。
它需要两个输入,一个输出。 第一个输入是覆盖第二个输入的“主”视频。
它接受以下参数:
x, y 设置主视频上叠加视频的 x 和 y 坐标表达式。两个表达式的默认值都是“0”。如果表达式无效,则将其设置为一个巨大的值(意味着不会在输出可见区域内显示叠加层)。
eval 在计算 x 和 y 的表达式时设置。它接受以下值:
‘init’ 仅在过滤器初始化期间或处理命令时对表达式求值一次
‘frame’ 评估每个传入帧的表达式. Default value is ‘frame’.
format 设置输出视频的格式。它接受以下值:
‘yuv420’ force YUV420 output
‘yuv420p10’ force YUV420p10 output
‘yuv422’ force YUV422 output
‘yuv422p10’ force YUV422p10 output
‘yuv444’ force YUV444 output
‘rgb’ force packed RGB output
‘gbrp’ force planar RGB output
‘auto’ automatically pick format
Default value is ‘yuv420’.
eof_action See framesync.
shortest See framesync. 请参阅帧同步。
repeatlast See framesync. https://ffmpeg.org/ffmpeg-filters.html#framesync
alpha 设置叠加视频的 alpha 格式,可以是直接或预乘。默认是 straight。
x 和 y 表达式可以包含以下参数。
main_w, W
main_h, H
The main input width and height. 主要输入宽度和高度。
overlay_w, w
overlay_h, h
The overlay input width and height. 叠加输入宽度和高度。
x, y x 和 y 的计算值。它们针对每个新帧进行评估。
hsub
vsub
输出格式的水平和垂直色度子样本值。 例如,对于像素格式“yuv422p”,hsub 为 2,vsub 为 1。
n 输入帧数,从0开始
pos 输入帧在文件中的位置,如果未知,则为 NAN
t 时间戳,以秒表示。 如果输入时间戳未知,则为 NAN。
此过滤器还支持帧同步选项。
请注意,n、pos、t 变量仅在每帧完成评估时可用,并且当 eval 设置为“init”时将评估为 NAN。
请注意,帧是按时间戳顺序从每个输入视频中获取的,因此,如果它们的初始时间戳不同,最好通过 setpts=PTS-STARTPTS 过滤器传递两个输入,让它们以相同的零时间戳开始, 就像电影过滤器的例子一样。
您可以将更多的叠加层链接在一起,但您应该测试这种方法的效率。
11.161.1 Commands
此过滤器支持以下命令:
x
y
修改覆盖输入的 x 和 y。 该命令接受相应选项的相同语法。
如果指定的表达式无效,则保持其当前值。
5.2 Examples 举例
在距主视频右下角 10 像素处绘制叠加层:
overlay=main_w-overlay_w-10:main_h-overlay_h-10
使用命名选项,上面的例子变成:
overlay=x=main_w-overlay_w-10:y=main_h-overlay_h-10
使用带有 -filter_complex 选项的 ffmpeg 工具在输入的左下角插入一个透明的 PNG 徽标:
$ ffmpeg -i input -i logo -filter_complex 'overlay=10:main_h-overlay_h-10' output
使用 ffmpeg 工具插入 2 个不同的透明 PNG 标志(右下角的第二个标志):
$ ffmpeg -i input -i logo1 -i logo2 -filter_complex 'overlay=x=10:y=H-h-10,overlay=x=W-w-10:y=H-h-10' output
在主视频的顶部添加一个透明的颜色层; WxH 必须指定覆盖过滤器的主要输入的大小:
color=color=red@.3:size=WxH [over]; [in][over] overlay [out]
使用 ffplay 工具并排播放原始视频和过滤版本(此处使用 deshake 过滤器):
$ ffplay input.avi -vf 'split[a][b]; [a]pad=iw*2:ih[src]; [b]deshake[filt]; [src][filt]overlay=w'
上面的命令等同于:
$ ffplay input.avi -vf 'split[b], pad=iw*2[src], [b]deshake, [src]overlay=w'
从时间 2 开始,从屏幕的左上方到右上方出现一个滑动覆盖:
overlay=x='if(gte(t,2), -w+(t-2)*20, NAN)':y=0
通过将两个输入视频并排放置来组合输出:
$ ffmpeg -i left.avi -i right.avi -filter_complex "
nullsrc=size=200x100 [background];
[0:v] setpts=PTS-STARTPTS, scale=100x100 [left];
[1:v] setpts=PTS-STARTPTS, scale=100x100 [right];
[background][left] overlay=shortest=1 [background+left];
[background+left][right] overlay=shortest=1:x=100 [left+right]
"
通过将 delogo 过滤器应用于某个部分来屏蔽视频的 10-20 秒
$ ffmpeg -i test.avi -codec:v:0 wmv2 -ar 11025 -b:v 9000k
-vf '[in]split[split_main][split_delogo];[split_delogo]trim=start=360:end=371,delogo=0:0:640:480[delogoed];[split_main][delogoed]overlay=eof_action=pass[out]'
masked.avi
级联多个叠加层:
nullsrc=s=200x200 [bg];
testsrc=s=100x100, split=4 [in0][in1][in2][in3];
[in0] lutrgb=r=0, [bg] overlay=0:0 [mid0];
[in1] lutrgb=g=0, [mid0] overlay=100:0 [mid1];
[in2] lutrgb=b=0, [mid1] overlay=0:100 [mid2];
[in3] null, [mid2] overlay=100:100 [out0]