1本の動画に日本語と英語の音声を入れて、再生中に切り替えられるようにできます。コメンタリーを副音声として足すこともできます。FFmpeg では、-map で音声トラックを選んで1つのファイルにまとめます。
なぜ複数音声トラックが必要か
複数の音声トラックは、たとえば次のような場面で使います。
- 多言語対応(日本語・英語の吹き替え)
- オーディオコメンタリー(映画の副音声)
- 形式違いの音声(AAC と Dolby AC-3 を両方入れる)
- ステレオと 5.1ch サラウンドを1つのファイルに入れる
ストリーム情報を確認する
作業の前に、入力ファイルに音声トラックがいくつあるかを確認します。
ffprobe -v quiet -show_streams -select_streams a input.mkv
音声トラック1本ごとに、[STREAM] から始まる情報のまとまりが表示されます。
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:v copy -c:a copy \
output_bilingual.mkv
-i を書いた順に、入力には 0、1、2 の番号が付きます。
0:v:0:入力0(video.mp4)の映像ストリーム1:a:0:入力1(audio_ja.aac)の音声ストリーム2:a:0:入力2(audio_en.aac)の音声ストリーム
-c:v copy -c:a copy なので、映像も音声も変換せずにそのまま入れます。
言語メタデータを設定する
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 \
-metadata:s:a:0 language=jpn \
-metadata:s:a:1 language=eng \
output.mkv
-metadata:s:a:0 は、出力の0番(最初)の音声ストリームに情報を書き込む指定です。言語は ISO 639-2 の3文字のコードで書きます(jpn、eng、fra、deu など)。
デフォルト音声トラックを設定する
ffmpeg -i input.mkv \
-map 0 \
-c copy \
-disposition:a:0 default \
-disposition:a:1 0 \
output.mkv
-map 0:すべてのストリームを残す(付けないと、自動で選ばれた1本の音声しか出力されず、ほかの音声は消えます)-disposition:a:0 default:0番(1本目)の音声をデフォルト(最初に再生される音声)にする-disposition:a:1 0:1番(2本目)の音声から、デフォルトの印(フラグ)を外す
既存の動画に音声トラックを追加する
ffmpeg -i existing.mp4 -i new_audio.aac \
-map 0 \
-map 1:a \
-c copy \
output_added.mkv
-map 0 で元の動画のストリームをすべて残し、-map 1:a で新しい音声を足します。足した音声は、元の音声の後ろに並びます。
特定の音声トラックだけを抽出する
ffmpeg -i input.mkv -map 0:a:1 -c:a copy audio_track2.mka
0:a:1 は2本目の音声です(番号は0から数えます)。そのトラックだけを、変換せずに取り出します。.mka(Matroska の音声ファイル)なら、AAC でも AC-3 でもそのまま入ります。拡張子を .aac にできるのは AAC の音声だけで、AC-3 などでは adts muxer supports only codec aac というエラーになります。
特定の音声トラックを削除する
-map の指定の頭に - を付けると、そのトラックを除外できます(ネガティブマッピング)。
ffmpeg -i input.mkv -map 0 -map -0:a:1 -c copy output.mkv
-map 0 で全ストリームを選び、-map -0:a:1 で2本目の音声だけを外します。
音声トラックのコーデックを変換する
1本目の音声を AAC に変換し、2本目はそのままコピーする例です。
ffmpeg -i input.mkv \
-map 0:v -map 0:a:0 -map 0:a:1 \
-c:v copy \
-c:a:0 aac -b:a:0 192k \
-c:a:1 copy \
output.mkv
-c:a:0・-c:a:1 のように番号を付けると、音声ごとに別のコーデックを指定できます。-b:a:0 は、1本目の音声のビットレート(1秒あたりのデータ量)の指定です。
MP4での注意点
MP4 は MKV より、多言語トラックの扱いが限られます。
| 機能 | MKV | MP4 |
|---|---|---|
| 複数音声トラック | ◯ 対応 | ◯ 対応(ただし互換性に注意) |
| 言語タグ | ◯ | ◯ |
| 字幕のテキスト形式 | ◯(ASS/SRT) | △(mov_text形式) |
| 無制限のトラック数 | ◯ | △(プレーヤー依存) |
複数の音声を入れて長く保存するなら、MKV をおすすめします。
よくある問題
音声トラックを追加したらファイルが大きくなりすぎた
-c copy がないと、映像も再エンコードされてサイズが変わります。-c copy を付けていれば、増えるのは足した音声の分(ビットレート × 長さ)だけです。WAV のような非圧縮の音声は、そのまま入るので大きく増えます。AAC などに変換してから足してください。
プレーヤーが特定の音声トラックを認識しない
-map 0 -disposition:a:0 default で、すべてのトラックを残したまま、最初のトラックをデフォルトにします(-map 0 がないと、音声が1本だけになります)。それでも直らなければ、プレーヤー側の音声トラックの選択設定を確認してください。
音声トラック情報の一覧表示
ffprobe -v quiet -select_streams a \
-show_entries stream=index,codec_name,channels:stream_tags=language \
-of csv input.mkv
関連記事
よくある質問
複数音声トラックの動画を保つには?
-map 0 で、映像とすべての音声ストリームをコピーします(-map 0:a だけだと映像が消えます)。-c copy も付けると、再エンコードしないので速く、劣化もしません。
日本語音声と英語音声を切り替えたい
出力するときに、各音声トラックへ -metadata:s:a:0 language=jpn のように言語タグを付けます。VLC・mpv・Plex などのプレーヤーでは、言語タグがなくてもメニューから音声を切り替えられます。言語タグがあると、プレーヤーがどの音声が何語かを判断でき、設定した言語の音声を自動で選べます。
MP4 で複数音声トラックは使える?
使えます。MP4 は複数の音声トラックに対応しています。ただし、音声トラックを切り替えられないプレーヤーもあります。見る人の再生環境を確認してください。
デフォルトで再生される音声を指定したい
-map 0 -disposition:a:0 default -disposition:a:1 0 のように、disposition で指定します(-map 0 がないと、音声が1本だけになります)。0番(1本目)の音声をデフォルトにし、1番(2本目)の音声はデフォルトから外す、という意味です。
5.1ch を 2ch にダウンミックスしたい
-ac 2 を付けると、自動でステレオ(2ch)にまとめられます(ダウンミックス)。左右への振り分けを細かく決めたい場合は、-af "pan=stereo|FL=...|FR=..." を使います。