ffmpeg在视频上叠加透明的gif动画,并保持gif背景的透明度

时间:2019-04-06 21:34:45

标签: ffmpeg transparency overlap animated-gif

我正在尝试将动画gif重叠在视频上,但没有成功。

我的目标是下一个:

  1. gif动画必须循环播放,直到视频结束。
  2. gif已缩放,因此覆盖了整个视频。
  3. gif保持透明度。

我在这方面所获得的最大成就是,gif使用比例过滤器覆盖了整个视频,并且它一直循环播放直到视频结束为止(我想这不是最好的方式)。

关于循环,我知道我可以使用-ignore_loop 0 gif过滤参数,且最短= 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

2 个答案:

答案 0 :(得分:1)

好的,我会回答我自己的问题。第一部分,无法实现gif透明度,这是一个愚蠢的问题!我使用的gif不透明,我没意识到!我想,天哪,所以这是每当有透明度问题时都要检查的第一件事。

第二个,循环播放gif直到视频结束,我无法使用-ignore_loop 0和shortest = 1来做到这一点,但是我所做的是 -ignore_loop 0 -frames:v 900 ,它就像一个魅力。

不起作用的不是-ignore_loop 0,而是最短的= 1,因此ffm​​peg永远不会结束编码,但是如果将其设置为以一定数量的帧结束,就可以解决问题。

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

答案 1 :(得分:0)

您好,如果有人想向视频添加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()
    };