(この記事は コマンドラインツール/CLI の Advent Calendar 2025 の記事【2つ目】にする予定です)
はじめに
この記事の内容は、FFmpeg を使って 2つの音声ファイルをミックスするという話です。その際、時間差でミックスする、ということもやってみます。
メインの内容
この記事のメインの内容となるコマンドは、以下のとおりです。
ffmpeg -y -i input01.mp3 -i input02.mp3 \
-filter_complex "[1:a]adelay=1000|1000[bdel]; \
[0:a][bdel]amix=inputs=2:duration=longest" \
-c:a libmp3lame out_mixed.mp3
2つの音声ファイルのミックスに「adelay」を使い、その処理で再生開始のタイミングに時間差をつけるところで「amix」を使っています。
上記の補足
上記のコマンドについて、少し補足します。
出力関連のオプション
出力関連のオプションで、以下を使っています。
- -y: 出力ファイルが存在する場合、確認なしで上書きする
- -c:a libmp3lame: 音声コーデックに MP3 を使用
それと、出力ファイル名を「out_mixed.mp3」で指定しています。
amix による音声ファイルのミックス
以下 2つを入力としています。
- -i input01.mp3: 1つ目の入力ファイル(ストリーム[0:a])
- -i input02.mp3: 2つ目の入力ファイル(ストリーム[1:a])
そして、この後に補足する遅延追加の処理をしたものと、入力ストリームの 1つを、「amix(オーディオミックスフィルタ)」を使い合成しています。以下は合成の処理の補足です。
- [0:a][bdel]: input01.mp3 と遅延させた input02.mp3 をミックス
- [bdel]: 遅延処理後のストリームにつけたラベル(遅延を入れた段階でつけたラベル)
- inputs=2: 2つの入力をミックス
- duration=longest: 長い方の入力に合わせて出力時間を決定
adelay による遅延の追加
[1:a](input02.mp3 の音声ストリーム)に対しては、以下の処理で 1秒の遅延を加えています。
- adelay=1000|1000: 遅延フィルタ(左チャンネル、右チャンネルを対象としたもの)
- 左右の両チャンネルとも 1000ミリ秒(1秒)遅延
- [bdel]: 遅延処理後のストリームにつけたラベル(後段の処理の指定に利用)
このように 2つの音声ファイルの入力を、スタート位置をずらしてミックスする、ということが実現できました。
参考情報
●複数の音声を混ぜる amix | ニコラボ
https://nico-lab.net/amix_with_ffmpeg/