複数の音声トラックや字幕を持つ動画を扱うとき、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