T-CREATOR

FFmpeg マッピング完全攻略:-map/-disposition/-metadata の黄金レシピ

FFmpeg マッピング完全攻略:-map/-disposition/-metadata の黄金レシピ

FFmpeg で動画や音声ファイルを処理する際、ストリームの選択やメタデータの管理は避けて通れない重要な作業です。複数の音声トラックや字幕を含むファイルを扱うとき、「どのストリームを出力に含めるか」「どのトラックをデフォルトにするか」といった細かな制御が求められますよね。

この記事では、FFmpeg の三大マッピングオプションである-map-disposition-metadataについて、基本から応用まで徹底的に解説します。これらのオプションを理解することで、プロフェッショナルな品質の動画ファイルを自在に作成できるようになるでしょう。

オプション早見表

-map オプション早見表

#オプション形式説明使用例
1-map 0入力ファイル 0 のすべてのストリームを選択-map 0
2-map 0:v入力ファイル 0 のすべての映像ストリームを選択-map 0:v
3-map 0:a入力ファイル 0 のすべての音声ストリームを選択-map 0:a
4-map 0:s入力ファイル 0 のすべての字幕ストリームを選択-map 0:s
5-map 0:0入力ファイル 0 のストリーム 0 を選択-map 0:0
6-map 0:v:0入力ファイル 0 の最初の映像ストリームを選択-map 0:v:0
7-map 0:a:1入力ファイル 0 の 2 番目の音声ストリームを選択-map 0:a:1
8-map -0:a:2入力ファイル 0 の 3 番目の音声ストリームを除外-map -0:a:2
9-map 1:a入力ファイル 1 のすべての音声ストリームを選択-map 1:a
10-map 0 -map -0:s入力ファイル 0 のすべてのストリームから字幕を除外-map 0 -map -0:s

-disposition オプション早見表

#disposition 値説明使用例
1defaultデフォルトトラックとして設定-disposition:a:0 default
2dub吹き替え音声トラックとして設定-disposition:a:1 dub
3originalオリジナル音声トラックとして設定-disposition:a:0 original
4commentコメンタリートラックとして設定-disposition:a:2 comment
5lyrics歌詞トラックとして設定-disposition:s:0 lyrics
6karaokeカラオケトラックとして設定-disposition:a:3 karaoke
7forced強制字幕として設定-disposition:s:0 forced
8hearing_impaired聴覚障害者向け字幕として設定-disposition:s:1 hearing_impaired
9visual_impaired視覚障害者向け音声として設定-disposition:a:2 visual_impaired
100すべての disposition フラグをクリア-disposition:a:0 0

-metadata オプション早見表

#メタデータキー説明使用例
1titleタイトル情報を設定-metadata title="My Video"
2artistアーティスト情報を設定-metadata artist="Artist Name"
3albumアルバム情報を設定-metadata album="Album Name"
4date日付情報を設定-metadata date="2025"
5genreジャンル情報を設定-metadata genre="Documentary"
6commentコメント情報を設定-metadata comment="Description"
7language言語情報を設定(ストリーム別)-metadata:s:a:0 language=jpn
8handler_nameハンドラ名を設定(ストリーム別)-metadata:s:v:0 handler_name="VideoHandler"
9-map_metadata 0入力ファイル 0 からすべてのメタデータをコピー-map_metadata 0
10-map_metadata -1すべてのメタデータを削除-map_metadata -1

背景

FFmpeg におけるストリームの概念

動画ファイルは単一のデータの塊ではなく、複数の「ストリーム」から構成されています。一般的な動画ファイルには以下のようなストリームが含まれます。

  • 映像ストリーム:実際の動画データ
  • 音声ストリーム:音声データ(複数言語や解説音声など)
  • 字幕ストリーム:テキストベースの字幕データ
  • データストリーム:チャプター情報や添付ファイルなど

これらのストリームには、それぞれ固有の番号(インデックス)が割り当てられており、FFmpeg はこの番号を使ってストリームを識別します。

以下の図は、FFmpeg がファイル内のストリームをどのように認識するかを示しています。

