ステレオをモノラルにするだけなら、-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 で足ります。

関連記事