Para una configuración de transmisión, me gustaría mezclar audio de un dispositivo de entrada con audio de un archivo .wav. El archivo .wav contiene una música de introducción, espera o salida que me gustaría agregar a la música en algún momento durante la transmisión.
El objetivo es la siguiente configuración:
Se necesitan varios pasos:
- agregar/mezclar dos transmisiones
- convertir a mono (o tal vez esto debería haberse hecho primero)
- dividir las transmisiones para una transmisión de transmisión y un medidor VU
- enviar la transmisión a la salida de audio local
Estoy bastante seguro de que esto debe ser posible, pero todavía no pude encontrar ninguna solución en Internet. Investigar en .asoundrc de alsa no arrojó ningún resultado todavía. Parece que alsa dmix hace algunas mezclas, pero no es lo que quiero aquí...
Realmente no sé por dónde empezar.
¿Alguien puede arrojar algo de luz sobre esto? ¡Una solución parcial también estaría bien!
Respuesta1
La forma más sencilla es utilizar Pulseaudio. (Puedes hacerlo con ALSA, pero será complicado configurarlo).
Todo lo que produce sonido se mezcla automáticamente en la salida actual ("sumidero" en términos de Pulseaudio), por lo que no necesita preocuparse por la mezcla. Puede controlar los volúmenes con pavucontrol
y recuerda el último volumen por nombre de la aplicación. Puedes usarlo paplay
para reproducir archivos wav desde la línea de comandos, pero también servirá cualquier otro reproductor de audio.
La conversión a mono se realizará automáticamente si su disipador es mono. Si no puede configurar el sumidero RaspPi local para eso (no lo sé, no tengo un RaspPi), puede agregar un sumidero "pseudo" con
pactl load-module module-null-sink sink_name=whatever
o si resulta que necesitas reasignar en Pulseaudio module-remap-sink
(ver más abajo, todavía no lo he probado).
Este receptor o el receptor RaspPi local tendrá una .monitor
fuente asociada que puede usar para distribuirlo a icecast, etc.
Puede configurar una alimentación permanente de la entrada hw:1 en los disipadores elegidos con
pacmd load-module module-loopback source="alsa_input.name_of_hw_1" sink="whatever_or_local_sink"
Puede enumerar los nombres de receptores disponibles con
pacmd list-sinks | grep name:
Como argumentos, utilice el nombre sin los corchetes angulares.
Creo que eso es lo básico. Lea sobre Pulseaudio disponiblemódulos, y pacmd help
le dirá qué puede hacer desde la línea de comandos, si no desea utilizar pavucontrol
.
EditarparaALSA:
Primero, lea sobre los disponibles.complementos. Necesitará una "tarjeta de sonido virtual" para enrutar el audio a darkice, etc. Ese es un módulo del kernel, así que haga algo como
sudo modprobe snd-aloop pcm_substreams=2
para probar y colocar un archivo /etc/modprobe.d
cuando funcione. Digamos que el loopback es hw:3,*,*
.
En el lado de entrada de la tarjeta de sonido virtual, necesitarás algo como
dmix "main_in" --> enchufe (slave.channels = 1) --> hw:3,0,0
Entonces puedes aplay -D main_in sound.wav
y corre.
alsaloop -C hw:0 -P main_in
para conectarlo al capturador de audio.
En el lado de salida de la tarjeta de sonido virtual, algo así como
hw:3,1,0 --> dsnoop "salida_principal"
y monitorearlo en la salida de audio local, nuevamente
alsaloop -C main_out -P local_audio_out
Luego puede ejecutar darkice
y el medidor VU directamente en main_out
. Por cierto, arecord -D main_out -d 0 -vv /dev/null
es un buen vúmetro para realizar pruebas.
Lea los detalles sobre la sintaxis en el enlace de arriba, no voy a probar esto. Las -->
flechas indican las relaciones maestro/esclavo del complemento. La latencia probablemente será horrible, con un bucle invertido a través del espacio del kernel y muchas aplicaciones en el espacio de usuario.
Si Pulseaudio no te funciona, una alternativa es jack
, pero no tengo experiencia en configurarlo.