[FFmpeg] 基本說明檔
===
# 基本用法
基本規則:
```powershell
ffmpeg [OPTIONS] [[INPUT_OPTIONS] -i INPUT]... [[OUTPUT_OPTIONS] OUTPUT]...
```
### 選項
選項由 `-` 接著名稱組成,例如 `-help`;如果有設定值,後面再接著設定值以空格間隔,例如 `-help full`;與前後其他選項間也以必須空格間格,例如 `-hide_banner -help full`。
### 輸入
使用 `-i` 選項為指定輸入來源。當只有指定輸入時,ffmpeg 將只會取得輸入檔案內容資訊輸出到主控台上,不會進行任何轉換。使用路徑設定值以讀取檔案,若路徑帶有空格必須使用雙引號將它包含著。使用 `-` 為設定值將從管道 (pipeline) 讀取輸入。
**範例:**
使用 `-i` 選項指定輸入為 `input.m2ts` 檔案:
```powershell
ffmpeg -hide_banner -i input.m2ts
```
使用雙引號包含路徑:
```powershell
ffmpeg -i "my video.m2ts"
```
```powershell
ffmpeg -i "D:\my videos\voideo 1.m2ts"
```
### 輸出
使用一個不帶有選項的值作為輸出入。必須指定輸入。使用路徑設定值輸出為檔案,若路徑帶有空格必須使用雙引號將它包含著。使用 `-` 為設定值將輸出到管道 (pipeline)。
**範例:**
M2TS 檔轉 MP4 檔:
```powershell
ffmpeg -i input.m2ts output.mp4
```
### 選項群
全域選項位在任何位置不影響功能,例如 `-hide_banner`。而非全域選項位置,位於輸入之前則應用於輸入,位於輸出之前則應用於輸出,例如 `-c aac` 位於輸入之前代表對輸入應用 `aac` 解碼器 ;位於輸出之前則是對於輸出應用 `aac` 編碼器。
非全域選項的所在位置代表它們應用的對象:
```powershell
ffmpeg [options for input_1] -i input_1 [options for input_2] -i input_2 ... [options for output_1] output_1 [options for output_2] output_2 ...
```
**範例:**
指定 decoder, demuxer, encoder, muxer:
```powershell
ffmpeg -c:v h264 -c:a truehd -f mpeg2ts -i input.m2ts -c:v libx265 -c:a aac -f mp4 output.mp4
```
輸入 `input.m2ts` 應用 `h264`, `truehd` 解碼器以及 `mpeg2ts` 多工解訊器;輸出應用 `libx265`, `aac` 編碼器以及 `mp4` 多工器。在通常情況不需要手動設定選項應用於輸入,因為 ffmpeg 會依輸入自動應用合適的解碼器 (Decoder)、多工解訊器 (Demuxer),也不需要手動指定多工器 (Muxer),ffmpeg 會依輸出副檔名自動判斷。
承上,不手動應用任何選項於輸入:
```powershell
ffmpeg -i input.m2ts -c:v libx265 -c:a aac output.mp4
```
### 額外的函式庫
如果一編解碼器 (Codec) 名稱是 lib 開頭,代表這不是原生功能而是額外的函式庫,例如 x264 在 ffmpeg 中的名稱為 libx264。若要確認 ffmpeg 是否包含此編碼函式庫,使用 `-version` 選項在主控台印上印出建置組態,檢查 `configuration:` 裡是否包含 `--enable-libx264`。
```powershell
ffmpeg -version
```
# 挑選串流
ffmpeg 提供 `-map` 選項對於手動挑選每個輸出檔案的串流,若不使用 `-map` 將讓 ffmpeg 自動挑選輸入串流。使用 `-vn`, `-an`, `-sn`, `-dn`, 來掠過視訊 (Video)、音訊 (Audio)、字幕 (Subtitle)、資料 (Data) 串流,無論是手動映射或是自動選擇,除了複雜篩選器流程圖的輸出串流。
## 自動挑選
如果對於輸出沒有使用任何映射選項,ffmpeg 會檢查輸出檔案格式所能封裝的串流類型,即:視訊 (Video)、音訊 (Audio)、字幕 (Subtitle)。對於每一種可接受的串流類型,ffmpeg 將從所有串流中選擇一個可用的。根據以下規則挑選串流:對於視訊,解析度較高者;對於音訊,聲道數量較多者;對於字幕,順位較高者。
## 手動挑選
當使用 `-map` 選項輸出檔案將只包含使用者映射的串流,除了複雜篩選器流程圖的輸出串流。詳細請見 `-map` 選項說明。
# 篩選器流程圖 (Filter Graphs)
篩選器流程圖 (Filter Graphs) 是用來描述使用篩選器組、參數設定、處理流程。用於 `-vf`,`-af`, `-filter`, `-filter_complex` 選項的引數 (例如 `-filter:v filtergraphs`)。Filter Graphs 有基本型與複雜型兩種形式,對於多進一出或一進多出等這類輸入與輸出串流數量不同的篩選器僅能用在複雜型,例如 `overlay` 是將一個輸入影像與另一個輸入影像重疊合成一個影像輸出。
## 篩選器
`filtergraphs` 中使用篩選器名稱呼叫篩選器,必須是註冊在程式中之一的篩選器類的名稱。篩選器名稱與參數組以 `=` 字元連接組成: `filter_name=arguments` 。若省略 `=arguments` 則全部的參數將應用預設值。
**範例:**
使用 Non-local means 去雜訊全預設值:
```powershell
nlmeans
```
`arguments` 是一個字串,為篩選器的參數(群),由參數設定參數名稱 (`key`) 與 設定值 (`value`) 以 `=` 字元連接組成 `key=value`,若參數使用預設值則可以省略。如果有多個參數設定,需以 `:` 字元區別各個參數設定。如果參數設定按造順序排列,則參數名稱 (`key=`) 可以省略。
規則:
```powershell
key=value:key=value:key=value...
```
```powershell
value:value:value:value...
```
**範例:**
使用 `crop` 篩選器將 1920x1080p 電影裁切黑邊(上下裁切使輸出高度為 800,上裁切為 140):
```text
crop=w=iw:h=800:x=0:y=140
```
以上參數設定也等同下列 (省略參數名):
```text
crop=iw:800:0:140
```
以上參數設定也等同下列 (省略預設值):
```text
crop=h=800:y=140
```
> 註: `crop`/`scale`/`pad` 篩選器其 `w`,`h` 預設值與輸入相同;`x`,`y` 預設值為 0。
## 多重篩選器
一個 Filter Chain 是由一系列的篩選器所組成,每個連接到序列中的前一個。需以 `,` 字元分隔篩選器描述。
規則:
```text
filter_descriptions,filter_descriptions,filter_descriptions...
```
**範例:**
裁切後縮放解析度到 1280x536 並填充黑邊到 16:9:
```text
crop=h=800:y=140,scale=w=1280:h=536,pad=h=720:y=92
```
如果 filtergraphs 中帶有特殊字元(例如 `*` 或 `>`),則必須使用單引號 (`'string'`) 或雙引號 (`"string"`)。如果 filtergraph 含有空格,則只能使用 雙引號。※ Windows 命令提示字元下,單引號最大範圍只能包含參數群,雙引號則是能包含整個篩選器流程圖。
使用單引號包含篩選器參數群:
```text
scale='w=1280:h=trunc(ow/dar/8+0.5)*8',setsar=r=1/1
```
使用雙引號包含整個篩選器流程圖:
```text
"scale = w = 1280 : h = trunc(ow / dar / 8 + 0.5) * 8, setsar= r = 1 / 1"
```
## 複雜型式
在 `filter_name` 之前或 `arguments` 之後可以接著標籤(`[label]`)。允許使用者命名連結標籤並將其與輸出或輸入關聯。複雜形式的 僅能使用在FilterGraphs `-filter_complex` 選項。
複雜型式規則:
```text
[stream_specifiers]filter_chain_1[label_1];[label_1]filter_chain_2[label_2];[label_2]filter_chain_3[label_3]...
```
**範例:**
浮水印、雙聲道 (輸入檔案: #0:影片; #1:圖片檔:
```powershell
[0:v]scale=640:360[base];[1:v]scale=64:64[mark];[base][mark]overlay[vid];[0:a:0]pan=stereo[aud]
```
流程說明: 輸入影片 `0:v` 使用 scale filter 將解析度縮放為 640x360,輸出串流命名為 `base`;輸入圖片 `1:v` 使用 `scale` 篩選器將解析度縮放為 64x64,輸出串流命名為 `mark`,使用 `overlay` 篩選器將 `mark` 覆蓋到 `base` 左上方 (預設座標 (0,0))。輸入音訊 `0:a:0` 縮混為雙聲道 (使用預設值),輸出串流命名為 `aud`。
輸入 96KHz 8ch 轉成 48KHz 5.1ch 與 48KHz 2ch:
```powershell
[0:a:0]aresample=48000:async=1,asplit=2[temp1][temp2];[temp1]pan=5.1[a1];[temp2]pan=stereo[a2]
```
流程說明: 輸入音訊重新取樣成 48KHz 後用 `split` 篩選器分成 (複製出) 兩個一樣 (8ch 48KHz) 的音訊串流分別命名為 `temp1` 與 `temp2`,`temp1` 縮混到 5ch 輸出並重新命名為 `a1`;`temp2` 縮混到 2ch 並重新命名為 `a2`。
**選取標籤**
對於使用標籤重新命之後的串流,還必須使用 `-map '[label]'` 來選取它,若篩選器輸出串流沒有使用(`[label]`)重新命名,則不必使用 `-map` 來選取它。※ Windows 命令提示字元下,必須使用雙引號代替單引號: `-map "[label]"`
**範例:**
將輸入音訊複製一份並重新編碼為 FLAC 與 2ch AAC:
```powershell
-filter_complex "[0:a:0]aresample=48000:async=1,asplit=2[temp1][temp2];[temp1]pan=5.1[a1];[temp2]pan=stereo[a2]" -map "[a1]" -map "[a2]" -c:a:0 flac -c:a:1 aac
```
承上,濾器輸出串流不使用標籤重新命名:
```powershell
-filter_complex "[0:a:0]aresample=48000:async=1,asplit=2[temp1][temp2];[temp1]pan=5.1;[temp2]pan=stereo" -c:a:0 flac -c:a:1 aac
```
## 腳本 (scrip)
以一個純文字文件來包含 FilterGraphs。使用方式:將腳本檔案至於工作目錄下,使用 `-filter_script` 或 `-filter_complex_scrip` 選項,參數為腳本檔名,即可應用此 FilterGraphs。
**範例:**
FilterScript - 1280x720 自動黑邊:
```text
scale='w=min(1280,trunc((720*dar)/2+0.5)*2):h=min(720,trunc((1280/dar)/2+0.5)*2)',
pad='w=1280:h=720:x=(ow-iw)/2:y=(oh-ih)/2',
setsar='sar=1/1'
```
執行 ffmpeg 並套用 `letterbox_1280x720.txt` 腳本:
```powershell
ffmpeg input.mkv -filter_script:v letterbox_1280x720.txt output.mp4
```
# 選項 (Generic options)
## 串流說明符 (Stream specifiers)
有些選項應用於每個串流,例如位元率或編解碼器。串流說明符被用來精準的指定一個給定的選項屬於哪些串流。
串流說明符可用下列組合:
* *串流索引*
匹配串流的索引。起始值為 0。例如 `1` 即代表第2個串流。
* *串流類型*
匹配串流的類型。例如 `a` 為所有音訊串流。
可用類型: `v`, `a`, `s`, `d`, `t`.
即: 視訊 (Video), 音訊 (Audio), 字幕 (Subtitle), 資料 (Data), 附件 (Attachment).
* *串流類型*:*串流索引*
匹配相同的類型與索引,索引起始值為 0。例如 `a:1` 為第二個音訊串流。
**範例:**
輸出視訊 h.264, level 3.0,輸出音訊 aac, 2ch, 256kbps:
```powershell
ffmpeg -i input.mkv -c:v libx264 -level:v 30 -ac 2 -c:a aac -b:a 256k output.mkv
```
由於 `-ac` 為音訊專用選項,所以將它匹配音訊串流(即 `-ac:a`)是不必要的。
輸出串流#0 h.264, level 3.0,輸出串流#1 aac, 256kbps:
```powershell
ffmpeg -i input.mkv -c:0 libx264 -level:0 30 -c:1 aac -b:1 256k output.mkv
```
將輸入影片重新編碼輸出為 MPEG2 480P 4000kbps + AC3 2ch 192 kbps:
```powershell
ffmpeg -i input.m2ts -filter:v scale=720x480 -ac 2 -c:v mpeg2video -c:a ac3 -b:v 4000k -b:a 192k output.mkv
```
## 一般選項 (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=CODEC_NAME`, -`h decoder=CODEC_NAME`
* -i *檔案* (輸入)
設定輸入檔案。
* -y (全域)
當輸出檔案存在時,不詢問是否覆蓋,直接覆蓋輸出檔。
* -n (全域)
當輸出檔案存在時,不詢問是否覆蓋,直接結束離開。
* -dn (輸出/輸入)
禁用輸入或輸出資料 (Data)。
* -ss *時間碼* (輸出/輸入)
選項為指定開時時間。時間碼格式為 六十進位 (hh:mm:ss[.xxx]) 或秒數。
當作為輸入選項(位於 -i 之前)時,將會定位/跳轉(seek)到指定時間點並歸零的當前時間戳記。
當作為輸出選項(位於 -i 之後)時,將會將會從頭開始解碼(並丟棄)到達指定時間點。
* -t *時間碼* (輸出/輸入)
選項為指定持續時間。時間碼格式為 六十進位 (hh:mm:ss[.xxx]) 或秒數。
* -to *時間碼* (輸出/輸入)
在此時間點停止寫入輸出。時間碼格式為 六十進位 (hh:mm:ss[.xxx]) 或秒數。
* -frames[:*串流說明符*] *數量* (輸出)
在達到指定的格(框)數量後停止寫入串流。
* -filter[:*串流說明符*] *篩選器流程圖* (輸出, 每個串流)
設定篩選器。
* -filter_complex *篩選器流程圖* (輸出, 每個串流)
定義一個複雜的篩選器流程圖,即具有任意輸出/入數量。
* -filter_script[:*串流說明符*] *檔案名稱* (輸出, 每個串流)
類似 -filter,將篩選器流程圖另存為一個純文字文件,可以使用此選向來讀取它。
* -filter_complex_script *檔案名稱* (輸出, 每個串流)
類似 `-filter_complex`,將 filtergraph 另存為一個純文字文件,可以使用此選向來讀取它。
* -attach *檔案名稱* (輸出)
加入一個附近至輸出檔案。它被一些檔案格式所支援像是 Matroska。例如用於字幕渲染的字型。附件實現為一個特定類型的串流加入到輸出檔案之中,附件串流將在其他串流之後被建立 (不會受到 `-map` 選項影響)。
* -dump_attachment[:*串流說明符*] *檔案名稱* (輸入, 每個串流)
將匹配的附件串流匯出為指定檔名的檔案。如果檔案名稱為空將使用詮釋資料標籤的值作為檔案名稱。
* -target *類型* (輸出)
指定目標檔案類型。
`vcd`, `svcd`, `dvd`, `dv`, `dv50`
而類型可帶以下這些前輟,來使用相對應的標準。
`ntsc-`, `pal-`, `film-`
全部的輸出格式選項 (解析度、畫格速率、編碼參數、位元率、緩衝) 將被自動設定為符合指定的類型。
**範例:**
例如 NTSC DVD-Video:
```
ffmpeg -i input.mkv -target ntsc-dvd output.mpg
```
## 音訊選項 (Audio options)
**常用選項:**
* -an (輸出/輸入)
禁用輸入或輸出音訊 (Audio)。
* -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` 篩選器代替。
* -af *篩選器流程圖* (輸出)
設定音訊篩選器 (audio filter)。與 `-filter:a` 相同。
## 視訊選項 (Video options)
**常用選項:**
* -vn (輸出/輸入)
禁用輸入或輸出視訊 (Video)。
* -vframes *數量* (輸出)
設定畫格的輸出數量。與 `-frames:v` 相同。
* -vcodec *視訊編碼器* (輸出)
設定視訊編碼器。與 `-codec:v` 相同。
* -r[:*串流說明符*] *畫格率* (輸入/輸出, 每個串流)
設定視訊的畫格率 (frame rate,單位為 Hz 或 fps,分數 或 縮寫)。
例如: `-r 23.976` 或 `-r 24000/1001`
* -fpsmax[:*串流說明符*] *畫格率* (輸出, 每個串流)
設定最大畫格率。當輸出視訊的畫格率是自動且高於此設定值限制輸出畫格率。此選項不能與 `-r` 混用。
* -s[:*串流說明符*] *解析度* (輸入/輸出, 每個串流)
設定畫格大小。
例如: `-s 1280x720`
* -aspect[:*串流說明符*] *比例* (輸出, 每個串流)
設定視訊的顯示寬高比。需要詳細設定請改用 `setdar` 或 `stesar` 篩選器。
例如: `-aspect 1.77778` 或 `-aspect 16:9`, `-aspect 16/9`。
* -vsync *參數*
視訊同步方法。
參數:
* 0, passthrough
不改變畫格的時間戳記。
* 1, cfr
複製畫格或刪除畫格,使輸出為 恆定畫格率 (CFR)。
* 2, vfr
不改變畫格的時間戳記,但移除重複時間戳記的畫格。
* drop
破壞原本的時間戳記,以指定的 fps 為基礎產生新的時間戳記。
* -1, auto
根據 muxer 自動選擇 `1` 或 `2`。
-vf *篩選器流程圖* (輸出)
設定視訊篩選器 (video filter)。與 `-filter:v` 相同。
## 字幕選項 (Subtitle options)
**常用選項:**
* -sn (輸出/輸入)
禁用輸入或輸出字幕 (Subtitle)。
* -scodec *字幕格式* (輸出)
設定字幕格式 (Subtitle Format)。`copy` 為複製字幕串流。
此選項已過於老舊,建議改用新選項 `-codec`, `-c`
## 編解碼器選項 (Codec options)
如果要精準的指定一個給定的選項屬於哪些串流,下列全部選項皆可以使用串流說明符。
規則:
-*選項名*[:*串流說明符*] [*設定值*]
**範例:**
設定全部音訊串流皆轉換為 AC3 640kbps:
```powershell
ffmpeg -i input.mkv -c:v copy -c:a ac3 -b:a 640k output.mkv
```
選項必須是被編碼器所支援的才可使用,
使用 `-h encoder=CODCEC_NAME` 來檢視編碼器所支援的全部編碼選項,或是參考下列連結:
**常用選項:**
* -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 *整數* (編碼, 音訊)
設定截止頻寬。這將會篩選掉高於設定值的頻率。
## 進階選項
* -map [-]*輸入檔案ID*[:*串流說明符*][?][,*同步檔案ID*[:*串流說明符*]] | [*連結標籤*] (輸出)
挑選輸入串流為輸出。使用多個 `-map` 選項來挑選多個串流。允許重複挑選同一個串流。被選中的輸入串流將作為輸出串流,未被選中的串流則會被禁用。挑選的順序將成為輸出串流順序,例如第一個被挑選的串流將成為輸出串流 #0。
**範例:**
假設一影片檔 input.m2ts 內容為:
```text
Input #0, mpegts, from 'input.m2ts':
Stream #0:0: Video: h264
Stream #0:1(jpn): Audio: truehd, 5.1(side)
Stream #0:2(eng): Audio: ac3, stereo
```
手動選取 input.m2ts 的串流:
選擇全部的串流可用 `-map 0`
選擇全部的音訊串流 `-map 0:a`
選擇串流 `#0:0` 可用 `-map 0:0` 或 `-map 0:v` 或 `-map 0:v:0`
選擇串流 `#0:1` 可用 `-map 0:1` 或 `-map 0:a:0` 或 `-map 0:m:language:jpn`
選擇串流 `#0:2` 可用 `-map 0:2` 或 `-map 0:a:1` 或 `-map 0:m:language:eng`
使用 `-map` 替換 input.m2ts 的音訊:
```powershell
-i input.m2ts -i audio_only.m4a -map 0:v -map 1:a
```
使用 `-map` 挑選多個串流其順序將成為輸出串流順序,例如:
```powershell
-map 0:0 -map 0:1 -map 0:2 -map 0:1
```
以上設定也等同:
```powershell
-map 0:v -map 0:a -map 0:a:0
```
則輸出與輸入串流的關係如下:
輸出 #0 = 輸入 #0:0 (Video: h264)
輸出 #1 = 輸入 #0:1 (Audio: truehd)
輸出 #2 = 輸入 #0:2 (Audio: ac3)
輸出 #3 = 輸入 #0:1 (Audio: truehd)
匹配輸出串流:
匹配 #0 可用 `0` 或 `v` 或 `v:0`
匹配 #1 可用 `1` 或 `a:0`
匹配 #2 可用 `2` 或 `a:1`
匹配 #3 可用 `3` 或 `a:2`
匹配 #1 與 #2 與 #3 可用 `a`
承上,若要將輸出串流 #3 重新編碼為 aac, 2ch, 128kbps:
```powershell
-ac:3 2 -c:3 aac -b:3 128k
```
```powershell
-ac:a:2 2 -c:a:2 aac -b:a:2 128k
```
# 音訊編碼器 (Audio Encoders)
以下編碼器與選項只列出常用部分,詳細說明請參考官網說明文件。
## aac
AAC 音訊編碼器。此為實驗項目,必須使用 `-strict experimental` 解鎖。
**常用選項:**
* -strict experimental
解鎖實驗項目所必須。
* -qscale[:*串流說明符*] *品質*
-q[:串流說明符] *品質*
設定音訊品質 (Variable Bit Rate 模式)。實驗項目,需要 `-strict experimental`
範圍為 0.1 - 10。VBR 是實驗性質的可能會產生比 CBR 更糟的結果。
* -ab *位元率* (輸出)
-b[:*串流說明符*] *位元率*
設定音訊位元率 (Available Bit Rate 模式)。
單位為 位元/秒 (bps, bits/sec)。
## ac3, ac3_fixed
AC3 音訊編碼器。
**常用選項:**
* -ab *位元率*
-b[:*串流說明符*] *位元率*
設定音訊位元率 (Available Bit Rate 模式)。
單位為 位元/秒 (bps, bits/sec)。
## dca
DTS 音訊編碼器。此為實驗項目,必須使用 `-strict experimental` 解鎖。
**常用選項:**
* -strict experimental
解鎖實驗項目,必須。
* -profile[:*串流說明符*] *Profile*
設定音訊 Profile。它接受下列值之一:
* ‘dts’
DTS
* ‘dts_es’
DTS-ES
* ‘dts_96_24’
DTS 96/24
* ‘dts_hd_hra’
DTS-HD High Resolution Audio
* ‘dts_hd_ma’
DTS-HD Master Audio
## vorbis
Vorbis 音訊編碼器。
**常用選項:**
* -ab *位元率*
-b[:*串流說明符*] *位元率*
設定音訊位元率 (Available Bit Rate 模式)。
單位為 位元/秒 (bps, bits/sec)。
## alac
ALAC 無損音訊編碼器。
**常用選項:**
* -compression_level[:*串流說明符*] *等級*
設定演算法複雜度。範圍為 0 - 3。0 為最高速度編碼,但檔案較大,3 為最慢編碼但檔案最小。預設值為 3
## flac
FLAC 無損音訊編碼器。
**常用選項:**
* -compression_level[:*串流說明符*] *等級*
設定演算法複雜度。範圍為 0 - 12。0 為最高速度編碼,但檔案較大,12 為最慢編碼但檔案最小。預設值為 5
## libfdk_aac
AAC 音訊編碼器 - FDK。此為額外的編碼函式庫,要使用此編碼器請確認建置組態必需含有 `-enable-libfdk-aac`,或是使用 `-encoders` 查詢編碼器名稱。
**常用選項:**
* -ab *位元率*
-b[:*串流說明符*] *位元率*
設定音訊位元率 (Available Bit Rate 模式)。
單位為 位元/秒 (bps, bits/sec)。
如果使用了 VBR 編碼,此選項會被忽略。
* -vbr[:*串流說明符*] *品質*
設定音訊品質 (Variable Bit Rate 模式)。
範圍為 1 - 5,5 為最高品質。
目前,只有 `aac_low` 與 `aac_he` Profile 支援 VBR 編碼。
* -profile[:*串流說明符*] *Profile*
設定音訊 Profile。它接受下列值之一:
* ‘aac_low’
MPEG-4 AAC LC (default)
* ‘aac_he’
MPEG-4 HE-AAC (SBR)
* ‘aac_he_v2’
MPEG-4 HE-AAC v2 (SBR+PS)
* ‘aac_ld’
MPEG-4 AAC LD
* ‘aac_eld’
MPEG-4 AAC ELD
## libopus
Opus 音訊編碼器。此為額外的編碼函式庫,要使用此編碼器請確認建置組態必需含有 `-enable-libopus`,或是使用 `-encoders` 查詢編碼器名稱。
**常用選項:**
* -ab *位元率* (輸出)
-b[:串流說明符] *位元率*
設定音訊位元率 (Available Bit Rate 模式)。
單位為 位元/秒 (bps, bits/sec)。
* -vbr[:*串流說明符*] *模式*
設定 VBR 模式。它接受下列值之一:
* ‘off’
不使用 VBR 模式,即 CBR 模式。
* ‘on’
使用 VBR 模式。
* ‘constrained’
使用 CVBR 模式。
* -compression_level[:*串流說明符*] *等級*
設定演算法複雜度。範圍為 0–10。0 為最高速度編碼,但品質較低,10 為最慢編碼但品質最高。預設值為 10
## libvorbis
Vorbis 音訊編碼器。此為額外的編碼函式庫,要使用此編碼器請確認建置組態必需含有 `-enable-libvorbis`,或是使用 `-encoders` 查詢編碼器名稱。
**常用選項:**
* -qscale[:*串流說明符*] *品質*
-q[:串流說明符] *品質*
設定音訊品質 (Variable Bit Rate 模式)。
範圍為 0 - 10,10 為最高品質。3–6 是好的嘗試範圍。預設值為 3。
* -ab *位元率*
* -b[:*串流說明符*] *位元率*
設定音訊位元率 (Available Bit Rate 模式)。
單位為 位元/秒 (bps, bits/sec)。
## libmp3lame
MP3 音訊編碼器 - LAME。此為額外的編碼函式庫,要使用此編碼器請確認建置組態必需含有 `-enable-libmp3lame`,或是使用 `-encoders` 查詢編碼器名稱。
**常用選項:**
* -ab *位元率*
-b[:串流說明符] *位元率*
設定音訊位元率 (ABR 或 CBR 模式)。
如果使用了 VBR 編碼,此選項會被忽略。
* -abr[:*串流說明符*] 1
使用 ABR 編碼模式於。FFmpeg 依賴 `-b:a` 選項來設定位元率。
* -qscale[:*串流說明符*] *品質*
-q[:串流說明符] *品質*
設定音訊品質 (Variable Bit Rate 模式)。
範圍為 0 - 9,0 為最高品質。預設值為 4。
* -compression_level[:*串流說明符*] *等級*
設定演算法複雜度。範圍為 0–9。但品質較低,0 為最慢編碼但品質最高,9 為最高速度編碼。
# 視訊編碼器 (Video Encoders)
以下編碼器與選項只列出常用部分,詳細說明請參考官網說明文件。
## mpeg2video
MPEG-2 視訊編碼器。
**常用選項:**
* -b[:*串流說明符*] *位元率*
設定視訊位元率(1-Pass: ABR, 2-Pass: VBR)。
單位為 位元/秒 (bps, bits/sec)。
* -qscale[:*串流說明符*] *品質*
-q[:串流說明符] *品質*
設定視訊品質 (Variable Bit Rate 模式)。
範圍為 1 - 31,1 為最高品值。
* -maxrate[:*串流說明符*] *位元率*
設定最大流量容許值 (每秒位元),bufsize 需要被設定。
* -bufsize[:*串流說明符*] *位元值*
設定流量控制緩衝區大小 (位元)。
## mpeg4
MPEG-4 part 2 視訊編碼器。
**常用選項:**
* -b[:*串流說明符*] *位元率*
設定視訊位元率(1-Pass: ABR, 2-Pass: VBR)。
單位為 位元/秒 (bps, bits/sec)。
* -qscale[:*串流說明符*] *品質*
-q[:串流說明符] 品質
設定視訊品質 (Variable Bit Rate 模式)。
範圍為 1 - 31,1 為最高品值。
* -maxrate[:*串流說明符*] *位元率*
設定最大流量容許值 (每秒位元),bufsize 需要被設定。
* -bufsize[:*串流說明符*] *位元值*
設定流量控制緩衝區大小 (位元)。
## libxvid
MPEG-4 part 2 視訊編碼器。此為額外的編碼函式庫,要使用此編碼器請確認建置組態必需含有 `-enable-lixvid`,或是使用 `-encoders` 查詢編碼器名稱。
**常用選項:**
* -b[:*串流說明符*] *位元率*
設定視訊位元率(1-Pass: ABR, 2-Pass: VBR)。
單位為 位元/秒 (bps, bits/sec)。
* -qscale[:*串流說明符*] *品質*
-q[:串流說明符] *品質*
設定視訊品質 (Variable Bit Rate 模式)。
範圍為 1–31,1 為最高品值。
* -maxrate[:*串流說明符*] *位元率*
設定最大流量容許值 (每秒位元),bufsize 需要被設定。
* -bufsize[:*串流說明符*] *位元值*
設定流量控制緩衝區大小 (位元)。
## libvpx, libvpx-vp9
VP8 / VP9 視訊編碼器。此為額外的編碼函式庫,要使用此編碼器請確認建置組態必需含有 `-enable-libvpx`,或是使用 `-encoders` 查詢編碼器名稱。
**常用選項:**
* -b[:*串流說明符*] *位元率*
設定視訊位元率。
單位為 位元/秒 (bps, bits/sec)。
* -crf *設定值*
即 vpxenc 的 CQ 位元率控制模式。設定視訊品質 (Variable Bit Rate 模式)。
設定值範圍: vp8: 4 - 63, vp9: -1 - 63。設定值越低則輸出品質越高。
將位元率設為 0 (-b:v 0),將確保每個畫格 (frames) 所分配到的位元數足以達到一個恆定 (感官) 品質等級。若位元率不為 0,將確保一個恆定(感官)品質,並保值輸出位元率不超過設定位元率。
https://trac.ffmpeg.org/wiki/Encode/VP9#constantq
* -speed[:*串流說明符*] *設定值*
設定 品質/速度比。比較高的值以品質為代價提升編碼速度。
設定值範圍: vp8: -16 - 16, vp9: -8 - 8
* -lossless 1
啟用無損編碼模式。
## libx264, libx264rgb
MPEG-4 AVC / H.264 視訊編碼器。此為額外的編碼函式庫,要使用此編碼器請確認建置組態必需含有 `-enable-libx264`,或是使用 `-encoders` 查詢編碼器名稱。
**常用選項:**
* -b[:*串流說明符*] *位元率*
設定視訊位元率。
單位為 位元/秒 (bps, bits/sec)。
* -crf[:*串流說明符*] *設定值*
設定恆定品質模式 (constant quality mode) 的品質。
範圍為 0 – 51.0,0 為最高品質。建議使用 18 - 26。預設值為 23
* -qp[:*串流說明符*] *設定值*
設定恆定量化率方法 (constant quantization rate control method) 參數。
範圍為 0 – 69,0 為最高品質 (無損)。建議使用 21 - 28。預設值為 23
* -profile[:*串流說明符*] *Profile*
選擇視訊 Profile。它接受下列值之一:
以下為可用值:
* ‘baseline’
Baseline Profile (BP)
* ‘main’
Main Profile (MP)
* ‘high’
High Profile (HiP)
* ‘high10’
High 10 Profile (Hi10P)
* ‘high422’
High 4:2:2 Profile (Hi422P)
* ‘high444’
High 4:4:4 Predictive Profile (Hi444PP)
* -preset[:*串流說明符*] *Preset*
平衡壓縮效率和編碼速度,速度越慢則效率 (畫質-位元率比) 越高。
可用值: 0 - 9 或 ‘ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow, placebo’。
* -tune[:*串流說明符*] *Tune*
最佳化編碼效果。
它接受下列值之一:
* ‘film’
電影 (膠片電影)。
* ‘animation’
動畫。例如卡通/日本動畫。
* ‘grain’
膠片顆粒。顆粒感很重的影片。
* ‘stillimage’
靜止影像。例如幻燈片效果的影片。
* ‘psnr’
優化 PSNR 值。
* ‘ssim’
優化 SSIM 值。
* ‘fastdecode’
快速解碼。用於低性能播放設備。
* ‘zerolatency’
零延遲。處裡時間低延遲。主要用於直播等。
* -refs[:*串流說明符*] *數量*
設定參考畫格最大數量。
* -bf[:*串流說明符*] *數量*
設定 B-Frame 最大連續數量。
* -maxrate[:*串流說明符*] *位元率*
設定最大流量容許值 (每秒位元),bufsize 需要被設定。
* -bufsize[:*串流說明符*] *位元值*
設定流量控制緩衝區大小 (位元)。
* -fastfirstpass *參數*
可用值:
* 0
不加速首次編碼。
* 1
加速首次編碼。
* -x264opts[:*串流說明符*] *組態*
-x264-params[:*串流說明符*] *組態*
設定任何 x264 選項,見 `x264 --fullhelp`
規則:
```powershell
[key[=value]][:key[=value]][:key[=value]]...
```
**範例:**
```powershell
-x264-params level=30:bframes=0:weightp=0:cabac=0:ref=1:vbv-maxrate=768:vbv-bufsize=2000:analyse=all:me=umh:no-fast-pskip=1:subq=6:8x8dct=0:trellis=0
```
## libx265
MPEG-H HEVC / H.265 視訊編碼器。此為額外的編碼函式庫,要使用此編碼器請確認建置組態必需含有 `-enable-libx265`,或是使用 `-encoders` 查詢編碼器名稱。
**常用選項:**
* -b[:*串流說明符*] *位元率*
設定視訊位元率。
單位為 位元/秒 (bps, bits/sec)。
* -crf[:*串流說明符*] *設定值*
設定恆定品質模式 (constant quality mode) 的品質。
範圍為 0 – 51.0,0 為最高品質。建議使用 18 - 26。預設值為 23
* -preset[:*串流說明符*] *Preset*
平衡壓縮效率和編碼速度,速度越慢則效率 (畫質-位元率比) 越高。
可用值: 0 - 9 或 ‘ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow, placebo’。
* -tune[:*串流說明符*] *Tune*
最佳化編碼效果。
* -x265-params[:*串流說明符*] *組態*
設定任何 x265 選項,見 `x265 --help`。規則同 `x264opts`。
# 音訊篩選器 (Audio Filters)
以下篩選器、選項、參數、常數只有列出常用部分,完整說明請見官網說明文件。
## volume
調整音量。預設值為 1.0。
輸入輸出音量關係公式:
輸出音量 = 音量 * 輸入音量
**範例:**
音量減半:
```powershell
volume=0.5
```
```powershell
volume=1/2
```
```powershell
volume=-6.0206dB
```
## loudnorm
EBU R128 音量正常化。包含線性與動態正常化雙模式。具有動態與線性正常化模式。支援單一階段與二階段處裡雙模式。在動態模式下,為了準確檢測真實峰值,音訊串流將被向上取樣到 192 kHz,可用 `-ar` 選項或 `aresample` 篩選器來明確設定一個輸出取樣率。
**參數:**
* I, i
設定綜合響度 (Integrated Loudness) 目標值。範圍為 -70.0 - -5.0。 預設值為 -24.0。
* LRA, lra
設定響度範圍 (Loudness Range) 目標值。範圍為 1.0 - 20.0。預設值為 7.0。
* TP, tp
設定最大真實峰值 (True Peak)。範圍為 -9.0 - +0.0。預設值為 -2.0。
* measured_I, measured_i
測量輸入檔案的 IL。範圍為 -99.0 - +0.0。
* measured_LRA, measured_lra
測量輸入檔案的 LRA。範圍為 0.0 - 99.0。
* measured_TP, measured_tp
測量輸入檔案的真實峰值。範圍為 -99.0 - +99.0。
* measured_thresh
測量輸入檔案的閾值。範圍為 -99.0 - +0.0。
* offset
設定偏移增益。增益應用在真實峰值限制器之前。範圍為 -99.0 - +99.0。 預設值為 +0.0。
* linear
透過線性縮放音源達到正常化。必須指定 `measured_I`, `measured_LRA`, `measured_TP`, `measured_thresh`。目標的 LRA 不應該低於來源的 LRA。並且綜合響度的變化不應該造成真實峰值超過目標 TP。若不滿足以上任一條件,正常化模式將回復為動態。可用值為 `true`, `false`。預設值為 `true`。
* dual_mono
將單聲道輸入檔視為"雙單聲道"。如果要在立體聲系統上播放單聲道,其 EBU R128 測量會感知上不正確。將此選項設定為 `true` 將會補償這種影響。多聲道不受此選項影響可用值為 `true`, `false`。預設值為 `false`。
* print_format
設定列印統計資料的格式。可用值為 `summary`, `json`, `none`。預設值為 `none`。
## lowpass
低通濾波器。
**參數:**
* frequency, f
設定頻率,單位Hz。預設值為 500。
* poles, p
設定階數。預設值為2。
* width_type
設定方法以指定濾波器的帶寬。
* h
Hz
* q
Q-Factor
* o
octave
* s
slope
* width, w
以 width_type 為單位指定一個濾波器帶寬。僅適用雙二階濾波器。預設值為 0.707q 並給予一個 Butterworth 響應。
## aresample
重新取樣輸入的音訊。
**參數:**
* resampler
設定重新取樣引擎。預設值為 `swr`。
它接受下列值之一:
* ‘swr’
選擇原生的 SW Resampler。
* ‘soxr’
選擇SoX Resampler。
* async
只能用於 SWR。簡單的參數 1 使用拉伸、擠壓、填充與修剪音訊串流去匹配時間戳記 (TimeStamp)。設定它為 1 將啟用填充與修剪,較大的數值代表該數據可被拉伸或擠壓的每一秒的取樣最大數量。預設值是 0,因此不會做處裡。
* matrix_encoding
選擇矩陣式立體聲編碼,必須搭配 -ac 選項。
它接受下列值之一:
* ‘none’
無
* ‘dolby’
Dolby
* ‘dplii’
Dolby Pro Logic II
**範例:**
重新取樣為 44.1 KHz:
```powershell
-af aresample=44100
```
重新取樣為 44.1 KHz 以及音訊同步與矩陣編碼
```powershell
-ac 2 -af "aresample='44100:async=1:matrix_encoding=dplii'"
```
## pan
混合聲道與特定增益等級。
參數形式為 `l:outdef:outdef:...`
新版參數形式為 `l|outdef|outdef|...`
**參數:**
* l
為輸出聲道布局或聲道數。
* outdef
為輸出聲道選擇,形式為 `out_name=[gain*]in_name[+[gain*]in_name...]`
* out_name
輸出聲道定義。無論是 聲道名稱 (如: `FL`, `FR`, ...) 或是 聲道編號 (如: `c0`, `c1`, ...)
* gain
聲道的係數。1 為音量不變。
* in_name
輸入聲道使用。見 out_name;它不能夠混用聲道名稱與編號。
假設將 `=` 取代為 `<`,然後該規格的增益將被正規化使總和為 1,以避免雜訊(Clipping Noise)。
**範例:**
調換左右聲道
```powershell
pan='2:FL=FR:FR=FL'
```
5.1 聲道混合為 2.0 聲道
```powershell
pan=stereo: FL < FL + 0.5*FC + 0.6*BL + 0.6*SL : FR < FR + 0.5*FC + 0.6*BR + 0.6*SR
```
完整命令
```powershell
ffmpeg -i input.mkv -af "pan='stereo| FL < FL + 0.5*FC + 0.6*BL + 0.6*SL | FR < FR + 0.5*FC + 0.6*BR + 0.6*SR'" output.mkv
```
## channelsplit
分割來自輸入音訊串流的每個聲道為獨立的輸出串流。
**參數:**
* channel_layout
輸入音訊串流的聲道布局。預設值為 `stereo`。
**範例:**
分割來自輸入音訊串流的立體聲為2個獨立的輸出串流:
```powershell
ffmpeg -i input.m2ts -filter_complex output.mka
```
※如果輸入音訊聲道數大於2,則只會分割左右聲道。
分割來自輸入音訊串流的5.1聲道為6個獨立的輸出串流:
```powershell
ffmpeg -i input.m2ts -filter_complex "channelsplit='channel_layout=5.1'" output.mka
```
分割來自輸入音訊串流的5.1聲道為6個獨立的輸出音訊檔案:
```powershell
ffmpeg -i input.wav -filter_complex "channelsplit='channel_layout=5.1[FL][FR][FC][LFE][SL][SR]'" -map '[FL]' front_left.wav -map '[FR]' front_right.wav -map '[FC]' front_center.wav -map '[LFE]' lfe.wav -map '[SL]' side_left.wav -map '[SR]' side_right.wav
```
## amerge
合併兩個或多個音訊串流為單獨一個的多聲道串流。
**參數:**
* inputs
設定輸入數量。預設值為 2。
假如輸入的聲道聲道布局 (layout) 是不相交的,因此則相容,輸出的聲道布局被相應地設定且聲道會被重新排序為所需。假如輸入的聲道聲道布局 (layout) 不是不相交的,輸出將含有第一個輸入的全部聲道以及第二個輸入的全部聲道,依此規律,且輸出的聲道布局預設值為輸入聲道的總數。
例如,假如第一個輸入是 2.1 (FL+FR+LF) 且第二個輸入是 FC+BL+BR,則輸出為 5.1,聲道為以下順序: a1, a2, b1, a3, b2, b3 (a1 為第一個輸入的第一個聲道,b1 為第一個輸入的第一個聲道)。
另一方面,如果兩個輸入都是立體聲 (FL+FR),輸出聲道將會被排序為預設的順序: a1, a2, b1, b2,且輸出聲道布局將會擅自被設定為 4.0,也許是或也許不是期望值。
# 視訊篩選器 (Video Filters)
以下篩選器、選項、參數、常數只有列出常用部分,完整說明請見官網說明文件。
## crop
裁切輸入視訊的寬高。
**參數:**
* w, out_w
h, out_h
輸出視訊的寬度與高度。預設值為 in_w 與 in_h。
* x
左邊裁切範圍。預設值為 (in_w-out_w)/2
* y
上邊裁切範圍。預設值為 (in_h-out_h)/2
* keep_aspect
如果設定為1將使輸出顯示寬高比與輸入相同,由改變 SAR (sample aspect ratio)。其預設值為 0。
`out_w`, `out_h`, `x`, `y` 參數均包含以下常數:
* ‘in_w, iw’
‘in_h, ih’
輸入高度與寬度。
* ‘out_w, ow’
輸出(裁切之後)的寬度。
* ‘out_h, oh’
輸出(裁切之後)的高度。
* ‘a’
即 iw / ih
* ‘sar’
輸入 sample aspect ratio
* ‘dar’
輸入顯示寬高比, 即 (iw / ih) * sar
**範例:**
左裁 8, 上裁 16, 右裁 32, 下裁 64:
```powershell
crop='w=iw-8-32:h=ih-16-64:x=8,y=16'
```
1280x720, 左裁 8, 上裁 16, 右裁 32, 下裁 64:
```powershell
crop='w=1240:h=640,x=8,y=16'
```
## cropdetect
裁切檢測。它不會做裁切,而是在掃描完畢後回報黑邊範圍、參考用裁切參數。可以搭配 `-ss` 與 `-t` 限制掃瞄檢測範圍。
**參數:**
* limit
設定更黑色的閾值,大於設定值將被當作非黑色。範圍 0 - 255。預設值為 24。
* round
輸出能被設定值所整除的解析度。預設值為 16。對於大多數編碼器 16 是最好的選擇。
* reset_count, reset
設定多少影格之後重新開始檢測過程。預設值為 0。這對於頻道圖示或浮水印扭曲畫面邊界時會很有用。0 表示不重置,將會回報檢測到的畫面最大範圍。
**範例:**
1. 執行掃描
```powershell
ffmpeg -i input.m2ts -vf cropdetect=40:2:0 -f null -
```
2. 假設最終結果為
```powershell
[Parsed_cropdetect_0 @ 026b64c0] x1:0 x2:1279 y1:88 y2:632 w:1280 h:544 x:0 y:88 pts:113279 t:113.279000 crop=1280:544:0:88
```
3. 進行裁切
```powershell
ffmpeg -i input.m2ts -vf crop=1280:544:0:88 output.mkv
```
## scale
縮放輸入視訊解析度,使用 `libswscale` 函式庫。`scale` 篩選器強制輸出顯示寬高比相同於輸入顯示比例, 通過改變像素寬高比來達成。如果輸入影像格式不同於下一個篩選器所需的格式,將轉換輸入為所需的格式。
**參數:**
* width, w
height, h
設定輸出視訊寬高。預設值為與輸入相同。假如值為 0 則輸出與輸入相同。將寬或高其中之一設為 -n 時,FFmpeg 將會自動計算輸出正方形像素影像時可以維持顯示比例的值,且向上取最接近可以被 n 給整除的數值。例如輸入 DAR 為 2.4:1, `w=1280, h=-16`,由計算得到若要維持 DAR 高度必須要是 533 (1280/2.4=533.333...) ,因為 533 不能被 16 整除,向上取能被 16 整除的值也就是 544。
* flags
設定 `libswscale` 縮放旗標。完整設定值列表見 `sws_flags`。如果未明確指定,篩選器將使用預設旗標。
* w, h 參數所包含的常數:
* ‘in_w, iw’
‘in_h, ih’
輸入寬度與高度。
* ‘out_w, ow’
‘out_h, oh’
輸出(縮放之後)的寬度與高度。
* ‘a’
即 iw / ih
* ‘sar’
輸入取樣 (像素) 寬高比。
* ‘dar’
輸入顯示寬高比, 即 (iw / ih) * sar
**範例:**
縮放輸入視訊至 1280x720:
```powershell
scale=1280:720
```
```powershell
scale='w=1280:h=720'
```
```powershell
scale=1280x720
```
使用 Lanczos 演算法:
```powershell
scale='w=1280:h=720:flags=lanczos'
```
縮放輸入視訊寬高至 1/2:
```powershell
scale='w=iw/2:h=ih/2'
```
```powershell
scale='w=iw/2:h=trunc((ow/dar)/2+0.5)*2'
```
```powershell
scale='w=trunc((oh*dar)/2+0.5)*2:h=ih/2'
```
縮放輸入視訊寬至 1280,自動 高 為 mod 16:
```powershell
scale='w=1280:h=trunc((ow/dar)/16+0.5)*16'
```
> 註:`trunc()` 為取整數,小數捨去。
縮放輸入視訊,寬小於或等於 720,高小或等於 480,像素寬高比為 40:33:
```powershell
scale='w=min(720,trunc((480*33/40*dar)/2+0.5)*2):h=min(480,trunc((720*40/33/dar)/2+0.5)*2)'
```
## pad
附加邊框至輸出影像。
**參數:**
* width, w
height, h
輸出視訊的寬度與高度。預設值為與輸入相同。
設定值必須大於或等於輸入。
* x
y
左與上邊框的範圍。
* color
填充區域的顏色。預設值為 "black"。
w, h 參數所包含的常數:
* ‘in_w, iw’
‘in_h, ih’
輸入寬度與高度。
* ‘out_w, ow’
‘out_h, oh’
輸出(填充之後)的寬度與高度。
* ‘a’
即 iw / ih
* ‘sar’
輸入 sample aspect ratio
* ‘dar’
輸入顯示寬高比, 即 (iw / ih) * sar
**範例:**
填充黑邊使輸出解析度為 1920x1080,且上下邊界相等、左右邊界相等:
```powershell
pad='w=1920:h=1080:x=(ow-iw)/2:y=(oh-ih)/2'
```
上下填充黑邊 (mod 16) 使輸出顯示比例為 16:9,且上下邊界相等、左右邊界相等:
```powershell
pad='w=iw:h=trunc((ow*sar*9/16)/16)*16:x=0:y=(oh-ih)/2'
```
自動填充黑邊 (mod 16) 使輸出顯示比例為 16:9,且上下邊界相等、左右邊界相等:
```powershell
pad='w=max(iw,trunc((ih/sar*16/9)/2+0.5)*2):h=max(ih,trunc((iw*sar*9/16)/2+0.5)*2):x=(ow-iw)/2:y=(oh-ih)/2'
```
## setdar, setsar
該 setsar 篩選器用於設定輸出視訊的顯示寬高比。注意,`setdar` 篩選器並不會改變視訊的解析度,而是透過改變 像素寬高比 來改變 顯示寬高比。`setsar` 篩選器用於設定輸出視訊的 取樣 (又名"像素") 寬高比。
顯示寬高比關係公式
顯示寬高比 = 水平解析度 / 垂直解析度 * 像素寬高比
**參數:**
* r, ratio
設定比例。可以是浮點數或分數。
* dar
設定比例,`setdar` 專用。可以是浮點數或分數。
* sar
設定比例,`setsar` 專用。可以是浮點數或分數。
**範例:**
設定顯示比例為 16:9:
```powershell
setdar='r=16/9'
```
```powershell
setdar='dar=16/9'
```
設定像素比例為 40:33:
```powershell
setsar='r=40/33'
```
```powershell
setsar='sar=40/33'
```
## subtitles
用 `libass` 繪製使用的字幕到輸出視訊上。此為額外的編碼函式庫,要使用此編碼器請確認建置組態必需含有 `-enable-libass`,或是使用 `-encoders` 查詢編碼器名稱。且 Windows 系統下需要 `fonts-conf` 才可以使 `libass` 正常工作。此為額外的函式庫,請確認建置組態必需含有 `-enable-fontconfig`。
**參數:**
* filename, f
設定字幕的檔案名稱來讀取。這是必用參數。
* original_size
指定原始影片的畫面大小。由於 ASS 寬高比演算法中的錯誤設計,如果寬高比已被改變,則必須正確縮放字體。
* charenc
設定輸入字幕的字元編碼。 `subtitles` 篩選器專用。 只有非 UTF-8 有用。
* stream_index, si
設定字幕串流索引。 `subtitles` 篩選器專用。
* force_style
覆蓋字幕的預設樣式(Style)或是腳本的訊息參數。它接受一個字串包含ASS風格(style)格式:
```powershell
force_style='KEY=VALUE[,KEY=VALUE][,KEY=VALUE][,KEY=VALUE]......'
```
**範例:**
‧指定輸入字幕檔名。由於無法指定路徑,所以字幕檔必須位於工作目錄。
```powershell
subtitles=sub.srt
```
```powershell
subtitles='filename=sub.srt'
```
從影片檔讀取預設字幕串流:
```powershell
subtitles=video.mkv
```
從影片檔讀取第二個字幕串流(第一個為#0,第二個為#1:
```powershell
subtitles='video.mkv:si=1'
```
強制覆蓋字幕風格為透明綠色微軟正黑體:
```powershell
subtitles=sub.srt:force_style='FontName=Microsoft JhengHei,PrimaryColour=&HAA00FF00'
```
## yadif
反交錯 (Deinterlace) 輸入視訊。
**範例:**
* mode
交錯模式採取。它接受下列值之一:
* ‘0, send_frame’
每一畫格 (Frame) 輸出為一個畫格 (Frame)。
* ‘1, send_field’
每一圖場 (Field) 輸出為一個畫格 (Frame)。此項為預設值。
* ‘2, send_frame_nospatial’
如 send_frame, 但跳過空間域 (Spatial) 交錯檢查。
* ‘3, send_field_nospatial’
如 send_field, 但跳過空間域 (Spatial) 交錯檢查。
* parity
假設輸入交錯視訊的圖像場奇偶 (Field Parity)。 它接受以下值之一:
* ‘0, tff’
輸入為頂場優先 (TFF, Top Field First)。
* ‘1, bff’
輸入為底場優先 (BFF, Bottom Field First).
* ‘-1, auto’
啟用圖場奇偶的自訂檢測。此項為預設值。
如果該交錯是未知或者編碼器沒有匯出此訊息則 `tff` 將被假定。
* deint
指定那些畫格來反交錯。它接受下列值之一:
* ‘0, all’
反交錯全部畫格。此項為預設值。
* ‘1, interlaced’
只有交錯畫格。
## bwdif
反交錯 (Deinterlace) 輸入視訊。動態適應性去交錯(motion adaptive deinterlacing)以 yadif 為基礎 使用 w3fdif 與三次插值 (cubic interpolation) 演算法。
**範例:**
* mode
交錯模式採取。它接受下列值之一:
* ‘0, send_frame’
每一畫格 (Frame) 輸出為一個畫格 (Frame)。此項為預設值。
* ‘1, send_field’
每一圖場 (Field) 輸出為一個畫格 (Frame)。
* parity
假設輸入交錯視訊的圖像場奇偶 (Field Parity)。 它接受以下值之一:
* ‘0, tff’
輸入為頂場優先 (TFF, Top Field First)。
* ‘1, bff’
輸入為底場優先 (BFF, Bottom Field First).
* ‘-1, auto’
啟用圖場奇偶的自訂檢測。
該預設值是 `auto`。 如果該交錯是未知或者編碼器沒有匯出此訊息則 tff 將被假定。
* deint
指定那些畫格來反交錯。它接受下列值之一:
* ‘0, all’
反交錯全部畫格。此項為預設值。
* ‘1, interlaced’
只有交錯畫格。
## nnedi
影像反交錯,使用 Neural Network Edge Directed。此為 FFmpeg 目前所支援效果最佳的影像反交錯篩選器。
此篩選器需要二進位檔案 [nnedi3_weights.bin](https://github.com/dubhater/vapoursynth-nnedi3/blob/master/src/nnedi3_weights.bin),將它放到工作目錄下即可。
**範例:**
* field
設定操作模式。它接受下列值之一:
* ‘af’
自動,兩個場 (Both Fields) 各輸出為一張畫格 (Frame)。
* ‘a’
自動,只使用其中一場 (Single Field)。
* ‘t’
只使用頂圖場 (Top Filed)。
* ‘b’
只使用底圖場 (Bottom Filed)。
* ‘tf’
使用頂圖場,輸入為頂場優先 (TFF, Top Field First)。
* ‘bf’
使用底圖場,輸入為底場優先 (BFF, Bottom Field First)。
* deint
指定那些畫格來反交錯。它接受下列值之一:
* ‘all’
反交錯全部畫格。此項為預設值。
* ‘interlaced’
只有交錯畫格。
## hqdn3d
高精度/品質3D雜訊消除篩選器。產生乾淨(低雜訊)的影像,使靜態畫面真正靜止,這應該可以提升壓縮率。
詳情: https://ffmpeg.org/ffmpeg-all.html#hqdn3d
## nlmeans
影像雜訊消除,使用非局部平均演算法。
此為 FFmpeg 目前所支援效果最佳的影像降噪篩選器。
**參數:**
* s
設定降躁強度。可用範圍 [1.0-30.0],預設值 1.0。
詳情: https://ffmpeg.org/ffmpeg-all.html#nlmeans
## transpose
旋轉輸入視訊的畫面。
**參數:**
* dir
指定旋轉方向:
* ‘0, 4, cclock_flip’
逆時針方向旋轉 90 度 並垂直鏡射
* ‘1, 5, clock’
順時針方向旋轉 90 度
* ‘2, 6, cclock’
逆時針方向旋轉 90 度
* ‘3, 7, clock_flip’
順時針方向旋轉 90 度 並垂直鏡射
對於 4 - 7 之間的值,只在輸出畫面為縱向時作用。這些值已經棄用,應該改用 passthrough 選項。
* passthrough
當輸出畫面幾何圖形匹配指定值時不旋轉。
* ‘none’
總是旋轉畫面。此項為預設值。
* ‘portrait’
保留縱向畫面 (當高度大於寬度時不旋轉畫面)。
* ‘landscape’
保留橫向畫面 (當寬度大於高度時不旋轉畫面)。
**範例:**
例 90度順時針旋轉,並保留縱向佈局:
```powershell
transpose=dir=1:passthrough=portrait
```
```powershell
transpose=1:portrait
```
## vflip
垂直鏡射/上下翻轉 (無參數)。
**範例:**
```powershell
ffmpeg -i input.mp4 -vf vflip output.mp4
```
## flip
水平鏡射/左右翻轉 (無參數)。
**範例:**
```powershell
ffmpeg -i input.mp4 -vf hflip output.mp4
```
###### tags: `ffmpeg`