動画ファイルには、映像・音声・字幕などのデータが別々の「ストリーム」として入っています。音声や字幕が複数ある動画を FFmpeg に任せると、欲しいものではないストリームだけが出力に残ることがあります。-map を使うと、出力に入れるストリームを自分で指定できます。

-map を使わない場合のデフォルト動作

-map を指定しないと、FFmpeg は種類ごとにストリームを1つずつ自動で選びます。

  • 映像:解像度がいちばん高いもの
  • 音声:チャンネル数がいちばん多いもの
  • 字幕:出力形式と、その形式の標準の字幕エンコーダに合う場合だけ、最初の字幕が選ばれることがあります

同じファイルの中では、デフォルトの印(default フラグ)が付いたストリームが選ばれやすくなります。そのため、解像度が低い映像やチャンネル数が少ない音声が選ばれることもあります。音声が2本ある動画でも、出力に入る音声は1本だけです。複数の音声や特定の字幕を残すには -map が必要です。

-map の基本構文

-map [入力ファイルインデックス]:[ストリームタイプ]:[ストリームインデックス]
  • 入力ファイルインデックス:-i で指定した順の番号。最初の入力が 0、次が 1 です
  • ストリームタイプ:v(映像)、a(音声)、s(字幕)、d(データ)
  • ストリームインデックス:同じ種類の中での番号(0 から数えます)

たとえば 0:a:1 は「最初の入力の、2本目の音声」です。

基本的な使い方

最初の映像と最初の音声ストリームを選択

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

-c copy は、再エンコードせずにそのまま書き出す指定です。

全ストリームをコピー(字幕含む)

ffmpeg -i input.mkv -map 0 -c copy output.mkv

-map 0 は、最初の入力(0)のストリームをすべて出力に入れます。

ストリームの情報を確認する

番号を決める前に、ffprobe で入力ファイルの音声ストリームの一覧を確認します。-select_streams a を外すと、すべてのストリームが表示されます。

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

映像(0:v:0)と、2本目の音声(0:a:1)だけを残します。

全音声トラックを含める

ffmpeg -i input.mkv -map 0:v -map 0:a -c copy output_all_audio.mp4

0:a のように番号を書かないと、その種類のストリームがすべて選ばれます。

字幕ストリームの選択

字幕を含めて出力

ffmpeg -i input.mkv -map 0:v:0 -map 0:a:0 -map 0:s:0 -c copy output_with_sub.mkv

MKV の字幕を MP4 にそのままコピーしようとすると、字幕の形式によっては失敗します。MP4 に出力するときは、字幕を外すか、MP4 が扱える形式に変換してください。

字幕だけを抽出

ffmpeg -i input.mkv -map 0:s:0 output.srt

-c:s copy を付けないので、ASS などのテキスト字幕も SRT に変換して書き出されます(-c:s copy を付けると、SRT 以外の字幕は Unsupported subtitles codec で失敗します)。PGS のような画像の字幕は SRT に変換できません。-c:s copy を付けて .sup に書き出すと、そのまま取り出せます。

ネガティブマッピング(特定ストリームを除外)

-map に渡す値の前に - を付けると(-map -0:s のように)、そのストリームを出力から外せます。

字幕を除いたすべてのストリーム

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本目の音声(0:a:1)だけを外し、ほかはすべて残します。

複数入力ファイルからストリームをまとめる

2つのファイルから映像と音声を1本ずつ取り出し、1つのファイルにまとめます。

ffmpeg -i video.mp4 -i audio.mp3 -map 0:v:0 -map 1:a:0 -c copy output.mp4

0:v:0 は1つ目のファイルの映像、1:a:0 は2つ目のファイルの音声です。

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

-map を書いた順に並ぶので、日本語が1本目、英語が2本目の音声になります。

ストリームのメタデータを設定する

音声トラックに言語の情報(言語タグ)を付けるには、-metadata:s:a:0 language=jpn のように書きます。

ffmpeg -i input.mkv -map 0 -c copy \
  -metadata:s:a:0 language=jpn \
  -metadata:s:a:1 language=eng \
  output.mkv

s:a:0 は出力の1本目の音声です。jpn は日本語、eng は英語を表します。

よくある使用例まとめ

目的 コマンド
映像のみ抽出 -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)に、128 kb/s の AAC 音声を2本加えた MKV です。計測環境は Core i9-14900KF(32スレッド)、FFmpeg 8.1(gyan.dev ビルド)、2026-09-05 です。生データはデータセットで公開しています。

なぜ 0.41 秒で終わるのか

-c copy のとき、FFmpeg はデコード(展開)もエンコード(圧縮)もしません。MKV(Matroska)ファイルからデータの塊(パケット)を読み出し、そのまま新しいファイルに書き込むだけです。残る作業は、ディスクの読み書きと、ヘッダ・インデックス(ファイルの目次にあたる部分)の作り直しだけです。そのため、2分の素材が実時間の 292.76 倍の速さで処理されます。

比べると、同じ素材をフィルタなしで再エンコードすると 27.97 秒でした。同じ条件で測った再エンコードの処理は、720p への縮小が 18.43 秒、curves が 42.01 秒、boxblur が 59.37 秒、VP9 への変換が 729.16 秒でした。一方、ストリームコピーが中心の処理は、このコマンドが 0.41 秒、moov atom(MP4 の目次情報)の配置変更が 0.49 秒、音声フェードが 1.03 秒です。処理時間には、preset や CRF の選び方よりも、再エンコードせずコピーで済ませられるかどうかのほうがずっと大きく効きます。

出力は 355.1 MB で、入力の MKV と同じ大きさです。-c copy は映像と音声のデータをそのまま書き写すので、このサイズは素材のサイズそのものです。圧縮の性能を表す数字ではないため、再エンコードしたときの 86.26 MB と比べても意味がありません。351.4 MB の映像との差(約 3.7 MB)は、2本の音声の分です。

書き出したら、狙ったストリームが入っているかを ffprobe で確認します。

ffprobe -v error -show_streams -select_streams a output.mkv

音声トラックの数、language タグ、チャンネル数が思ったとおりでなければ、-map の順番を見直します。-metadata:s:a:0 language=jpn のような指定は、入力ではなく出力のストリームの順番で数えます。

入力が複数あるコマンドでは、-map 0:a:0(1つ目の入力の音声)と -map 1:a:0(2つ目の入力の音声)を取り違えがちです。コマンドを書く前に、各入力の Stream #0:...、Stream #1:... の表示をメモしておくと、違う音声に差し替わる失敗を防げます。

関連記事