如何使用 FFmpeg 调整视频大小

如何使用 FFmpeg 调整视频大小

如何使用 FFmpeg 调整视频大小使其变小?(例如从 1024x576 到 720x480。)

答案1

最基本的例子是这样的:

ffmpeg -i input.avi -s 720x480 -c:a copy output.mkv

使用过滤scale将提供更多的灵活性:

ffmpeg -i input.avi -filter:v scale=720:-1 -c:a copy output.mkv

-1告诉 ffmpeg 根据提供的宽度自动选择正确的高度以保持纵横比。-1如果您提供了给定的高度,也可以用于宽度。


使用时 scale 的一个缺点libx264是,此编码器需要偶数值,而 scale 可能会自动选择奇数值,从而导致错误:width or height not divisible by 2。您可以告诉 scale 为给定的高度选择偶数值(此示例中为 720):

scale="trunc(oh*a/2)*2:720"

...或给定的宽度(此示例中为 1280):

scale="1280:trunc(ow/a/2)*2"

请注意,您的 ffmpeg 版本可能会抱怨无法识别-c-filter选项。它也可能不支持scale。在这种情况下,您应该使用较新的 ffmpeg,您可以可以下载作为静态构建,或者自己编译

答案2

我使用以下命令对视频和图像进行重新缩放。对于固定宽度和高度 -

ffmpeg -i input.avi -vf scale="720:480" output.avi

如果你想保留纵横比,只需将高度设为 -1,它就会根据宽度自动调整大小 -

ffmpeg -i input.avi -vf scale="720:-1" output.avi

如果您想根据输入大小进行缩放,例如将宽度/高度减少一半,您可以这样做 -

ffmpeg -i input.avi -vf scale="iw/2:ih/2" output.avi

笔记 :

iw : input width
ih : input height

静态构建可以从以下网址下载 -https://johnvansickle.com/ffmpeg/

文档:https://ffmpeg.org/ffmpeg.html#filter_005foption

答案3

使用您的图形处理器而不是 CPU:

ffmpeg -hwaccel cuda -hwaccel_output_format cuda -i "input_file.mp4"
-c:a copy -vf "scale_cuda=-2:480" -c:v h264_nvenc "output_file.mp4"

您需要一张支持 CUDA 硬件加速的 NVIDIA 显卡。

这对我有用(2024 年 2 月),在 Windows 10 Pro 上使用 FFmpeg v6.0-essentials(来自 gyan.dev)和 NVIDIA GeForce GTX 960。


细节:

  1. 来自NVIDIA FFmpeg 转码指南
  • -hwaccel cuda 选择合适的硬件加速器
  • -hwaccel_output_format cuda 将解码后的帧保存在 GPU 内存中
  • -c:v h264_nvenc 选择 NVIDIA 硬件加速 H.264 编码器

如果没有此-hwaccel cuda -hwaccel_output_format cuda选项,解码后的原始帧将通过 PCIe 总线复制回系统内存,如图 3 所示。稍后,同一图像将通过 PCIe 复制回 GPU 内存,以便在 GPU 上进行编码。这两次额外的传输会因传输时间而产生延迟,并会增加 PCIe 带宽占用。

也可以看看:

  1. -vf "scale_cuda=-2:480"缩放至 480px 高度,宽度经过计算以保持纵横比。2确保-2宽度可被 2 整除 - 请参阅FFmpeg 的缩放选项

width, w

height, h

设置输出视频尺寸表达式。默认值为输入尺寸。

如果宽度或 w 值为 0,则将输入宽度用于输出。如果高度或 h 值为 0,则将输入高度用于输出。

如果只有一个值为 -n 且 n >= 1,则缩放过滤器将使用一个值来保持输入图像的纵横比,该值是根据另一个指定维度计算得出的。但此后,它将确保计算出的维度可以被 n 整除,并在必要时调整该值。

如果两个值都是 -n,且 n >= 1,则行为将与前面详述的两个值都设置为 0 相同。

  1. ⚠️ GPU 不支持某些格式或滤镜,因此您可能需要同时使用 GPU 和 CPU。请参阅“混合使用 CPU 和 GPU 处理”NVIDIA FFmpeg 转码指南

有时可能需要混合使用 CPU 和 GPU 处理。例如,您可能需要在 CPU 上解码,因为 GPU 解码器不支持该格式,或者因为 GPU 上没有可用的过滤器。在这些情况下,您不能使用或标志-hwaccel cuvid-hwaccel cuda相反,您需要使用过滤器管理将数据从系统上传到 GPU 内存hwupload_cuda

在下面的示例中,由于-hwaccel cuvid未设置,H.264 流在 GPU 上解码并下载到系统内存。淡入淡出滤镜应用于系统内存,处理后的图像使用该hwupload_cuda滤镜上传到 GPU 内存。最后,使用 GPU 缩放图像scale_npp并在 GPU 上编码。

ffmpeg -vsync 0 -c:v h264_cuvid -i input.264 -vf "fade,hwupload_cuda,scale_npp=1280:720" -c:v h264_nvenc output.264

了解有关scale_nppvs 的更多信息scale_cuda


致谢:这个帖子这个, 和这个为我指明了正确的方向,让我找出使用 CUDA 进行硬件加速的正确语法。

相关内容