使用ffmpeg在静态背景图像上覆盖具有透明度的动画图像? [英] Overlay animated images with transparency over a static background image using 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 -vfmovie = bg.png [wm]; [in ] [wm] overlay = 0:0 [out]-s hd720 testvid.mp4
但是问题是它覆盖了输入的背景。根据:
convert dancingbanana.gif -define png:color-type = 6 over.png
(设置 png:color-type = 6
(RGB- Matte)是至关重要的,因为ffmpeg不能正确处理索引的透明度。)输入命名为 over-0.png
, over-1.png
,
超过2.png
等。
我们的背景图片(缩放到香蕉) :
使用 ffmpeg版本N-40511-g66337bf
(a
-loop
循环背景图像输入,以便我们不仅仅有一个框架,至关重要!
-r
减慢跳舞的香蕉一点,可选。
-filter_complex
是一个最近添加的ffmpeg功能处理多个输入更容易。
-shortest
在最短输入结束时结束编码,这是循环背景所必需的,意味着该输入永远不会结束
使用稍微较少的前沿版本, 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输出):
I'm looking to create a video using a set of png images that have transparency merged with a static background.
After doing a lot of digging I seems like it's definitely possible by using the filters library.
My initial video making without including the background is:
ffmpeg -y -qscale 1 -r 1 -b 9600 -loop -i bg.png -i frame_%d.png -s hd720 testvid.mp4
Using -vf
I can apply the background as 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
However the problem is it's overlaying the background over the input. According libacfilter I can split the input and play with it's content. I'm wondering if I can somehow change the overlay order?
Any help greatly appreciated!
UPDATE 1:
I'm trying to make the following filter work but I'm getting the movie without the background:
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
UPDATE 2:
Got video making using -vf option. Just piped the input slit it applied image over it and overlayed the two split feeds! Probably not the most efficient way... but it worked!
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 overlay order is controlled by the order of the inputs, from the ffmpeg docs
[...] takes two inputs and one output, the first input is the "main" video on which the second input is overlayed.
You second command thus becomes:
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
With the latest versions of ffmpeg the new -filter_complex
command makes the same process even simpler:
ffmpeg -loop 1 -i bg.png -i frame_%d.png -filter_complex overlay -shortest testvid.mp4
A complete working example:
The source of our transparent input images (apologies for dancing):
Exploded to frames with ImageMagick:
convert dancingbanana.gif -define png:color-type=6 over.png
(Setting png:color-type=6
(RGB-Matte) is crucial because ffmpeg doesn't handle indexed transparency correctly.) Inputs are named over-0.png
, over-1.png
, over-2.png
, etc.
Our background image (scaled to banana):
Using ffmpeg version N-40511-g66337bf
(a git build from yesterday), we do:
ffmpeg -loop 1 -i bg.png -r 5 -i over-%d.png -filter_complex overlay -shortest out.avi
-loop
loops the background image input so that we don't just have one frame, crucial!
-r
slows down the dancing banana a bit, optional.
-filter_complex
is a very recently added ffmpeg feature making handling of multiple inputs easier.
-shortest
ends encoding when the shortest input ends, which is necessary as looping the background means that that input will never end.
Using a slightly less cutting-edge build, 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
doesn't allow rate setting, so we slow down the background instead which gives the same effect. Because the overlaid movie isn't a proper input, we can't use -shortest
and instead explicitly set the number of frames to output to how many overlaid input frames we have.
The final result (output as a gif for embedding):
这篇关于使用ffmpeg在静态背景图像上覆盖具有透明度的动画图像?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!