# [FFmpeg] 挑選輸入串流 ## -map 選項 挑選輸入串流為輸出。使用多個 -map 選項來挑選多個串流。允許重複挑選同一個串流。被選中的輸入串流將作為輸出串流,未被選中的串流則會被禁用。挑選的順序將成為輸出串流順序,例如第一個被挑選的串流將成為輸出串流 #0。 ### 確認影片檔內容 首先使用下列命令取得 input.m2ts 的訊息: ```powershell ffmpeg -hide_banner -i 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` 則 ffmpeg 將從所有輸出中選擇一個可用的串流。根據以下規則挑選串流:對於視訊,解析度較高者;對於音訊,聲道數量較多者;對於字幕,順位較高者。 重新封裝: ```powershell ffmpeg -i input.m2ts -codec copy output.mkv ``` 根據規則,預期執行結果如下: ```text 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` 使用 `-map` 替換 input.m2ts 的音訊 ```text -i input.m2ts -i audio_only.m4a -map 0:v -map 1:a ``` 重新封裝為MKV,強制選擇視音訊串流各一個: ```powershell ffmpeg -i input.m2ts -map 0:v:0 -map 0:a:0 -codec copy output.mkv ``` 以上命令也等同於: ```powershell ffmpeg -i input.m2ts -map 0:0 -map 0:1 -codec copy output.mkv ``` 執行結果如下: ```text Stream mapping: Stream #0:0 -> #0:0 (copy) Stream #0:1 -> #0:1 (copy) ``` ### 選取多個串流 承上,以下示範如何選取多個同類型串流: ```powershell ffmpeg -i input.m2ts -map 0:0 -map 0:1 -map 0:2 -map 0:1 -codec copy output.mkv ``` 以上命令也等於: ```powershell ffmpeg -i input.m2ts -map 0:v -map 0:a -map 0:a:0 -codec copy output.mkv ``` 執行結果如下: ```text 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` 以下示範如何分別設定多個串流: ```powershell ffmpeg -hide_banner -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 ``` 執行結果如下: ```text 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)) ``` ###### tags: `ffmpeg`