FFmpeg
簡介與其他資料:
- http://www.mobile01.com/topicdetail.php?f=510&t=3734550
FFmpeg 常用選項功能說明
由於 FFmpe 功能太龐大了,
所以以下只節錄一些常用選項的說明,
如果需要更詳細的說明,請查詢 ffmpeg Documentation。
基本用法
取得輸入檔案資訊
如果你要取得輸入檔案資訊,可以使用以下命令:
ffmpeg -hide_banner -i 輸入檔案
※-hide_banner 可以隱藏不必要的多餘訊息
輸入/輸出設定
基本規則:
ffmpeg [選項] [[輸入選項] -i 輸入檔案]... {[輸出選項] 輸出檔案}...
部分選項可以用來作為輸入設定,也可以作為輸出設定
位於 -i 輸入檔案 之前則為 輸入檔案 的輸入設定,位於 輸出檔案 之前則為輸出設定
-c[:串流說明符] 編解碼器 (輸入, 輸出)
-f 多工(解訊)器 (輸入, 輸出)
所在位置會影響它們的功能:
ffmpeg -hide_banner -c:v 視訊解碼器 -c:a 音訊解碼器 -f 多工解訊器 -i 輸入檔 -c:v 視訊編碼器 -c:a 音訊編碼器 -f 多工器 輸出檔
通常不需要手動指定 解碼器 (Decoder)、多工解訊器 (Demuxer),因為 ffmpeg 會依輸入自動判斷
也不需要手動指定 多工器 (Muxer),ffmpeg 會依輸出副檔名自動判斷
額外的函式庫 (External Libraries)
如果你需要的 Codec 名稱是 lib 開頭
必須確認 ffmpeg 是否有所需的 lib,以 FDK AAC 為例
ffmpeg -version
檢查 configuration 裡是否有 --enable-libfdk-aac

