Introduction
ffmpeg是目前主流音视频编码解码的主要工具。
本文总结常用的命令,不定期更新。下文以windows为例。
1. 下载
官网:
https://www.ffmpeg.org/download.html
根据平台选择操作系统,比如点击windows的builds会跳转到
https://ffmpeg.zeranoe.com/builds/
需要依次选择version、Architecture、Linking。
建议version选择X.X的常规版本,比如3.4.1,架构根据系统选择即可,Linking建议选择static静态编译的版本,防止因为操作系统配置问题出现某些包库无法找到,但静态编译的文件可能会比较大。
下载完成后解压出来,进入/bin/
文件夹即可看到几个exe文件,我们主要使用ffmpeg.exe
。
2. 常用命令
windows下,在/bin
文件夹里,按住Shift + 鼠标右键,弹出的菜单即可发现多了一条:在此处打开命令行,点击后会弹出win的命令行窗口,即可使用下面的命令。
2.1 合并视频和音频
比如从https://www.addyoutube.com下载的视频和音频文件合并,现在有个视频video.avi,有个音频 audio.mp3,将其合并成output.avi,两种方法:
2.1.1 方法1
两个命令,( video2.avi 是中间文件 ,用完可删)
# 先把原来视频的音频去掉
ffmpeg.exe -i video.avi -vcodec copy -an video2.avi
# 再把复制上去
ffmpeg.exe -i video2.avi -i audio.mp3 -vcodec copy -acodec copy output.avi
-i
表示输入文件-vcodec copy
表示 force video codec ('copy' to copy stream) ,不转码视频内容,直接拷贝。acodec copy
不转码音频内容,直接拷贝-an
表示 disable audio, 表示去掉video.avi 原有的音频
2.1.2 方法2
可以直接指定两个输入文件 :
ffmpeg.exe -i video.avi -i audio.mp3 output.avi
两个文件的顺序很重
2.2 转换视频格式
将输入的out.ogv视频文件转换成mp4的格式
ffmpeg.exe -i out.ogv -vcodec h264 out.mp4
如果你用手机录制的视频,一般也可以直接用上面的命令压缩。
更详细的版本:
ffmpeg.exe -i MVI_7274.MOV -vcodec libx264 -preset fast -crf 20 -y -vf "scale=1920:-1" -acodec libmp3lame -ab 128k a.mp4
-preset
:指定编码的配置。x264编码算法有很多可供配置的参数,不同的参数值会导致编码的速度大相径庭,甚至可能影响质量。为了免去用户了解算法,然后手工配置参数的麻烦。x264提供了一些预设值,而这些预设值可以通过preset指定。这些预设值有包括:ultrafast,superfast,veryfast,faster,fast,medium,slow,slower,veryslow和placebo。ultrafast编码速度最快,但压缩率低,生成的文件更大,placebo则正好相反。x264所取的默认值为medium。需要说明的是,preset主要是影响编码的速度,并不会很大的影响编码出来的结果的质量。压缩高清电影时,我一般用slow或者slower,当你的机器性能很好时也可以使用veryslow,不过一般并不会带来很大的好处。
-crf
:这是最重要的一个选项,用于指定输出视频的质量,取值范围是0-51,默认值为23,数字越小输出视频的质量越高。这个选项会直接影响到输出视频的码率。一般来说,压制480p我会用20左右,压制720p我会用16-18,1080p我没尝试过。个人觉得,一般情况下没有必要低于16。最好的办法是大家可以多尝试几个值,每个都压几分钟,看看最后的输出质量和文件大小,自己再按需选择。
其实还有-b 1024k这样的参数,但是我发现-crf设置上后-b就不管用了。根据我自己的简单尝试,压制5D2拍摄的一段18秒1920x1080的视频(下午自然光、图像简单、大面积白墙、只有一扇黑门)crf和压出来的文件大小关系如下:
crf | 文件大小 |
---|---|
16 | 54M |
18 | 39M |
20 | 25M |
22 | 17M |
24 | 11M |
26 | 7.3M |
28 | 5.0M |
30 | 3.6M |
32 | 2.7M |
默认 | 14M(crf为23) |
又比较了一下crf在20、28、32时的视频质量,发现32还是能看出质量下降的,20的确非常精细,但28跟20之间的差别并不是那么大,crf值设置在26-28之间比较好。如果对尺寸有要求,什么都不设,用默认的也行(可能是31)。
如果把原视频尺寸从1920x1080缩小到960x540,则视频尺寸变为了:
crf | 文件大小 |
---|---|
16 | 11M |
18 | 6.7M |
20 | 4.4M |
22 | 3.0M |
24 | 2.1M |
26 | 1.6M |
28 | 1.3M |
30 | 1.1M |
32 | 893K |
默认 | 2.5M(crf为23) |
对质量要求较高时,选22以下;对尺寸要求非常高时,选26(但质量确实是会稍差一些),否则选24的性价比比较高(或者默认的23也行),如果对尺寸实在要求非常非常高,那就28以上吧。
可以用-threads n 来实施多线程的运算,充分利用多核cpu 例子如下:
ffmpeg -threads 2 -crf 20 -y -i ML-02.avi -strict experimental ML-02.mp4