[FFmpeg] 挑選輸入串流 (Streams) / 軌道 (Tracks)

FFmpeg


簡介與其他資料:
 http://www.mobile01.com/topicdetail.php?f=510&t=3734550

其他範例:
  http://www.mobile01.com/topicdetail.php?f=510&t=4487462

串流說明符

有些選項應用於每個串流,例如位元率或編解碼器。
串流說明符被用來精準的指定一個給定的選項屬於哪些串流。

串流說明符可用下列組合:

串流索引
匹配串流的索引。起始值為0,例如 `1` 即代表第2個串流。

串流類型:串流索引
匹配相同的類型與索引。起始值為0,例如 `a:2` 為第三個音訊串流。

串流類型
匹配串流的類型。例如 `a` 為音訊串流。
可用類型: `v` (Video, 視訊), `a` (Audio, 音訊), `s` (Subtitle, 字幕), `d` (Data, 資料), `t` (Attachment, 附件)。

選項匹配串流


規則:
-選項[:串流說明符] [設定值]

將輸入影片重新編碼輸出為 MPEG2 480P 4000kbps + AC3 2ch 192 kbps
ffmpeg -i input.m2ts -filter:v scale=720x480 -ac 2 -c:v mpeg2video -c:a ac3 -b:v 4000k -b:a 192k output.mkv

由於 `-ac` 為音訊專用選項,所以將它匹配音訊串流(即 `-ac:a`)是不必要的。

選取串流


-map [*輸入檔ID*][:*串流說明符*]
當使用 -map 選取串流時,其他未被選取的串流全都會被禁用。

確認影片檔內容

首先使用下列命令取得 input.m2ts 的訊息:
ffmpeg -hide_banner -i input.m2ts

假設結果是這樣:
```
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` 則 ffmpeg 將從所有串流中選擇一個可用的。根據以下規則挑選串流:對於視訊,解析度較高者;對於音訊,聲道數量較多者;對於字幕,順位較高者。

重新封裝:
ffmpeg -i input.m2ts -codec copy output.mkv

根據規則,預期執行結果如下:
```
Stream mapping:
Stream #0:0 -> #0:0 (copy)
Stream #0:1 -> #0:1 (copy)
```

手動選取串流

承上,手動選取 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`

重新封裝為MKV,強制選擇視音訊串流各一個:
ffmpeg -i input.m2ts -map 0:v:0 -map 0:a:0 -codec copy output.mkv

以上命令也等同於:
ffmpeg -i input.m2ts -map 0:0 -map 0:1 -codec copy output.mkv


執行結果如下:
```
Stream mapping:
Stream #0:0 -> #0:0 (copy)
Stream #0:1 -> #0:1 (copy)
```

選取多個串流

承上,以下示範如何選取多個同類型串流:
ffmpeg -i input.m2ts -map 0:0 -map 0:1 -map 0:2 -map 0:1 -codec copy output.mkv

以上命令也等同於:
ffmpeg -i input.m2ts -map 0:v -map 0:a -map 0:a:0 -codec copy output.mkv


執行結果如下:
```
Stream mapping:
Stream #0:0 -> #0:0 (copy)
Stream #0:1 -> #0:1 (copy)
Stream #0:2 -> #0:2 (copy)
Stream #0:1 -> #0:3 (copy)
```

輸出串流 #0 = 輸入串流 #0:0 (Video: h264)
輸出串流 #1 = 輸入串流 #0:1 (Audio: truehd)
輸出串流 #2 = 輸入串流 #0:2 (Audio: ac3)
輸出串流 #3 = 輸入串流 #0:1 (Audio: truehd)

從執行結果可以得知 `-map` 選項的排序即輸出串流排序

選取多個串流並個別設定參數

匹配輸出串流 #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:
`-ac:3 2 -c:3 aac -b:3 128k`
`-ac:a:2 2 -c:a:2 aac -b:a:2 128k`

以下示範如何分別設定多個串流:
ffmpeg -i input.m2ts -map 0:0 -map 0:1 -map 0:2 -map 0:1 -c:0 libx264 -crf:0 20 -c:1 flac -c:2 copy -c:3 libfdk_aac -ac:3 2 -b:3 320k output.mkv

```

執行結果如下:
```
Stream mapping:
Stream #0:0 -> #0:0 (h264 (native) -> h264 (libx264))
Stream #0:1 -> #0:1 (truehd (native) -> flac (native))
Stream #0:2 -> #0:2 (copy)
Stream #0:1 -> #0:3 (truehd (native) -> aac (libfdk_aac))
```
2014-12-17 19:19 發佈
內文搜尋
X
評分
評分
複製連結
Mobile01提醒您
您目前瀏覽的是行動版網頁
是否切換到電腦版網頁呢?