ffmpeg 3.4から追加のフィルタ。入力したステレオなどの音声の周波数からフロントとリアなどの音声に分けてサラウンド(5.1ch など)に変換するsurround
フィルタの使い方。
基本コマンド
アンプなどにもよるがサラウンドは48KHzでないとデコードしないこともある。コーデックもAACやPCMよりもAC3のほうがデコードの汎用性が高い。既定値では入力音声のチャンネル数chl_inはステレオになっている。
そのほかのコーデックで対応しているのはac3_fixed、dtsなどがある。dtsは実験的なコーデックなので-strict -2を併用する。手元のアンプでは対応しているはずのtruehdはPCMに変換されて再生された。
既定値のオプション内容。
ffmpeg -i input -af surround=chl_out=5.1:chl_in=stereo:level_in=1:level_out=1:lfe=1:lfe_low=128:lfe_high=256:fc_in=1:fc_out=1:lfe_in=1:lfe_out=1 -c:v copy -c:a aac -ar 48000 output.ts
ffmpeg -i input -af surround=5.1:stereo:1:1:1:128:256:1:1:1:1 -c:v copy -c:a aac -ar 48000 output.ts
音声コーデックをAC3に変更。
ffmpeg -i input -af surround -c:v copy -c:a ac3 -ar 48000 output.ts
ffmpeg -i input -af surround -c:v copy -c:a ac3_fixed -ar 48000 output.ts
音声コーデックをDTSに変更。
ffmpeg -i input -af surround -c:v copy -c:a dts -strict -2 -ar 48000 output.ts
音声コーデックをTrueHDに変更。
ffmpeg -i input -af surround -c:v copy -c:a truehd -strict -2 -ar 48000 output.ts
sox
が ffmpeg にリンクされて–enable-libsoxrが付いている場合は高品質なsox
でリサンプリングできる。
ffmpeg -i input -af aresample=48000:resampler=soxr,surround -c:v copy -c:a aac output.ts
各チャンネルをモノラルで出力するにはchannelsplit
フィルタを使う。下のコマンドはステレオの音声を入力する場合のコマンド例。
ffmpeg -i input -filter_complex surround,channelsplit=channel_layout=5.1[FL][FR][FC][LFE][SL][SR] -map [FL] FL.wav -map [FR] FR.wav -map [FC] FC.wav -map [LFE] LFE.wav -map [SL] SL.wav -map [SR] SR.wav
公式ドキュメント:FFmpeg Filters Documentation : surround
オプション
- chl_out[string]
出力チャンネル数。指定値は公式ドキュメントのチャンネルレイアウトを参照
既定値:”5.1″ - chl_in[string]
入力チャンネル数。指定値は公式ドキュメントのチャンネルレイアウトを参照
既定値:”stereo” - level_in[float]
入力音量レベル
既定値:1
範囲:0 から 10 まで - level_out[float]
出力音量レベル
既定値:1
範囲:0 から 10 まで - lfe[boolean]
LFE(Low-frequency effect)チャンネル、いわゆる5.1チャンネルサラウンドの0.1chのこと、の出力を許可する
既定値:1(許可) - lfe_low[int]
LFE カットオフの下限 Hz
既定値:128
範囲:0 から 256 まで - lfe_high[int]
LFE カットオフの上限 Hz
既定値:256
範囲:0 から 512 まで - lfe_mode[int]
LFE モードの指定 - 0, add:既定値
- 1, sub
- smooth[float]
一時的なスムース強度
既定値:0
範囲:0 から 1 まで - angle[float]
変形アングル
既定値:90
範囲:0 から 360 まで - focus[float]
変形フォーカス
既定値:0
範囲:-1 から 1 まで - fc_in[float]
FC(前中央) の入力音量レベル
既定値:1
範囲:0 から 10 まで - fc_out[float]
FC(前中央) の出力音量レベル
既定値:1
範囲:0 から 10 まで - fl_in[float]
既定値:1
範囲:0 から 10 まで - fl_out[float]
既定値:1
範囲:0 から 10 まで - fr_in[float]
既定値:1
範囲:0 から 10 まで - fr_out[float]
既定値:1
範囲:0 から 10 まで - sl_in[float]
既定値:1
範囲:0 から 10 まで - sl_out[float]
既定値:1
範囲:0 から 10 まで - sr_in[float]
既定値:1
範囲:0 から 10 まで - sr_out[float]
既定値:1
範囲:0 から 10 まで - bl_in[float]
既定値:1
範囲:0 から 10 まで - bl_out[float]
既定値:1
範囲:0 から 10 まで - br_in[float]
既定値:1
範囲:0 から 10 まで - br_out[float]
既定値:1
範囲:0 から 10 まで - bc_in[float]
既定値:1
範囲:0 から 10 まで - bc_out[float]
既定値:1
範囲:0 から 10 まで - lfe_in[float]
LFE の入力音量レベル
既定値:1
範囲:0 から 10 まで - lfe_out[float]
LFE の出力音量レベル
既定値:1
範囲:0 から 10 まで - allx[float]
既定値:0.5
範囲:0.06 から 15 まで - ally[float]
既定値:0.5
範囲:0.06 から 15 まで - fcx[float]
既定値:0.5
範囲:0.06 から 15 まで - flx[float]
既定値:0.5
範囲:0.06 から 15 まで - frx[float]
既定値:0.5
範囲:0.06 から 15 まで - blx[float]
既定値:0.5
範囲:0.06 から 15 まで - brx[float]
既定値:0.5
範囲:0.06 から 15 まで - slx[float]
既定値:0.5
範囲:0.06 から 15 まで - srx[float]
既定値:0.5
範囲:0.06 から 15 まで - bcx[float]
既定値:0.5
範囲:0.06 から 15 まで - fcy[float]
既定値:0.5
範囲:0.06 から 15 まで - fly[float]
既定値:0.5
範囲:0.06 から 15 まで - fry[float]
既定値:0.5
範囲:0.06 から 15 まで - bly[float]
既定値:0.5
範囲:0.06 から 15 まで - bry[float]
既定値:0.5
範囲:0.06 から 15 まで - sly[float]
既定値:0.5
範囲:0.06 から 15 まで - sry[float]
既定値:0.5
範囲:0.06 から 15 まで - bcy[float]
既定値:0.5
範囲:0.06 から 15 まで - win_size[int]
既定値:4096
範囲:1024 から 65536 まで - win_func[int]
- 0, rect
- 1, hann, hanning
- 2, hamming
- 3, blackman
- 4, bartlett
- 5, welch
- 6, flattop
- 7, bharris
- 8, bnuttall
- 9, sine
- 10, nuttall
- 11, bhann
- 12, lanczos
- 13, gauss
- 14, tukey
- 15, dolph
- 16, cauchy
- 17, parzen
- 18, poisson
- 19, bohman
- 20, kaiser
- overlap[float]
既定値:0.5
範囲:0 から 1 まで
上記のやり方だとエラーが出て出力できず
それと上記のやり方だと各チャンネルがそれぞれwav出力されるのでしょうか、それともこの記載方法で1個のwavに5.1ch音声の状態で出力されるのでしょうか?
公式を見るとinとoutが別々に指定するかの様にchl_inとchl_outが書かれていますが、ここら辺の記述方法が見当たらず困っております
chl_inはステレオがデフォなのに、chl_outは5.1がデフォなのも意味不明…(上記の記載方法ではchl_in等が見当たらないので余計に分からなく…)
> それと上記のやり方だと各チャンネルがそれぞれwav出力されるのでしょうか、それともこの記載方法で1個のwavに5.1ch音声の状態で出力されるのでしょうか?
ffmpeg -i input -filter_complex surround,channelsplit=channel_layout=5.1[FL][FR][FC][LFE][SL][SR] -map [FL] FL.wav -map [FR] FR.wav -map [FC] FC.wav -map [LFE] LFE.wav -map [SL] SL.wav -map [SR] SR.wav
このコマンドのことでしたらステレオの音声を 5.1ch にしてモノラルで6つの WAV ファイルで出力します。少しわかりにくかったので文章を直しました。エラー内容が書いてないのでどのようなエラーかは分かりませんが、入力ファイルには正しくパスと拡張子まで記入しましょう。
エラー内容を書き忘れていました…
とその前に…まず問題は24bit48.0KHz6ch(5.1(side)とffmpeg公式に書かれているタイプ)のFLACになり、4GBを超えてしまうという部分でした(-rf64 autoのオプションが分からなかった為…)
このオプションを入れた所、layout等の記載がない状態で出力出来ました
問題はこの後にも起こってしまい…24bit48.0KHz6ch音声を今度はalacにしようと思ったのですが、No such file or directory(そのようなファイルはない)とでてしまい変換が出来ません…(24bit2chの物なら可能)
これの対処法などわかる範囲で構いません、ご教示頂けないでしょうか?
本当に申し訳ございません…
とんでもなくくだらなく、物凄い初歩的なミスをしておりました…
フォルダに全角スペースが入ってたのが原因でしたorz
恥かきついでにお聞きしたいのですが、soxのsamplerを利用するのに、sox.exeはffmepegと同じフォルダに置くのか、それともpathを通すのか…
[SWR @ 0000000000e36fc0] [Eval @ 00000000005fe070] Invalid chars ‘.surround’ at the end of expression ‘soxr.surround’
[SWR @ 0000000000e36fc0] Unable to parse option value “soxr.surround”
[AVFilterGraph @ 0000000000df2e80] Error initializing filter ‘aresample’ with args ‘48000:resampler=soxr.surround’
Error reinitializing filters!
Failed to inject frame into filter network: Invalid argument
Error while processing the decoded data for stream #0:0
となってしまいます…
sox は ffmpeg にリンクする必要があります。ffmpeg に –enable-libsoxr が付いてなければ使えません。Windows では zeranoe ffmpeg で使えます。
なるほど…とりあえず今の自分には知識的に厳しそうなのでもう少し勉強してからまた挑戦してみます
ありがとぅございます