最近要将mkv格式转为mp4格式,由于compressor不支持mkv,所以就打算用ffmpeg来转,但是由于视频文件巨大,简单的命令太慢了,所以就想用硬件加速,但是由于macOS的特殊性,官网上给出硬件加速的方法不管用,所以就研究了一下,正好写一下这款程序的一个小教程,希望能帮到有需要的人。
需要注意的是,ffmpeg不是GUI(图形交互)软件,所以操作起来需要有一定命令行使用的经验,不过我也会一步步来,尽力让新手也能看懂。
首先介绍一下ffmpeg。
ffmpeg是一款非常好用的视频音频转码、编码、解码录制程序,可以用于录制流媒体视频音频、转换音视频文件格式等各种用途,官网是:http://www.ffmpeg.org。由于是开源软件,很多转码、下载视频软件的内在就是ffmpeg。
第一步肯定是安装程序了,官网不光提供源码可以让我们按需编译程序,也给我们提供了完整的编译版本,这里我们直接安装编译好的完整版。
首先我们进入官网,点击“Download”:
再点击苹果图标,然后点击64位的静态版本下载:
这时候下载了一个归档,也就是压缩包。我们在桌面新建一个文件夹,这里将其命名为“ffmpeg
”,然后将压缩包拖到这个新文件夹中。双击解压之后就得到程序了,大致如下:
这时候我们双击运行,会自动配置好,如下:
这时候就算安装好了。
这时候我们需要打开“终端”(Terminal),打开终端有几种比较方便的办法。
由于macOS终端的默认工作目录是用户的根目录,所以我们需要输入以下命令来切换到刚才新建的ffmpeg
文件夹:
cd Desktop/ffmpeg/
然后我们就可以用./ffmpeg
来使用ffmpeg程序了。
我们可以使用以下命令来查看“帮助”:
# 下面这个命令可以查看比较简短的帮助和提示
./ffmpeg -h
# 下面这个命令可以查看比较长的帮助和提示
./ffmpeg -h long
# 下面这个命令可以查看完整的帮助和提示
./ffmpeg -h full
好了,我们开始转码吧。
ffmpeg转码非常简单。这里出于演示目的,我往ffmpeg文件夹中拖入了一个名为in.mp4
的MP4视频文件作为输入文件,如下:
然后使用以下命令将其转成名为out.mov
的MOV视频文件(这里in.mp4
和out.mov
都可以自己决定的):
./ffmpeg -i in.mp4 out.mov
这里讲一下如何看这个部分,先看重复很多的那些行,从左到右:
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:
可以看到下面的头发糊到一起了,所以我们得使用一个比较高的码率,来改善这一情况。
如果只是想转码,不想损耗画质,使用的码率得大于等于源文件。
如果是想发在视频平台上,一般1080P的视频想要获取比较好的画质,码率至少在5000k以上即可。
这里需要注意的是同等码率下,mov画质不如mp4,所以我们将码率设置成10000k,码率几乎是之前的4倍,:
./ffmpeg -i in.mp4 -b:v 10000k out.mov
对比图如下(从上到下为“源文件”、“自动设置”、“10000码率”):
可以看到虽然画质还是比不上源文件但是好很多了。
上面提到过渲染很慢可以使用硬件加速,也就是利用显卡或者一些指令集加速。使用硬件加速不光会加快转码速度,也会减少内存和CPU的占用
但是如果使用官网文档的方法是没有办法在macOS平台加速,官网甚至没有提到相关内容。
首先我们使用以下命令来查看可以使用的硬件加速方式:
./ffmpeg -hwaccels
这时候我们可以在最下面看到支持的硬件加速方式,如下:
这里可以看到只支持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程序了,后面应该还会写一写其他的用法。
希望可以帮到有需要的人~