Die*_*rez 1 transparency ffmpeg animated-gif overlap
我试图在视频上重叠动画 gif,但没有成功。
我的目标是:
我在这方面取得的最大成就是 gif 用缩放过滤器覆盖了整个视频,并且循环播放直到视频结束(但我猜这不是最好的方式)。
关于循环,我知道我可以在叠加中使用 -ignore_loop 0 gif 过滤器参数和 shortest=1 但这样它不起作用所以我最终得到了 -frames:v 900(我的视频是 30fps 和 30sec 长所以 900 是帧)。
我最重要的问题是我无法保持 gif 的透明度,我尝试过的一切都没有成功。
这是我的带参数的 ffmpeg 命令,所以我希望任何人都可以提供帮助(我使用的是 ffmpeg 4.1)。
ffmpeg -y
-i videoin.mp4
-i anim01.gif
-filter_complex [1:v]scale=1080:1920[ovrl] [0:v][ovrl]overlay=main_w-overlay_w:main_h-overlay_h
-frames:v 900
-codec:a copy
-codec:v libx264
-preset ultrafast
video.mp4
Run Code Online (Sandbox Code Playgroud)
好的,我会回答我自己的问题。第一部分,无法实现gif透明,好傻的问题!!我使用的 gif 不透明,我没有意识到!!天哪,我想,所以当你遇到透明度问题时,这是首先要检查的。
第二个,循环 gif 直到视频结束,我无法使用 -ignore_loop 0 和 shortest=1 来完成,但我所做的是-ignore_loop 0和-frames:v 900并且效果很好。
不起作用的不是 -ignore_loop 0 而是 shortest=1 ,因此 ffmpeg 永远不会结束编码,但是如果您将其设置为在解决问题的特定帧数时完成。
900 来自 30fps x 30 秒视频。
最后,我完整的 ffmpeg 命令行参数结果如下:
ffmpeg -y -i xxx.mp4 -ignore_loop 0 -i xxx.gif -filter_complex "[1:v]scale=1080:1920[ovrl];[0:v][ovrl]overlay=0:0" -frames:v 900 -codec:a copy -codec:v libx264 -max_muxing_queue_size 2048 video.mp4
Run Code Online (Sandbox Code Playgroud)