Для настройки трансляции я хотел бы смешать аудио с устройства ввода с аудио из файла .wav. Файл .wav содержит вступительную, ожидающую или выходную музыку, которую я хотел бы добавить к музыке в какой-то момент трансляции.
Целью является следующая настройка:
Необходимо выполнить несколько шагов:
- добавить/смешать два потока
- конвертировать в моно (или, может быть, это стоило сделать в первую очередь)
- разделение потоков на трансляционный поток и VU-метр
- отправить поток на локальный аудиовыход
Я почти уверен, что это возможно, но пока не смог найти решения в интернете. Копание в .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
Затем вы можете запустить darkice
VU-метр непосредственно на main_out
. Кстати, arecord -D main_out -d 0 -vv /dev/null
это хороший VU-метр для тестирования.
Прочитайте подробности синтаксиса по ссылке выше, я не собираюсь это пробовать. Стрелки -->
указывают на отношения master/slave плагина. Задержка, вероятно, будет ужасной, с одним циклом через пространство ядра и множеством приложений пользовательского пространства.
Если Pulseaudio вам не подходит, альтернативой является jack
, но у меня нет опыта его настройки.