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=..." を使います。