複数の音声トラックや字幕を持つ動画を扱うとき、FFmpeg に任せきりだと意図しないストリームだけが残ることがあります。-map オプションを使えば、どの映像・音声・字幕を出力に含めるかを明示的に選べます。この記事では -map の基本構文から、特定トラックの抽出、ネガティブマッピングによる除外、複数入力ファイルのまとめ方までを実例で解説します。
動作確認: FFmpeg 6.1(検証スクリプトで実 FFmpeg 実行確認)/対象 OS: Windows / macOS / Linux
-map を使わない場合のデフォルト動作
-map を指定しないとFFmpegは自動的に「最適な」ストリームを1つずつ選択します:
- 映像:最高解像度のストリーム
- 音声:最多チャンネルのストリーム
- 字幕:出力フォーマットと既定字幕エンコーダに合う場合だけ、最初の字幕が選ばれることがあります
複数音声トラックや特定の字幕を扱うには -map が必要です。
-map の基本構文
-map [入力ファイルインデックス]:[ストリームタイプ]:[ストリームインデックス]
- 入力ファイルインデックス:0番目の入力は
0、2番目は1など - ストリームタイプ:
v(映像)、a(音声)、s(字幕)、d(データ) - ストリームインデックス:同じタイプの中での番号(0始まり)
基本的な使い方
最初の映像と最初の音声ストリームを選択
ffmpeg -i input.mp4 -map 0:v:0 -map 0:a:0 -c copy output.mp4
全ストリームをコピー(字幕含む)
ffmpeg -i input.mkv -map 0 -c copy output.mkv
-map 0 は入力ファイル0のすべてのストリームを出力に含めます。
ストリームの情報を確認する
まず ffprobe で入力ファイルのストリーム一覧を確認します:
ffprobe -v quiet -show_streams -select_streams a input.mkv
複数音声トラックを扱う
特定の音声トラック(2番目)だけを抽出
ffmpeg -i input.mkv -map 0:v:0 -map 0:a:1 -c copy output_audio1.mp4
全音声トラックを含める
ffmpeg -i input.mkv -map 0:v -map 0:a -c copy output_all_audio.mp4
字幕ストリームの選択
字幕を含めて出力
ffmpeg -i input.mkv -map 0:v:0 -map 0:a:0 -map 0:s:0 -c copy output_with_sub.mkv
字幕だけを抽出
ffmpeg -i input.mkv -map 0:s:0 -c:s copy output.srt
ネガティブマッピング(特定ストリームを除外)
-map の前に - をつけると、そのストリームを除外できます:
字幕を除いたすべてのストリーム
ffmpeg -i input.mkv -map 0 -map -0:s -c copy output_nosubs.mkv
-map 0(全ストリーム)の後に -map -0:s(字幕を除外)を指定します。
特定の音声トラックだけを除外
ffmpeg -i input.mkv -map 0 -map -0:a:1 -c copy output.mkv
複数入力ファイルからストリームをまとめる
2つのファイルから映像と音声を取り出して1つにまとめる:
ffmpeg -i video.mp4 -i audio.mp3 -map 0:v:0 -map 1:a:0 -c copy output.mp4
2言語音声トラックを1ファイルにまとめる
ffmpeg -i video.mp4 -i audio_ja.aac -i audio_en.aac \
-map 0:v:0 -map 1:a:0 -map 2:a:0 \
-c copy output_bilingual.mkv
ストリームのメタデータを設定する
ストリームに言語タグを設定する場合:
ffmpeg -i input.mkv -map 0 -c copy \
-metadata:s:a:0 language=jpn \
-metadata:s:a:1 language=eng \
output.mkv
よくある使用例まとめ
| 目的 | コマンド |
|---|---|
| 映像のみ抽出 | -map 0:v:0 |
| 音声のみ抽出 | -map 0:a:0 |
| 全ストリームコピー | -map 0 |
| 字幕を除く全ストリーム | -map 0 -map -0:s |
| 別ファイルから音声差し替え | -map 0:v -map 1:a |
実測例
2分のMKVに映像1本、音声2本、字幕1本が入っている場合、-map 0 -c copy で全ストリームをコピーすると再エンコードは発生しません。
ffmpeg -i input.mkv -map 0 -c copy output_all.mkv
この処理は再多重化(remux)が中心なので、SSD上では数秒から十数秒で終わることが多いです。出力サイズは入力とほぼ同じですが、コンテナのメタデータやインデックスの作り直しで数MB程度変わることがあります。
一方、MKV内の字幕をMP4へそのままコピーしようとすると、字幕形式によっては失敗します。MP4向けには字幕を外す、または対応形式へ変換する判断が必要です。環境により変動します。
納品前には、出力ファイルに意図したストリームが入っているかを ffprobe で確認します。
ffprobe -v error -show_streams -select_streams a output_all.mkv
音声トラックの数、language タグ、チャンネル数が想定と違う場合は、エンコードし直す前に -map の順序を見直してください。-metadata:s:a:0 language=jpn のようなメタデータ指定は、出力側のストリーム順に対して適用されます。
特に複数入力を使うコマンドでは、-map 0:a:0 と -map 1:a:0 の違いを取り違えやすいです。コマンドを作る前に、各入力ファイルの Stream #0:...、Stream #1:... をメモしてから対応させると、意図しない音声差し替えを防げます。
関連リソース
よく使うオプション・フィルタ・コーデック設定をまとめた PDF チートシートです。手元に置いておくと調べる時間を短縮できます。
関連記事
一次ソース: ffmpeg.org/ffmpeg.html#Stream-specifiers-1 / trac.ffmpeg.org/wiki/Map