FFmpeg

**FFmpeg** 是一個開放原始碼的自由軟體，可以執行音訊和視訊多種格式的錄影、轉檔、串流功能，包含了 libavcodec—— 這是一個用於多個專案中音訊和視訊的解碼器函式庫，以及 libavformat—— 一個音訊與視訊格式轉換函式庫。

「FFmpeg」這個單詞中的「FF」指的是「Fast Forward（快速前進）」。「FFmpeg」的專案負責人在一封回信中說：「Just for the record, the original meaning of "FF" in FFmpeg is "Fast Forward"...」

這個專案最初是由法國程式設計師法布里斯・貝拉（Fabrice Bellard）發起的，而現在是由邁克爾・尼德梅爾（Michael Niedermayer）在進行維護。許多 FFmpeg 的開發者同時也是 MPlayer 專案的成員，FFmpeg 在 MPlayer 專案中是被設計為伺服器版本進行開發。

2011 年 3 月 13 日，FFmpeg 部分開發人士決定另組 Libav，同時制定了一套關於專案繼續發展和維護的規則。

## 組成元件

此計劃由幾個元件組成：

* 命令列應用程式
  * _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
* 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 社區便將這些違反協定的公司、組織、個人的網址貼在「恥辱大廳」（又叫「恥辱柱」）上，並與這些公司 / 組織 / 個人商討如何解決著作權爭議。

## 參考資料

## 參見

* 影片轉換

## 外部連結

* 官方網站