更改视频分辨率ffmpeg

45

我有不同分辨率的视频。我希望它们全部都能以480x320的分辨率播放。我尝试了以下命令:

ffmpeg -i %s_ann.mp4 -vf scale=480x320,setsar=1:1 %s_annShrink.mp4' %(dstfile,dstfile)

但是视频的输出文件大小为0 kb。

我做错了什么?


1
无法在没有完整的命令行输出的情况下提供答案。 - llogan
4个回答

46

我猜这里实际上有两个问题...

  1. 如何批量转换文件?
  2. 如何自动缩放视频?

如何批量转换文件?

以下脚本应该能解决问题...

Windows

for %%i in (*.mp4) do (
    ffmpeg -y -i "%%i" << TODO >> "%%~ni_shrink.mp4"
)

Linux(未经测试!)

for i in *.mp4; 
do
    ffmpeg -y -i "$i" << TODO >> "${i%.mp4}_shrink.mp4";
done

(我不太确定Linux脚本中的输出文件扩展名,值得验证一下。)


如何自动缩放视频?

这有点棘手。由于您已经有了命令,因此可能会破坏宽高比。以下是您可以选择的选项...

  1. 缩放视频,忽略宽高比。结果 = 失真的视频
  2. 缩放视频,保持宽高比,以使缩放后的高度(或宽度)适合。结果 = 最佳效果
  3. 缩放视频,保持宽高比,并用黑色边框填充,以使视频大小恰好为480x320。结果 = 浪费/增加文件大小
  4. 在缩放之前裁剪输入,使其填充到480x320分辨率。结果 = 不完整的视频

选项2将是首选解决方案,否则您(可能没有必要地)增加输出文件的大小。对于选项3,我将提供部分经过测试的解决方案。选项4我甚至不会接触。

选项2:缩放视频,保持宽高比,调整高度以适合

ffmpeg -y -i "%%i" -vf scale=480:-2,setsar=1:1 -c:v libx264 -c:a copy "%%~ni_shrink.mp4"

选项三:按比例缩放视频,并用黑色条填充以保持视频大小恰好为480x320

ffmpeg -y -i "%%i" -vf "[in]scale=iw*min(480/iw\,320/ih):ih*min(480/iw\,320/ih)[scaled]; [scaled]pad=480:320:(480-iw*min(480/iw\,320/ih))/2:(320-ih*min(480/iw\,320/ih))/2[padded]; [padded]setsar=1:1[out]" -c:v libx264 -c:a copy "%%~ni_shrink.mp4"

如果我想要一个固定的高度和宽度适应怎么办?我需要放置 -vf scale=-2:320,setsar=1:1 吗? - Sodj
12
如果您能给我们提供一个链接,让我们了解命令中每个标记的含义,那就更好了。 - Harsha
我对失真视频(选项1)很感兴趣。处理太窄的输入视频 - 它会挤压物体,需要进行校正。 - Ray Woodcock
为什么发布无法在控制台或从.cmd脚本中工作的Windows脚本呢?为什么不发布工作正常的脚本呢 - 这样会更好,你不觉得吗! - ilw

41
你可以使用 ffmpeg 工具,输入命令即可。
ffmpeg -i input.mp4 -vf scale=480:320 output_320.mp4
或者如果您想更改视频宽高比,请使用setdar。
ffmpeg -i input.mp4 -vf scale=480:320,setdar=4:3 output_320.mp4


5
不起作用。正确的命令格式是ffmpeg -i input.mp4 -vf "scale=480:320" output_320.mp4 - Alexey Antonenko
这是唯一对我有效的方法。 - Apostolos

4

我之前没有能够从以前的答案中正确地使视频缩放工作,所以我自己研究了一下,想要添加一个当前和更详细的答案。

缩放:

参考:https://trac.ffmpeg.org/wiki/Scaling - 请查看此内容以了解这里未涵盖的任何内容。 这个页面清楚地介绍了缩放命令及其示例。 scale 命令适用于图像和视频。

以下是最基本的缩放命令,它将简单地将视频调整为所需的像素大小。 如果输入和输出的长宽比不同,则可能会导致视频失真。

ffmpeg -i input.mov -vf scale=320:240 output.mp4

为了保持纵横比,您可以仅指定宽度,然后接上 -1 ,它将计算出高度以保持输入的纵横比:

ffmpeg -i input.mov -vf scale=320:-1 output.mp4

压缩

如果您还希望压缩视频大小,则会发现经常推荐使用 libx265 编解码器。 但是,这不适用于缩放命令:在我的测试中,我发现颜色通道的位置不同,因此存在可见的幽灵重叠。

相反,请使用 libx264 编解码器并添加 -crf 标志这应该是 .mp4 输出的默认设置,但我建议指定它以为您的脚本提供未来的保障。

ffmpeg -i input.mov -vf scale=1920:-2 -vcodec libx264 -crf 20 output.mp4

注意:在缩放中,您还需要使用 -2 而不是 -1。 这确保纵横比始终符合编解码器要求。

测试

我使用 Canon 5Div 拍摄了一个 4K RAW 视频进行了一些测试:

原始文件大小为 2,128,665 KB

  • 使用-crf 0的参数将分辨率扩大至1920:-2,导致文件大小为847266 KB,因为重新缩放而出现轻微质量损失。
  • 使用-crf 1的参数将分辨率扩大至1920:-2,导致文件大小为747738 KB,因为重新缩放而出现轻微质量损失。
  • 使用-crf 10的参数将分辨率扩大至1920:-2,导致文件大小为191491 KB,因为重新缩放而出现轻微质量损失。
  • 使用-crf 20的参数将分辨率扩大至1920:-2,导致文件大小为19735 KB,会有进一步的质量损失,但依然相当不错。
  • 使用-crf 30的参数将分辨率扩大至1920:-2,导致文件大小为4537 KB,会有更进一步的质量损失,只能用作预览质量。

2
您可以使用以下命令进行图像的放大和缩小:
ffmpeg -i input.mp4 -vf scale=640x480:flags=lanczos -c:v libx264 -preset slow -crf 21 output_compress_480p.mp4

使用FFMPEG进行视频升级

ffmpeg -i input.mp4 -vf scale=1920x1080:flags=lanczos -c:v libx264 -preset slow -crf 21 output_compress_1080p.mp4

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接