各チャンネルの音声を混ぜたり、入れ替えたり、無音にしたりできるpanフィルタの使い方。

基本コマンド

ステレオをそのままステレオで出力。
ffmpeg -i stereo -af "pan=stereo|c0=c0|c1=c1" -c:v copy output
ffplay -i stereo -af "pan=stereo|FL=FL|FR=FR"

c1(FR)をそのままにc0(FL)を無音にしたステレオ音声。
ffmpeg -i stereo -af "pan=stereo|c1=c1" -c:v copy output
ffplay -i stereo -af "pan=stereo|c1=FR"

c1(FR)c0(FL)を逆にしたステレオ音声。
ffmpeg -i stereo -af "pan=stereo|c0=c1|c1=c0" -c:v copy output
ffplay -i stereo -af "pan=stereo|c0=FR|c1=FL"

ステレオ音声をそれぞれ別ファイルで出力。
ffmpeg -i stereo -filter_complex "[0:a]pan=1c|c0=c0[left];[0:a]pan=1c|c0=c1[right]" -map "[left]" left.wav -map "[right]" right.wav

左右のチャンネルを同じだけ合わせたステレオ音声。
ffmpeg -i stereo -af "pan=stereo|c0<1*FR+1*FL|c1<1*FR+1*FL" -c:v copy output ffplay -i stereo -af "pan=stereo|c0<1*FR+1*FL|c1<1*FR+1*FL"

ステレオを左右ミックスしたモノラルにするにはいくつか方法があり、フィルタを使うならpanフィルタだけ使うほうが速い。

ffplay -i stereo -af "channelsplit,amix"
ffplay -i stereo -af "pan=mono|c0 < c0 + c1"
ffmpeg -i input -vn -ac 1 mono.wav

4チャンネルを2つのステレオに分離する。
ffmpeg -i 4channels -filter_complex "pan=stereo|c0=c0|c1=c1[a0];[a:0]pan=stereo|c0=c2|c1=c3[a1]" -map [a0] audio0.wav -map [a1] audio1.wav

5.1チャンネルの音声の音量を変える(FC、LFEを2倍にする)。
ffmpeg -i 6channels -af "pan=5.1|FL=FL|FR=FR|FC=2*FC|LFE=2*LFE|BL=BL|BR=BR" -c:v copy -c:a ac3 output.ts
ffplay -i 6channels -af "pan=5.1|FL=FL|FR=FR|FC=2*FC|LFE=2*LFE|BL=BL|BR=BR"

5.1チャンネルの音声をFLとFRだけのステレオにする。
ffmpeg -i 6channels -af "pan=stereo|FL=FL|FR=FR" output

5.1チャンネルからステレオへのダウンミックス例。
音量順目安。右が大:5 < 4 < 1 < 6 < 2 < 3

  1. -af "pan=stereo|FL<1.0*FL+0.707*FC+0.707*BL|FR<1.0*FR+0.707*FC+0.707*BR"
  2. -af "pan=stereo|FL=FC+0.30*FL+0.30*BL|FR=FC+0.30*FR+0.30*BR"
  3. -af "volume=1.66,pan=stereo|FL=.5*FC+.707*FL+.707*BL+.5*LFE|FR=.5*FC+.707*FR+.707*BR+.5*LFE"
  4. -af "pan=stereo|FL=.3694*FL+.2612*FC+.3694*BL+0.0*LFE|FR=.3694*FR+.2612*FC+.3694*BR+0.0*LFE"
  5. -af "pan=stereo|FL=.3254*FL+.2301*FC+.2818*BL+.1627*BR|FR=.3254*FR+.2301*FC-.1627*BL-.2818*BR"
  6. -af "pan=stereo|FL=.374107*FC+.529067*FL+.458186*BL+.264534*BR+.374107*LFE|FR=.374107*FC+.529067*FR+.458186*BR+.264534*BL+.374107*LFE"

LFEの音量を上げる例。
-af "lowpass=c=LFE:f=120,volume=1.6,pan=stereo|FL=0.5*FC+0.707*FL+0.707*BL+0.5*LFE|FR=0.5*FC+0.707*FR+0.707*BR+0.5*LFE"

Is this command the standard and the correct way for downmixing 5.1 to stereo ? : ffmpeg

トラック別の音声のチャンネルレイアウトと言語を調べる。
ffprobe -v error -i input -select_streams a -show_entries stream=channel_layout:stream_tags=language -of json > log.json

Audio Channel Layout : mediaarea.net

チャンネルレイアウト:mediaarea.netより

8チャンネル(FL+FR+FC+LFE+BL+BR+DL+DR)をステレオと5.1に分離する。DLはmediainfoだとLeft Matrix Total、DRはRight Matrix TotalのことでダウンミックスしたLRになる。
ffmpeg -i 8track -filter_complex "amerge=inputs=8,asplit[1],channelmap=map=DL-FL|DR-FR:channel_layout=stereo[stereo];[1]channelmap=channel_layout=5.1[5.1]" -map [stereo] stereo.wav -map [5.1] 5.1.wav

