Alsa не может установить формат образца [FFMPEG]

Я пытаюсь захватить поток PCM с USB-устройства Roland с помощью ffmpeg и обернуть его wav. Командная строка, которую я использую, следующая:

ffmpeg -f alsa -acodec pcm_s32le -ac 2 -ar 48000 -i hw:2,0 out.wav

Которые соответствуют настройкам оборудования. Я также могу захватить поток с помощью Audacity. Проблема в том, что FFMPEG выдает "невозможно установить ошибку формата образца". Любая идея о том, что может происходить и как я могу это исправить?

Заранее спасибо.

ВЫВОД FFMPEG

user@user:~$ ffmpeg -f alsa -acodec pcm_s32le -ac 2 -ar 48000 -i hw:2,0 out.wav
    ffmpeg version N-85548-g3390a2b Copyright (c) 2000-2017 the FFmpeg developers
      built with gcc 5.4.0 (Ubuntu 5.4.0-6ubuntu1~16.04.4) 20160609
      configuration: --enable-gpl --enable-libx264 --enable-libx265 --enable-libvpx --enable-libvorbis --enable-libopus --enable-ffplay
      libavutil      55. 61.100 / 55. 61.100
      libavcodec     57. 92.100 / 57. 92.100
      libavformat    57. 72.101 / 57. 72.101
      libavdevice    57.  7.100 / 57.  7.100
      libavfilter     6. 84.101 /  6. 84.101
      libswscale      4.  7.101 /  4.  7.101
      libswresample   2.  8.100 /  2.  8.100
      libpostproc    54.  6.100 / 54.  6.100
    [alsa @ 0x34b6780] cannot set sample format 0x10008 10 (Invalid argument)
    hw:2,0: Input/output error

ВЫВОД ЗАПИСИ:

user@user:~$ arecord -l
**** List of CAPTURE Hardware Devices ****
card 1: PCH [HDA Intel PCH], device 0: ALC3236 Analog [ALC3236 Analog]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 2: DUOCAPTURE [DUO-CAPTURE], device 0: USB Audio [USB Audio]
  Subdevices: 1/1
  Subdevice #0: subdevice #0

После помощи Deimus я проверил настройку своей карты в arecord и использовал правильную строку для FFMPEG (обратите внимание, что я изменил частоту захвата на оборудовании).

ЗАПИСЬ ВЫХОД

user@user:~$ arecord --dump-hw-params -D hw:2,0
Recording WAVE 'stdin' : Unsigned 8 bit, Rate 8000 Hz, Mono
HW Params of device "hw:2,0":
--------------------
ACCESS:  MMAP_INTERLEAVED RW_INTERLEAVED
FORMAT:  S24_3LE
SUBFORMAT:  STD
SAMPLE_BITS: 24
FRAME_BITS: 48
CHANNELS: 2
RATE: 44100
PERIOD_TIME: (1020 1981429)
PERIOD_SIZE: [45 87381]
PERIOD_BYTES: [270 524286]
PERIODS: [2 1024]
BUFFER_TIME: (2040 3962858)
BUFFER_SIZE: [90 174762]
BUFFER_BYTES: [540 1048572]
TICK_TIME: ALL
--------------------
arecord: set_params:1233: Sample format non available
Available formats:
- S24_3LE

Правильная командная строка

ffmpeg -f alsa -acodec pcm_s24le -ac 2 -ar 44100 -i hw:2,0 out.wav

person caiomcg    schedule 18.05.2017    source источник
comment
Пожалуйста, введите полное сообщение об ошибке и отформатируйте свой вопрос, чтобы он был более читабельным.   -  person deimus    schedule 18.05.2017
comment
Вы уверены, что это устройство поддерживает 32-битные образцы?   -  person CL.    schedule 18.05.2017
comment
Я не уверен, но я пробовал с 24-битной выборкой, и она дает ту же ошибку. 32 — это то, что показывает мне дерзость, когда она захватывает.   -  person caiomcg    schedule 18.05.2017
comment
Если я правильно помню, это то, что Audacity использует по умолчанию — это не означает, что ввод равен 32.   -  person llogan    schedule 18.05.2017
comment
В яблочко! Я этого не знал.   -  person caiomcg    schedule 18.05.2017


Ответы (2)


Используйте параметр --dump-hw-params инструмента arecord для проверки поддерживаемых форматов примеров.

Man страница для arecord

Затем вы можете использовать опцию -sample_fmt для ffmpeg, чтобы указать формат, например. s32

Параметры аудио для ffmpeg находятся здесь

person deimus    schedule 18.05.2017
comment
Идеальный! Это та информация, которая мне была нужна. Формат, предложенный arecord для моего устройства, следующий: S24_3LE, и он поддерживает 24-битный формат. Я буду настраивать свою командную строку, чтобы она соответствовала моему устройству. Большое спасибо. - person caiomcg; 18.05.2017

  1. См. выходные данные arecord --dump-hw-params -D hw:2,0, где hw:2,0 — ваше целевое устройство.

  2. В выводе arecord будут показаны доступные примеры форматов под FORMAT и Available formats. Также отображается другая полезная информация, такая как CHANNELS и RATE. Пример:

    --------------------
    ACCESS:  MMAP_INTERLEAVED RW_INTERLEAVED
    FORMAT:  S16_LE S32_LE
    SUBFORMAT:  STD
    SAMPLE_BITS: [16 32]
    FRAME_BITS: [32 64]
    CHANNELS: 2
    RATE: [44100 192000]
    PERIOD_TIME: (83 11888617)
    PERIOD_SIZE: [16 524288]
    PERIOD_BYTES: [128 4194304]
    PERIODS: [2 32]
    BUFFER_TIME: (166 23777234)
    BUFFER_SIZE: [32 1048576]
    BUFFER_BYTES: [128 4194304]
    TICK_TIME: ALL
    --------------------
    Available formats:
    - S16_LE
    - S32_LE
    
  3. В вашей команде ffmpeg выберите соответствующий декодер, соответствующий формату примера. Вы также можете выбрать каналы и частоту дискретизации:

    ffmpeg -f alsa -c:a pcm_s32le -channels 2 -sample_rate 44100 -i hw:2,0 output.wav
    

Примеры декодеров для использования:

  • S16LE = -c:a pcm_s16le
  • S24LE = -c:a pcm_s24le
  • S32LE = -c:a pcm_s32le

См. также ffmpeg -decoders и документацию FFmpeg: ввод ALSA.

person llogan    schedule 31.03.2020