FFmpeg map オプション一覧:詳細なリファレンス

FFmpeg map オプション徹底解説:詳細リファレンス

FFmpegは、動画、音声、画像などを扱うための強力なコマンドラインツールです。その中でも map オプションは、入力ストリームからどのストリームを出力に含めるかを制御するための非常に重要な機能です。map オプションを理解することで、FFmpegをより柔軟に、そして効率的に活用できるようになります。

本稿では、FFmpegの map オプションについて、その基本的な使い方から高度なテクニックまで、詳細なリファレンスとして解説します。具体的な例を交えながら、map オプションのあらゆる側面を網羅し、読者がFFmpegを自在に操れるようになることを目指します。

1. はじめに: なぜ map オプションが必要なのか?

FFmpegは、複数の入力ストリーム(動画、音声、字幕など)を持つメディアファイルを扱うことができます。デフォルトでは、FFmpegは最初に入力ストリームをすべて出力に含めようとします。しかし、場合によっては、特定のストリームのみを出力に含めたい、またはストリームの順序を変更したいといった要求が発生します。

例えば、以下のようなシナリオが考えられます。

  • 複数の音声トラックを含む動画から、日本語音声のみを抽出したい。
  • 動画ファイルから動画ストリームのみを抽出し、音声ストリームを除外したい。
  • 複数の入力ファイルを結合する際に、それぞれのファイルから特定のストリームのみを使用したい。
  • 異なる言語の字幕ストリームを切り替えて出力したい。

このような場合に、map オプションが非常に役立ちます。map オプションを使うことで、出力に含めるストリームを明示的に指定し、FFmpegの動作を細かく制御できます。

2. map オプションの基本構文

map オプションの基本的な構文は以下の通りです。

ffmpeg -i input_file [global_options] -map mapping_string [output_options] output_file

  • -i input_file: 入力ファイルを指定します。
  • [global_options]: グローバルオプションを指定します。
  • -map mapping_string: マッピング文字列を指定します。これが map オプションの中核です。
  • [output_options]: 出力オプションを指定します。
  • output_file: 出力ファイルを指定します。

重要なのは -map オプションの後に続く mapping_string です。この文字列によって、どのストリームを出力に含めるかを決定します。

3. mapping_string の詳細

mapping_string は、様々な要素で構成されており、複雑なストリームの選択を可能にします。ここでは、mapping_string の各要素について詳しく解説します。

3.1 ファイルインデックス指定: [file_number]

複数の入力ファイルがある場合、どのファイルからストリームを選択するかを [file_number] で指定します。

  • [0]: 最初の入力ファイル(-i オプションで最初に指定されたファイル)のストリームを指定します。
  • [1]: 2番目の入力ファイルのストリームを指定します。
  • [2]: 3番目の入力ファイルのストリームを指定します。
  • 以降同様です。

ファイルインデックスを省略した場合、FFmpegはすべての入力ファイルを対象にストリームを検索します。

例:

ffmpeg -i input1.mp4 -i input2.mp4 -map [0:v] -map [1:a] output.mp4

この例では、input1.mp4 から動画ストリーム([0:v])を、input2.mp4 から音声ストリーム([1:a])を選択し、output.mp4 に出力します。

3.2 ストリームタイプ指定: v, a, s, d, t

ストリームのタイプを指定することで、動画、音声、字幕などの特定の種類のストリームのみを選択できます。

  • v: 動画ストリーム (video)
  • a: 音声ストリーム (audio)
  • s: 字幕ストリーム (subtitle)
  • d: データストリーム (data)
  • t: サムネイルストリーム (thumbnail)

ストリームタイプを指定しない場合、FFmpegはすべてのストリームタイプを対象に検索します。

例:

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

この例では、input.mp4 から動画ストリーム(0:v)と音声ストリーム(0:a)を選択し、output.mp4 に出力します。ファイルインデックスとストリームタイプの間にコロン(:)が必要です。

3.3 ストリームインデックス指定: stream_index

同じタイプのストリームが複数存在する場合、ストリームインデックスを指定することで、特定のストリームを選択できます。ストリームインデックスは0から始まります。