mermaidflowchart TB
  input["入力ファイル<br/>input.mp4"]
  v0["映像ストリーム 0:v:0"]
  a0["音声ストリーム 0:a:0<br/>(日本語)"]
  a1["音声ストリーム 0:a:1<br/>(英語)"]
  s0["字幕ストリーム 0:s:0<br/>(日本語)"]
  s1["字幕ストリーム 0:s:1<br/>(英語)"]

  input --> v0
  input --> a0
  input --> a1
  input --> s0
  input --> s1

図で理解できる要点

  • 各ストリームは「ファイル番号:タイプ:番号」の形式で識別される
  • 同じタイプのストリームが複数存在する場合、連番で管理される
  • FFmpeg はこのインデックスを使ってストリームを正確に選択する

デフォルトの動作の限界

FFmpeg はデフォルトで「各タイプの最初のストリームを自動選択する」という動作をします。しかし、この自動選択には以下のような問題があります。

  • 複数の音声トラックがある場合、意図しない言語が選ばれる
  • 字幕トラックがすべて除外されてしまう
  • メタデータ情報が失われる
  • デフォルトトラックの指定ができない

実際の制作現場では、ストリームの選択を完全にコントロールする必要があります。そこで登場するのが、-map-disposition-metadataの三つのオプションなのです。

課題

ストリーム選択の複雑さ

FFmpeg でストリームを扱う際に直面する主な課題は以下の通りです。

課題 1:複数ストリームの選択と除外

複数の音声トラックや字幕を含むファイルから、特定のストリームだけを選択したり、不要なストリームを除外したりする必要があります。例えば、5 つの音声トラックの中から日本語と英語だけを残したい場合、どのように指定すれば良いでしょうか。

課題 2:複数入力ファイルの統合

別々のファイルから映像と音声を取り出して一つのファイルに統合する場合、どのファイルのどのストリームを選ぶかを明示的に指定する必要があります。

課題 3:プレイヤーでのデフォルトトラック制御

多言語対応の動画を作成する際、プレイヤーがデフォルトで再生するトラックを指定したいケースがあります。しかし、単にストリームを追加しただけでは、プレイヤーがどのトラックを優先するかは不確定です。

課題 4:メタデータの適切な管理

ストリームごとに言語情報やタイトルを設定しないと、プレイヤー上で「Audio Track 1」のような無味乾燥な表示になってしまいます。ユーザーフレンドリーな表示のためには、適切なメタデータ設定が不可欠です。

以下の図は、これらの課題がどのように関連しているかを示します。

mermaidflowchart TD
  challenge["FFmpegストリーム制御の課題"]
  c1["課題1<br/>複数ストリームの<br/>選択と除外"]
  c2["課題2<br/>複数入力ファイルの<br/>統合"]
  c3["課題3<br/>デフォルトトラックの<br/>制御"]
  c4["課題4<br/>メタデータの<br/>適切な管理"]

  sol_map["-map<br/>ストリーム選択"]
  sol_disp["-disposition<br/>トラック優先度"]
  sol_meta["-metadata<br/>情報付与"]

  challenge --> c1
  challenge --> c2
  challenge --> c3
  challenge --> c4

  c1 -.解決.-> sol_map
  c2 -.解決.-> sol_map
  c3 -.解決.-> sol_disp
  c4 -.解決.-> sol_meta

図で理解できる要点

  • 4 つの主要課題がそれぞれ異なるオプションで解決される
  • -mapはストリーム選択全般を担当
  • -disposition-metadataは品質とユーザビリティを向上させる

これらの課題を解決するために、FFmpeg は柔軟で強力なオプション群を提供しています。次のセクションでは、これらのオプションの具体的な使い方を見ていきましょう。

解決策

FFmpeg が提供する三つの主要オプション、-map-disposition-metadataを使うことで、ストリームの完全な制御が可能になります。それぞれのオプションの役割と使い方を詳しく見ていきましょう。

-map:ストリーム選択の基本

-mapオプションは、出力ファイルにどのストリームを含めるかを指定する最も基本的なオプションです。

基本構文

-mapの基本的な構文は以下の通りです。

ini-map [入力ファイル番号]:[ストリームタイプ]:[ストリーム番号]

