FFMPEG 在另一层上擦除过渡层

FFMPEG Wipe transition one layer over another

如何使用 FFMPEG 通过擦除过渡在另一层之上显示一层?

注意:这不是幻灯片切换。顶部图像保持在一个位置,但会随着时间的推移逐渐显示出来。

我想要一种技术,它可以适用于具有或不具有透明度的顶层以及图像、视频或动态创建的源,例如 showwavespic

我试过像这样制作遮罩动画:

但是 alphamerge 没有像我预期的那样工作,我找不到适用于这种类型面具的 blend 模式。

编辑:建议使用 xfade 过滤器,但它似乎不适用于源具有透明度的情况。它使透明区域变黑。透明源示例:

但是 xfade 呈现这个:

ffmpeg -loop 1 -t 5 -i flower.jpg -t 5 -loop 1 -i gear.png -filter_complex "[0]format=rgb24,drawbox=thickness=fill,split[black][black2];[black2]negate[white];[black][white]xfade=transition=wiperight:duration=1:offset=0[alf];[0][1]overlay=format=auto[ovr];[ovr][alf]alphamerge[fg];[0][fg]overlay=format=auto,format=yuv420p" output.mp4
  1. format 过滤器将允许 drawbox 变成真正的黑色。否则它可能会像示例 GIF 中那样生成一个半透明的覆盖层,您几乎看不到齿轮(我最初制作它时没有注意到)。例如,如果您想要 YUV 而不是 RGB,请使用 yuv444p 而不是 rgb24.

  2. drawbox 用黑色覆盖 flower.jpg。或者,您可以使用 color(以及可选的 scale2ref)过滤器。这是一种使黑色图像与输入大小相同的惰性方法。

  3. split 滤镜复制黑色图像,negate 滤镜复制白色图像。

  4. xfade 从黑白图像制作动画 alpha 蒙版。

  5. alphamerge 将 alpha 掩码添加到 overlay.

    的输出中
  6. 生成的带有 alpha 的叠加层覆盖在 flower.jpg 上。

另见