ffmpeg - 添加水印时无限循环

ffmpeg - 添加水印时无限循环

参数:

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

希望这可以帮助!

相关内容