首页 > 解决方案 > 如何使用 ffmpeg 缩放图像并指定每秒所需的帧数?

问题描述

我正在使用 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 的图像。

标签: ffmpegpngmp4

解决方案


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

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 过滤器,因为在这种情况下,假设您的输入帧速率高于 20 fps,它会比首先缩放更有效和更快,因为帧将在缩放过滤器之前被丢弃。

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

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

426x240 放大,同时保持纵横比实际上是 1920x1082 或 1917x1080,所以添加填充裁剪来补偿。或参考force_original_aspect_ratio比例选项。添加了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

推荐阅读