使用任意源视频,我想在整个视频的不同时间独立淡入/淡出至少三个.png叠加/水印。我在为过滤器链获得正确的语法时遇到了麻烦。
在下面这些失败的尝试中,我使用相同大小的源输入视频在1920x1080使用四个透明的.png图像。无需缩放/定位,只需在定义的时间内淡入淡出。
我的功能没有淡入淡出,没有“启用”,如下所示:
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和7行。 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
我也尝试过'split'与上面类似的结果,但淡入淡出似乎只适用于第一张图片(这个也使用淡入淡出):
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
非常感谢任何帮助! :)
答案 0 :(得分:1)
使用
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
)。
然后系列叠加,就像你已经做过的那样。我已添加启用条件以缩短执行时间。
答案 1 :(得分:0)
首先感谢您的答案和代码,它极大地帮助我修补。我已经发布了自己的代码(注意我不是像你这样的FFMPEG的完整专家。) 我的任务是在20.760秒的视频中淡入和淡出3对标题 - 标题是透明的PNG。从您的初始代码我做了以下内容:
一个。将所有“启用(t,开始,结束)”更改为“启用(t,0,999)”,这样就不需要调整或计算它们(如果您的视频短于999秒) 湾对每个图像使用绝对淡入淡出的方法。虽然处理时间较长,但您可以设置每个标题的绝对结束时间和开始时间。 C。添加了-t 20.760,表示要添加标题的基础视频的总长度。这可以防止无限循环。
ffmpeg -i sourcevideo.mp4 -loop 1 -i servtit1.png -loop 1 -i servtit2.png -loop 1 -i servtit3.png -loop 1 -i servtit4.png -loop 1 -i servtit5.png -loop 1 -i servtit6.png -filter_complex
"[1]fade=t=in:st=0.5:d=1,fade=t=out:st=2.5:d=1[ovr1];
[2]fade=t=in:st=2.5:d=1,fade=t=out:st=4.44:d=1[ovr2];
[3]fade=t=in:st=6.8:d=1,fade=t=out:st=9.6:d=1[ovr3];
[4]fade=t=in:st=9.6:d=1,fade=t=out:st=12.4:d=1[ovr4];
[5]fade=t=in:st=12.5:d=1,fade=t=out:st=15.2:d=1[ovr5];
[6]fade=t=in:st=15.2:d=1,fade=t=out:st=17.9:d=1[ovr6];
[0:v][ovr1]overlay=0:0:enable='between(t,0,999)'[base1]; [base1]
[ovr2]overlay=0:0:enable='between(t,0,999)'[base2]; [base2]
[ovr3]overlay=0:0:enable='between(t,0,999)'[base3]; [base3]
[ovr4]overlay=0:0:enable='between(t,0,999)'[base4]; [base4]
[ovr5]overlay=0:0:enable='between(t,0,999)'[base5]; [base5]
[ovr6]overlay=0:0:enable='between(t,0,999)'[out]" -map "[out]" -c:v libx264 -c:a copy -flags +global_header -t 20.760 -shortest -y outputvideo.mp4
再次感谢您的帮助。