FFMPEG堪称自由软件中最完备的一套多媒体支持库,它几乎实现了所有当下常见的数据封装格式、多媒体传输协议以及音视频编解码器。因此,对于从事多媒体技术开发的工程师来说,深入研究FFMPEG成为一门必不可少的工作,可以这样说,FFMPEG之于多媒体开发工程师的重要性正如kernel之于嵌入式系统工程师一般。
几个小知识:
-
FFMPEG项目是由法国人Fabrice Bellard发起的,此人也是著名的CPU模拟器项目QEMU的发起者,同时还是圆周率算法纪录的保持者。
-
FF是Fast Forward的意思,翻译成中文是“快进”。
-
FFMPEG的LOGO是一个”Z字扫描”示意图,Z字扫描用于将图像的二维频域数据一维化,同时保证了一维化的数据具备良好的统计特性,从而提高其后要进行的一维熵编码的效率。
关于耻辱厅(Hall of Shame):FFMpeg大部分代码遵循LGPL许可证,如果使用者对FFMpeg进行了修改,要求公布修改的源代码;有少部分代码遵循GPL许可证,要求使用者同时公开使用FFMpeg的软件的源代码。实际上,除去部分具备系统软件开发能力的大型公司(Microsoft、Apple等)以及某些著名的音视频技术提供商(Divx、Real等)提供的自有播放器之外,绝大部分第三方开发的播放器都离不开FFMpeg的支持,像Linux桌面环境中的开源播放器VLC、MPlayer,Windows下的KMPlayer、暴风影音以及Android下几乎全部第三方播放器都是基于FFMpeg的。也有许多看似具备自主技术的播放器,其实也都不声不响地使用了FFMpeg,这种行为被称为“盗窃”
FFMPEG从功能上划分为几个模块,分别为核心工具(libutils)、媒体格式(libavformat)、编解码(libavcodec)、设备(libavdevice)和后处理(libavfilter, libswscale, libpostproc),分别负责提供公用的功能函数、实现多媒体文件的读包和写包、完成音视频的编解码、管理音视频设备的操作以及进行音视频后处理。
这里指FFMPEG提供的命令行(CLI)工具ffmpeg,其使用方法如下(方括号表示可选项,花括号表示必选项目):
ffmpeg [global options] [[infile options][‘-i’ infile]]... {[outfile options] outfile}...除了全局选项,其他选项仅对后面紧跟着的输入或输出文件有效。
-
-formats:列出支持的文件格式。
-
-codecs:列出支持的编解码器。
-
-decoders:列出支持的解码器。
-
-encoders:列出支持的编码器。
-
-protocols:列出支持的协议。
-
-bsfs:列出支持的比特流过滤器。
-
-filters:列出支持的滤镜。
-
-pix_fmts:列出支持的图像采样格式。
-
-sample_fmts:列出支持的声音采样格式。
-
-f fmt:强制设定输入和输出文件格式(缺省是根据扩展名选择的)。
-
-i filename:指定输入文件名。
-
-y:覆盖输出文件。
-
-c codec:指定编码器或解码器(编解码器设定为”copy“表示不进行编解码)。
-
-acodec codec:指定声音的编码器或解码器(编解码器设定为”copy“表示不进行编解码)。
-
-vcodec codec:指定视频的编码器或解码器(编解码器设定为”copy“表示不进行编解码)。
-
-t hh:mm:ss[.xxx]:设定输入或输出文件的终止时间点。
-
-ss hh:mm:ss[.xxx]:设定输入或输出文件的起始时间点。
-
-frames count:设定输出的帧数目。
-
-r fps:设定视频编解码器的帧率,整数,单位fps
-
-ar sample rate:设定音频编解码器的采样率,整数,单位Hz。
-
-b bitrate:设定音视频编码器输出的比特率,整数,单位bps。
-
-ab bitrate:设定音频编码器输出的比特率,整数,单位bps。
-
-ac channels:设置音频编解码器的声道数目。
-
-bf frames:设置视频编码器的B帧数目。
-
-profile profile:设置音视频编码器的类。
-
-level level:设置音视频编码器的级。
FFMPEG的某些选项可以对一个特定的媒体流起作用,这种情况下需要在选项后面增加一个流标识。流标识允许以下几种格式:
-
流序号。譬如“:1”表示第二个流。
-
流类型。譬如“:a“表示音频流,流类型可以和流序号合并使用,譬如“:a:1”表示第二个音频流。
-
节目。节目和流序号可以合并使用。
-
流标识。流标识是一个内部标识号。
假如要设定第二个音频流为copy,则需要指定-codec:a:1 copy