在多音軌、多字幕的影片處理中,-map 是 FFmpeg 最關鍵也最容易用錯的參數之一。
如果你不明確指定 -map,FFmpeg 會依預設規則自動挑選串流,結果常常不是你要的。像是:
- 匯出後字幕不見
- 選錯音軌語言
- 混入不需要的資料串流
這篇文章用最常見的情境,講清楚 -map 怎麼用。
先理解什麼是「串流」
一個容器檔(例如 mp4、mkv)通常不只一個內容串流(stream),常見包含:
- 影片串流(
v) - 音訊串流(
a) - 字幕串流(
s) - 附件/資料串流(如字型、封面、章節等)
你可以先用 ffprobe 看清檔案裡有哪些串流:
|
|
-map 的基本語法
最常見寫法:
|
|
例如:
0:v:第 1 個輸入檔的所有影片串流0:a:0:第 1 個輸入檔的第 1 條音訊串流1:s:1:第 2 個輸入檔的第 2 條字幕串流
說明:
input_index從0開始,對應-i的順序stream_index也從0開始
實戰範例
1) 影片來自 A,音訊來自 B
|
|
含義:
- 取
english.mp4的第 1 條影片串流 - 取
french.mp3的第 1 條音訊串流 - 合併輸出成
french.mp4
2) 保留第一個輸入的全部串流,再額外加一條音軌
|
|
含義:
-map 0先帶上第一個輸入檔的所有串流- 再追加第二個輸入的第 1 條音訊串流
兩個很實用的進階技巧
1) 負映射:排除不需要的串流
例如保留第一個輸入的全部串流,但去掉第 2 條音訊串流:
|
|
2) 可選映射:串流不存在也不中斷
有些檔案可能沒有字幕,這時可用 ?:
|
|
0:s? 表示「有字幕就映射,沒有就跳過,不報錯」。
常見坑位
- 一旦使用
-map,FFmpeg 就不再自動選流,必須把要的串流都寫出來。 -c copy只是封裝複製,不做轉碼;若目標容器不支援某編碼,仍會失敗。- 多輸入時最容易錯的是輸入序號,序號只看
-i的先後順序。 - 要做穩定腳本時,先
ffprobe再生成-map,通常比手寫更穩。
總結
-map 的核心就一句話:明確告訴 FFmpeg,「從哪個輸入,拿哪類串流,拿第幾條」。
掌握之後,你就能穩定處理多音軌、多字幕、跨檔合成等複雜場景,避免「輸出不對卻不知道原因」的情況。