我有一个程序可以从视频生成 10 帧 GIF 幻灯片,无论视频长度如何,幻灯片帧始终为 0.5 秒长。*
它的工作原理是首先获取视频的时长,然后运行以下代码片段,该代码片段通过 imagemagick 和 gifsicle 传输 ffmpeg 的输出:
ffmpeg -i video.webm -filter:v "fps=1/#{duration / 10.0}" -frames:v 10 -f image2pipe -vcodec ppm - | convert -delay 50 -loop 0 -gif:- | gifsicle -O2 > preview.gif
我想转换此代码片段以使用单个 ffmpeg 命令。
首先,进行基本的健全性检查。input.webm
持续时间 = 100 秒:
ffmpeg -y -i input.webm -vf "fps=1/10"
正如预期的那样,这有效。它创建了具有正确帧数但错误帧时序的输出。
我预计获得恒定 2 FPS 的解决方案是简单地使用 -r 选项来设置输出 FPS:
ffmpeg -i input.webm -vf "fps=1/10" -r 2 preview.gif
这不起作用。它生成了一个与之前具有相同帧时间的文件。
考虑到具有此恒定帧速率设置的视频的时间基准可以是 0.5 秒,而 PTS 可以是帧号,所以我也尝试过这样做:
ffmpeg -i input.webm -vf "fps=1/10,settb=1/2,setpts=N" preview.gif
但这也不起作用。ffmpeg
删除了除 3 帧以外的所有帧,并且它们仍然显示了 10 秒,而不是半秒。
我在这里做错了什么?
* 如果输入视频少于 10 帧,则将生成少于 10 帧的输出 GIF。但是,帧时间将相同。
答案1
使用 settb 和 setpts 时还需要设置 -r 选项:
ffmpeg -y -i input.webm -vf "fps=1/10,settb=1/2,setpts=N" -r 2 preview.gif