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和FAAC的两个外部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- NUTNUT
*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社区便将这些违反协议的公司、组织、个人的网址贴在“耻辱大厅”（又叫“耻辱柱”）上，并与这些公司/组织/个人商讨如何解决版权争议。

**参考资料**

**参见**
 影片转换