Манипулирование буфером ввода аудио в Ubuntu Linux
Предположим, что я хочу кодировать звуковой фильтр на C++, который применяется к каждому аудио или к определенному микрофону / источнику, с чего мне начать с этого в Ubuntu?
отредактируйте, чтобы было ясно, я не понимаю, как это сделать, и какова роль Pulseaudio, ALSA и Gstreamer.
1 ответ
Alsa предоставляет API для доступа и управления аудио и MIDI оборудованием. Одна часть ALSA представляет собой серию драйверов устройств в режиме ядра, а другая - это библиотека пользовательского пространства, с которой связываются приложения. Алса однопользовательская.
PulseAudio - это инфраструктура, которая облегчает доступ нескольких клиентских приложений к одному аудиоинтерфейсу (alsa - это один клиент). Он обеспечивает процесс демона, который "владеет" аудиоинтерфейсом и обеспечивает транспорт IPC для аудио между демоном и приложениями, использующими его. Это широко используется в настольных средах с открытым исходным кодом. Использование Pulse в значительной степени прозрачно для приложений - они продолжают получать доступ к аудиовходу и выходу с помощью API Alsa с передачей и микшированием звука. Также есть Джек, который больше ориентирован на "профессиональные" аудиоприложения - возможно, немного неправильный, хотя здесь подразумеваются инструменты для создания музыки с низкой задержкой.
gStreamer - это мультимедийная среда общего назначения, основанная на шаблоне графика сигналов, в котором компоненты имеют ряд входных и выходных контактов и обеспечивают функцию преобразования. График этих компонентов построен для реализации таких операций, как декодирование медиа, со специальными узлами для ввода и вывода аудио и видео. По концепции он похож на CoreAudio и DirectShow. VLC и libAV являются альтернативами с открытым исходным кодом, которые работают аналогичным образом. Выбор между ними зависит от стиля API и языка реализации. В частности, gStreamer - это OO API, реализованный на C. VLC - это C++.
Очевидный способ реализации описанной проблемы - реализовать компонент gStreamer/libAV/VLC. Если вы хотите обработать звук, а затем направить его в другое приложение, это можно сделать, передав его обратно через Pulse или Jack.
Alsa предоставляет механизм плагинов, но я подозреваю, что реализовать это из документации ALSA будет непросто.
Де-факто архитектура для создания плагинов эффектов описанного вами типа - это VST Штейнберга. Существует множество хостов с открытым исходным кодом и примеров плагинов, которые можно использовать в Linux, и, что самое важное, есть достойная документация. Как и в случае с gStreamer/libAV/VLC, вы сможете направлять аудио на выход.
Из них VST, вероятно, легче всего подобрать.