soranoba
soranoba Author of soranoba.net
programming

FFmpegでマルチストリームオーディオをシングルストリームに変換する

マルチストリームオーディオのビデオファイルを、配信などに利用しようとすると往々にしてシングルストリームオーディオのファイルに変換する必要があります。

マルチストリームオーディオ

マルチストリームオーディオというのはffmpeg -iで情報を表示すると以下のように複数のオーディオが含まれる物のことです。
例えば、7.1chがマルチストリームで入っているビデオファイルの一部を抜粋すると以下のようになります。
各ストリームはモノラル(1ch)で、チャンネルポジション情報が含まれています。

  Stream #0:1(eng): Audio: pcm_s24le (in24 / 0x34326E69), 48000 Hz, 1 channels (FL), s32 (24 bit), 1152 kb/s (default)
    Metadata:
      creation_time   : 2020-02-20T01:43:19.000000Z
      handler_name    : Apple Sound Media Handler
      vendor_id       :     
      timecode        : 00:00:00:00
  Stream #0:2(eng): Audio: pcm_s24le (in24 / 0x34326E69), 48000 Hz, 1 channels (FR), s32 (24 bit), 1152 kb/s (default)
    Metadata:
      creation_time   : 2020-02-20T01:43:19.000000Z
      handler_name    : Apple Sound Media Handler
      vendor_id       :     
      timecode        : 00:00:00:00

シングルストリームオーディオ

一方シングルストリームの場合は、1つのストリームで複数のチャンネルが含まれます。
5.1chの場合は以下のようになります。
ドルビーのテストトーンがこの形式で提供されています。

  Stream #0:1(und): Audio: eac3 (ec-3 / 0x332D6365), 48000 Hz, 5.1(side), fltp, 448 kb/s (default)
    Metadata:
      creation_time   : 2016-10-21T00:35:40.000000Z
      handler_name    : sound handler
      vendor_id       : [0][0][0][0]

マルチストリームからシングルストリームの変換

チャンネル数を維持する場合

チャンネル数を維持する場合は、join audio filterに正しい入力数とチャンネルレイアウトを指定することでシングルストリームにすることができます。
7.1ch(つまり、8つのオーディオストリームがある)の場合は以下のようになります。

ffmpeg -i input.mov \
    -filter_complex "[0:a]join=inputs=8:channel_layout=7.1[a]" \
    -map v:0 -map "[a]" output.mp4

元ファイルのオーディオストリームの内、利用できていないものがある場合は以下のようなwarningが出力されるので、これが表示された際はコマンドを見直す必要があります。

[Parsed_join_0 @ 0x7fae33f7d000] No channels are used from input stream 2.
[Parsed_join_0 @ 0x7fae33f7d000] No channels are used from input stream 3.
[Parsed_join_0 @ 0x7fae33f7d000] No channels are used from input stream 4.
[Parsed_join_0 @ 0x7fae33f7d000] No channels are used from input stream 5.
[Parsed_join_0 @ 0x7fae33f7d000] No channels are used from input stream 6.
[Parsed_join_0 @ 0x7fae33f7d000] No channels are used from input stream 7.

チャンネル数を変更する場合

チャンネル数を変更する場合は、前述のjoin audio filterを使用した上で、-acオプションによってチャンネル数を変更することができます。
ステレオ(2ch)の場合は以下のようになります。

ffmpeg -i input.mov \
    -filter_complex "[0:a]join=inputs=8:channel_layout=7.1[a]" \
    -ac 2 \
    -map v:0 -map "[a]" output.mp4

5.1chの場合は以下のようになります。

ffmpeg -i input.mov \
    -filter_complex "[0:a]join=inputs=8:channel_layout=7.1[a]" \
    -ac 6 \
    -map v:0 -map "[a]" output.mp4

参考文献

(Updated: )

comments powered by Disqus