首页 > 解决方案 > FFmpeg 的 GIF 叠加层闪烁

问题描述

在过去的几个月里,我一直在使用 ffmpeg,并且无法摆脱在添加 GIF 文件作为覆盖时遇到的问题。

基本上我想要实现的是在 MP4 视频的顶部添加一个透明的 GIF 动画作为覆盖。

请在下面找到我正在使用的示例命令:

ffmpeg \
  -i 0689a8a9-43b5-45d2-b0e8-acbea6905ce1.mp4 \
  -ignore_loop 0 \
  -i 02a6e696-969b-4a90-9444-e4b0b4d6f6da.gif \
  -t 10.000000 \
  -filter_complex "[0:v][1:v]overlay=enable='between(t, 1, 3)'[overlay]" \
  -map '[overlay]' \
  -pix_fmt yuv420p \
  output.mp4

为了更好地理解,请注意:

但是,当我运行此命令时,在 GIF 消失前几毫秒(3 秒),它开始闪烁。如果我逐帧查看它,它实际上会从视频中消失,然后又回来,最终如预期般消失。

请在此链接中找到一个黑色背景和来自 giphy 的随机 GIF 的示例。资产可以在这里找到。

我可能在这里遗漏了一些东西。你有什么提示吗?

我跑ffmpeg进去了4.3.1

先感谢您

标签: ffmpeggif

解决方案


我可以用任意 gif 复制它。我怀疑覆盖过滤器中存在错误。随时将其提交给https://trac.ffmpeg.org

一旦设置了时间过滤(过滤器被列为具有时间线支持),就会发生这种情况,并且还会根据时间边界发生变化。后者永远不应该是这样。

MWE

ffmpeg \
  -t 10 -s qcif -f rawvideo -pix_fmt rgb24 -r 25 -i /dev/zero \
  -ignore_loop 0 -i 'https://media.tenor.com/images/c50ca435dffdb837914e7cb32c1e7edf/tenor.gif' \
  -filter_complex "overlay=enable='between(t,3,7)'" \
  -f flv - | ffplay -

作为一种解决方法,您可以尝试将 gif 转换为 mp4 ( ffmpeg -re -i <gif> [...]) 并将白色区域设置为透明。


推荐阅读