将视频的FPS改为1FPS,如何保证至少1帧?

将视频的FPS改为1FPS,如何保证至少1帧?

我一直ffmpeg使用以下命令将视频转换为 1 FPS:

ffmpeg -i Example1.gif -c:v libaom-av1 -filter:v "fps=1" test1.webm

但是对于非常短的视频,例如时长 0.2 秒且只有两帧的 gif,这没有输出。有没有办法强制 ffmpeg 选择至少一帧?谢谢

答案1

该问题似乎与fps过滤器的默认舍入方法有关。

执行ffmpeg -h filter=fps显示默认舍入方法是“近似”。
这意味着当 fps=1 时,时间戳 < 0.5 秒的帧将舍入为零。

我对此不太确定,但我认为当 fps=1 时,要编码的第一帧是时间戳 >= 0.5 秒的帧(fps过滤器正在寻找帧持续时间的中心)。
这意味着当使用时fps=1,持续时间少于 0.5 秒的剪辑将为空。

我们可以通过设置来修复这个问题round=up

ffmpeg -y -i Example1.gif -c:v libaom-av1 -filter:v "fps=1:round=up" test1.webm

其他选项是使用-r 1而不是使用fps过滤器:

ffmpeg -y -i Example1.gif -c:v libaom-av1 -r 1 test1.webm


上述解决方案的缺点是,第一个输出帧将是第一个输入帧,而不是第一秒的中心。
我们可以考虑实现一个简短的脚本,在执行 FFmpeg 之前检查输入持续时间,并据此选择参数。


为了测试,我们可以生成持续时间为 0.4 秒的 GIF,如下所示:

ffmpeg -y -f lavfi -r 10 -i testsrc=size=192x108:rate=1:duration=4 -filter_complex "[0:v]setpts=N/10/TB,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" Example1.gif

答案2

这是这篇文章的主题 ffmpeg-python 尝试保存为 mp4 时输出黑屏

llogan 的回答是:

你的播放器不支持 1 fps

许多玩家都有类似的行为。

您仍然可以为输入提供较低的帧速率,但为输出提供更正常的帧速率。ffmpeg只会复制帧。输出视频看起来不会与原始命令不同,但它会播放。

ffmpeg -framerate 1 -i "pics2/Image%02d.png" -r 10 -vcodec libx264 -s 1280x720 -pix_fmt yuv420p Output.mp4

相关内容