Программист выходит к микрофону, чтобы сказать речь. Подходит и стучит по микрофону: Тук-тук-тук, Раз, Два, Три... Из микрофона: "фХЛ-ФХЛ-ФХЛ, тБЪ, дЧБ, фТЙ..."
В Windows нет разделения каналов записи по источникам.
CD-ROM ----------|
| |--- Динамики
Микрофон --------| |
| - Windows --|--- Записывающие программы
Линейный вход ---| |
| |--- Линейный выход
MIDI ------------|
Все поступающие в систему звуки смешиваются, и лишь после этого их получает программа.
Для получения звукового сигнала нужно воспользоваться WinAPI. WaveInOpen открывает доступ к микрофону. Одновременно только одна программа может работать с микрофоном. Заодно Вы указываете, какая нужна частота, сколько бит на значение и размер буфера. От последнего зависит, как часто и в каком объеме информация будет поступать в программу.
Далее нужно выделить память для буфера и вызвать функцию WaveInAddBuffer, которая передаст Windows пустой буфер. После вызова WaveInStart Windows начнет заполнять буфер, и, после его заполнения, пошлет сообщение MM_WIM_DATA. В нем нужно обработать полученную информацию и вновь вызвать WaveInAddBuffer, тем самым указав, что буфер пуст.
Функции WaveInReset и WaveInClose прекратят поступление информации в программу и закроют доступ к микрофону.
Эта программа считывает сигнал с микрофона и выводит его на экран. Частота сигнала - 22050 Гц. Количество бит определяется флажком, размер буфера TrackBar-ом.
Код, который вы предоставили, это приложение Delphi, использующее Windows API для захвата аудиоданных с микрофона и отображения их на компоненте PaintBox.
Вот подробное описание, как работает код:
Событийный обработчик Button1Click открывает микрофон с помощью WaveInOpen, устанавливает формат для аудиоданных и готовит буфер для приема аудиоданных.
Событийный обработчик Button2Click останавливает захват аудиоданных, сбрасывая устройство wave-in, отменяя заголовок, закрывая устройство wave-in и освобождая память, выделенную для буфера.
Событийный обработчик OnWaveIn вызывается, когда новые аудиоданные становятся доступными. Он извлекает аудиоданные из буфера, конвертирует их в графическое представление (либо 8-битное, либо 16-битное) и рисует его на компоненте PaintBox.
Некоторые примечания к коду:
Переменная Bits16 определяет, как аудиоданные должны быть обработаны - как 8-битные или 16-битные.
Переменная BufSize determines how much memory is allocated for the buffer to receive the audio data.
Переменные XScale и YScale используются для конвертации аудиоданных в графическое представление, с XScale, определяющим горизонтальный масштаб, и YScale, определяющим вертикальный масштаб.
Вот альтернативное решение, использующее встроенные компоненты Delphi для медиа:
Создайте новую форму с компонентом TMediaPlayer.
Установите игрока для захвата аудиоданных с default-устройства с помощью Open.
Используйте метод GetDeviceCaps для получения информации о устройстве, например, количество каналов и частоту дискретизации.
Используйте метод Record для начала захвата аудиоданных.
В событийном обработчике OnStartCapture, настройте таймер для периодического извлечения аудиоданных из буфера игрока с помощью GetBuffer.
Конвертируйте аудиоданные в графическое представление (либо 8-битное, либо 16-битное) и рисуйте его на компоненте PaintBox.
Эта APPROACH более проста и легче использовать, чем подход с Windows API, но может не обеспечивать такое же управление процессом захвата аудиоданных.
В статье описывается способ считывания сигнала с микрофона в Windows, используя библиотеку WinAPI и функции WaveInOpen, WaveInAddBuffer, WaveInStart, WaveInReset, WaveInClose.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.