如何使用 ffmpeg 缩放图像并指定每秒所需的帧数?

How to use ffmpeg to scale image AND to specify desired frames per second?

我正在使用 ffmpeg 将帧从 mp4 转换为 png 图像。
我想要每秒 20 帧,我还希望将图像放大到 1920x1080。原始 mp4 是 240p (426x240)。

它允许我在 -vf 标志后指定 20 fps,但不允许我缩放图像。

ffmpeg -i 240_video.mp4 -vf scale=1920:1080 fps=20 240_scaled/out%d.png

如果我省略 scale=1920:1080 命令有效,但当然,我得到 426x240 图像。

您可以将线性过滤器与逗号链接在一起:

ffmpeg -i 240_video.mp4 -vf "fps=20,scale=1920:1080" 240_scaled/out%d.png
  • 如果您的输入超过 20 fps,则 ffmpeg 将丢帧以转换为 20 fps。如果您的输入低于 20 fps,则 ffmpeg 将复制帧以转换为 20 fps。如果您想要所有帧,请忽略 fps 过滤器。
  • 我用的是fps filter first because in this case, assuming your input frame rate is higher than 20 fps, it will be slightly more efficient and faster than scaling first because frames will be dropped before the scale filter.

很多玩家不喜欢输出,因为它不会是4:2:0,所以你可以添加format过滤器:

ffmpeg -i 240_video.mp4 -vf "fps=20,scale=1920:1080,format=yuv420p" 240_scaled/out%d.png

426x240 放大,同时保持纵横比实际上是 1920x1082 或 1917x1080,所以添加 pad or crop to compensate. Or refer to the force_original_aspect_ratio option in scale. setsar 这样你就不会得到奇怪的 SAR。 -movflags +faststart 添加以防您进行渐进式播放。

ffmpeg -i 240_video.mp4 -vf "fps=20,scale=1920:-1,crop=1920:1080,setsar=1,format=yuv420p" -movflags +faststart 240_scaled/out%d.png