如何使用 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/
答案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。
细节:
-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 带宽占用。
也可以看看:
-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 相同。
- ⚠️ 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_npp
vs 的更多信息scale_cuda
。