【问题标题】:GIF overlays blink with ffmpegFFmpeg 的 GIF 叠加层闪烁
【发布时间】:2021-02-21 10:55:27
【问题描述】:

在过去的几个月里,我一直在使用 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

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

  • -ignore_loop 0 允许我循环播放动画,只要启用了叠加层
  • -t 让我的视频持续 10 秒
  • overlay=enable='between(t, 1.0, 3.0)' 设置可见的时间间隔

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

请从 giphy at this link 中找到一个黑色背景和随机 GIF 的示例。资产可以在here找到。

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

我在4.3.1 中运行ffmpeg

提前谢谢你

【问题讨论】:

  • 无法用单个 GIF 复制问题。提供您的输入。建议简化命令,直到得到仍然存在问题的最简单命令。
  • 感谢您的回答。没错,我将命令简化到最低限度,替换了视频并上传了资产。
  • 可能是一个错误。
  • 您好,感谢您的回答。您是否能够重现您身边的错误?
  • 是的,但我没有尝试找到解决方案。

标签: ffmpeg gif


【解决方案1】:

我可以用任意 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> [...]) 并将白色区域设置为透明。

【讨论】:

    【解决方案2】:

    在官方 FFmpeg 社区中,有一张票,但尚未修复: https://trac.ffmpeg.org/ticket/4803

    票证提到在指定的启用时间之前正在显示 GIF。在我的测试中,给定 60 fps 视频,10.42 fps GIF(需要从 510 s 显示)闪烁一次 5 帧之前所需时间(在4.933 s) 并在5 s 再次可见。应该是连接到与视频的 fps 不匹配的 GIF 的 fps。

    无论如何,我找到了最优雅的解决方法,它一次性解决了问题,并且不需要将 GIF 转换为临时 MP4(因为在某些情况下可能不希望这样做)。因此,给定视频 fps,要在从 510 的某个位置(x=10, y=20)覆盖 GIF 而不闪烁,我们应该使用以下命令:

    ffmpeg -y -i "video.mp4" -ignore_loop 0 -i "giphy.gif" \
    -filter_complex "[1:v]fps=60[gif];[0:v][gif]overlay=x=10:y=20:enable='between(t,5,10)'" \
    -c:a copy -shortest "overlay.mp4"
    

    我们可以更进一步,提出一个命令行,它不需要事先了解视频 fps(但您应该知道输出视频 fps,在这种情况下为 60 fps):

    ffmpeg -y -i "video.mp4" -ignore_loop 0 -i "giphy.gif" \ 
    -filter_complex "[0:v]fps=60[video];[1:v]fps=60[gif];[video][gif]overlay=x=10:y=20:enable='between(t,5,10)'" \
    -acodec copy -shortest "overlay.mp4"
    

    【讨论】:

      猜你喜欢
      • 2019-11-30
      • 1970-01-01
      • 2015-10-28
      • 1970-01-01
      • 2013-07-02
      • 1970-01-01
      • 2013-09-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多