7.1チャンネルから5.1チャンネルへのダウンミックス。
-af "asplit[f][s];[f]pan=3.1|c0=c0|c1=c1|c2=c2|c3=c3[r];[s]pan=stereo|c0=0.5*c4+0.5*c6|c1=0.5*c5+0.5*c7,compand=attacks=0:decays=0:points=-90/-84|-8/-2|-6/-1|-0/-0.1,aformat=channel_layouts=stereo[d];[r][d]amerge"

7.1チャンネルから5.1チャンネルを経由してステレオにダウンミックス。
-af "asplit[f][s];[f]pan=3.1|c0=c0|c1=c1|c2=c2|c3=c3[r];[s]pan=stereo|c0=0.5*c4+0.5*c6|c1=0.5*c5+0.5*c7,compand=attacks=0:decays=0oints=-90/-84|-10/-4|-6/-2|-0/-0.3,aformat=channel_layouts=stereo[d];[r][d]amerge,pan=stereo|FL=.3254FL+.2301FC+.2818BL+.1627BR|FR=.3254FR+.2301FC-.1627BL-.2818BR"

Atmos7.1chから5.1chのac3にエンコードする。音量が下がらないように-drc_scale 0をつける。ffmpeg ac3、eac3は7.1chに対応していない。
ffmpeg -drc_scale 0 -i "Atmos71.eac3" -filter_complex "asplit [f][s]; [f] pan=3.1|c0=c0|c1=c1|c2=c2|c3=c3 [r]; [s] pan=stereo|c0=0.5*c4+0.5*c6|c1=0.5*c5+0.5*c7, compand=attacks=0:decays=0:points=-90/-84|-10/-4|-6/-2|-0/-0.3, aformat=channel_layouts=stereo [d]; [r][d] amerge [a]" -map "[a]" -acodec ac3 -center_mixlev 0.707 -dsurex_mode 2 -ab 640k ac351.ac3

Doom9's Forum - View Single Post - 7.1 downmix function?
Eac3 Atmos To Ac3 - Doom9's Forum

公式ドキュメント:FFmpeg Filters Documentation : pan
公式wiki:AudioChannelManipulation – FFmpeg

オプション

最初の引数で出力チャンネル数を指定し、バーティカルバー|で区切りながら各チャンネルの設定を行う。指定チャンネルの中で設定を行わなければ無音チャンネルになるc0から順番にチャンネルが割り当てられその順番は チャンネルレイアウトの書式に準ずる。

ffmpeg -layouts
NAME           DESCRIPTION
FL             front left
FR             front right
FC             front center
LFE            low frequency
BL             back left
BR             back right
FLC        	front left-of-center
FRC        	front right-of-center
SL         	side left
SR         	side right

Standard channel layouts:
NAME           DECOMPOSITION
mono           FC
stereo         FL+FR
3.1        	FL+FR+FC+LFE
5.1        	FL+FR+FC+LFE+BL+BR
5.1(side)  	FL+FR+FC+LFE+SL+SR
7.1        	FL+FR+FC+LFE+BL+BR+SL+SR
7.1(wide)  	FL+FR+FC+LFE+BL+BR+FLC+FRC
7.1(wide-side) FL+FR+FC+LFE+FLC+FRC+SL+SR

Audio Channel Layout : mediaarea.net

設定の順番は"l|outdef|outdef|..."になる。入力チャンネルを合わせるときに=または<が使え、前者は合計が 1 を超えても超えなくてもそのまま合計する。後者は合計が 1 を超えても超えなくても 1 になるように調整し音量が大きすぎてクリップノイズが発生するのを抑える。

例えば、"pan=stereo|c1=c1"だと stereoは2チャンネル出力でc0(FL)c1(FR)の設定ができるが、c0は何も書いていないので無音になる。最初のc1が出力するチャンネル、次のc1が入力したチャンネルになり、入力した c1に出力するc1を割り当てている。

複数ファイルを入力したときのcの番号は1入力の音声から0が割り振られ、振り終わったら2入力の音声が引き続き割り振られる。

  • l
    出力チャンネルレイアウトmono、stereo、5.1などと設定する方法と、出力チャンネル数c0、c1、c2などで設定する方法の2通りがある
  • outdef
    出力チャンネル数を設定したら次のように設定する"out_name=[gain*]in_name[(+-)[gain*]in_name...]"または"out_name<[gain*]in_name[(+-)[gain*]in_name...]"
    • out_name
      出力チャンネル名mono、stereo、5.1などと設定する方法と、出力チャンネル数c0、c1、c2で設定する方法の2通りがある
    • gain
      音量の累乗係数の設定。1 だと入力音量そのまま
    • in_name
      入力チャンネル名の設定。チャンネル番号c0、c1、c2と、チャンネル名で指定できる

参考記事

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)