FFmpeg

FFmpeg 是一个开放源代码的自由软件，可以执行音讯和视讯多种格式的录影、转档、串流功能，包含了libavcodec——这是一个用于多个专案中音讯和视讯的解码器函式库，以及libavformat——一个音讯与视讯格式转换函式库。

这个项目最初是由法国程序员法布里斯·贝拉（Fabrice Bellard）发起的，而现在是由米夏埃尔·尼德迈尔（Michael Niedermayer）在进行维护。许多FFmpeg的开发者同时也是MPlayer项目的成员，FFmpeg在MPlayer项目中是被设计为服务器版本进行开发。

## 历史

该项目由法布里斯·贝拉（Fabrice Bellard，使用化名“Gérard Lantau”）于2000年启动，并由米夏埃尔·尼德迈尔（Michael Niedermayer）从2004年领导，直到2015年辞职。一些FFmpeg的开发者也参与了MPlayer项目。

该项目的名称灵感来源于MPEG视频标准组织，其中“FF”代表“快进”（fast forward），因此FFmpeg代表“快进动态图像专家组”。其标志是一个之字形扫描图案，显示了MPEG视频编解码器如何处理熵编码。

2011年3月13日，一组FFmpeg开发者决定将该项目分支，命名为Libav。此事件与项目管理中的问题有关，开发者们对FFmpeg的领导层存在分歧。

2014年1月10日，两名谷歌员工宣布，在过去两年中，通过模糊测试已修复了FFmpeg中的1000多个漏洞。

2018年1月，FFmpeg的一个长期组件ffserver命令行程序被移除。开发者此前已经废弃了该程序，原因是由于其使用了内部应用程序接口，导致维护工作量大。

该项目平均每三个月发布一次新版本。尽管可以从网站上下载发布版本，但FFmpeg开发者建议用户使用他们源代码Git版本控制系统中的最新构建来编译软件。

### 编解码器历史

到目前为止，FFmpeg项目已创建了两种视频编码格式及其对应的编解码器，并且有一种容器格式。这两种视频编解码器是无损的FFV1和既有无损又有损的Snow编解码器。Snow的开发已经停滞，其比特流格式尚未最终确定，因此自2011年以来一直处于实验阶段。名为NUT的多媒体容器格式不再积极开发，但仍在维护中。

2010年夏天，FFmpeg开发者Fiona Glaser、Ronald Bultje和David Conrad宣布了ffvp8解码器。经测试发现，ffvp8的速度比谷歌自己的libvpx解码器更快。从0.6版本开始，FFmpeg还支持WebM和VP8。

2013年10月，FFmpeg添加了本地VP9解码器和OpenHEVC，一个开源的高效率视频编码（HEVC）解码器。2016年，本地AAC编码器被认为是稳定的，因此移除了对VisualOn和自由高级音频编码的两个外部AAC编码器的支持。FFmpeg 3.0保留了对Fraunhofer FDK AAC编码器的构建支持。从3.4版本开始，FFmpeg支持FITS图像格式。从2018年11月的4.1版本开始，AV1可以在MP4和Matroska（包括WebM）中复用。

## 组成元件

此计划由几个元件组成：

- 命令列应用程序
- ffmpeg：用于对视讯档案或音讯档案转换格式
- ffplay：一个简单的播放器，基于SDL与FFmpeg函式库
- ffprobe：用于显示媒体档案的资讯，见MediaInfo
- 函数库
- libswresample
- libavresample
- libavcodec：包含全部FFmpeg音讯/视讯编解码函式库
- libavformat：包含demuxers和muxer函式库
- libavutil：包含一些工具函式库
- libpostproc：对于视讯做前处理的函式库
- libswscale：对于影像作缩放的函式库
- libavfilter

## 参数

FFmpeg可使用众多参数，参数内容会根据ffmpeg版本而有差异，使用前建议先参考参数及编解码器的叙述。此外，参数明细可用`ffmpeg -h`显示；编解码器名称等明细可用`ffmpeg -formats`显示。

下列为较常使用的参数：

### 主要参数