各要素の説明

  • 入力ファイル番号:0 から始まる入力ファイルのインデックス
  • ストリームタイプv(映像)、a(音声)、s(字幕)など
  • ストリーム番号:同じタイプ内での連番(0 から始まる)

すべてのストリームを選択

入力ファイルのすべてのストリームを出力に含める場合は、以下のように指定します。

bashffmpeg -i input.mp4 -map 0 -c copy output.mp4

このコマンドは入力ファイル 0(input.mp4)のすべてのストリームを出力ファイルにコピーします。

タイプ別ストリーム選択

特定のタイプのストリームだけを選択する場合は、ストリームタイプを指定します。

bash# すべての映像ストリームを選択
ffmpeg -i input.mp4 -map 0:v -c copy output.mp4
bash# すべての音声ストリームを選択
ffmpeg -i input.mp4 -map 0:a -c copy output.mp4
bash# 映像と音声のみ選択(字幕を除外)
ffmpeg -i input.mp4 -map 0:v -map 0:a -c copy output.mp4

これらのコマンドを使うことで、必要なストリームタイプだけを効率的に抽出できます。

個別ストリーム選択

特定のストリームを番号で指定する場合は、以下のように記述します。

bash# 最初の映像ストリームと2番目の音声ストリームを選択
ffmpeg -i input.mp4 -map 0:v:0 -map 0:a:1 -c copy output.mp4

この記法は、複数の音声トラックから特定の言語だけを選びたい場合に便利です。

ストリームの除外

特定のストリームを除外する場合は、マイナス記号を使います。

bash# すべてのストリームから3番目の音声ストリームを除外
ffmpeg -i input.mp4 -map 0 -map -0:a:2 -c copy output.mp4
bash# すべてのストリームから字幕を除外
ffmpeg -i input.mp4 -map 0 -map -0:s -c copy output.mp4

除外指定は、大部分のストリームは保持したいが特定のストリームだけ削除したい場合に有効です。

-disposition:トラック優先度の設定

-dispositionオプションは、プレイヤーがどのトラックをデフォルトで再生するかを制御するフラグを設定します。

基本構文

ini-disposition:[ストリームタイプ]:[番号] [フラグ]

主要な disposition フラグ

  • default:デフォルトトラック
  • dub:吹き替え音声
  • original:オリジナル音声
  • comment:コメンタリー
  • forced:強制字幕
  • hearing_impaired:聴覚障害者向け
  • visual_impaired:視覚障害者向け

デフォルトトラックの設定

最初の音声トラックをデフォルトに設定する例です。

bashffmpeg -i input.mp4 \
  -map 0 \
  -c copy \
  -disposition:a:0 default \
  output.mp4

このコマンドにより、プレイヤーは最初の音声トラックを優先的に再生します。

複数トラックへの異なる disposition 設定

複数の音声トラックに異なるフラグを設定する場合は、以下のようにします。

bashffmpeg -i input.mp4 \
  -map 0 \
  -c copy \
  -disposition:a:0 default \
  -disposition:a:1 dub \
  -disposition:a:2 comment \
  output.mp4

この設定により、プレイヤーは各トラックの性質を理解し、適切な UI を表示できます。

disposition フラグのクリア

既存の disposition フラグをすべてクリアする場合は、0を指定します。

bashffmpeg -i input.mp4 \
  -map 0 \
  -c copy \
  -disposition:a:0 0 \
  output.mp4

この操作は、既存の設定をリセットして新しい設定を適用する際に使われます。

-metadata:メタデータの管理

-metadataオプションは、ファイルやストリームに付随する情報を設定します。

基本構文

ini# ファイル全体のメタデータ
-metadata [キー]="[値]"

# 特定ストリームのメタデータ
-metadata:s:[ストリームタイプ]:[番号] [キー]="[値]"

ファイルレベルのメタデータ設定

ファイル全体に適用されるメタデータを設定する例です。

bashffmpeg -i input.mp4 \
  -map 0 \
  -c copy \
  -metadata title="サンプル動画" \
  -metadata artist="制作者名" \
  -metadata date="2025" \
  -metadata genre="ドキュメンタリー" \
  output.mp4

