複数の音声トラックや字幕を持つ動画を扱うとき、FFmpeg に任せきりだと意図しないストリームだけが残ることがあります。-map オプションを使えば、どの映像・音声・字幕を出力に含めるかを明示的に選べます。この記事では -map の基本構文から、特定トラックの抽出、ネガティブマッピングによる除外、複数入力ファイルのまとめ方までを実例で解説します。
動作確認: FFmpeg 8.1 / Windows — 本記事のコマンド 11 件を検証スクリプトで実行し、全て成功しました(2026-09-06)
-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 |
実測: 処理時間とサイズ
計測したのは次のコマンドです。
ffmpeg -i input.mkv -map 0 -c copy output.mkv
| 項目 | 実測値 |
|---|---|
| 処理時間 | 0.41 秒(実時間の 292.76 倍速) |
| 出力サイズ | 355.1 MB |
素材は 1920x1080 / 30fps / 120 秒 / 351.4 MB(Big Buck Bunny をループしたもの、Blender Foundation, CC BY 3.0)。計測環境は Core i9-14900KF(32スレッド)、FFmpeg 8.1(gyan.dev ビルド)、2026-09-05。各ケースは逐次実行しています。生データはデータセットで公開しています。
なぜ 0.41 秒で終わるのか
-c copy の間、FFmpeg はデコードもエンコードもしていません。Matroska コンテナからパケットを読み出し、同じパケットを新しいコンテナへ書き戻すだけです。残る仕事はディスク I/O とヘッダ・インデックスの作り直しだけなので、2分の素材が実時間の 292.76 倍速で流れていきます。
この記事は以前「SSD上では数秒から十数秒で終わることが多い」と書いていました。実測は 0.41 秒で、その見積もりは過大でした。
比較すると、同じ素材をフィルタなしで再エンコードするだけで 27.97 秒かかります。同じ計測セットの再エンコード側は、720p への縮小 18.43 秒、curves 42.01 秒、boxblur 59.37 秒、VP9 変換 729.16 秒。対してストリームコピー主体の処理は、このコマンド 0.41 秒、moov atom の配置変更 0.49 秒、音声フェード 1.03 秒に収まります。その処理をコピーのまま済ませられるかどうかは、preset や CRF の選択よりはるかに効く判断です。
出力は 355.1 MB で、素材の 351.4 MB とほぼ同じです。-c copy は映像・音声のビットストリームをそのまま書き写すため、この数値は素材のサイズそのものであって圧縮性能を表しません。再エンコード時の 86.26 MB と並べて比べる意味はありません。数MBの差はコンテナのヘッダとインデックスを作り直した分です。
なお、MKV内の字幕をMP4へそのままコピーしようとすると、字幕形式によっては失敗します。MP4向けには字幕を外す、または対応形式へ変換する判断が必要です。
納品前には、出力ファイルに意図したストリームが入っているかを ffprobe で確認します。
ffprobe -v error -show_streams -select_streams a output.mkv
音声トラックの数、language タグ、チャンネル数が想定と違う場合は、エンコードし直す前に -map の順序を見直してください。-metadata:s:a:0 language=jpn のようなメタデータ指定は、出力側のストリーム順に対して適用されます。
特に複数入力を使うコマンドでは、-map 0:a:0 と -map 1:a:0 の違いを取り違えやすいです。コマンドを作る前に、各入力ファイルの Stream #0:...、Stream #1:... をメモしてから対応させると、意図しない音声差し替えを防げます。
関連記事
一次ソース: ffmpeg.org/ffmpeg.html#Stream-specifiers-1 / trac.ffmpeg.org/wiki/Map