Para uma configuração de transmissão, gostaria de mixar o áudio de um dispositivo de entrada com o áudio de um arquivo .wav. O arquivo .wav contém uma música de introdução, espera ou saída que eu gostaria de adicionar à música em algum momento durante a transmissão.
A seguinte configuração é o objetivo:
Existem várias etapas necessárias:
- adicionar/misturar dois fluxos
- converter para mono (ou talvez isso devesse ter sido feito primeiro)
- divida os streams para um stream de transmissão e um medidor VU
- envie o stream para a saída de áudio local
Tenho certeza de que isso deve ser possível, mas ainda não consegui encontrar nenhuma solução na internet. Explorar o .asoundrc do alsa ainda não produziu nenhum resultado. Parece que alsa dmix faz algumas mixagens, mas não é o que eu quero aqui....
Eu realmente não sei por onde começar.
Alguém pode lançar alguma luz sobre isso? Uma solução parcial também seria adequada!
Responder1
A maneira mais fácil é usar o Pulseaudio. (Você pode fazer isso com ALSA, mas será difícil configurar.)
Tudo o que produz som é mixado automaticamente na saída atual ("sink" nos termos do Pulseaudio), então você não precisa se preocupar com a mixagem. Você pode controlar os volumes com pavucontrol
e ele lembra o último volume pelo nome do aplicativo. Você pode usar paplay
para reproduzir arquivos wav a partir da linha de comando, mas qualquer outro reprodutor de áudio também serve.
A conversão para mono será feita automaticamente se o seu coletor for mono. Se você não pode configurar o coletor RaspPi local para isso (não sei, não possuo um RaspPi), você pode adicionar um coletor "pseudo" com
pactl load-module module-null-sink sink_name=whatever
ou se você precisar remapear no Pulseaudio module-remap-sink
(veja abaixo, ainda não tentei fazer isso).
Este coletor ou o coletor RaspPi local terá uma .monitor
fonte associada que você pode usar para distribuí-lo para icecast, etc.
Você pode configurar um feed permanente da entrada hw:1 nos coletores escolhidos com
pacmd load-module module-loopback source="alsa_input.name_of_hw_1" sink="whatever_or_local_sink"
Você pode listar os nomes de coletores disponíveis com
pacmd list-sinks | grep name:
Como argumentos, use o nome sem colchetes angulares.
Acho que isso é o básico. Leia sobre o Pulseaudio disponívelmódulos, e pacmd help
dirá o que você pode fazer na linha de comando, se não quiser usar pavucontrol
.
EditarparaALSA:
Primeiro, leia sobre os disponíveisplug-ins. Você precisará de uma "placa de som virtual" para rotear o áudio para o darkice etc. Esse é um módulo do kernel, então faça algo como
sudo modprobe snd-aloop pcm_substreams=2
para teste e coloque um arquivo /etc/modprobe.d
quando funcionar. Digamos que o loopback seja hw:3,*,*
.
No lado de entrada da placa de som virtual, você precisará de algo como
dmix "main_in" --> plug (slave.channels = 1) --> hw:3,0,0
Então você pode aplay -D main_in sound.wav
, e correr
alsaloop -C hw:0 -P main_in
para conectá-lo ao captador de áudio.
No lado de saída da placa de som virtual, algo como
hw:3,1,0 --> dsnoop "main_out"
e monitorá-lo na saída de áudio local, novamente
alsaloop -C main_out -P local_audio_out
Você pode então executar darkice
o medidor VU diretamente no main_out
. Aliás, arecord -D main_out -d 0 -vv /dev/null
é um bom medidor VU para testes.
Leia detalhes sobre a sintaxe no link acima, não vou tentar fazer isso. As -->
setas indicam as relações mestre/escravo do plugin. A latência provavelmente será horrível, com um loopback através do espaço do kernel e muitos aplicativos do espaço do usuário.
Se o Pulseaudio não funcionar para você, uma alternativa é jack
, mas não tenho experiência em configurá-lo.