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

Jon*_*ona 25 ffmpeg

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

经过大量的挖掘后,我觉得通过使用过滤器库肯定是可行的.

我最初的视频制作没有包括背景:

ffmpeg -y -qscale 1 -r 1 -b 9600 -loop -i bg.png -i frame_%d.png -s hd720 testvid.mp4
Run Code Online (Sandbox Code Playgroud)

使用-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
Run Code Online (Sandbox Code Playgroud)

然而问题是它在输入上覆盖了背景.根据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
Run Code Online (Sandbox Code Playgroud)

更新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
Run Code Online (Sandbox Code Playgroud)

bla*_*lah 48

叠加顺序由输入顺序控制,来自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
Run Code Online (Sandbox Code Playgroud)

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

ffmpeg -loop 1 -i bg.png -i frame_%d.png -filter_complex overlay -shortest testvid.mp4
Run Code Online (Sandbox Code Playgroud)

一个完整的工作示例:

透明输入图像的来源(舞蹈道歉):
跳香蕉
使用ImageMagick分解为框架:

convert dancingbanana.gif -define png:color-type=6 over.png
Run Code Online (Sandbox Code Playgroud)

(设定png:color-type=6(RGB-哑光)是至关重要的,因为ffmpeg的不正确处理索引透明度.)输入端被命名over-0.png,over-1.png,over-2.png,等.

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

使用ffmpeg version N-40511-g66337bf(昨天的git构建),我们做到:

ffmpeg -loop 1 -i bg.png -r 5 -i over-%d.png -filter_complex overlay -shortest out.avi
Run Code Online (Sandbox Code Playgroud)

-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
Run Code Online (Sandbox Code Playgroud)

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

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


gab*_*uff 5

对于2015年2月17日的未来参考,命令行是:

ffmpeg -loop 1 -i images/background.png -i images/video_overlay%04d.png -filter_complex overlay=shortest=1 testvid.mp4
Run Code Online (Sandbox Code Playgroud)

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