
Estoy intentando redirigir el sonido de un programa (en mi caso, ffmpeg) a una fuente, para poder reproducir el sonido en cuestión en Zoom (software de videoconferencia). La forma clásica de hacerlo sería seleccionar, como fuente de sonido en Zoom, la fuente SinkName.monitor, ya que cada fregadero viene con un monitor. Pero :
1) Zoom no enumera las fuentes del monitor en el menú desplegable de micrófonos. Intenté configurar la propiedad device.class del monitor en "sonido" (en lugar de "monitor") para engañar a Zoom para que lo acepte, sin éxito.
2) Zoom parece negarse a permitirle configurar la fuente usted mismo desde pavucontrol. En la pestaña Grabación, cuando intento configurar otra fuente para que Zoom la escuche, no importa lo que elija, mi elección se ignora. La opción desplegable ni siquiera cambia. Leí en alguna parte que crear ~/.alsoftrc y escribir "[pulse]" (nueva línea) "allow-moves=yes" podría ayudar, pero no hizo nada por mí.
Por lo tanto, estoy intentando configurar mi propia fuente y "redirigir el sonido hacia ella". Creé un sumidero nulo, una fuente nula y un loopback, pero al abrir pavucontrol, entendí que probablemente lo había obtenido al revés; parece que se usa un bucle invertido para redirigir una fuente a un sumidero, no al revés (pavucontrol dice, en Reproducción: "Loopback of MySource en [...] MySink", siendo MySink el valor de la lista desplegable a la derecha ).
¿Hay alguna manera de lograr lo que estoy tratando de hacer? Cualquiera:
a) Modificar un monitor para que parezca un micrófono normal, o
b) ¿Redirigir el sonido de un sumidero a una fuente?
Gracias.
Respuesta1
La siguiente configuración me funciona para compartir el audio de la aplicación con Zoom en Linux. La configuración tal como está, alimenta el micrófono y el audio de la aplicación a Zoom. Pero, como se describe al final, se puede cambiar para usar solo cualquiera de los dos también.
Crea un fregadero donde mezclaremos el micrófono y algo de audio de la aplicación:
pactl load-module module-null-sink sink_name=mix-for-virtual-mic \
sink_properties=device.description=Mix-for-Virtual-Microphone
Cree un receptor que tome el audio de la aplicación y lo envíe a nuestros parlantes y al receptor de mezcla especial que acabamos de crear (reemplácelo alsa_output….analog-stereo
con el nombre de su receptor, consulte pactl list sinks short
).
pactl load-module module-combine-sink sink_name=virtual-microphone-and-speakers \
slaves=mix-for-virtual-mic,alsa_output.pci-0000_00_1b.0.analog-stereo
Haga un loopback de nuestro micrófono real a nuestro disipador de mezclas (reemplácelo alsa_input…analog-stereo
con el nombre de su fuente, consulte pactl list sources short
).
pactl load-module module-loopback source=alsa_input.pci-0000_00_1b.0.analog-stereo \
sink=mix-for-virtual-mic latency_msec=20
No me queda claro cómo determina Zoom qué es realmente un micrófono. No podemos decirle que use un monitor, pero escuchará echo-cancel
(como lo describió Paul). Dado que no hay ningún eco que realmente pretendamos cancelar, creamos un sumidero falso contra el cual cancelar:
pactl load-module module-null-sink sink_name=silence \
sink_properties=device.description=silent-sink-for-echo-cancel
Finalmente, creamos la fuente de cancelación de eco que servirá como micrófono que detecta Zoom:
pactl load-module module-echo-cancel \
sink_name=virtual-microphone source_name=virtual-microphone \
source_master=mix-for-virtual-mic.monitor sink_master=silence aec_method=null \
source_properties=device.description=Virtual-Microphone \
sink_properties=device.description=Virtual-Microphone
Ahora, Zoom debería mostrar un micrófono virtual en la sección Micrófono.
Para enviar el audio de la aplicación a su micrófono virtual, en pavucontrol
, configure el receptor de su aplicación en Mezcla para micrófono virtual (para enviarlo solo al micrófono virtual) o en "Salida simultánea para Mezcla para micrófono virtual,..." para enviarlo al micrófono y a tus altavoces.
Tenga en cuenta que también puede silenciar o cambiar el volumen del audio de la aplicación en el micrófono virtual y los altavoces independientemente del volumen real de su micrófono cambiando el volumen de "Salida simultánea en..." en pavucontrol
.
Naturalmente, puedes silenciar tu micrófono en la sección "Dispositivos de entrada" para compartir solo el audio de la aplicación.
Aquí hay una visualización de esta configuración para una mejor comprensión:
Respuesta2
Encontré otra forma de hacerlo: module-pipe-source.
pactl load-module module-pipe-source source_name=virtualmic file=/tmp/virtualmic format=s16le rate=44100 channels=1
Entonces:
ffmpeg -re -i movie.mkv -f v4l2 /dev/video2 -f s16le -ar 44100 -ac 1 - > /tmp/virtualmic
(Tenga en cuenta que esto también simula una cámara web, utilizando el módulo v412loopback)
Respuesta3
Solo quería enrutar OBS a Zoom. Utilicé V4l2loopback para conectar el vídeo (verhttps://www.eigenmagic.com/2020/04/22/how-to-use-obs-studio-with-zoom/). Para conectar el audio funciona lo siguiente:
#!/bin/sh
# This created something I could see in OBS. Set it as the monitor device in Settings->Audio. Then
# turn on monitoring for the microphone and the video.
pactl load-module module-null-sink sink_name=Virtual-Speaker sink_properties=device.description=Virtual-Speaker
# Now I need to take the monitor stream from the Virtual-Speaker and turn it into a source that Zoom can use
# as a microphone.
pactl load-module module-remap-source source_name=Remap-Source master=Virtual-Speaker.monitor
Mientras reproduce videos de OBS, tenga el audio/video alineado, si intenta agregar comentarios sobre el video, no se sincroniza correctamente.
ACTUALIZAR:
Habiendo usado esto por un tiempo, aquí está mi flujo:
- Arrancar la computadora,
- Ejecutar guión,
- Inicie OBS (que toma el control de la cámara e inicia la transmisión de video virtual),
- Iniciar Zoom (capta las transmisiones virtuales, pero a veces tiene un retraso en el audio),
- Salga de OBS,
- Inicie OBS (el audio ahora no tiene demoras).
- dar clase.
Si tengo que dar otra clase:
- Salir de Zoom,
- Iniciar una nueva reunión de Zoom,
- Salga de OBS,
- Inicie OBS.
- enseñar segunda clase
Este proceso ha sido confiable para mí desde hace un tiempo. No he intentado agregar ninguna automatización adicional al proceso. TEORÍA (sin evidencia real): Tengo que iniciar OBS antes que ZOOM para que los programas capten los dispositivos correctos. OBS comienza a poner cosas en el canal de audio, así que luego tengo que detener y reiniciar OBS para permitir que el canal se vacíe.
Respuesta4
Me encontré con el mismo problema con Zoom. Una alternativa podría ser el module-echo-cancel
. Esto puede crear una nueva fuente, a partir de una fuente de monitor existente. Creo que con la configuración predeterminada, procesa poco.
pactl load-module module-echo-cancel \
sink_name="echo_cancel" \
source_master="YourSink.monitor" \
sink_master="DefaultSink" \
aec_method="webrtc"
Establezca DefaultSink
cualquiera que sea su dispositivo de salida predeterminado y YourSink.monitor
el monitor del sumidero (en nuestro caso, el sumidero de flujo).
Obtuve esta solución desecuencia de comandos ipwebcam-gst.