これらの情報は、メディアプレイヤーやファイル管理ソフトで表示されます。

ストリームレベルのメタデータ設定

各ストリームに個別のメタデータを設定する場合は、以下のようにします。

bashffmpeg -i input.mp4 \
  -map 0 \
  -c copy \
  -metadata:s:a:0 language=jpn \
  -metadata:s:a:0 title="日本語音声" \
  -metadata:s:a:1 language=eng \
  -metadata:s:a:1 title="英語音声" \
  output.mp4

言語コードはISO 639-2の 3 文字コード(jpnengfraなど)を使用するのが標準です。

メタデータのコピーと削除

入力ファイルからメタデータをコピーする場合は、-map_metadataを使います。

bash# 入力ファイル0からメタデータをコピー
ffmpeg -i input.mp4 \
  -map 0 \
  -c copy \
  -map_metadata 0 \
  output.mp4
bash# すべてのメタデータを削除
ffmpeg -i input.mp4 \
  -map 0 \
  -c copy \
  -map_metadata -1 \
  output.mp4

メタデータの削除は、個人情報や不要な情報を取り除く際に使われます。

以下の図は、三つのオプションがどのように連携して動作するかを示しています。

mermaidflowchart LR
  input["入力ファイル群"]
  map_process["ストリーム選択<br/>-map"]
  disp_process["優先度設定<br/>-disposition"]
  meta_process["情報付与<br/>-metadata"]
  output["出力ファイル"]

  input -->|"複数ストリーム"| map_process
  map_process -->|"選択されたストリーム"| disp_process
  disp_process -->|"フラグ付きストリーム"| meta_process
  meta_process -->|"完成されたファイル"| output

図で理解できる要点

  • 処理は-map-disposition-metadataの順で適用される
  • 各ステップで段階的にストリームが整形される
  • 最終的にプレイヤーフレンドリーなファイルが生成される

これらの三つのオプションを組み合わせることで、プロフェッショナルな品質の動画ファイルを作成できます。

具体例

実際の制作現場で遭遇するシナリオを元に、-map-disposition-metadataの実践的な使い方を見ていきましょう。

例 1:多言語音声の動画作成

日本語と英語の 2 つの音声トラックを含む動画を作成し、日本語をデフォルトに設定する例です。

ステップ 1:入力ファイルの確認

まず、入力ファイルのストリーム構成を確認します。

bashffmpeg -i input.mp4

出力例(抜粋):

lessStream #0:0: Video: h264
Stream #0:1: Audio: aac (日本語)
Stream #0:2: Audio: aac (英語)
Stream #0:3: Audio: aac (フランス語)

この例では、3 つの音声トラックが存在します。

ステップ 2:必要なストリームの選択

映像と日本語・英語の音声のみを選択します。

bashffmpeg -i input.mp4 \
  -map 0:v:0 \
  -map 0:a:0 \
  -map 0:a:1 \
  -c copy \
  output_mapped.mp4

このコマンドにより、フランス語音声が除外され、映像と 2 つの音声トラックだけが出力されます。

ステップ 3:デフォルトトラックの設定

日本語音声をデフォルトに設定します。

bashffmpeg -i input.mp4 \
  -map 0:v:0 \
  -map 0:a:0 \
  -map 0:a:1 \
  -c copy \
  -disposition:a:0 default \
  -disposition:a:1 0 \
  output_with_disposition.mp4

-disposition:a:1 0により、英語音声のデフォルトフラグをクリアしています。

ステップ 4:メタデータの追加

各トラックに言語情報とタイトルを設定します。

bashffmpeg -i input.mp4 \
  -map 0:v:0 \
  -map 0:a:0 \
  -map 0:a:1 \
  -c copy \
  -disposition:a:0 default \
  -disposition:a:1 0 \
  -metadata:s:a:0 language=jpn \
  -metadata:s:a:0 title="日本語" \
  -metadata:s:a:1 language=eng \
  -metadata:s:a:1 title="英語" \
  -metadata title="多言語対応サンプル動画" \
  output_final.mp4

このコマンドにより、プレイヤー上で「日本語」「英語」と表示され、日本語が自動選択されます。