例:

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

この例では、input.mp4 から最初の動画ストリーム(0:v:0)と2番目の音声ストリーム(0:a:1)を選択し、output.mp4 に出力します。

3.4 メタデータマッチング: m:key=value

メタデータを活用することで、より複雑なストリームの選択が可能です。m:key=value の形式で、特定のメタデータを持つストリームのみを選択できます。

例:

ffmpeg -i input.mp4 -map 0:m:language=eng output.mp4

この例では、input.mp4 から language メタデータが eng (英語) に設定されているストリームを選択し、output.mp4 に出力します。

3.5 ワイルドカード指定: -map 0

ストリームタイプやインデックスを省略し、-map 0 のようにファイルインデックスのみを指定した場合、そのファイルのすべてのストリームが出力に含まれます。

例:

ffmpeg -i input.mp4 -map 0 output.mp4

この例では、input.mp4 のすべてのストリームをそのまま output.mp4 に出力します。これはデフォルトの動作とほぼ同じです。

4. 複雑な map オプションの活用例

ここでは、より複雑な map オプションの使い方を具体的な例を通して解説します。

4.1 特定の言語の音声トラックのみを抽出する

複数の言語の音声トラックを含む動画ファイルから、特定の言語の音声トラックのみを抽出するには、以下の手順に従います。

  1. まず、ffprobe コマンドを使って、入力ファイルのストリーム情報を確認します。

    ffprobe -i input.mp4 -show_streams

    このコマンドを実行すると、各ストリームのメタデータ(language など)が表示されます。
    2. ffprobe の出力から、抽出したい言語の音声ストリームのインデックスを確認します。例えば、日本語の音声ストリームが 0:a:1 に存在する場合、以下のコマンドを実行します。

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

    この例では、input.mp4 から2番目の音声ストリーム(0:a:1)を選択し、コーデックをコピー(-c:a copy)して、output.mp4 に出力します。

4.2 複数の入力ファイルを結合し、特定のストリームを選択する

複数の動画ファイルを結合する際に、それぞれのファイルから特定のストリームのみを選択するには、以下の手順に従います。

  1. 結合するためのリストファイルを作成します。例えば、mylist.txt という名前のファイルを作成し、以下のように記述します。

    file 'input1.mp4'
    file 'input2.mp4'
    file 'input3.mp4'

    2. FFmpegの concat demuxer を使用して、リストファイルを読み込みます。

    ffmpeg -f concat -safe 0 -i mylist.txt -map 0:v -map 1:a -c copy output.mp4

    この例では、mylist.txt に記述されたファイルを連結し、最初のファイルから動画ストリーム(0:v)を、2番目のファイルから音声ストリーム(1:a)を選択し、output.mp4 に出力します。-safe 0 オプションは、リストファイルに相対パスを使用する場合に必要です。-c copy オプションは、ストリームを再エンコードせずにコピーすることを意味します。

4.3 動画ストリームのみを抽出し、音声ストリームを削除する

動画ファイルから動画ストリームのみを抽出し、音声ストリームを削除するには、以下のコマンドを実行します。

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

この例では、input.mp4 から動画ストリーム(0:v)を選択し、コーデックをコピー(-c:v copy)して、output.mp4 に出力します。-an オプションは、すべての音声ストリームを削除することを意味します。

4.4 字幕ストリームを操作する

字幕ストリームの選択や処理も map オプションで制御できます。例えば、特定の言語の字幕ストリームのみを選択したり、複数の字幕ストリームを結合したりすることができます。

  1. 特定の言語の字幕ストリームを選択する

    ffmpeg -i input.mp4 -map 0:s:0 -c:s copy output.srt

    この例では、input.mp4 から最初の字幕ストリーム(0:s:0)を選択し、コーデックをコピー(-c:s copy)して、output.srt (SubRip形式) に出力します。出力ファイル名を .srt にすることで、FFmpegは自動的に適切な形式で字幕を保存します。

  2. 複数の字幕ストリームを結合する(実験的)

    複数の字幕ストリームを結合するには、subtitles フィルタを使用します。

    ffmpeg -i input.mp4 -vf "subtitles='input.mp4':stream_index=0,subtitles='input.mp4':stream_index=1" output.mp4

    この例では、input.mp4 の最初の字幕ストリームと2番目の字幕ストリームを subtitles フィルタを使って結合し、output.mp4 に出力します。stream_index オプションで、結合したい字幕ストリームのインデックスを指定します。ただし、この方法は実験的であり、期待通りに動作しない場合があります。