依此類推, x264 編碼器,就是 --enable-libx264
串流選取 (Stream selection)
ffmpeg 提供 `-map` 選項對於手動挑選每個輸出檔案的串流,若不使用 `-map` 將讓 ffmpeg 自動挑選輸入串流。使用 `-vn`, `-an`, `-sn`, `-dn` 來掠過視訊 (Video)、音訊 (Audio)、字幕 (Subtitle)、資料 (Data) 串流,無論是手動映射或是自動選擇,除了複雜過濾器流程圖的輸出串流。
自動挑選
如果對於輸出沒有使用任何映射選項,ffmpeg 會檢查輸出檔案格式所能封裝的串流類型,即:視訊 (Video)、音訊 (Audio)、字幕 (Subtitle)。對於每一種可接受的串流類型,ffmpeg 將從所有串流中選擇一個可用的。根據以下規則挑選串流:對於視訊,解析度較高者;對於音訊,聲道數量較多者;對於字幕,順位較高者。
手動挑選
當使用 `-map` 選項輸出檔案將只包含使用者映射的串流,除了複雜過濾器流程圖的輸出串流。
-map 詳細說明請見以下連結:
http://www.mobile01.com/topicdetail.php?f=510&t=4200388
過濾器流程圖 (Filter Graphs)
過濾器流程圖 (Filter Graphs) 是用來描述使用過濾器組、參數設定、處理流程。用於 `-vf`,`-af`, `-filter`, `-filter_complex` 選項的引數 (例如 `-filter:v filtergraphs`)。Filter Graphs 有基本型與複雜型兩種形式,對於多進一出或一近多出等這類輸入與輸出串流數量不同的過濾器僅能用在複雜型,例如 `overlay` 是將一個輸入影像與另一個輸入影像重疊合成一個影像輸出。
過濾器流程圖詳細說明請見以下連結:
https://www.mobile01.com/topicdetail.php?f=510&t=5024356
選項 (Options)
串流說明符 (Stream specifiers)
有些選項應用於每個串流,例如位元率或編解碼器。串流說明符被用來精準的指定一個給定的選項屬於哪些串流。
串流說明符可用下列組合:
串流索引
匹配串流的索引。例如 "1" 即代表第2個串流。
串流類型
匹配串流的類型。例如 "a" 為音訊串流。
可用類型: v, a, s, d, t.
即: 視訊 (Video), 音訊 (Audio), 字幕 (Subtitle), 資料 (Data), 附件 (Attachment).
串流類型:串流索引
匹配相同的類型與索引,索引起始值為 0。例如 "a:2" 為第二個音訊串流。
第3輸出軌的位元率為 640kbps:
-b:2 640k
所有輸出音軌使用 libfdk_aac 重新編碼:
-codec:a libfdk_aac
第2輸出音軌使用混合為6聲道:
-ac:a:1 6
一般選項 (Generic options)
常用選項:
-L
授權條款
-h, -?, -help, --help [參數]
顯示說明,如果沒有參數則顯示基本說明。
可用參數如下:
long
顯示更多選項。
full
顯示全部選項 (包括所有格式和編解碼器特定的選項。
decoder=解碼器名稱
顯示指定解碼器 (Decoder) 訊息。
encoder=編碼器名稱
顯示指定編碼器 (Encoder) 訊息。
demuxer=多工解訊器名稱
顯示指定多工解訊器 (Demuxer) 訊息。
muxer=多工器名稱
顯示指定多工器 (Muxer) 訊息。
filter=篩選器名稱
顯示指定篩選器 (Filter) 訊息。
-version
顯示版本訊息。
-formats
列出可用檔案格式。
-codecs
列出可用的編解碼器。
-decoders
列出可用的解碼器。
-encoders
列出可用的編碼器。
-bsfs
列出可用的位元流篩選器。
-protocols
列出可用的協議。
-filters
列出可用的篩選器。
-pix_fmts
列出可用的像素格式。
-sample_fmts
列出可用的取樣格式。
-colors
列出認可的顏色名稱。
-loglevel, -v [repeat+]日誌等級
設定日誌等級。
日誌等級:
quiet, -8
不顯示任何訊息。
panic, 0
只顯示可能導致程式崩潰的致命錯誤訊息。
fatal, 8
只顯示致命錯誤訊息。
error, 16
顯示全部錯誤訊息。
warning, 24
只顯示致命警告與錯誤訊息。
info, 32
在處理期間顯示資訊訊息。
verbose, 40
與 info 相似,但更加冗長。
debug, 48
顯示任何訊息。
-report
傾印完整命列與控制台輸出至目前目錄下一個名為 program-YYYYMMDD-HHMMSS.log 的檔案。
與 -loglevel verbose 相同詳細程度等級。
-hide_banner
所有FFmpeg的工具通常會顯示版權聲明,建置(build)選項和程式庫(library)版本。這個選項可以用來隱藏這些訊息。
主要選項 (Main options)
常用選項:
-f 多工解訊器 或 多工器 (輸出/輸入)
設定多工(解訊)器。
通常不需要用到此選項,因為 ffmpeg 會依據輸出/入副檔名自動判斷。
可用檔案格式表單 見 -fromats
-codec[:串流說明符] 編解碼器 (輸出/輸入,每個串流)
-c[:串流說明符] 編解碼器 (輸出/輸入,每個串流)
設定編解碼器 (Codec)。"copy" 為複製串流。
編解碼器表單 見 -encoders, -decoders
編解碼器說明 見 -h encoder=編碼器名稱, -h decoder=解碼器名稱
-i 檔案 (輸入)
設定輸入檔案。
-y (全域)
當輸出檔案存在時,不詢問是否覆蓋,直接覆蓋輸出檔。
-n (全域)
當輸出檔案存在時,不詢問是否覆蓋,直接結束離開。
-ss 時間碼 (輸出/輸入)
選項為指定開時時間。時間碼格式為 六十進位 (hh:mm:ss[.xxx]) 或秒數。
當作為輸入選項(位於 -i 之前)時,將會定位/跳轉(seek)到指定時間點並歸零的當前時間戳記。
當作為輸出選項(位於 -i 之後)時,將會將會從頭開始解碼(並丟棄)到達指定時間點。
-t 時間碼 (輸出/輸入)
選項為指定持續時間。時間碼格式為 六十進位 (hh:mm:ss[.xxx]) 或秒數。
-to 時間碼 (輸出/輸入)
在此時間點停止寫入輸出。時間碼格式為 六十進位 (hh:mm:ss[.xxx]) 或秒數。
-frames[:串流說明符] 數量 (輸出)
在達到指定的格(框)數量後停止寫入串流。
-filter[:串流說明符] filtergraph (輸出, 每個串流)
設定篩選器 (filter)。
-filter_complex filtergraph (輸出, 每個串流)
定義一個複雜的 filtergraph,即具有任意輸出/入數量。
-filter_script[:串流說明符] 檔案名稱 (輸出, 每個串流)
類似 -filter,將 filtergraph 另存為一個純文字文件,可以使用此選向來讀取它。
-filter_complex_script 檔案名稱 (輸出, 每個串流)
類似 -filter_complex,將 filtergraph 另存為一個純文字文件,可以使用此選向來讀取它。
filtergraph 說明:
http://www.mobile01.com/topicdetail.php?f=510&t=5024356
常用篩選器 (Audio Filters):
http://www.mobile01.com/topicdetail.php?f=510&t=5026848
-target 類型 (輸出)
指定目標檔案類型。
'vcd, svcd, dvd, dv, dv50'
而類型可帶以下這些前輟,來使用相對應的標準。
'ntsc-, pal-, film-'
全部的輸出格式選項 (解析度、畫格速率、編碼參數、位元率、緩衝) 將被自動設定為符合指定的類型。
例如 NTSC DVD-Video
ffmpeg -i input.mkv -target ntsc-dvd output.mpg
音訊選項 (Audio options)
常用選項:
-an (輸入, 輸出)
禁用音訊輸出/入。
-aframes 數量 (輸出)
設定音訊框的輸出數量。與 -frames:a 相同。
-acodec 音訊編碼器 (輸出)
設定音訊編碼器。與 -codec:a 相同。
-ar[:串流說明符] 頻率 (輸出/輸入,每個串流)
重新取樣 (resample) 音訊,單位為 Hz。重新取樣成 48kHz: -ar 48000
需要詳細設定請改用 aresample filter。
-ac[:串流說明符] 聲道數 (輸出/輸入,每個串流)
縮混 (downmix) 音訊的聲道。例如 5.1 -ac 6 。需要詳細設定請改用 pan filter。
可用值: 0, 1, 2, 4, 5, 6, 8
-async 每秒取樣數量 (輸出)
音訊同步方法。"伸展/擠壓"音訊串流去匹配時間戳記 (TimeStamp),該參數是音訊每秒最大的改變取樣。-async 1 是一個特殊的 case 只會校正音訊串流的開頭而之後的都不會。預設值是 0,因此不會做處裡。
此選項已被棄用。使用 aresample filter 代替。
-af filtergraph (輸出)
設定音訊篩選器 (audio filter)。與 -filter:a 相同。
視訊選項 (Video options)
常用選項:
-vn (輸入, 輸出)
禁用視訊輸出。
-vframes 數量 (輸出)
設定畫格的輸出數量。與 -frames:v 相同。
-vcodec 視訊編碼器 (輸出)
設定視訊編碼器。與 -codec:v 相同。
-r[:串流說明符] 畫格率 (輸入/輸出, 每個串流)
設定視訊的畫格率 (frame rate,單位為 Hz 或 fps,分數 或 縮寫)。
例如: -r 23.976 或 -r 24000/1001
-s[:串流說明符] WxH (輸入/輸出, 每個串流)
設定畫格大小。
例如: -s 1280x720
-aspect[:串流說明符] 比例 (輸出, 每個串流)
設定視訊的顯示寬高比。需要詳細設定請改用 setdar 或 stesar filter。
例如: -aspect 1.77778 或 -aspect 16:9
-vsync 參數
視訊同步方法。
參數:
0, passthrough
不改變畫格的時間戳記。
1, cfr
複製畫格或刪除畫格,使輸出為 恆定畫格率 (CFR)。
2, vfr
不改變畫格的時間戳記,但移除重複時間戳記的畫格。
drop
破壞原本的時間戳記,以指定的 fps 為基礎產生新的時間戳記。
-1, auto
根據 muxer 自動選擇 1 或 2。
-vf filtergraph (輸出)
設定視訊篩選器 (video filter)。與 -filter:v 相同。
字幕選項 (Subtitle options)
常用選項:
-sn (輸入/輸出)
禁用字幕輸出/入。
-scodec 字幕格式 (輸出)
設定字幕格式 (Subtitle Format)。"copy" 為複製字幕串流。
此選項已過於老舊,建議改用新選項 -codec/-c
編解碼器選項 (Codec options)
如果要精準的指定一個給定的選項屬於哪些串流,
下列全部選項皆可以使用串流說明符。
規則:
-選項名[:串流說明符] [設定值]
例如: 設定全部音訊串流皆轉換為 AC3 640kbps
ffmpeg -i input.mkv -c:v copy -c:a ac3 -b:a 640k output.mkv
選項必須是被編碼器所支援的才可使用,
使用 "-h encoder=編碼器名稱" 來檢視編碼器所支援的全部編碼選項,或是參考下列連結:
常用編碼器:
http://www.mobile01.com/topicdetail.php?f=510&t=5026848
常用選項:
flags 旗標 (編/解碼, 音訊, 視訊, 字幕)
設定要使用(+旗標名稱)或禁用(-旗標名稱)的旗標
例如使用 ilme 與 ildct 旗標: "-flags ilme+ildct"
b 位元率 (編碼, 視訊, 音訊)
設定串流的位元率 (bitrate),單位為 位元/秒 (bps, bits/sec)。
例如設定為 640kbps,設定值即 640k 或 640000
qscale 品質 (編碼, 視訊, 音訊)
q 品質 (輸出, 每個串流)
設定串流品質 (Variable Bit Rate 模式)。
用法見該編碼器說明。
profile profile (編碼, 視訊, 音訊)
設定輸出串流的 Profile。
preset preset (編碼, 視訊, 音訊)
選擇一組預設參數。
minrate 位元率 (編碼,視訊,音訊)
設定最小流量容許值 (每秒位元)。用處不多,最大用處是用來建立 CBR 編碼。
例如設定為 640kbps,設定值即 640k 或 640000
maxrate 位元率 (編碼, 視訊, 音訊)
設定最大流量容許值 (每秒位元)。bufsize 需要被設定。
例如設定為 640kbps,設定值即 640k 或 640000
bufsize 位元值 (編碼, 視訊, 音訊)
設定流量控制緩衝區大小 (位元)。
例如設定為 640kbits,設定值即 640k 或 640000
level 等級 (編碼, 視訊, 音訊)
設定輸出編碼等級。
pix_fmt 格式 (編碼, 視訊)
轉換像素格式。
像素格式表單 見 -pix_fmts
keyint_min 整數 (編碼, 視訊)
設定 GOP 最小值, 即 IDR-frames (keyframes) 最短間格。
g 整數 (編碼, 視訊)
設定 GOP 最大值,即 IDR-frames (keyframes) 最長間格。
refs 整數 (編碼, 視訊)
設定參考畫格數 (reference frames)。
bf 整數 (編碼, 視訊)
設定 B-Frames 最大連續數量。
cutoff 整數 (編碼, 音訊)
設定截止頻寬。這將會過濾掉高於設定值的頻率。