使用ffmpeg覆盖静态背景图像上的透明动画图像?

时间:2012-05-03 20:17:02

标签: ffmpeg

我正在寻找使用一组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

然而问题是它在输入上覆盖了背景。根据{{​​3}}我可以分割输入并播放它的内容。我想知道我是否能以某种方式改变叠加顺序?

任何帮助都非常感谢!

更新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

2 个答案:

答案 0 :(得分:48)

叠加顺序由来自the ffmpeg docs

的输入顺序控制
  

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

你的第二个命令因此变成:

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

一个完整的工作示例:

透明输入图像的来源(舞蹈道歉):
Dancing banana
已展开为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

我们的背景图片(缩放为香蕉):
Happy little mountain

使用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):
Dancing banana with background

答案 1 :(得分:5)

对于将来自2015年2月17日的参考文献,命令行为:

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

感谢那些花时间在这里回复的llogan:https://trac.ffmpeg.org/ticket/4315#comment:1