在本 FFmpeg 教程中,我们学习使用 FFmpeg 的命令行工具更改视频的分辨率(或调整视频大小/缩放视频)。
更改视频的分辨率(也称为调整大小或缩放)是视频编辑、处理和压缩中非常常见的操作。对于 ABR 视频流尤其如此,比如将单个视频作为源并压缩为几种不同的比特率分辨率组合。例如,输入视频的分辨率可以是1920×1080,ABR 比特流可以是1280×720,640×480等。
所以,作为第一步,让我们找出输入视频的分辨率是多少。
可以用FFmpeg 附带的ffprobe工具来确定输入视频的分辨率
ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of csv=s=x:p=0 input.mp4
该命令会在命令行节目输出类似1920x1080
的信息
注意:视频缩放是有损的,会导致视频质量下降
- 如何使用 FFmpeg 调整/缩放/更改视频的分辨率?
- 如何使用 FFmpeg 在保持高质量的同时调整视频大小
- 如何更改视频的分辨率但保持宽高比?
- 如何使用 FFmpeg 调整/缩放/更改视频的分辨率?
如何使用 FFmpeg 调整/缩放/更改视频的分辨率?
使用 FFmpeg 缩放或更改视频的分辨率是由FFmpeg 中的scale过滤器完成的。要使用scale过滤器,请使用以下命令 –
ffmpeg -i input.mp4 -vf scale=$w:$h <encoding-parameters> output.mp4
Code language: PHP (php)
其中,$w:$h
表示目标视频所需的宽度和高度。例如,你可以使用-vf scale=640:480
将视频大小调整为480p.
使用这个简单的命令就可以更改视频的分辨率。
FFmpeg 改变视频的分辨率后,它会以该分辨率重新编码。在上面的命令行中,你可以向 FFmpeg 提供编码参数并使用这些参数对缩放后的视频进行编码。例如,你可以告诉 FFmpeg 使用crf=18高质量的 H.264/AVC 编码对其进行编码,或者选择其他方式
都好?好的,让我们解决下一个主题,即改变视频的分辨率但保留/保持其纵横比。
如何使用 FFmpeg 在保持高质量的同时调整视频大小
调整大小后,你可能会注意到输出视频的质量非常差或与你的预期不同。这可以通过设置视频编码参数来解决。
比如:
ffmpeg -i input.mp4 -vf scale=1280:720 -preset slow -crf 18 output.mp4
在这里,你告诉 FFmpeg 将视频缩放到720p然后使用crf=18withlibx264
的slow预设对其进行编码,该预设通常提供非常好的质量。
如何更改视频的分辨率但保持宽高比?
图像的纵横比是其宽度与高度的比率。它通常表示为用冒号分隔的两个数字,如16:9. 对于x:y纵横比,图像是 x 单位宽和 y 单位高。
在处理视频时遇到这个问题很常见:如何更改视频的分辨率(或缩放视频)但保持或保留视频的原始纵横比。
在FFmpeg中,如果要在保持其纵横比的同时缩放视频,则需要设置高度或宽度参数之一并将另一个参数设置为-1。也就是说,如果你设置height,则将宽度设置为-1,反之亦然。
为了演示,假设以下命令将高清视频 ( 1920×1080) 作为其输入。而且,让我们假设我们想要改变它的分辨率。如上所述,可以通过两种方式来完成:
- 1.指定保持纵横比的宽度
ffmpeg -i input.mp4 -vf scale=320:-1 output.mp4
生成的视频将具有320×180分辨率. 这是因为1920 / 320= 6。因此,height被缩放为1080 / 6 = 180像素。
- 2.指定高度以保持纵横比
ffmpeg -i input.mp4 -vf scale=-1:720 output.mp4
生成的视频将具有1280×720分辨率. 这是因为1080 / 720= 1.5。因此,width被缩放为1920 / 1.5 = 1280像素。
在 FFmpeg 中使用变量缩放/更改视频的分辨率
我们可以使用表示视频参数的变量来实现相同的缩放命令。输入视频的width和height分别由iw和表示ih。
让我们看看将视频宽度缩放两倍 ( 2x) 的命令是什么样的。
ffmpeg -i input.mp4 -vf scale=iw*2:ih output.mp4
如果你想将高度或宽度除以一个数字,语法会稍有变化:scale=iw/2:ih/2参数需要用双引号括起来
ffmpeg -i input.mp4 -vf "scale=iw/2:ih/2" output.mp4
Code language: JavaScript (javascript)
避免根据输入视频的尺寸放大视频
正如我们在文章开头提到的那样,每个缩放操作通常不会产生与输入视频相同级别的视频质量。在缩放过程中必然会有一些压缩损失。如果输入分辨率太低,FFmpeg提供了一个巧妙的技巧来防止放大。
ffmpeg -i input.mp4 -vf "scale='min(320,iw)':'min(240,ih)'" output.mp4
Code language: JavaScript (javascript)
在上面的命令行中,执行缩放的最小宽度/高度分别设置为320和240像素。这是一种非常简单的方法来防止劣质缩放
获取宽高比等视频详细信息
ffprobe -i <filename> -show_streams