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