28

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

经过大量挖掘后,我似乎使用过滤器库绝对有可能。

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

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

使用-vf我可以将背景应用为叠加层:

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
4

2 回答 2

52

覆盖顺序由ffmpeg 文档中的输入顺序控制

[...] 需要两个输入和一个输出,第一个输入是第二个输入覆盖的“主”视频。

您的第二个命令因此变为:

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.pngover-1.pngover-2.png等。

我们的背景图片(缩放为香蕉):
快乐的小山

使用ffmpeg version 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 功能,可以更轻松地处理多个输入。
-shortest当最短的输入结束时结束编码,这是必要的,因为循环背景意味着该输入永远不会结束。

使用稍微不那么先进的构建,ffmpeg version 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

movie不允许设置速率,因此我们减慢背景速度,从而产生相同的效果。因为叠加的电影不是正确的输入,我们不能使用-shortest而是明确设置要输出的帧数为我们有多少叠加的输入帧。

最终结果(作为嵌入的 gif 输出):
有背景的跳舞香蕉

于 2012-05-08T23:22:33.533 回答
5

for references in the future as of 17/02/2015, the command-line is :

ffmpeg -loop 1 -i images/background.png -i images/video_overlay%04d.png -filter_complex overlay=shortest=1 testvid.mp4

thanks for llogan who took the time to reply here : https://trac.ffmpeg.org/ticket/4315#comment:1

于 2015-02-17T08:38:14.613 回答