5. -map オプションと他のオプションの組み合わせ

map オプションは、他のFFmpegオプションと組み合わせることで、さらに高度な処理を実現できます。ここでは、-map オプションとよく組み合わせて使用されるオプションについて解説します。

  • -c (codec): 出力ストリームのコーデックを指定します。copy を指定すると、ストリームを再エンコードせずにコピーします。
  • -an (disable audio): すべての音声ストリームを削除します。
  • -vn (disable video): すべての動画ストリームを削除します。
  • -sn (disable subtitles): すべての字幕ストリームを削除します。
  • -dn (disable data): すべてのデータストリームを削除します。
  • -f (format): 出力ファイルのフォーマットを指定します。
  • -ss (seek): 入力ファイルの特定の位置から処理を開始します。
  • -to (duration): 出力ファイルの長さを指定します。
  • -metadata: ストリームのメタデータを設定します。
  • -filter (or -vf, -af): フィルタグラフを適用します。

例:

ffmpeg -i input.mp4 -map 0:v -c:v libx264 -b:v 2M -map 0:a -c:a aac -b:a 128k -f mp4 output.mp4

この例では、input.mp4 から動画ストリーム(0:v)と音声ストリーム(0:a)を選択し、動画を libx264 コーデックで 2Mbps のビットレートでエンコードし、音声を AAC コーデックで 128kbps のビットレートでエンコードし、MP4 フォーマットで output.mp4 に出力します。

6. トラブルシューティングとデバッグ

map オプションを使用する際に問題が発生した場合、以下の点を確認してください。

  • ストリームインデックスの確認: ffprobe コマンドを使って、入力ファイルのストリーム情報を確認し、正しいストリームインデックスを指定しているか確認してください。
  • 構文エラー: mapping_string の構文に誤りがないか確認してください。コロン(:)や角括弧([])の使い方が正しいか確認してください。
  • ファイルパス: 入力ファイルや出力ファイルのパスが正しいか確認してください。
  • 競合するオプション: 他のオプションと map オプションが競合していないか確認してください。例えば、-an オプションと -map 0:a オプションを同時に指定すると、-an オプションが優先され、音声ストリームは出力されません。
  • FFmpegのバージョン: 古いバージョンのFFmpegを使用している場合、map オプションの動作が異なる場合があります。最新バージョンのFFmpegを使用することをお勧めします。
  • ログの確認: FFmpegの実行時に表示されるログを確認し、エラーメッセージや警告メッセージがないか確認してください。-report オプションを使うと、詳細なログファイルを生成できます。

7. まとめ

map オプションは、FFmpegのストリーム選択を制御するための強力なツールです。本稿では、map オプションの基本的な構文から高度なテクニックまで、詳細に解説しました。map オプションを理解し、使いこなすことで、FFmpegをより柔軟に、そして効率的に活用できるようになります。

本稿が、読者がFFmpegを自在に操れるようになるための一助となれば幸いです。

補足:

本稿では、FFmpegの map オプションに関する様々な情報を網羅的に解説しましたが、FFmpegは非常に多機能なツールであり、すべてを網羅することは困難です。より詳細な情報や特定の用途における map オプションの使い方については、FFmpegの公式ドキュメントやオンラインフォーラムなどを参照してください。

また、FFmpegのバージョンによって、map オプションの挙動が異なる場合があります。特に、古いバージョンのFFmpegを使用している場合は、最新バージョンにアップデートすることを推奨します。

FFmpegは、高度な技術を必要とする場合もありますが、その柔軟性とパワーは、メディア処理において非常に価値のあるものです。ぜひ、map オプションをマスターし、FFmpegを最大限に活用してください。

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

上部へスクロール