- `-i`——设定输入档名。
- `-f`——设定输出格式。
- `-y`——若输出档案已存在时则覆盖档案。
- `-fs`——超过指定的档案大小时则结束转换。
- `-t`——指定输出文件的持续时间，以秒为单位。
- `-ss`——从指定时间开始转换，以秒为单位。
- `-ss`和`-t`一起使用时代表从`-ss`的时间开始转换持续时间为`-t`的影片，例如：`-ss 00:00:01.00 -t 00:00:10.00`即从`00:00:01.00`开始转换到`00:00:11.00`。
- `-title`——设定标题。
- `-timestamp`——设定时间戳。
- `-vsync`——增减Frame使影音同步。
- `-c`——指定输出文件的编码。
- `-metadata`——更改输出文件的元数据。
- `-help`——查看帮助信息。

### 影像参数

- `-b:v`——设定影像流量，预设为200Kbit/秒。（单位请参照下方注意事项）
- `-r`——设定帧率值，预设为25。
- `-s`——设定画面的宽与高。
- `-aspect`——设定画面的比例。
- `-vn`——不处理影像，于仅针对声音做处理时使用。
- `-vcodec( -c:v )`——设定影像编解码器，未设定时则使用与输入档案相同之编解码器。

### 声音参数

- `-b:a`——设定每Channel（最近的SVN版为所有Channel的总合）的流量。（单位请参照下方注意事项）
- `-ar`——设定采样率。
- `-ac`——设定声音的Channel数。
- `-acodec ( -c:a )` ——设定声音编解码器，未设定时与影像相同，使用与输入档案相同之编解码器。
- `-an`——不处理声音，于仅针对影像做处理时使用。
- `-vol`——设定音量大小，256为标准音量。（要设定成两倍音量时则输入512，依此类推。）

### 注意事项

- 以`-b:v`及`-b:a`参数设定流量时，根据使用的ffmpeg版本，须注意单位会有kbits/sec与bits/sec的不同。（可用`ffmpeg -h`显示说明来确认单位。）

例如，单位为bits/sec的情况时，欲指定流量64kbps时需输入 `-b:a 64k`；单位为kbits/sec的情况时则需输入 `-b:a 64`。

- 以`-acodec`及`-vcodec`所指定的编解码器名称，会根据使用的ffmpeg版本而有所不同。例如使用AAC编解码器时，会有输入aac与libfaac的情况。此外，编解码器有分为仅供解码时使用与仅供编码时使用，因此一定要利用`ffmpeg -formats`确认输入的编解码器是否能运作。

## 支援的编码器、格式和协议

### 编码器

FFmpeg项目原生的编码器：

- Snow
- FFV1

FFmpeg已实现的：

- ITU-T视频标准：H.261, H.262/MPEG-2 Part 2, H.263和H.264/MPEG-4 AVC
- ITU-T音频编解码器标准：G.711 µ-law, G.711 A-law, G.721（也叫G.726 32k）, G.722, G.722.2（也叫AMR-WB）, G.723（也叫G.726 24k和40k）和G.726
- ISO/IEC MPEG视频标准：MPEG-1 Part 2, H.262/MPEG-2 Part 2, MPEG-4 Part 2和H.264/MPEG-4 AVC
- ISO/IEC MPEG音频标准：MP1, MP2, MP3, AAC, HE-AAC和MPEG-4 ALS
- ISO/IEC/ITU-T JPEG图像标准：JPEG和JPEG-LS
- SMPTE视频标准：VC-1（也称作WMV3）, VC-3（也称作AVID DNxHD）和DPX图像
- SMPTE音频标准：SMPTE 302M
- DVD论坛的相关标准 / 杜比实验室的音频编解码器：MLP（也称TrueHD）和AC-3
- 3GPP音频编码器标准：AMR-NB, AMR-WB（也叫G.722.2）
- GSM相关的语音信号编解码器：Full Rate
- Windows Media Player相关的视频编解码器：Microsoft RLE, Microsoft Video 1, Cinepak, Indeo 2, 3和5, Motion JPEG, Microsoft MPEG-4 v1, v2和v3, WMV1, WMV2 and WMV3（也称VC-1）
- Windows Media Player相关的音频编解码器：WMA1, WMA2和WMA Pro
- Windows Media Player相关的语音信号编解码器：WMA Voice和MS-GSM
- RealPlayer相关的视频编解码器：RealVideo 1, 2, 3和4
- RealPlayer相关的音频编解码器：RealAudio 3, 6, 7, 8, 9和10
- RealPlayer相关的语音信号编解码器：RealAudio 1, 2 (G.728的衍生), 4和5
- QuickTime相关的视频编解码器：Cinepak, Motion JPEG和Sorenson 3 Codec
- QuickTime相关的音频编解码器：QDesign音乐编解码器2和ALAC
- Adobe Flash Player相关的视频编解码器：Sorenson 3 Codec, VP6和Flash Video (FLV)
- Adobe Flash Player相关的音频编解码器：Adobe SWF ADPCM和Nellymoser Asao
- Xiph.Org: Theora, Speex（通过libspeex实现）, Vorbis和FLAC
- Sony: ATRAC1和ATRAC3
- NTT: TwinVQ
- On2: Duck TrueMotion 1, Duck TrueMotion 2, VP3, VP5, VP6和VP8
- RAD Game Tools: Smacker video和Bink video
- Truespeech
- RenderWare: TXD

