FFmpeg 的 `-map` 參數詳解:精準選擇影片、音訊與字幕串流

一篇可直接上手的 FFmpeg `-map` 指南:從串流命名規則到多輸入合成、負映射與可選映射。

在多音軌、多字幕的影片處理中,-map 是 FFmpeg 最關鍵也最容易用錯的參數之一。

如果你不明確指定 -map,FFmpeg 會依預設規則自動挑選串流,結果常常不是你要的。像是:

  • 匯出後字幕不見
  • 選錯音軌語言
  • 混入不需要的資料串流

這篇文章用最常見的情境,講清楚 -map 怎麼用。

先理解什麼是「串流」

一個容器檔(例如 mp4mkv)通常不只一個內容串流(stream),常見包含:

  • 影片串流(v
  • 音訊串流(a
  • 字幕串流(s
  • 附件/資料串流(如字型、封面、章節等)

你可以先用 ffprobe 看清檔案裡有哪些串流:

1
ffprobe -hide_banner input.mkv

-map 的基本語法

最常見寫法:

1
-map input_index[:stream_type][:stream_index]

例如:

  • 0:v:第 1 個輸入檔的所有影片串流
  • 0:a:0:第 1 個輸入檔的第 1 條音訊串流
  • 1:s:1:第 2 個輸入檔的第 2 條字幕串流

說明:

  • input_index0 開始,對應 -i 的順序
  • stream_index 也從 0 開始

實戰範例

1) 影片來自 A,音訊來自 B

1
2
3
4
ffmpeg -i english.mp4 -i french.mp3 \
  -map 0:v:0 -map 1:a:0 \
  -c:v copy -c:a aac \
  french.mp4

含義:

  • english.mp4 的第 1 條影片串流
  • french.mp3 的第 1 條音訊串流
  • 合併輸出成 french.mp4

2) 保留第一個輸入的全部串流,再額外加一條音軌

1
2
3
4
ffmpeg -i english.mp4 -i french.mp3 \
  -map 0 -map 1:a:0 \
  -c copy \
  english-french.mp4

含義:

  • -map 0 先帶上第一個輸入檔的所有串流
  • 再追加第二個輸入的第 1 條音訊串流

兩個很實用的進階技巧

1) 負映射:排除不需要的串流

例如保留第一個輸入的全部串流,但去掉第 2 條音訊串流:

1
ffmpeg -i input.mkv -map 0 -map -0:a:1 -c copy output.mkv

2) 可選映射:串流不存在也不中斷

有些檔案可能沒有字幕,這時可用 ?

1
ffmpeg -i input.mp4 -map 0:v -map 0:a -map 0:s? -c copy output.mp4

0:s? 表示「有字幕就映射,沒有就跳過,不報錯」。

常見坑位

  1. 一旦使用 -map,FFmpeg 就不再自動選流,必須把要的串流都寫出來。
  2. -c copy 只是封裝複製,不做轉碼;若目標容器不支援某編碼,仍會失敗。
  3. 多輸入時最容易錯的是輸入序號,序號只看 -i 的先後順序。
  4. 要做穩定腳本時,先 ffprobe 再生成 -map,通常比手寫更穩。

總結

-map 的核心就一句話:明確告訴 FFmpeg,「從哪個輸入,拿哪類串流,拿第幾條」。

掌握之後,你就能穩定處理多音軌、多字幕、跨檔合成等複雜場景,避免「輸出不對卻不知道原因」的情況。

记录并分享
使用 Hugo 建立
主題 StackJimmy 設計