使用ffmpeg在静态背景图片上覆盖具有透明度的动画图像?

我正在寻找使用一组透明度与静态背景相结合的png图像来创建视频。

在做了很多挖掘之后,我似乎可以通过使用过滤器库来实现。

我的初始视频制作不包括背景:

ffmpeg -y -qscale 1 -r 1 -b 9600 -loop -i bg.png -i frame_%d.png -s hd720 testvid.mp4

使用-vf我可以将背景应用为overlay:

ffmpeg -y -qscale 1 -r 1 -b 9600 -i frame_%d.png -vf "movie=bg.png [wm];[in][wm] overlay=0:0 [out]" -s hd720 testvid.mp4

但是问题是它覆盖了输入的背景。根据libacfilter我可以分割输入和播放它的内容。我想知道我是否可以改变叠加顺序?

任何帮助非常感谢!

更新1:
我试图使以下过滤器工作,但我得到的电影没有背景:

ffmpeg -y -qscale 1 -r 1 -b 9600 -i frame_%d.png -vf "movie=bg.png [bg]; [in] split [T1], fifo, [bg] overlay=0:0, [T2] overlay=0:0 [out]; [T1] fifo [T2]" -s hd720 testvid.mp4

更新2:
使用-vf选项进行视频制作。只是管道输入狭缝,它应用图像,并覆盖了两个拆分饲料!可能不是最有效的方式…但它的工作!

ffmpeg -y -r 1 -b 9600 -i frame_%d.png -vf "movie=bg.png, scale=1280:720:0:0 [bg]; [in] format=rgb32, split [T1], fifo, [bg] overlay=0:0, [T2] overlay=0:0 [out]; [T1] fifo [T2]" -s hd720 testvid.mp4
最佳答案
覆盖顺序由输入的顺序控制,从the ffmpeg docs开始

[…] takes two inputs and one output, the first input is the “main” video on which the second input is overlayed.

你的第二个命令就成为:

ffmpeg -y -loop 1 -qscale 1 -r 1 -b 9600 -i frame_%d.png -vf "movie=bg.png [wm];[wm][in] overlay=0:0" -s hd720 testvid.mp4

使用最新版本的ffmpeg,新的-filter_complex命令使相同的进程更简单:

ffmpeg -loop 1 -i bg.png -i frame_%d.png -filter_complex overlay -shortest testvid.mp4

一个完整的工作实例:

我们透明输入图像的来源(为跳舞道歉):

分解为ImageMagick

convert dancingbanana.gif -define png:color-type=6 over.png

(设置png:color-type = 6(RGB-Matte)是至关重要的,因为ffmpeg不会正确处理索引的透明度)输入命名为over-0.png,超过1.png,超过2.png等。

我们的背景图像(缩放到香蕉):

使用ffmpeg版本N-40511-g66337bf(一个git build从昨天),我们做:

ffmpeg -loop 1 -i bg.png -r 5 -i over-%d.png -filter_complex overlay -shortest out.avi

-loop循环背景图像输入,这样我们不仅仅有一个框架,至关重要!
-r减慢了跳舞的香蕉一点,可选。
-filter_complex是一个最近添加的ffmpeg功能,可以更轻松地处理多个输入。
当最短输入结束时,最短端编码,这是循环背景所必需的,意味着输入永远不会结束。

使用稍微不那么先进的构建,ffmpeg版本0.10.2.git-d3d5e84:

ffmpeg -loop 1 -r 5 -i back.png -vf 'movie=over-%d.png [over], [in][over] overlay' -frames:v 8 out.avi

电影不允许速率设置,所以我们减慢背景而不是相同的效果。因为重叠的电影不是正确的输入,所以我们不能使用-shortest,而是明确地将要输出的帧数显示给我们拥有多少叠加的输入框。

最终结果(作为嵌入的gif输出):

转载注明原文:使用ffmpeg在静态背景图片上覆盖具有透明度的动画图像? - 代码日志