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 特定の言語の音声トラックのみを抽出する
複数の言語の音声トラックを含む動画ファイルから、特定の言語の音声トラックのみを抽出するには、以下の手順に従います。
-
まず、
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 複数の入力ファイルを結合し、特定のストリームを選択する
複数の動画ファイルを結合する際に、それぞれのファイルから特定のストリームのみを選択するには、以下の手順に従います。
-
結合するためのリストファイルを作成します。例えば、
mylist.txtという名前のファイルを作成し、以下のように記述します。file 'input1.mp4'
file 'input2.mp4'
file 'input3.mp4'
2. FFmpegのconcatdemuxer を使用して、リストファイルを読み込みます。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 オプションで制御できます。例えば、特定の言語の字幕ストリームのみを選択したり、複数の字幕ストリームを結合したりすることができます。
-
特定の言語の字幕ストリームを選択する
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は自動的に適切な形式で字幕を保存します。 -
複数の字幕ストリームを結合する(実験的)
複数の字幕ストリームを結合するには、
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を最大限に活用してください。