Инструкции по микшированию двух аудиопотоков

Инструкции по микшированию двух аудиопотоков

Для настройки трансляции я хотел бы смешать аудио с устройства ввода с аудио из файла .wav. Файл .wav содержит вступительную, ожидающую или выходную музыку, которую я хотел бы добавить к музыке в какой-то момент трансляции.

Целью является следующая настройка: введите описание изображения здесь

Необходимо выполнить несколько шагов:

  1. добавить/смешать два потока
  2. конвертировать в моно (или, может быть, это стоило сделать в первую очередь)
  3. разделение потоков на трансляционный поток и VU-метр
  4. отправить поток на локальный аудиовыход

Я почти уверен, что это возможно, но пока не смог найти решения в интернете. Копание в .asoundrc alsa пока не дало никаких результатов. Кажется, alsa dmix делает какое-то микширование, но не то, что мне нужно....

Я действительно не знаю, с чего начать.

Может кто-нибудь пролить свет на это? Частичное решение тоже было бы неплохо!

решение1

Самый простой способ — использовать Pulseaudio. (Можно сделать это с помощью ALSA, но его будет сложно настроить.)

Все, что производит звук, автоматически микшируется на текущем выходе («sink» в терминах Pulseaudio), поэтому вам не нужно беспокоиться о микшировании. Вы можете управлять громкостью с помощью pavucontrol, и он запоминает последнюю громкость по имени приложения. Вы можете использовать paplayдля воспроизведения wav-файлов из командной строки, но любой другой аудиоплеер также подойдет.

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

pactl load-module module-null-sink sink_name=whatever

или если окажется, что вам нужно переназначить в Pulseaudio module-remap-sink(см. ниже, сам еще не пробовал).

Этот приемник или локальный приемник RaspPi будет иметь связанный с ним .monitorисточник, который можно использовать для его распространения на icecast и т. д.

Вы можете настроить постоянную подачу входа hw:1 на выбранные вами приемники с помощью

pacmd load-module module-loopback source="alsa_input.name_of_hw_1" sink="whatever_or_local_sink"

Вы можете просмотреть список доступных названий приемников с помощью

pacmd list-sinks | grep name:

В качестве аргументов используйте имя без угловых скобок.

Я думаю, это основы. Читайте о доступных Pulseaudioмодули, и pacmd helpрасскажет вам, что можно сделать из командной строки, если вы не хотите использовать pavucontrol.

РедактироватьдляАЛСА:

Сначала прочтите о доступныхплагины. Вам понадобится "виртуальная звуковая карта" для маршрутизации звука в darkice и т. д. Это модуль ядра, поэтому сделайте что-то вроде

sudo modprobe snd-aloop pcm_substreams=2

для тестирования, и вставьте файл, /etc/modprobe.dкогда он заработает. Допустим, обратная связь — это hw:3,*,*.

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

dmix "main_in" --> plug (slave.channels = 1) --> hw:3,0,0

Тогда ты сможешь aplay -D main_in sound.wavи побежишь

alsaloop -C hw:0 -P main_in

для подключения его к аудиограбберу.

На выходной стороне виртуальной звуковой карты что-то вроде

hw:3,1,0 --> dsnoop "main_out"

и снова контролировать его на локальном аудиовыходе

alsaloop -C main_out -P local_audio_out

Затем вы можете запустить darkiceVU-метр непосредственно на main_out. Кстати, arecord -D main_out -d 0 -vv /dev/nullэто хороший VU-метр для тестирования.

Прочитайте подробности синтаксиса по ссылке выше, я не собираюсь это пробовать. Стрелки -->указывают на отношения master/slave плагина. Задержка, вероятно, будет ужасной, с одним циклом через пространство ядра и множеством приложений пользовательского пространства.

Если Pulseaudio вам не подходит, альтернативой является jack, но у меня нет опыта его настройки.

Связанный контент