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

Ant*_*Ant 6 mp4 png 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
Run Code Online (Sandbox Code Playgroud)

如果我忽略scale=1920:1080该命令,则可以正常工作,但当然,我会得到 426x240 的图像。

llo*_*gan 12

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

ffmpeg -i 240_video.mp4 -vf "fps=20,scale=1920:1080" 240_scaled/out%d.png
Run Code Online (Sandbox Code Playgroud)
  • 如果您的输入超过 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
Run Code Online (Sandbox Code Playgroud)

426x240 放大后保持纵横比实际上是 1920x1082 或 1917x1080,因此添加padcrop进行补偿。或者参考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
Run Code Online (Sandbox Code Playgroud)