ffmpeg 在视频上覆盖透明动画 gif 并保持 gif 背景透明度
ffmpeg overlay transparent animated gif over video and keep gif background transparency
我正在尝试将动画 gif 重叠在视频上,但没有成功。
我的下一个目标是:
- gif 动画必须循环播放直到视频结束。
- gif 已缩放以覆盖整个视频。
- gif 保留透明度。
我在这方面取得的最大成就是 gif 使用缩放过滤器覆盖了整个视频,并且循环播放直到视频结束(但我想这不是最好的方式)。
关于循环,我知道我可以在叠加层中使用最短=1 的 -ignore_loop 0 gif 过滤器参数,但这种方式不起作用,所以我最终得到了 -frames:v 900(我的视频是 30fps 和30 秒长,所以 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
好的,我会回答我自己的问题。第一部分,无法实现 gif 透明,真是个愚蠢的问题!!我使用的 gif 不是透明的,我没有意识到!!天哪,我想,所以这是当你遇到透明度问题时首先要检查的事情。
第二个,循环 gif 直到视频结束,我无法使用 -ignore_loop 0 和 shortest=1 但我做的是 -ignore_loop 0 和 -frames:v 900 效果很好。
不起作用的不是 -ignore_loop 0,而是最短的=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
大家好,如果有人想将 gif 添加到视频中,请使用此命令。相信你会得到正确的答案
String strFilter = "[1:v]scale=h=-1:w=100[overlay_scaled],"
+ "[0:v][overlay_scaled]overlay=shortest=1:x=W*0:y=H*0";
String[] complexCommand = new String[] {
"-i",
yourRealPath,
"-itsoffset",
String.valueOf(0),
"-ignore_loop", "0", "-i",
fullPath,
"-filter_complex",
strFilter,
"-frames:v", "900", "-preset",
"ultrafast",
"-g",
"120",
dest.getAbsolutePath()
};
我正在尝试将动画 gif 重叠在视频上,但没有成功。
我的下一个目标是:
- gif 动画必须循环播放直到视频结束。
- gif 已缩放以覆盖整个视频。
- gif 保留透明度。
我在这方面取得的最大成就是 gif 使用缩放过滤器覆盖了整个视频,并且循环播放直到视频结束(但我想这不是最好的方式)。
关于循环,我知道我可以在叠加层中使用最短=1 的 -ignore_loop 0 gif 过滤器参数,但这种方式不起作用,所以我最终得到了 -frames:v 900(我的视频是 30fps 和30 秒长,所以 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
好的,我会回答我自己的问题。第一部分,无法实现 gif 透明,真是个愚蠢的问题!!我使用的 gif 不是透明的,我没有意识到!!天哪,我想,所以这是当你遇到透明度问题时首先要检查的事情。
第二个,循环 gif 直到视频结束,我无法使用 -ignore_loop 0 和 shortest=1 但我做的是 -ignore_loop 0 和 -frames:v 900 效果很好。
不起作用的不是 -ignore_loop 0,而是最短的=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
大家好,如果有人想将 gif 添加到视频中,请使用此命令。相信你会得到正确的答案
String strFilter = "[1:v]scale=h=-1:w=100[overlay_scaled],"
+ "[0:v][overlay_scaled]overlay=shortest=1:x=W*0:y=H*0";
String[] complexCommand = new String[] {
"-i",
yourRealPath,
"-itsoffset",
String.valueOf(0),
"-ignore_loop", "0", "-i",
fullPath,
"-filter_complex",
strFilter,
"-frames:v", "900", "-preset",
"ultrafast",
"-g",
"120",
dest.getAbsolutePath()
};