连接多个视频(带音频)并淡入淡出

连接多个视频(带音频)并淡入淡出

我有 7 个短视频片段,它们的大小、帧速率等都相同。我想将它们一个接一个地连接起来,并进行 2 秒的淡入淡出,并且不丢失音频。取自此处的一篇早期文章,我尝试使用以下方法连接/淡入淡出前两个片段:

ffmpeg -i *clip1.mp4 -i *clip2.mp4  \
-filter_complex "[0]fade=t=out:st=0:d=1:alpha=1,setpts=PTS-STARTPTS[va0]; \
[1]fade=t=in:st=0:d=1:alpha=1,setpts=PTS-STARTPTS[va1];  \
[va0][va1]overlay[outv];[0][1]amix[outa]" \
-map [outv] -map "[outa]" -crf 10 out.mp4

但是,这样会生成一个视频,第一个视频会立即淡出,最终长度与第二个视频完全相同(恰好是 40 秒)。我认为这是因为第一个视频的“st=0”[0]?但是,如果我将其更改为“st=18”(第一个视频长 20 秒),生成的组合视频(out.mp4)仍然会让第一个视频立即淡出(整个视频仍然只有 40 秒长,而不是 58 秒)。但是,第一个视频的音频现在确实持续了 18 秒(但它现在覆盖了第二个视频及其音频 18 秒)。有什么建议可以尝试吗?

答案1

要使用交叉淡入淡出来合并剪辑 - 您需要注意两件事 - 在正确的时间和正确的类型应用淡入淡出,并延迟视频时间戳,以便每个视频在最终组装中的正确时间开始。

在这种情况下,您的第一个视频为 20 秒,第二个视频为 40 秒,并且您想要 2 秒的淡入淡出。使用叠加滤镜执行淡入淡出时,我们只需对传入视频应用淡入。对传出视频应用淡出将产生亮度下降 - 有时是可取的,但我避免这样做。

首先,我们应用 2 秒淡入淡出在第二个视频的开始处。

[1]format=yuva444p,fade=t=in:st=0:d=2:alpha=1,setpts=PTS-STARTPTS+18/TB[va1];

由于淡入淡出仅应用于 alpha 通道,因此视频需要具有 alpha 通道。通常,视频没有,因此在淡入淡出之前应用像素格式转换滤镜,将第二个视频的像素格式更改为具有 alpha 的格式 - 注意 中的ayuva444p淡入淡出类型in从时间开始0,持续时间2s阿尔法通道仅即视频的彩色像素不受影响。

现在第二个视频应该延迟。由于第一个视频长度为 20 秒,需要 2 秒的淡入淡出,因此第二个视频应该在组装过程中从 18 秒开始。因此应用了 setpts 过滤器

setpts=PTS-STARTPTS+18/TB

TB 指的是时间基准,是存储流的时间戳的单位。

对于音频淡入淡出,有一个淡入淡出过滤器

[0][1]acrossfade=d=2

这将设置 2 秒的淡入淡出。

现在我们可以把两个夹子组装起来,

ffmpeg -i *clip1.mp4 -i *clip2.mp4  \
-filter_complex \
 "[1]format=yuva444p,fade=t=in:st=0:d=2:alpha=1,setpts=PTS-STARTPTS+18/TB[va1];  \
 [0][va1]overlay[outv];[0][1]acrossfade=d=2[outa]" \
-map [outv] -map "[outa]" -crf 10 out.mp4

相关内容