例 2:複数ファイルから映像と音声を統合

別々のファイルから映像と音声を取り出して一つのファイルに統合する例です。

シナリオ

  • video.mp4:高品質な映像のみ
  • audio.m4a:高品質な音声のみ

これらを統合して一つの動画ファイルを作成します。

統合コマンド

bashffmpeg -i video.mp4 -i audio.m4a \
  -map 0:v:0 \
  -map 1:a:0 \
  -c copy \
  -metadata:s:v:0 title="HD映像" \
  -metadata:s:a:0 language=jpn \
  -metadata:s:a:0 title="高音質音声" \
  output_merged.mp4

コマンドの解説

  • -i video.mp4:入力ファイル 0 として指定
  • -i audio.m4a:入力ファイル 1 として指定
  • -map 0:v:0:ファイル 0 の映像ストリームを選択
  • -map 1:a:0:ファイル 1 の音声ストリームを選択
  • -c copy:再エンコードせずにコピー

このアプローチにより、品質を劣化させずに高速に統合できます。

例 3:字幕付き動画の作成

複数の字幕トラックを含む動画を作成し、適切なメタデータを設定する例です。

ステップ 1:字幕ファイルの追加

SRT ファイルを動画に埋め込みます。

bashffmpeg -i video.mp4 \
  -i subtitle_ja.srt \
  -i subtitle_en.srt \
  -map 0:v \
  -map 0:a \
  -map 1:s \
  -map 2:s \
  -c:v copy \
  -c:a copy \
  -c:s mov_text \
  output_with_subs.mp4

ポイント

  • 字幕ストリームは-c:s mov_textで MP4 互換形式にエンコードする必要があります
  • SRT ファイルは自動的に字幕ストリームとして認識されます

ステップ 2:字幕メタデータの設定

各字幕トラックに言語情報を設定します。

bashffmpeg -i video.mp4 \
  -i subtitle_ja.srt \
  -i subtitle_en.srt \
  -map 0:v \
  -map 0:a \
  -map 1:s \
  -map 2:s \
  -c:v copy \
  -c:a copy \
  -c:s mov_text \
  -metadata:s:s:0 language=jpn \
  -metadata:s:s:0 title="日本語字幕" \
  -metadata:s:s:1 language=eng \
  -metadata:s:s:1 title="英語字幕" \
  -disposition:s:0 default \
  output_final_with_subs.mp4

日本語字幕をデフォルトに設定することで、プレイヤーは自動的に日本語字幕を表示します。

例 4:不要なストリームの一括除外

多数のストリームを含むファイルから、特定のタイプだけを除外する例です。

シナリオ

録画した放送動画に複数のデータストリームや不要な音声トラックが含まれている場合。

除外コマンド

bashffmpeg -i broadcast.ts \
  -map 0 \
  -map -0:d \
  -map -0:a:2 \
  -map -0:a:3 \
  -c copy \
  output_cleaned.mp4

コマンドの解説

  • -map 0:すべてのストリームを選択
  • -map -0:d:データストリームを除外
  • -map -0:a:2:3 番目の音声ストリームを除外
  • -map -0:a:3:4 番目の音声ストリームを除外

この方法により、必要なストリームだけを効率的に残せます。

例 5:メタデータの完全削除

個人情報や制作情報を含むメタデータを完全に削除する例です。

削除コマンド

bashffmpeg -i input.mp4 \
  -map 0 \
  -c copy \
  -map_metadata -1 \
  -fflags +bitexact \
  output_no_metadata.mp4

オプションの説明

  • -map_metadata -1:すべてのメタデータを削除
  • -fflags +bitexact:エンコーダー情報も削除

このコマンドは、公開前に個人情報を削除したい場合に有効です。

例 6:チャプター情報の保持

チャプター情報を含む動画を処理する際、メタデータを保持する例です。

チャプター保持コマンド

bashffmpeg -i input_with_chapters.mp4 \
  -map 0 \
  -c copy \
  -map_metadata 0 \
  -map_chapters 0 \
  output_with_chapters.mp4

