Захват образцов ALSA: невозможно открыть устройство

Вопрос или проблема

Я довольно новичок в Linux (точнее, Lubuntu 12.04) и в программировании ALSA в целом.
Я пытаюсь написать программу на C для захвата аудио с внутреннего микрофона ПК для его обработки.
Итак, в качестве первого шага я немного погуглил и нашел эту статью о захвате аудиосэмплов.

Урок по использованию ALSA Audio API

Но когда я компилирую и выполняю ее с помощью:

./mycapture "default" или ./mycapture "hw:0,0" и все возможные варианты на эту тему, всегда возникает ошибка:

не удается открыть устройство hw:0,0 (нет такого файла или каталога).

Итак, вопрос в том: как называется аудиоустройство микрофона, которое нужно передать в качестве параметра для записи аудио с микрофона?

Микрофон работает нормально, потому что программа «Запись звука» записывает звуки идеально, и я могу их воспроизводить.

Результат aplay -l таков:

**** Список устройств воспроизведения ****
card 0: I82801DBICH4 [Intel 82801DB-ICH4], device 0: Intel ICH [Intel 82801DB-ICH4]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 0: I82801DBICH4 [Intel 82801DB-ICH4], device 4: Intel ICH - IEC958 [Intel 82801DB-ICH4 - IEC958]
  Subdevices: 1/1
  Subdevice #0: subdevice #0

И это вывод amixer (обрезан)

Простой контроль микшера 'Master',0
  Возможности: pvolume pswitch penum
  Каналы воспроизведения: Передний левый - Передний правый
  Ограничения: Воспроизведение 0 - 31
  Моно:
  Передний левый: Воспроизведение 31 [100%] [0.00dB] [включен]
  Передний правый: Воспроизведение 31 [100%] [0.00dB] [включен]
Простой контроль микшера 'Master Mono',0
  Возможности: pvolume pvolume-joined pswitch pswitch-joined penum
  Каналы воспроизведения: Моно
  Ограничения: Воспроизведение 0 - 31
  Моно: Воспроизведение 4 [13%] [-40.50dB] [включен]
Простой контроль микшера 'PCM',0
  Возможности: pvolume pswitch penum
  Каналы воспроизведения: Передний левый - Передний правый
  Ограничения: Воспроизведение 0 - 31
  Моно:
  Передний левый: Воспроизведение 31 [100%] [12.00dB] [включен]
  Передний правый: Воспроизведение 31 [100%] [12.00dB] [включен]
Простой контроль микшера 'CD',0
  Возможности: pvolume pswitch cswitch cswitch-exclusive penum
  Группа захвата исключительных прав: 0
  Каналы воспроизведения: Передний левый - Передний правый
  Каналы захвата: Передний левый - Передний правый
  Ограничения: Воспроизведение 0 - 31
  Передний левый: Воспроизведение 0 [0%] [-34.50dB] [выключен] Захват [выключен]
  Передний правый: Воспроизведение 0 [0%] [-34.50dB] [выключен] Захват [выключен]
Простой контроль микшера 'Mic',0
  Возможности: pvolume pvolume-joined pswitch pswitch-joined cswitch cswitch-exclusive penum
  Группа захвата исключительных прав: 0
  Каналы воспроизведения: Моно
  Каналы захвата: Передний левый - Передний правый
  Ограничения: Воспроизведение 0 - 31
  Моно: Воспроизведение 22 [71%] [-1.50dB] [включен]
  Передний левый: Захват [включен]
  Передний правый: Захват [включен]
Простой контроль микшера 'Mic Boost (+20dB)',0
  Возможности: pswitch pswitch-joined penum
  Каналы воспроизведения: Моно
  Моно: Воспроизведение [выключен]
Простой контроль микшера 'Mic Select',0
  Возможности: enum
  Элементы: 'Mic1' 'Mic2'
  Элемент0: 'Mic1'
Простой контроль микшера 'Stereo Mic',0
  Возможности: pswitch pswitch-joined penum
  Каналы воспроизведения: Моно
  Моно: Воспроизведение [выключен]

Итак, для aplay, похоже, у меня нет устройства записи, но для amixer у меня есть микрофон, увеличение микрофона и стереомикрофон, а также все эти замечательные вещи на своих местах!!
Если так, как же моя программа «Запись звука» может записывать аудио без каких-либо проблем?!?

Наверняка я передаю неправильное имя устройства в командной строке для захвата аудио, но я теряю надежду на то, чтобы найти правильное!

Пожалуйста, помогите…. прежде чем я вырву себе волосы на голове!!!

aplay -l перечисляет устройства воспроизведения. Используйте arecord -l.

Программа захвата работает отлично после исправления ошибок (третий параметр для snd_pcm_hw_params_set_rate_near должен быть указателем на частоту, а размер buf должен быть удвоен, чтобы было достаточно места для двух каналов).

Ответ или решение

Проблема, с которой вы столкнулись, связана с неправильным указанием устройства для записи звука. Давайте пошагово рассмотрим, как решить вашу проблему с использованием ALSA в Lubuntu 12.04.

Шаг 1: Правильная команда для получения списка устройств захвата

Как вы заметили, команда aplay -l выводит список устройств только для воспроизведения звука. Чтобы увидеть устройства для захвата, вам необходимо использовать команду:

arecord -l

Эта команда покажет вам доступные устройства захвата, включая ваш встроенный микрофон. Сравните вывод arecord -l с выводом aplay -l, чтобы убедиться, что ваше устройство отображается.

Шаг 2: Настройка вашего C-программы

После того как вы определили устройство для захвата, вы можете использовать его в вашей программе. Чаще всего для захвата от встроенного микрофона используется что-то вроде hw:0,0 или default, но убедитесь, что вы используете именно то, что отображено в выводе arecord -l.

Вот пример, как можно изменить вызов вашей программы:

./mycapture "hw:0,0"

Или если arecord -l показывает другое устройство, например card 1: Mic1, вы можете использовать:

./mycapture "hw:1,0"

Шаг 3: Убедитесь, что устройство захвата активно

Проверьте, что ваше устройство микрофона активно и настроено для захвата. Используйте amixer, чтобы убедиться, что запись включена:

amixer get Mic

Если запись отключена, вы можете включить ее с помощью следующей команды:

amixer set Mic capture cap

Также убедитесь, что уровень громкости микрофона установлен выше нуля (в идеале на 100%).

Шаг 4: Исправления в коде

Если вы уже корректно указали устройство, но все еще получаете ошибку, проверьте ваш код на наличие ошибок. Например, в функции snd_pcm_hw_params_set_rate_near() третий параметр должен быть указателем на значение частоты. Также убедитесь, что размер буфера, который используется для захвата аудио данных, соответствует количеству каналов (например, для стерео — он должен быть в два раза больше).

Шаг 5: Тестирование

Попробуйте запустить вашу программу после выполнения всех перечисленных шагов. Если все сделано правильно, ваше устройство для захвата будет открыто, и вы сможете записывать звук с микрофона.

Итог

Если вы следовали приведенным инструкциям, но ошибка все еще сохраняется, пожалуйста, проверьте, видит ли система ваше устройство в других приложениях (например, в Audacity или других средствах записи). Это поможет исключить аппаратные проблемы или конфликты программного обеспечения.

Если у вас возникнут дополнительные вопросы или проблемы, не стесняйтесь спрашивать! Удачи в разработке!

Оцените материал
Добавить комментарий

Капча загружается...