小丸工具箱官方网站
日常生活和工作中,难免遇到一些视频处理的事情,比如视频格式转换,大小压缩,截屏等,要是在Windows下还好办,格式工厂啊,小丸工具箱都算比较良心的好软件,但是Linux下就比较尴尬了,没有那么多好用的GUI软件,然而问题不大,有ffmpeg,自己动手,丰衣足食嘛!
FFmpeg的名称来自MPEG视频编码标准,前面的“FF”代表“Fast Forward”,FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。可以轻易地实现多种视频格式之间的相互转换。
FFmpeg的用户有Google,Facebook,Youtube,优酷,爱奇艺,土豆等。
几乎所有视频音频处理的软件都是基于FFmpeg目前国内外的所有视频、音频处理软件,包括视频格式转换、视频中抽取音频、屏幕录像、视频转GIF 等常见功能,几乎都是基于FFmpeg做了个GUI封装
这里先讲一些FFmpeg和视频处理中的基本概念。
1.容器/文件(Conainer/File):即特定格式的多媒体文件,比如mp4、flv、mkv等。
2.媒体流(Stream):表示时间轴上的一段连续数据,如一段声音数据、一段视频数据或一段字幕数据,可以是压缩的,也可以是非压缩的,压缩的数据需要关联特定的编解码器。
3.数据帧/数据包(Frame/Packet):通常,一个媒体流是由大量的数据帧组成的,对于压缩数据,帧对应着编解码器的最小处理单元,分属于不同媒体流的数据帧交错存储于容器之中。
一般情况下:
Frame对应压缩前的数据,Packet对应压缩后的数据。
4.编解码器(Codec):以帧为单位实现压缩数据和原始数据之间的相互转换的
5.复用(mux):把不同的流按照某种容器的规则放入容器,这种行为叫做复用(mux)
6.解复用(mux):把不同的流从某种容器中解析出来,这种行为叫做解复用(demux)
7.码率和帧率是视频文件的最重要的基本特征,对于他们的特有设置会决定视频质量。如果我们知道码率和时长那么可以很容易计算出输出文件的大小。
8.帧率:帧率也叫帧频率,帧率是视频文件中每一秒的帧数,肉眼想看到连续移动图像至少需要15帧。
9.码率:比特率(也叫码率,数据率)是一个确定整体视频/音频质量的参数,秒为单位处理的位数,码率和视频质量成正比,在视频文件中中比特率用bps来表达。
有了这些概念后,直接上手使用吧。怎么安装,我就不再描述了
实例1-压缩视频大小直接上命令
ffmpeg -threads 4 -i vid1559883307870mix.mp4 -vcodec libx264 -preset fast -crf 28 -y -vf scale=1280:720 -acodec libmp3lame -ab 128k thread.mp4来解释下每个参数的意义
-threads 4 开启多线程-i vid1559883307870mix.mp4 表示输入要转换的文件-vcodec libx264 设定视频的编码器,未设定时则使用与输入流相同的编解码器。X264是压缩率最高,目前兼容性最好的一种编码(X265压缩率更高,但还不常用)。-preset fast 指定编码的配置。x264编码算法有很多可供配置的参数,不同的参数值会导致编码的速度大相径庭,甚至可能影响质量。为了免去用户了解算法,然后手工配置参数的麻烦。x264提供了一些预设值,而这些预设值可以通过preset指定。这些预设值有包括:ultrafast,superfast,veryfast,faster,fast,medium,slow,slower,veryslow和placebo。ultrafast编码速度最快,但压缩率低,生成的文件更大,placebo则正好相反。x264所取的默认值为medium。需要说明的是,preset主要是影响编码的速度,并不会很大的影响编码出来的结果的质量。压缩高清电影时,我一般用slow或者slower,当你的机器性能很好时也可以使用veryslow,不过一般并不会带来很大的好处。-crf 28:这是最重要的一个选项,用于指定输出视频的质量,取值范围是0-51,默认值为23,数字越小输出视频的质量越高。这个选项会直接影响到输出视频的码率。最好的办法是大家可以多尝试几个值,每个都压几分钟,看看最后的输出质量和文件大小,自己再按需选择。对质量要求较高时,选22以下;对尺寸要求非常高时,选26(但质量确实是会稍差一些),否则选24的性价比比较高(或者默认的23也行),如果对尺寸实在要求非常非常高,那就28以上吧。scale=1280:720 设置视频显示的尺寸-acodec libmp3lame 设置音频编码为MP3-ab 128k 设置音频流量,值越小,压缩率越高,质量越差。经过这么一压缩,我原本45M的手机视频压缩成了5M,而且没有比较大的质量损失。看来效果不错。
实例2-录屏在Windows下,可以用FastStone Capture等来实现录屏,Linux下也可以用vokoscreenNG,但实际上,FFmpeg在命令行下就可以做到,不需要GUI。
上命令
ffmpeg -video_size 1024x768 -framerate 25 -f x11grab -i :0.0+100,200 output.mp4参数解释:
-framerate 25:表示我录制的帧率为25
-video_size:需要录制的宽度和高度
x11grab:表明我们是通过x11抓屏的方式 ,这是Linux下的命令,如果是Win,则使用gdigrab
实例3-从视频截选指定长度的内容生成GIF图片这个操作就更常见了,贴吧和微博太需要了
惯例,先上命令
ffmpeg -ss 3 -t 5 -i input.mp4 -s 480*270 -f gif out.gif参数意义,猜一下应当也差不多了。
其中-t 5表示录取5秒的视频转为GIF
实例4-从视频中抽取音频这个操作也很常见了,还是直接上命令
ffmpeg -i 起风了.mp4 -f mp3 -vn qfl.mp3就这样,从一个29M的MV里提取出了4M的MP3。
实例5-音频格式转换这个命令演示从大体积无损音乐转换为小体积MP3格式
ffmpeg -i mo.flac -ab 256k mo.mp3非常简单,只需要指定下比特率即可,当然不指定也可。
总结实际上,ffmpeg能干的不止这些。和ffmpeg配套的ffplay实际上也是各种视频播放器的核心。这里顺便提个历史 ffmpeg耻辱柱。
由于FFmpeg是在LGPL/GPL协议下发布的(如果使用了其中一些使用GPL协议发布的模块则必须使用GPL协议),任何人都可以自由使用,但必须严格遵守LGPL/GPL协议。有很多播放软件都使用了FFmpeg的代码,但它们并没有遵守LGPL/GPL协议,没有公开任何源代码。我们应该对这种侵权行为表示耻辱。
截止到2014年加入FFmpeg耻辱柱的播放软件:暴风影音、QQ影音、KMP、GOM Player、PotPlayer都在其列。后面由于资本家的压力,这个页面被迫撤回。
最后,总结下常用参数
ffmpeg命令参数
还有什么是ffmpeg搞不定的呢