注意:本文是基于FFMPEG的3.3.1 版本,如有出入请先核对版本是否相同
一、缘起
做多媒体开发这么多年,接触了不少开源库,其中FFMPEG算是接触时间比较长的一个了,之前已经介绍了gstreamer和VLC了,这里也小小的来介绍一下FFMPEG。
二、简介
FFmpeg(全名是Fast Forward MPEG(Moving Picture Experts Group))是全球领先的多媒体框架,能够解码(decode)、编码(encode)、转码(transcode)、复用(mux)、解复用(demux)、流化(stream)、滤波(filter)和播放几乎任何人类和机器创造的多媒体文件。它具有不少特点:
- 高可移植性:可以在Linux, Mac OS X, Microsoft Windows, the BSDs, Solaris等等系统上编译,运行以及通过FATE(FFmpeg Automated Testing Environment:FFMPEG自动化测试环境)测试;
- 高性能:专门针对X86,arm,MIPS,ppc等大多数主流的处理器提供了对应的汇编级别的优化实现
- 高度安全:FFMPEG官网上说,他们对代码审查总是考虑安全性,而且一旦发布的版本中有安全性的Bug都会尽快的修复并更新发布版本
- 高度易用性:FFMPEG的提供的API都有相关的注释,且官方也有对应的说明文档
- 支持的格式多样性:FFMPEG支持很多很多多媒体格式的解码,编码,复用,解复用等功能,不管是很老的格式,还是比较新的格式均有不错的支持
- 高度可扩展:FFMPEG是一个模块化的结构,不管是avformat,还是avcodec都有相应的类型结构体,完全可以实现自己比较特殊的编解码器或者解复用等功能并注册到FFMPEG当中去
- 。。。
特点很多,我也不尽解。
2.1 FFMPEG工具
在FFMPEG源代码中自带了几个比较实用的工具,通过编译选项的设置可以编译出来。
- ffmpeg:一个命令行工具,用来进行对媒体文件的格式转换(如 mkv 转 mp4等)
- ffserver:一个对媒体流服务器,用于直播
- ffplay:基于SDL和FFMPEG 库的一个简单播放器
- ffprobe:一个简单的多媒体流分析工具
2.2 FFMPEG主要的库
- libavutil:简化编程的工具函数库,包括随机数生成器,数据结构,数学函数,多媒体核心工具函数等等
- libavcodec:包含音视频编解码的库
- libavformat:包含复用,解复用多媒体容器的库
- libavdevice:包含输入/输出设备的库,它能从一些通用的软件框架中抓取数据,也能将多媒体数据送到一些通用软件框架中去渲染。这些通用软件框架包括:Video4Linux,Video4Linux2,VfW以及ALSA等
- libavfilter:包含多媒体滤波器的库
- libswscale:用于执行高性能的图像缩放,颜色空间或像素格式转换的库
- libswresample:用于执行高性能音频重采样,重矩阵化(rematrixing,不确定翻译是否准确),采样格式转换以及混音(主要是声道转换(如5.1声道转到立体声等))等功能的库