FFmpeg入门简介
FFmpeg的定义
FFmpeg既是一款音视频编解码工具,同时也是一组音视频编解码开发套件,作为编解码开发套件,它为开发者提供了丰富的音视频处理的调用接口。
FFmpeg提供了多种媒体格式的封装和解封装,包括多种音视频编码、多种协议的流媒体、多种色彩格式转换、多种采样率转换、多种码率转换等;FFmpeg框架提供了多种丰富的插件模块,包含封装与解封装的插件、编码与解码的插件等。
FFmpeg中的“FF”指的是“Fast Forward”,曾经有人写信给FFmpeg的项目负责人,询问“FF”是不是代表“Fast Free”或者“Fast Fourier”的意思。FFmpeg中的“mpeg”则是人们通常理解的Moving Picture Experts Group(动态图像专家组),FFmpeg是一个很全面的图像处理套件。其实从2000年发展至今,FFmpeg中的“FF”已经可以用各种组合进行理解,因为FFmpeg的强大足以支撑这些意义。
FFmpeg的历史
想要深入了解一个软件、一个系统,首先要了解其发展史,下面就来介绍一下FFmpeg的整体发展过程。
FFmpeg由法国天才程序员Fabrice Bellard在2000年时开发出初版;后来发展到2004年,Fabrice Bellard找到了FFmpeg的接手人,这个人就是至今还在维护FFmpeg的Michael Niedermayer。Michael Niedermayer对FFmpeg的贡献非常大,其将滤镜子系统libavfilter加入FFmpeg项目中,使得FFmpeg的多媒体处理更加多样、更加方便。在FFmpeg发布了0.5版本之后,很长一段时间没有进行新版本的发布,直到后来FFmpeg采用Git作为版本控制服务器以后才开始继续进行代码更新、版本发布,当然也是时隔多年之后了;2011年3月,在FFmpeg项目中有一些提交者对FFmpeg的项目管理方式并不满意,因而重新创建了一个新的项目,命名为Libav,该项目尽管至今并没有FFmpeg发展这么迅速,但是提交权限相对FFmpeg更加开放;2015年8月,Michael Niedermayer主动辞去FFmpeg项目负责人的职务。Michael Niedermayter从Libav中移植了大量的代码和功能至FFmpeg中,Michael Niedermayer辞职的主要目的是希望两个项目最终能够一起发展,若能够合并则更好。时至今日,在大多数的Linux发行版本系统中已经使用FFmpeg来进行多媒体处理。
作为一套开源的音视频编解码套件,FFmpeg可以通过互联网自由获取。FFmpeg的源码Git库提供了多站同步的获取方式,具体如下。
- git://source.ffmpeg.org/ffmpeg.git
- http://git.videolan.org/?p=ffmpeg.git
- https://github.com/FFmpeg/FFmpeg FFmpeg发展至今,已经被许多开源项目所采用,如ijkplayer、ffmpeg2theora、VLC、MPlayer、HandBrake、Blender、Google Chrome等。DirectShow/VFW的ffdshow(外部工程)和QuickTime的Perian(外部工程)也采用了FFmpeg。由于FFmpeg是在LGPL/GPL协议下发布的(如果使用了GPL协议发布的模块则必须采用GPL协议),任何人都可以自由使用,但必须严格遵守LGPL/GPL协议。随着参与的人越来越多,FFmpeg的发展也越来越快,至本书完稿,FFmpeg已经发布到3.3版本。
FFmpeg的基本组成
FFmpeg框架的基本组成包含AVFormat、AVCodec、AVFilter、AVDevice、AVUtil等模块库。
下面针对这些模块做一个大概的介绍。
- FFmpeg的封装模块AVFormat AVFormat中实现了目前多媒体领域中的绝大多数媒体封装格式,包括封装和解封装,如MP4、FLV、KV、TS等文件封装格式,RTMP、RTSP、MMS、HLS等网络协议封装格式。FFmpeg是否支持某种媒体封装格式,取决于编译时是否包含了该格式的封装库。根据实际需求,可进行媒体封装格式的扩展,增加自己定制的封装格式,即在AVFormat中增加自己的封装处理模块。
- FFmpeg的编解码模块AVCodec AVCodec中实现了目前多媒体领域绝大多数常用的编解码格式,既支持编码,也支持解码。AVCodec除了支持MPEG4、AAC、MJPEG等自带的媒体编解码格式之外,还支持第三方的编解码器,如H.264(AVC)编码,需要使用x264编码器;H.265(HEVC)编码,需要使用x265编码器;MP3(mp3lame)编码,需要使用libmp3lame编码器。如果希望增加自己的编码格式,或者硬件编解码,则需要在AVCodec中增加相应的编解码模块,关于AVCode的更多相关信息以及使用信息将会在后面的章节中进行详细的介绍。
- FFmpeg的滤镜模块AVFilter AVFilter库提供了一个通用的音频、视频、字幕等滤镜处理框架。在AVFilter中,滤镜框架可以有多个输入和多个输出。我们参考下面这个滤镜处理的例子,如图1-2所示。