gpt4 book ai didi

ffmpeg - 如何使用 FFMPEG 在视频上独立淡入/淡出多个 (3+) 叠加图像?

转载 作者:行者123 更新时间:2023-12-04 22:46:20 25 4
gpt4 key购买 nike

使用任意源视频,我想在整个视频的不同时间独立淡入/淡出至少三个 .png 叠加层/水印。我无法获得适合过滤器链的语法。

在下面这些失败的尝试中,我使用了四个透明 .png 图像,全部分辨率为 1920x1080,并且使用相同大小的源输入视频。无需缩放/定位,只需在定义的时间淡入和淡出叠加层即可。

我的功能不会褪色,取消“启用”,如下所示:

ffmpeg -i vid1.mp4 -loop 1 -i img1.png -i img2.png -i img3.png -i img4.png -filter_complex 
"overlay=0:0:enable='between(t,8,11)' [tmp];
[tmp]overlay=0:0:enable='between(t,10,15)'[tmp1];
[tmp1]overlay=0:0:enable='between(t,15,138)'[tmp2];
[tmp2]overlay=0:0:enable='between(t,140,150)"
-c:v libx264 -c:a copy
-flags +global_header -shortest -s 1920x1080 -y out.mp4

我只想要相同的控件,使用淡入/淡出。

下面的几乎可以按照我的意愿工作,但我显然不希望整个输出流淡出。我意识到将 fade=out 添加到第 7、8 和 9 行会使组合输出褪色(从第 7 行开始),但这与我看到每个叠加图像实际褪色的情况一样接近。第 3、4 和 5 行中定义的淡入淡出显然不会影响任何内容,这就是我最初定义它们的地方。当我将它们复制到输出流时,淡入淡出效果适用于每个叠加图像,但我再次不希望它影响整个输出流,而只是影响各个叠加。

ffmpeg -i vid1.mp4 -loop 1 -i img1.png -i img2.png -i img3.png -i img4.png -filter_complex 
"[1:v]fade=out:st=3:d=1[watermark0];
[2:v]fade=out:st=4:d=1[watermark1];
[3:v]fade=out:st=5:d=1[watermark2];
[4:v]fade=out:st=6:d=1[watermark3];
[0:v][watermark0] overlay=0:0 [tmp0];
[tmp0][watermark1] overlay=0:0,fade=out:st=4:d=1 [tmp1];
[tmp1][watermark2] overlay=0:0,fade=out:st=6:d=1 [tmp2];
[tmp2][watermark3] overlay=0:0,fade=out:st=8:d=1 [out]" -map "[out]" -c:v libx264 -c:a copy
-flags +global_header -shortest -s 1920x1080 -y out.mp4

我也尝试过“分割”,其结果与上面类似,但淡入淡出似乎仅适用于第一张图像(该图像也使用淡入):

ffmpeg -i vid.mp4 -loop 1 -i img1.png -i img2.png -i img3.png -i img4.png -filter_complex 
"[1:v]split=4[wm1][wm2][wm3][wm4];
[wm1]fade=in:st=1:d=1:alpha=1,fade=out:st=3:d=1:alpha=1[ovr1];
[wm2]fade=in:st=2:d=1:alpha=1,fade=out:st=4:d=1:alpha=1[ovr2];
[wm3]fade=in:st=3:d=1:alpha=1,fade=out:st=5:d=1:alpha=1[ovr3];
[wm4]fade=in:st=4:d=1:alpha=1,fade=out:st=6:d=1:alpha=1[ovr4];
[0:v][ovr1]overlay=0:0[base1];
[base1][ovr2]overlay=0:0[base2];
[base2][ovr3]overlay=0:0[base3];
[base3][ovr4]overlay=0:0[out]" -map "[out]"
-t 10 -c:v libx264 -c:a copy -flags +global_header -shortest -s 1920x1080 -y out.mp4

非常感谢任何帮助! :)

最佳答案

使用

ffmpeg -i vid.mp4 -loop 1 -i img1.png -loop 1 -i img2.png -loop 1 -i img3.png
-loop 1 -i img4.png -filter_complex
"[1]fade=st=0:d=1:alpha=1,fade=out:st=2:d=1:alpha=1,trim=0:3,setpts=PTS+12/TB[ovr1];
[2]fade=st=0:d=1:alpha=1,fade=out:st=2:d=1:alpha=1,trim=0:3,setpts=PTS+25/TB[ovr2];
[3]fade=st=0:d=1:alpha=1,fade=out:st=2:d=1:alpha=1,trim=0:3,setpts=PTS+44/TB[ovr3];
[4]fade=st=0:d=1:alpha=1,fade=out:st=2:d=1:alpha=1,trim=0:3,setpts=PTS+73/TB[ovr4];
[0:v][ovr1]overlay=0:0:enable='between(t,12,15)'[base1];
[base1][ovr2]overlay=0:0:enable='between(t,25,28)'[base2];
[base2][ovr3]overlay=0:0:enable='between(t,44,47)'[base3];
[base3][ovr4]overlay=0:0:enable='between(t,73,76)'[out]" -map "[out]"
-c:v libx264 -c:a copy -flags +global_header -shortest -s 1920x1080 -y out.mp4

单个图像输入,如果不循环,将被视为一帧的视频输入。我已将循环添加到其他图像中。这使得每个输入都是无限持续时间的视频流。

对于每个图像,都会应用淡入和淡出。对于此处的时间值,假设您在流开始时应用。叠加的时间偏移稍后发生。淡出后,修剪流以仅保留视频直到淡出完成。然后应用时间偏移来匹配叠加的开始时间(要叠加从 33 秒开始的图像,则为 PTS+33/TB)。

然后按顺序叠加,就像您已经做的那样。我添加了启用条件以缩短执行时间。

关于ffmpeg - 如何使用 FFMPEG 在视频上独立淡入/淡出多个 (3+) 叠加图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42567144/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com