Как записать большое количество каналов с USB-аудиоинтерфейса с помощью ffmpeg?

Как записать большое количество каналов с USB-аудиоинтерфейса с помощью ffmpeg?

У меня есть пара USB-аудиоинтерфейсов с большим количеством входных каналов, например, 10, 18 или 32.

В настоящее время у меня есть один с 10 входными каналами, подключенный к моему Linux PC, и я смог найти его в выводе pactl list sources. Вот соответствующие части:

Source #1414
    ...
    Name: alsa_input.usb-Behringer_FLOW_8_03-FF-02-11-55-44-00.Direct__hw_F8__source
    ...
    Sample Specification: s32le 10ch 48000Hz
    Channel Map: aux0,aux1,aux2,aux3,aux4,aux5,aux6,aux7,aux8,aux9
    ...
    Volume: aux0: 48287 /  74% / -7.96 dB,   aux1: 48287 /  74% / -7.96 dB,   aux2: 48287 /  74% / -7.96 dB,   aux3: 48287 /  74% / -7.96 dB,   aux4: 48287 /  74% / -7.96 dB,   aux5: 48287 /  74% / -7.96 dB,   aux6: 48287 /  74% / -7.96 dB,   aux7: 48287 /  74% / -7.96 dB,   aux8: 48287 /  74% / -7.96 dB,   aux9: 48287 /  74% / -7.96 dB
            balance 0.00
    ...
    Properties:
        ...
        audio.channels = "10"
        ...

Итак, очевидно, что у него 10 входных каналов.

И Audacity соглашается, я могу записывать все 10 каналов параллельно на отдельные дорожки без каких-либо проблем. ffmpeg с другой стороны, похоже, не совсем понимает, что мой аудиоинтерфейс имеет более 2 каналов, даже когда я указываю channel_layout (я использую 0x3ff, что является шестнадцатеричным представлением 1111111111 (10 каналов).

Я попробовал запустить его так:

$ export SOURCE_NAME="alsa_input.usb-Behringer_FLOW_8_03-FF-02-11-55-44-00.Direct__hw_F8__source"
$ ffmpeg -f pulse -i "${SOURCE_NAME}" -c:a pcm_s32le -ar 48000 -ac 10 -channel_layout 0x3ff output.w64

И я получил такой результат:

...
Guessed Channel Layout for Input Stream #0.0 : stereo
Input #0, pulse, from 'alsa_input.usb-Behringer_FLOW_8_03-FF-02-11-55-44-00.Direct__hw_F8__source':
  Duration: N/A, start: 1689435887.317692, bitrate: 1536 kb/s
  Stream #0:0: Audio: pcm_s16le, 48000 Hz, stereo, s16, 1536 kb/s
Multiple -ac options specified for stream 0, only the last option '-ac 10' will be used.
Stream mapping:
  Stream #0:0 -> #0:0 (pcm_s16le (native) -> pcm_s32le (native))
Press [q] to stop, [?] for help
[pcm_s32le @ 0x5636967eb040] Channel layout '10 channels (FL+FR+FC+LFE+BL+BR+FLC+FRC+BC+SL)' with 10 channels does not match number of specified channels 2
Error initializing output stream 0:0 -- Error while opening encoder for output stream #0:0 - maybe incorrect parameters such as bit_rate, rate, width or height
Conversion failed!

Если вместо этого я укажу hexadecagonalchannel_layout, он действительно запишет, но тогда он запишет только первые два канала, создав файл w64 с 16 каналами, и только первые 2 из них будут содержать какой-либо звук.

$ ffmpeg -f pulse -i "${SOURCE_NAME}" -c:a pcm_s32le -ar 48000 -ac 10 -channel_layout hexadecagonal output.w64
...
Output #0, w64, to 'output.w64':
  Metadata:
    encoder         : Lavf58.76.100
  Stream #0:0: Audio: pcm_s32le ([1][0][0][0] / 0x0001), 48000 Hz, hexadecagonal, s32, 24576 kb/s
    Metadata:
      encoder         : Lavc58.134.100 pcm_s32le
size=   54000kB time=00:00:16.02 bitrate=27602.2kbits/s speed=1.07x    
video:0kB audio:54000kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.000231%
Exiting normally, received signal 2.

Есть ли какие-нибудь подсказки, что я делаю не так?

Связанный контент