ステレオをモノラルにするだけなら、-ac 1 を付ければ済みます。ただし pan フィルタで混ぜ方を自分で書くと、書き方によっては音量が変わります。同じ音声を方法ごとにモノラルにして、volumedetect(音量を測るフィルタ)で比べた結果を下に載せます。
ステレオ → モノラル: -ac 1
ffmpeg -i input.mp3 -ac 1 output.mp3
動画の場合は -c:v copy を付けます。映像は再エンコードされず、そのままコピーされます。
ffmpeg -i input.mp4 -c:v copy -ac 1 -c:a aac output.mp4
-ac 1 は左右を「0.5 ずつ」か「約 0.707 ずつ」足す
左右に同じ音(−19.1 dB)が入ったステレオ音源を、方法ごとにモノラルにして、16 ビットの WAV に書き出しました。volumedetect で測った平均音量です。
| 方法 | 平均音量 | 元との差 |
|---|---|---|
| 元のステレオ | −19.1 dB | — |
-ac 1 |
−19.1 dB | ±0 |
pan=mono|c0=0.5*c0+0.5*c1 |
−19.1 dB | ±0 |
aformat=channel_layouts=mono |
−19.1 dB | ±0 |
pan=mono|c0<c0+c1 |
−19.1 dB | ±0 |
pan=mono|c0=c0+c1 |
−13.0 dB | +6.1 dB |
16 ビットの WAV や FLAC に書き出すときは、-ac 1 の結果は L と R を 0.5 倍ずつ足したもの((L+R)/2)と同じで、音量は変わりません。AAC に書き出すときや、MP3 の音声を MP3 に書き出すときのように、音声を小数(浮動小数点)で処理するときは、-ac 1 と aformat は L と R を約 0.707 倍ずつ足します。左右に同じ音が入っている部分は、pan で 0.5 倍ずつ足したときより約 3 dB 大きくなります(FFmpeg 8.1 で、MP3 と AAC のどちらも +3.0 dB)。pan で c0+c1 と書くと、L と R をそのまま足します。左右に同じ音が入っている部分は 6 dB 大きくなります。
c0+c1 はクリップする
ピークが −0.1 dBFS(ほぼ上限)のステレオ音源で c0+c1 を試しました。dBFS は、デジタル音声で出せる最大の音量を 0 とした単位です。volumedetect の結果は、最大音量が 0.0 dB、0 dB の帯(上限から 1 dB 以内)に入ったサンプルが 441,000 サンプル中 310,400(約 70%)でした。音の大半が上限に張り付いて、音割れしています。
pan で足し算をするときは、係数の合計が 1 を超えないようにする(0.5*c0+0.5*c1)か、= の代わりに < を使います。
ffmpeg -i input.mp3 -af "pan=mono|c0=0.5*c0+0.5*c1" output.mp3
ffmpeg -i input.mp3 -af "pan=mono|c0<c0+c1" output.mp3
< を使うと、係数の合計が 1 になるように自動で調整されます。c0<c0+c1 なら、係数は 0.5 ずつになります。元の音量を保ちたいときは、この書き方が確実です。
片方のチャンネルだけ残す
右だけにノイズが乗っているときや、マイクの音が左にしか入っていないときは、使える側のチャンネルだけを残します。
ffmpeg -i input.mp3 -af "pan=mono|c0=c0" output.mp3
このコマンドは、左(c0)だけを取り出してモノラルにします。ステレオのまま、左の音を左右両方から出すには次のようにします。
ffmpeg -i input.mp3 -af "pan=stereo|c0=c0|c1=c0" output.mp3
c0/c1 の代わりに、チャンネル名の FL(左)/FR(右)も使えます(pan=stereo|c0=FL|c1=FL)。動画の場合は -c:v copy を付けます。
ffmpeg -i input.mp4 -c:v copy -af "pan=stereo|c0=c0|c1=c0" -c:a aac output.mp4
左右を入れ替える
ffmpeg -i input.mp3 -af "pan=stereo|c0=c1|c1=c0" output.mp3
channelmap=map=FL-FR|FR-FL でも入れ替えられますが、入力に FL と FR がないとき(モノラルなど)はエラーになります。
モノラル → ステレオ
ffmpeg -i input.mp3 -ac 2 output.mp3
同じ音を左右に振り分けるだけなので、音の広がりは変わりません。-ac 2 では左右それぞれが元より約 3 dB 小さくなります。元の音量のまま左右に置くなら、pan=stereo|c0=c0|c1=c0 を使います。ビットレートが同じなら、ファイルサイズも変わりません(理由は後述)。広がりを足すフィルタに extrastereo や stereotools がありますが、元がモノラルの音源ではほとんど効果がありません。
ffmpeg -i input.mp3 -af "extrastereo=m=2.5" output.mp3
extrastereo は、L と R の差を強めるフィルタです。m=1 で元のまま、m>1 で広がり、m<1 で狭まります。もともとステレオの音源を少し広げたいときに使います。値を大きくしすぎると、左右の差の成分だけが大きくなるので、中央の音(ボーカルなど)が相対的に小さく、細く聞こえます。
L / R を別ファイルに分ける・戻す
channelsplit は出力が 2 本になるので、-af ではなく -filter_complex に書きます。-af に書くと「... was expected to have exactly 1 input and 1 output」というエラーになります。-af に書けるのは、入力と出力が 1 本ずつのフィルタだけです。
ffmpeg -i input.mp3 -filter_complex "channelsplit=channel_layout=stereo[left][right]" -map "[left]" left.wav -map "[right]" right.wav
2 本のモノラルファイルをステレオに戻すには join を使います。
ffmpeg -i left.wav -i right.wav -filter_complex "[0:a][1:a]join=inputs=2:channel_layout=stereo[a]" -map "[a]" output.wav
amerge でも結合できます。入力のチャンネル(FL・FR など)が重ならなければ、その配置に合わせて並べます(channelsplit で分けた左右のファイルなら、入力の順に関係なく L・R の順になります)。重なるとき(ふつうのモノラル 2 本など)は入力の順に並べ、チャンネル数に合った既定のレイアウトを付けます(モノラル 2 本ならステレオ)。左だけノイズを取るなど、チャンネルごとに違う処理をしたいときに、この分割と結合を使います。
ステレオを微調整する(L/R を少し混ぜる)
ボーカルが左だけ、ギターが右だけの古い録音のように、左右が完全に分かれた音源は、反対側に少しだけ混ぜると聴きやすくなります。
ffmpeg -i input.mp3 -af "pan=stereo|c0=0.8*c0+0.2*c1|c1=0.2*c0+0.8*c1" output.mp3
チャンネルごとに係数の合計を 1.0 にしておけば、足しても音割れしません。音量は、左右が同じ音なら変わりませんが、左右が違う音だと下がります。
5.1ch をステレオにダウンミックスする
映画などの 5.1ch 音声をステレオにまとめること(ダウンミックス)は、-ac 2 でもできます。このときは FFmpeg に組み込まれた係数で混ぜられますが、センター(台詞)が小さく聞こえることがあります。台詞をはっきりさせたいときは、pan で係数を自分で書きます。
ffmpeg -i input.mkv -c:v copy -af "pan=stereo|FL=0.5*FC+0.3*FL+0.2*BL|FR=0.5*FC+0.3*FR+0.2*BR" -c:a aac output.mp4
FC(センター)を 0.5 倍、フロントを 0.3 倍、サラウンドを 0.2 倍にして、左右それぞれに足しています。センターはフロントより約 4 dB 大きくなります。左右それぞれで係数の合計が 1 なので、音割れしません。そのかわり、-ac 2 より音が小さく聞こえることがあります。LFE(低音)は混ぜていません。
AC-3 や E-AC-3 の 5.1ch は、FFmpeg では 5.1(side)(サラウンドが BL/BR ではなく SL/SR)として読み込まれます。この場合、上のコマンドの BL/BR は警告なしに無視され、サラウンドの音が消えます。ffprobe でレイアウトが 5.1(side) と表示されたら、BL/BR を SL/SR に書き換えてください。
モノラルにしたときのファイルサイズ
CBR(固定ビットレート)128 kbps の MP3 を、-b:a 128k を付けてモノラルにすると、ファイルサイズは 160,958 バイトで、元とまったく同じでした(10 秒)。ビットレートは 1 秒あたりのデータ量なので、チャンネル数を減らしても、ビットレートが同じならサイズも同じです。-b:a を付けずに -ac 1 だけで MP3 にすると、libmp3lame(FFmpeg の MP3 エンコーダー)がモノラル用のビットレート(44.1 kHz や 48 kHz の音源なら 64 kbps)を選ぶので、サイズは約半分になります。
サイズを減らしたいときは、ビットレートを下げるか、VBR(可変ビットレート)にします。モノラルなら、半分近いビットレートでも同じくらいの音質になります。-b:a 64k や -q:a 5 を指定してください。
ffmpeg -i input.mp3 -ac 1 -b:a 64k output.mp3
よくある質問
-ac 1 と pan=mono|c0=0.5*c0+0.5*c1 はどちらを使うべき?
16 ビットの WAV や FLAC に書き出すときは、結果は同じです。AAC に書き出すときや、MP3 を MP3 に書き出すときは、-ac 1 のほうが約 3 dB 大きくなります。モノラルにするだけなら -ac 1 で足ります。loudnorm などほかのフィルタと組み合わせるときは、-af の中で処理の順番を決められる pan のほうが扱いやすいです。
L と R が逆位相の音源をモノラルにすると消える
L と R に同じ音を逆位相(波の山と谷が逆)で入れた音は、足すと打ち消し合って無音になります。このような音は pan=stereo|c0=c0|c1=-1*c0 で作れます。古い疑似ステレオの音源で起きることがあります。この場合は、片方のチャンネルだけを残してください(pan=mono|c0=c0)。
stereotools と pan の違いは?
pan は、どのチャンネルを何倍して出すかを指定するフィルタです。stereotools は、Mid/Side 変換(中央の成分と左右の差の成分に分ける処理)、位相の反転、左右のバランス、ステレオの幅などをまとめて扱うフィルタです。音楽制作ソフト(DAW)のステレオツールに近いものです。stereotools=mode=lr>ms で L/R を Mid/Side に変換できます。ふつうのチャンネル変換なら pan で足ります。
関連記事
- 音声フォーマット変換 — コーデック・ビットレートの選び方
- 音量を調べる —
volumedetectで上の計測を再現する - ラウドネス正規化 — モノラル化後の音量そろえ
- 動画から音声を抽出する — 音声トラックだけ取り出す