如何用FFmpeg将视频转成1FPS时确保至少输出一帧?
如何用FFmpeg将视频转成1FPS时确保至少输出一帧?
哈哈,这个问题我之前处理短GIF转码的时候也碰到过!核心原因是你用的fps=1滤镜是严格按照“每秒取一帧”的逻辑来的——比如0.2秒的视频,它会尝试去取第1秒位置的帧,但视频早就结束了,自然就没有输出了。
给你两个实用的解决办法,单条FFmpeg命令就能搞定:
方法一:调整fps滤镜的取帧规则
fps滤镜自带一个round参数,默认是near(找最接近目标时间点的帧),如果目标时间点超出视频时长就会跳过。我们可以把它改成down,这样会取小于等于目标时间点的最后一帧,对于短视频来说,就能稳稳取到第一帧了:
ffmpeg -i Example1.gif -c:v libaom-av1 -filter:v "fps=1:round=down" test1.webm
方法二:用select滤镜强制保底选帧
如果第一种方法偶尔还是有适配问题,试试用select滤镜自定义选帧逻辑——不管视频多长,先确保选中第一帧,再按1FPS的规则选其他帧:
ffmpeg -i Example1.gif -c:v libaom-av1 -filter:v "select='eq(n,0)+gt(t,0)*floor(t)',setpts=N/FRAME_RATE/TB" test1.webm
这里的select表达式意思是:要么选第0帧(视频第一帧),要么选时间戳为整数秒的帧(符合1FPS的要求);后面的setpts是用来修正输出帧的时间戳,避免播放时出现跳帧或卡顿。
你可以先试试第一种方法,简单直接,大部分短视频转码场景都能用~
备注:内容来源于stack exchange,提问作者Clash