The default MPEG-4 codec used by FFmpegs the FourCC of FMP4.

### 输出格式

- AIFF
- ASF
- AVI
- AVIF
- BFI
- CAF
- FLV
- GIF
- GXF, General eXchange Format, SMPTE 360M
- HLS, HTTP Live Streaming
- IFF
- ISO base media file format（包括QuickTime, 3GP和MP4）
- M2V
- Matroska（包括WebM）
- Maxis XA
- MPEG-DASH
- MPEG program stream
- MPEG transport stream（包括 AVCHD）
- MXF, Material eXchange Format, SMPTE 377M
- MSN Webcam stream
- NUT
- Ogg
- OMA
- RL2
- Segment, for creating segmented video streams
- Smooth Streaming
- TXD
- WTV

### 协议

- IETF标准：TCP, UDP, Gopher, HTTP, RTP, RTSP和SDP
- 苹果公司的相关标准：HTTP Live Streaming
- RealMedia的相关标准：RealMedia RTSP/RDT
- Adobe的相关标准：RTMP, RTMPT（由librtmp实现），RTMPE（由librtmp实现），RTMPTE（由librtmp）和RTMPS（由librtmp实现）
- 微软的相关标准：MMS在TCP上和MMS在HTTP上

## 社区内部问题

2011年1月19日，FFmpeg的现任维护者Michael Niedermayer在邮件列表上披露，FFmpeg发生了“政变”，一些开发者占领了官方网站，关闭了其他人的写入权限。随后政变者宣布FFmpeg “建立新政权”，维护任务将由他们接手，宣称只有维护团队才能拥有主源码库的写入权限。

“新内阁”成员之一的Diego Biurrun解释了他们的行动，称“政变”是迫不得已，表示他们原本想联络每一个开发者，但没成功，因为不是每个人都在IRC上，或者能及时回电话、邮件或短信。“革命”的原因是为了统一，FFmpeg社区分裂的情况严重到他们已经看不下去了。他们期望FFmpeg项目能建立一个健康而友好的开发环境。

随后Fabrice Bellard等人于2011年3月13日跳出去开新专案，称作Libav，Libav里面每位成员的管理权限缩更小（至少不能任意关闭其他人更改程式码权限）。而Debian也响应，宣布2012年要将ffmpeg指令改成avconv。

Libav跳槽之后有一定程度上更改FFmpeg的指令。

## Libav/FFmpeg版权

由于Libav、FFmpeg是在LGPL、GPL下发布的（如果使用了其中一些使用GPL协议发布的模块则必须使用GPL协议），任何人都可以在遵守协议的情况下自由使用。目前有很多播放软件都使用了Libav、FFmpeg的代码，但它们并没有遵守LGPL，GPL协议，没有公开任何源代码。Libav、FFmpeg社区便将这些违反协议的公司、组织、个人的网址贴在“耻辱大厅”（又叫“耻辱柱”）上，并与这些公司/组织/个人商讨如何解决版权争议。

## 基本资料

- 开发者：FFmpeg team
- 发行日期：2000年12月20日，2000年12月20日
- 作者：Fabrice Bellard