参数:
ffmpeg -i in.mp4 -loop 1 -i banner.png -c:a copy -filter_complex "[1:v]fade=in:st=0:d=0.5,fade=out:st=30:d=0.5[watermark]; [0:v][watermark]overlay=(main_w-overlay_w)/2:main_h-overlay_h" out.mp4
输出:
frame= 131 fps=0.0 q=28.0 size= 110kB time=00:00:05.38 bitrate= 167.9kbits/
...
Past duration 0.999992 too large
frame= 3131 fps=258 q=28.0 size= 2112kB time=00:02:05.17 bitrate= 138.2kbits/
frame= 3131 fps=248 q=28.0 size= 2112kB time=00:02:05.17 bitrate= 138.2kbits/
...
然后它无限循环。我用这作为示例并仅修改了覆盖。out.mp4 确实包含预期的结果。
答案1
你漏掉了shortest
。由于你正在处理多个流,所以你需要告知整个过程何时需要完成。
-shortest(输出)
当最短输入流结束时完成编码。
您的水印图像会无限循环-loop
。因此您需要指定何时结束此循环。以下方法适合您。
ffmpeg -i input_video -loop 1 -i input_image -c:a copy -filter_complex "
[1:v]fade=in:st=0:d=0.5,fade=out:st=30:d=0.5[watermark];
[0:v][watermark]overlay=(main_w-overlay_w)/2:main_h-overlay_h:shortest=1" out_video
使用时,filter_complex
您需要使用shortest
滤镜。此外,您可能需要调整图像大小,您可以使用scale
对其进行过滤。
更新
要缩放视频,您可以使用scale
滤镜并将其与您使用的褪色水印链接起来。接下来将把输入视频缩放到 1280x720,您可以找到更多缩放选项这里。
ffmpeg -i input_video -loop 1 -i input_image -c:a copy -filter_complex "
[0:v]scale=1280:720[scaled];
[1:v]fade=in:st=0:d=0.5,fade=out:st=30:d=0.5[watermark];
[scaled][watermark]overlay=(main_w-overlay_w)/2:main_h-overlay_h:shortest=1" out_video
希望这可以帮助!