使用 ffmpeg 仅使用特定帧创建无限循环动画

Create endless loop animation using ffmpeg using only certain frames

我可以使用以下命令创建动画 gif。

ffmpeg -i wrist_0001.png -vf palettegen=16 palette.png

ffmpeg -i wrist_%04d.png -i palette.png -filter_complex "fps=20,scale=720:-1:flags=lanczos[x];[x][1:v]paletteuse" logo.gif

我想知道如何做的是:

  1. 仅使用前 20 帧创建另一个动画 gif 并且动画无限循环(动画结束时没有暂停)
  2. 仅使用前 20 帧创建另一个动画 gif,其中 动画播放然后在结束时暂停 3 秒然后继续。 (无休止)例子:(播放动画-暂停3秒-播放动画-暂停3秒-播放动画-暂停3秒...)

注意:我正在努力避免必须输入 wrist_0001.png wrist_0002.png...是否可以从 wrist_0001.png 到 wrist_0020.png?

  1. 仅使用前 20 帧创建另一个动画 gif,动画无限循环(动画结束时不暂停):

    ffmpeg -framerate 20 -i wrist_%04d.png -filter_complex "scale=720:-1:flags=lanczos,split[s0][s1];[s0]palettegen=max_colors=16[p];[s1][p]paletteuse" -frames:v 20 -loop 0 20framesloop.gif
    
    • 当使用一组图像作为输入时,使用 -framerate image demuxer 输入选项设置帧速率。您的原始命令默认为 25 fps,然后使用 fps 过滤器转换为 20 fps,这意味着正在丢弃帧。

    • -loop 0 是 GIF 混合器的默认设置,但我添加它是为了展示如果您想更改循环时它是如何工作的。 0表示无限循环。

    • 这个例子在一个命令中制作 GIF,如 How do I convert a video to GIF using ffmpeg, with reasonable quality?

  2. 仅使用动画播放的前 20 帧创建另一个动画 gif,然后在结束时暂停 3 秒然后继续。 (没完没了)

    最有效的方法是重新合成上一步的 GIF:

    ffmpeg -i 20framesloop.gif -c copy -final_delay 300 -loop 0 3secpause.gif
    

    -final_delay 300 取以厘秒为单位的值,因此 3 秒为 300 厘秒。有关详细信息,请参阅 ffmpeg -h muxer=gif