最近要将mkv格式转为mp4格式,由于compressor不支持mkv,所以就打算用ffmpeg来转,但是由于视频文件巨大,简单的命令太慢了,所以就想用硬件加速,但是由于macOS的特殊性,官网上给出硬件加速的方法不管用,所以就研究了一下,正好写一下这款程序的一个小教程,希望能帮到有需要的人。

需要注意的是,ffmpeg不是GUI(图形交互)软件,所以操作起来需要有一定命令行使用的经验,不过我也会一步步来,尽力让新手也能看懂。

首先介绍一下ffmpeg。
ffmpeg是一款非常好用的视频音频转码、编码、解码录制程序,可以用于录制流媒体视频音频、转换音视频文件格式等各种用途,官网是:http://www.ffmpeg.org。由于是开源软件,很多转码、下载视频软件的内在就是ffmpeg。

安装FFmpeg

第一步肯定是安装程序了,官网不光提供源码可以让我们按需编译程序,也给我们提供了完整的编译版本,这里我们直接安装编译好的完整版

首先我们进入官网,点击“Download”:

macos kvm教程 macos安装kvm_macos


再点击苹果图标,然后点击64位的静态版本下载:

macos kvm教程 macos安装kvm_码率_02

这时候下载了一个归档,也就是压缩包。我们在桌面新建一个文件夹,这里将其命名为“ffmpeg”,然后将压缩包拖到这个新文件夹中。双击解压之后就得到程序了,大致如下:

macos kvm教程 macos安装kvm_ffmpeg_03


这时候我们双击运行,会自动配置好,如下:

macos kvm教程 macos安装kvm_音视频_04


这时候就算安装好了。

初步使用FFmpeg

这时候我们需要打开“终端”(Terminal),打开终端有几种比较方便的办法。

  • 按下Command键+空格键,唤出“聚焦搜索”,搜索“终端”或者“Terminal”,就可以找到了。
  • 点击“启动台”,找到“其他”,就可以找到“终端”了。

由于macOS终端的默认工作目录是用户的根目录,所以我们需要输入以下命令来切换到刚才新建的ffmpeg文件夹:

cd Desktop/ffmpeg/

然后我们就可以用./ffmpeg来使用ffmpeg程序了。

我们可以使用以下命令来查看“帮助”:

# 下面这个命令可以查看比较简短的帮助和提示
./ffmpeg -h
# 下面这个命令可以查看比较长的帮助和提示
./ffmpeg -h long
# 下面这个命令可以查看完整的帮助和提示
./ffmpeg -h full

好了,我们开始转码吧。

初步视频格式转换(视频转码)

ffmpeg转码非常简单。这里出于演示目的,我往ffmpeg文件夹中拖入了一个名为in.mp4的MP4视频文件作为输入文件,如下:

macos kvm教程 macos安装kvm_macos kvm教程_05

然后使用以下命令将其转成名为out.mov的MOV视频文件(这里in.mp4out.mov都可以自己决定的):

./ffmpeg -i in.mp4 out.mov

按下回车就会进入转码状态了,画面上会出现这样的内容:

macos kvm教程 macos安装kvm_ffmpeg_06

这里讲一下如何看这个部分,先看重复很多的那些行,从左到右:

  • frame= :这部分显示的是已经生成了多少帧。
  • fps=:这部分显示的是从上条信息到这条信息期间,生成了多少帧。这里和左下角的speed部分有关系,等会说speed部分的时候再讲。
  • q:这部分表示的是视频质量。由于我们没有设定转码质量,所以由系统自动决定,这里的是31(最高是52,部分编码器可能会不同)。
  • size=:这里显示的是从上条信息到这条信息期间,生成了多少数据。
  • time:这部分显示的是到被转码视频的哪部分了,比如说time=00:01:36.68表示转码到视频的1分36.68秒。
  • bitrate=:这里显示的是从上条信息到这条信息期间转码的视频的平均码率。这个数据一般维持在一个值附近,这个值可以指定,稍后说。

然后就是刚才提到的左下角的speed部分,这部分表示的是转码速度是视频帧数的几倍,比如说这个视频平均帧数是60帧,每次转码72帧,这里显示的就是1.2x了。(视频时间除以speed就是大致的渲染时间)这部分越高,就表示转码速度越快。如果这部分小于1x,那就算慢了,就需要使用硬件加速。
转码速度取决于源文件、目标文件的码率,如果源文件码率低,转码会快。目标文件同理,但是码率低可能会大幅降低画质。
而且转码速度也取决于目标文件格式,例如转avi文件会快很多。

但是我们如果看一下转码后的视频,可能会发现视频比源文件糊,这是因为目标文件的码率太低(如果目标文件比源文件小太多就会这样)。如下图,上边是源文件,平均码率是41970k;下边是目标文件,平均码率是2780k:

macos kvm教程 macos安装kvm_macos_07


可以看到下面的头发糊到一起了,所以我们得使用一个比较高的码率,来改善这一情况。

如果只是想转码,不想损耗画质,使用的码率得大于等于源文件。

如果是想发在视频平台上,一般1080P的视频想要获取比较好的画质,码率至少在5000k以上即可。

这里需要注意的是同等码率下,mov画质不如mp4,所以我们将码率设置成10000k,码率几乎是之前的4倍,:

./ffmpeg -i in.mp4 -b:v 10000k out.mov

对比图如下(从上到下为“源文件”、“自动设置”、“10000码率”):

macos kvm教程 macos安装kvm_macos_08


可以看到虽然画质还是比不上源文件但是好很多了。

FFmpeg加速渲染

上面提到过渲染很慢可以使用硬件加速,也就是利用显卡或者一些指令集加速。使用硬件加速不光会加快转码速度,也会减少内存和CPU的占用
但是如果使用官网文档的方法是没有办法在macOS平台加速,官网甚至没有提到相关内容。
首先我们使用以下命令来查看可以使用的硬件加速方式:

./ffmpeg -hwaccels

这时候我们可以在最下面看到支持的硬件加速方式,如下:

macos kvm教程 macos安装kvm_macos kvm教程_09


这里可以看到只支持videotoolbox方式来进行硬件加速。没错,macOS平台没办法按照官网文档中说的那样使用qsv或者其他硬件加速方式,需要使用videotoolbox

Apple使用VideoToolbox来为h264和265/HEVC视频编码提供硬件加速。

我们来更改一下之前使用过的命令,使用硬件加速,如下:

./ffmpeg -hwaccel videotoolbox -i in.mp4 -c:v h264_videotoolbox -b:v 10000k out.mov

我们先用-hwaccel videotoolbox选项来表示使用videotoolbox工具包,然后使用-c:v h264_videotoolbox表示我们使用h264编/解码器来进行转码,如果源文件是h265/HEVC编码的,就使用-c:v hevc_videotoolbox

刚才不用加速的时候,速度是0.949x,使用加速之后达到了1.91x,几乎是之前的两倍(这一般取决于显卡能力)。

不过需要注意的是,加速转码的画质可能会不如直接转码,但是除非大码率转码,不然的话二者画质没有任何区别。如果很担心这个问题,但是又需要加速,视频是h264或者h265/HEVC编码的视频,可以使用-preset veryslow选项来缓和一下,如下:

./ffmpeg -hwaccel videotoolbox -i in.mp4 -c:v h264_videotoolbox -b:v 10000k -preset veryslow out.mov

这样就基本可以使用FFmpeg程序了,后面应该还会写一写其他的用法。

希望可以帮到有需要的人~