【问题标题】:Overlay animated images with transparency over a static background image using ffmpeg?使用ffmpeg在静态背景图像上覆盖具有透明度的动画图像?
【发布时间】:2012-05-13 09:37:24
【问题描述】:

我正在寻找使用一组具有与静态背景合并的透明度的 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

【问题讨论】:

  • 我有一个不好的解决方案,但可以。在每张图片之后,将您的背景图片放在两者之间。这将为您提供您想要的最终输出方式
  • 有趣的方法...问题是你是怎么做到的? :)
  • 假设你有n个frame_%d.png,在每一帧之后,每帧添加一个bg...frame1.png和frame2.pn都在,那么frame2.png就是baground_跨度>
  • 我不确定这是否可以在没有具有正确交替顺序的多个背景副本的情况下完成。我的要求是使用图像序列和一个背景文件。

标签: ffmpeg


【解决方案1】:

叠加顺序由输入的顺序控制,来自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

一个完整的工作示例:

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

分解成带有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 输出):

【讨论】:

  • 太棒了!是的,您的第一个建议我已经尝试过,但我收到错误“覆盖区域(...)不在区域内(...)。所以我尝试缩放 bg.png 但我得到“AV 过滤器告诉我们它有一个可用的帧但未能输出“关于您的第二个解决方案,哪个版本的 ffmpeg 有这些选项?我尝试了 10.3,但似乎没有。
  • 我在一些测试中也收到了“输出失败”的消息,这似乎是一个 ffmpeg 错误。 -filter_complex 的版本在最近的 git 版本中。我不知道它存在多长时间或它在哪个时间点发布,但它绝对是最近的。任何使视频过滤器更易于使用的东西绝对是一个受欢迎的补充。
  • 啊哈哈.. 有一秒钟我以为是垃圾邮件!感谢您的帖子和详细信息。它确实适用于最新版本。我也找到了另一种方法的解决方案。看看更新 2。但是,您的方法似乎工作量较小?我将在移动设备上使用它。
  • 避免所有的分割和管道可能会减少工作量,但没有什么可以替代测试多个选项,而不仅仅是猜测哪个效果更好。
  • 'ffmpeg -loop 1 -i bg.png -r 5 -i over-%d.png -filter_complex overlay -shortest out.avi',这会继续循环遍历图像 over-%。 png 并且永不停止。似乎 -shortest 标志没有按预期工作。你能提出解决办法吗?
【解决方案2】:

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

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

感谢洛根花时间在这里回复:https://trac.ffmpeg.org/ticket/4315#comment:1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-25
    • 1970-01-01
    • 2018-10-02
    • 1970-01-01
    • 1970-01-01
    • 2019-08-28
    • 1970-01-01
    • 2015-05-15
    相关资源
    最近更新 更多