ポイント

  • -map_chapters 0:入力ファイル 0 からチャプター情報をコピー
  • -map_metadata 0:その他のメタデータもコピー

チャプター情報は視聴体験を向上させる重要な要素なので、適切に保持することが重要です。

以下の図は、複雑なマッピング処理のフローを示しています。

mermaidflowchart TD
  input1["入力1: video.mp4<br/>映像+音声"]
  input2["入力2: audio_en.m4a<br/>英語音声"]
  input3["入力3: subtitle.srt<br/>字幕"]

  select["ストリーム選択<br/>-map 0:v -map 0:a<br/>-map 1:a -map 2:s"]

  v["映像ストリーム"]
  a_ja["音声ストリーム<br/>(日本語)"]
  a_en["音声ストリーム<br/>(英語)"]
  s["字幕ストリーム"]

  disp["disposition設定<br/>日本語をdefault"]

  meta["metadata設定<br/>言語・タイトル情報"]

  result["完成ファイル<br/>output.mp4"]

  input1 --> select
  input2 --> select
  input3 --> select

  select --> v
  select --> a_ja
  select --> a_en
  select --> s

  v --> disp
  a_ja --> disp
  a_en --> disp
  s --> disp

  disp --> meta
  meta --> result

図で理解できる要点

  • 複数の入力ファイルから必要なストリームを抽出
  • ストリーム選択後に優先度とメタデータを設定
  • 段階的な処理により、整理された出力ファイルが生成される

これらの実例を参考にすることで、さまざまなシナリオに対応した動画ファイルを作成できます。

まとめ

FFmpeg の-map-disposition-metadataオプションは、プロフェッショナルな動画ファイルを作成するための必須ツールです。

三大オプションの役割

#オプション主な役割重要度
1-mapストリームの選択と除外★★★
2-dispositionトラックの優先度設定★★☆
3-metadata情報の付与と管理★★☆

習得のポイント

これらのオプションを効果的に使うためには、以下のポイントを押さえることが重要です。

1. ストリーム構造の理解

まず、ffmpeg -i [ファイル名]コマンドでストリーム構成を確認する習慣をつけましょう。ストリームのインデックスや種類を把握することが、正確なマッピングの第一歩です。

2. 段階的なアプローチ

複雑な処理を行う場合は、一度に全てを設定しようとせず、以下の順序で段階的に進めると良いでしょう。

  • 第 1 段階-mapでストリームを選択
  • 第 2 段階-dispositionでデフォルトトラックを設定
  • 第 3 段階-metadataで詳細情報を追加

3. コピーモードの活用

-c copyオプションを使うことで、再エンコードなしで高速処理が可能です。品質劣化も防げるため、ストリームの組み替えだけを行う場合は積極的に活用しましょう。

よくある間違いと対策

#間違い正しいアプローチ理由
1ストリーム番号を 1 から数える0 から数えるFFmpeg のインデックスは 0 始まり
2言語コードに 2 文字コードを使用ISO 639-2 の 3 文字コード(jpn, eng など)を使用標準規格への準拠
3disposition を設定せずに複数トラック追加必ず default を明示的に設定プレイヤーの自動選択が不確定
4メタデータ設定時に引用符を省略スペースを含む値は必ず引用符で囲むシェルの解釈エラーを防ぐ
5すべてのストリームを再エンコード不要な場合は-c copyを使用処理時間と品質の保持

応用への道

基本を理解したら、以下のような応用技術にも挑戦してみてください。

  • 複数ファイルのバッチ処理:シェルスクリプトを使った自動化
  • 条件付きストリーム選択ffprobeとの組み合わせ
  • カスタムメタデータスキーマ:特殊な用途向けのメタデータ設計
  • 品質管理:ストリームごとに異なるエンコード設定の適用

これらのオプションを自在に使いこなすことで、どんな要求にも対応できる柔軟な動画処理環境を構築できます。最初は難しく感じるかもしれませんが、実際に手を動かして試すことで、必ず理解が深まるはずです。

FFmpeg のマッピング機能は、一度習得すれば生涯使える強力なスキルとなります。この記事が、皆さんの動画処理スキル向上の一助となれば幸いです。

関連リンク