Вопрос или проблема
Я довольно новичок в 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 или других средствах записи). Это поможет исключить аппаратные проблемы или конфликты программного обеспечения.
Если у вас возникнут дополнительные вопросы или проблемы, не стесняйтесь спрашивать! Удачи в разработке!