如何使用FFmpeg对视频进行压缩高级教程
如何使用FFmpeg对视频进行压缩高级教程
在视频制作和处理中,压缩视频是一个常见的需求。本文将详细介绍如何使用FFmpeg这一开源工具对视频进行压缩,包括通过改变编解码器、调整分辨率、比特率和帧速率等方法,帮助读者在保持视频质量的同时,大幅减小文件大小。
无损视频——直接从摄像机传输或由动态图形软件生成的视频通常非常大。未压缩视频的文件大小可能会占用每分钟视频千兆字节的磁盘空间。这对于高端电影或广播视频制作非常有用,但对于大多数日常视频任务,尤其是在线视频任务,就不那么有用了。
需要压缩视频的原因有多种,包括:
- 压缩后的视频尺寸更小,更易于存储、共享和在互联网上传输。
- 压缩视频消耗的带宽更少,因此播放更流畅,缓冲更少。
- 文件存储和带宽都需要成本,较小的文件大小可以降低这些成本。
- 许多网站和平台对上传的视频都有特定的文件大小限制。
在本篇文章中,我们将学习如何使用FFmpeg以不同方式压缩视频文件大小。FFmpeg是一款开源命令行工具,可用于通过调整编解码器、分辨率、比特率和帧速率来压缩视频。
前提条件
要学习本教程,请从FFmpeg官方下载页面为您的操作系统下载并安装最新版本的FFmpeg。本教程还假定你掌握了一些在终端运行命令的工作知识。
您还需要一个大尺寸、高分辨率、低压缩率的测试视频。在本教程中,我们将使用1080p MOV示例文件。
关于示例 MOV 文件
样本视频时长28秒,大小为269MB,分辨率为1920×1080像素,帧频为23.976,比特率为78,270 kb/s。它使用Apple ProRes 422 LT编解码器压缩,类似于现代iPhone、大疆无人机或高端摄像机录制视频的方式。音频编解码器为PCM (pcm_s161e),这是一种无损音频压缩算法。
由于视频时间短,文件大小,因此非常有必要将视频压缩到更小的大小,同时保持较高的视觉质量。
通过更改编解码器压缩视频
压缩视频的第一步是使用不同的视频压缩编解码器。编解码器只是一种算法,用于将视频编码和压缩到更小的文件大小,同时不损失视觉质量。MP4是最流行、最受广泛支持的视频格式之一。这主要归功于它使用H.264编解码器提供的视频压缩选项——这是一种高效的开源压缩算法,可以创建非常小的文件大小,同时将视觉质量损失降到最低。
要将MOV文件转换为MP4并使用H.264编解码器进行压缩,请在保存input.mov示例文件的文件夹中运行以下命令:
ffmpeg -i input.mov -c:v libx264 -pix_fmt yuv420p output.mp4
以下是该命令的详细说明:
-i input.mov
:指定输入的视频文件。-c:v libx264
:将视频压缩编解码器设置为H.264 (libx264)。-pix_fmt yuv420p
:将ProRes像素格式(4:2:2)更改为H.264兼容像素格式(4:2:0)。output.mp4
:输出文件的名称。
如果比较一下input.mov文件和新的output.mp4文件的大小,你会发现文件大小减少了220MB,压缩后的MP4文件只有49MB。
值得注意的是,你还可以使用其他编解码器和文件格式(容器)来压缩视频。例如,你可以使用H.265编解码器作为MP4文件,也可以使用VP9编解码器作为WebM文件。
H265编解码器和MP4容器
ffmpeg -i input.mov -c:v libx265 -pix_fmt yuv420p output.mp4
VP9编解码器和WEBM容器
ffmpeg -i input.mov -c:v libvpx-vp9 -pix_fmt yuv420p output.webm
如果运行这两个命令,可能会遇到一些问题。H265编解码器的文件大小要小得多,但当你尝试使用Windows内置的媒体播放器打开文件时,可能需要付费安装一个新的编解码器——这会让很多人望而却步。使用VP9编解码器编码时,速度非常慢,而且最终文件比使用H264/MP4文件大。正是由于这些原因,H264/MP4文件仍然是最流行的格式。
使用恒定速率因子(CRF)压缩视频
进一步压缩视频的方法之一是使用恒定速率因子(CRF)。这是在不控制单个设置的情况下控制压缩的最简单方法。你可以提供一个介于0-51之间的值。数值越小,视频质量越高,但文件越大;数值越大,视觉质量越低,但文件越小。对于MP4文件来说,合理的值介于17和28之间,但你也可以尝试使用不同的值来找到平衡质量和文件大小的最佳位置。默认值为23。
添加-crf 28
选项后的命令如下:
ffmpeg -i input.mov -c:v libx264 -pix_fmt yuv420p -crf 28 output.mp4
新的文件大小现在为22.6MB,但你可能会发现视觉质量略有下降,色彩也不那么鲜艳。
优化压缩和编码设置
我们还可以使用许多其他命令行选项来配置FFmpeg执行压缩的方式。请看这条命令:
ffmpeg -i input.mov -c:v libx264 -pix_fmt yuv420p -crf 28 -preset fast -tune zerolatency -c:a aac output.mp4
让我们来看看附加参数:
-preset fast
:预设选项设置压缩效率,进而影响编码速度。可用选项包括超快、快、中、慢和安慰剂。根据你的优先级选择预设值。例如,如果你想要更快的编码速度,可以选择快速或超快速。反之,如果你想获得更高的质量,并且不介意较长的编码时间,则可以选择较慢或慢速。-tune zerolatency
:可使用-tune
选项根据输入视频的类型来配置设置。例如,使用zerolatency
来优化编码以减少延迟。其他可用选项包括:电影、动画、静态图像和快速解码。-c:a aac
:为了进一步压缩,我们还可以确保对音频进行压缩,这里使用的是AAC编解码器。
现在output.mp4文件的大小只有18.6MB,减少了93%。
有关如何使用FFmpeg和H.264编解码器压缩视频的更多详情,请查看FFmpeg H.264编码指南。
通过降低分辨率压缩视频
缩小视频大小的另一种方法是改变分辨率,即视频的尺寸。我们的input.mov文件是1920px x 1080px,这是高清视频的常用分辨率。不过,你也可以使用较低的分辨率,尤其是如果视频将在移动设备上观看或嵌入到网页中。
让我们来看几个如何使用FFmpeg通过降低分辨率来压缩视频的例子:
缩小视频宽度和高度
ffmpeg -i input.mov -c:v libx264 -pix_fmt yuv420p -crf 28 -vf scale=1280:720 output.mp4
在上述命令中,我们将缩放滤镜添加到之前的命令中,将视频的宽度和高度调整为1280px x 720px。-vf
选项用于应用滤镜,是视频滤镜的简称。
新文件大小为9.8MB,总共缩小了96%。
保持视频的宽高比也很常见,这样视频就不会失真。为此,我们可以使用带有-1
值的缩放过滤器,它会根据其他尺寸自动计算出正确的高度或宽度。就像这样:
ffmpeg -i input.mov -c:v libx264 -pix_fmt yuv420p -crf 28 -vf scale=-1:720 output.mp4
这将把高度调整为720px,同时保持视频的原始宽高比。
通过降低比特率压缩视频
降低视频的比特率也会影响其文件大小,并让你对压缩有很大的控制权。比特率是用于编码视频的每秒比特数。比特率越高,视频质量越高,但文件大小也越大。相反,比特率越低,视频质量越低,但文件大小越小。
我们来看几个例子:
降低视频比特率
ffmpeg -i input.mov -c:v libx264 -pix_fmt yuv420p -b:v 1000k -vf scale=-1:720 output.mp4
在这里,我们替换掉-crf
参数,使用-b:v 1000k
选项将视频比特率设置为1000 Kbps。
现在文件大小为3.35MB,缩小了近99%。你肯定能看到视觉质量有所下降,但根据你的使用情况,这也许是可以接受的。
降低音频比特率
ffmpeg -i input.mov -c:v libx264 -pix_fmt yuv420p -b:v 1000k -b:a 128k -vf scale=-1:720 output.mp4
我们添加了-b:a 128k
,将音频比特率设置为128 Kbps。这对我们的样本视频不会有任何影响,因为它没有任何音频。
通过降低帧频压缩视频
最后,我们可以通过降低帧频来进一步压缩视频。帧频是指播放视频时每秒显示的帧数(fps)。帧频越高,视频越流畅,但文件大小也越大。相反,帧频越低,视频越不流畅,但文件尺寸越小。
ffmpeg -i input.mov -c:v libx264 -pix_fmt yuv420p -b:v 1000k -b:a 128k -vf scale=-1:720 -r 15 output.mp4
在上述命令中,我们使用-r
选项将输出帧频设置为每秒15帧。
奇怪的是,这实际上将文件大小增加到了3.37MB,因此如果与其他压缩选项结合使用,可能就不需要这个选项了。
如果我们像这样运行命令,不使用任何其他压缩选项,我们可以看到文件大小为46.5MB,比保持原来23.976帧率时的49MB略有减少:
ffmpeg -i input.mov -c:v libx264 -pix_fmt yuv420p -r 15 output.mp4
最终的压缩视频
在本文中,展示了如何使用FFmpeg通过更改属性来压缩视频。通过使用FFmpeg并应用正确的压缩设置,你可以在优化视觉质量水平的同时大幅减少视频的文件大小。
在我们的例子中,我们可以将原始文件大小从269MB减少到3.35MB,减幅高达99%。即使不走极端,将视频压缩80-90%也能节省大量存储和带宽成本,并通过更快的下载速度和更流畅的播放带来更好的用户体验。