ffmpeg 3.4 から追加のフィルタ。入力したステレオなどの音声の周波数からフロントとリアなどの音声に分けてサラウンド(5.1ch など)に変換する surround フィルタの使い方。

基本コマンド

アンプなどにもよるがサラウンドは 48KHz じゃないとサラウンドでデコードしないこともある。コーデックも aac や pcm よりも ac3 のほうがデコードの汎用性が高い。既定値では入力音声のチャンネル数 chl_in はステレオになっている

既定値のオプション内容
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 -ar 48000 -vcodec copy -acodec aac output.ts
ffmpeg -i input -af surround=5.1:stereo:1:1:1:128:256:1:1:1:1 -ar 48000 -vcodec copy -acodec aac output.ts

音声コーデックを ac 3 に変更
ffmpeg -i input -af surround -ar 48000 -vcodec copy -acodec ac3 output.ts

sox が ffmpeg にリンクされて –enable-libsoxr が付いている場合は高品質な sox でリサンプリングできる
ffmpeg -i input -af aresample=48000:resampler=soxr,surround -vcodec copy -acodec 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]
    出力チャンネル数。指定値は FFmpeg Utilities Documentation : Channel Layout を参照
    規定値:5.1
  • chl_in[string]
    入力チャンネル数。指定値は FFmpeg Utilities Documentation : Channel Layout を参照
    規定値:stereo
  • level_in[float]
    入力音量レベル
    規定値:1
    範囲:0 から 10 まで
  • level_out[float]
    出力音量レベル
    規定値:1
    範囲:0 から 10 まで
  • lfe[boolean]
    LFE(Low-frequency effect) チャンネル、いわゆるサラウンドチャンネルの 0.1ch のこと、の出力を許可する
    規定値:1(許可)
  • lfe_low[int]
    LFE カットオフの下限 Hz
    規定値:128
    範囲:0 から 256 まで
  • lfe_high[int]
    LFE カットオフの上限 Hz
    規定値:256
    範囲:0 から 512 まで
  • fc_in[float]
    FC(前中央) の入力音量レベル
    規定値:1
    範囲:0 から 10 まで
  • fc_out[float]
    FC(前中央) の出力音量レベル
    規定値:1
    範囲:0 から 10 まで
  • lfe_in[float]
    LFE の入力音量レベル
    規定値:1
    範囲:0 から 10 まで
  • lfe_out[float]
    LFE の出力音量レベル
    規定値:1
    範囲:0 から 10 まで

7 thoughts on “音声をサラウンド変換する surround

  • やらかし

    恥かきついでにお聞きしたいのですが、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

    となってしまいます…

    • admin

      sox は ffmpeg にリンクする必要があります。ffmpeg に –enable-libsoxr が付いてなければ使えません。Windows では zeranoe ffmpeg で使えます。

      • やらかし

        なるほど…とりあえず今の自分には知識的に厳しそうなのでもう少し勉強してからまた挑戦してみます
        ありがとぅございます

  • やらかし

    上記のやり方だとエラーが出て出力できず
    それと上記のやり方だと各チャンネルがそれぞれwav出力されるのでしょうか、それともこの記載方法で1個のwavに5.1ch音声の状態で出力されるのでしょうか?

    公式を見るとinとoutが別々に指定するかの様にchl_inとchl_outが書かれていますが、ここら辺の記述方法が見当たらず困っております

    chl_inはステレオがデフォなのに、chl_outは5.1がデフォなのも意味不明…(上記の記載方法ではchl_in等が見当たらないので余計に分からなく…)

    • admin

      > それと上記のやり方だと各チャンネルがそれぞれ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

コメントを残す

メールアドレスが公開されることはありません。

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