
Estou tentando redirecionar o som de um programa (no meu caso, ffmpeg) para uma fonte, para poder reproduzir o som em questão no Zoom (software de videoconferência). A forma clássica de fazer isso seria selecionar, como fonte sonora no Zoom, a fonte SinkName.monitor, já que todo sink vem com um monitor. Mas :
1) O Zoom não lista as fontes do monitor no menu suspenso do microfone. Tentei definir a propriedade device.class do monitor como "som" (em vez de "monitor") para enganar o Zoom e fazê-lo aceitá-lo, sem sucesso.
2) O Zoom parece se recusar a permitir que você mesmo defina a fonte no pavucontrol. Na aba Gravação, quando tento definir outra fonte para ser ouvida pelo Zoom, não importa o que eu escolha, minha escolha é ignorada. A opção suspensa nem muda. Eu li em algum lugar que criar ~/.alsoftrc e escrever "[pulse]" (nova linha) "allow-moves=yes" poderia ajudar, mas não fez nada por mim.
Portanto, estou tentando definir minha própria fonte e "redirecionar o som para ela". Criei um coletor nulo, uma fonte nula e um loopback, mas ao abrir o pavucontrol, entendi que provavelmente entendi ao contrário; um loopback parece ser usado para redirecionar uma fonte para um coletor, e não o contrário (pavucontrol diz, em Reproduzindo: "Loopback of MySource on [...] MySink", sendo MySink o valor da lista suspensa à direita ).
Existe uma maneira de conseguir o que estou tentando fazer? Qualquer:
a) Modificar um monitor para que pareça um microfone normal, ou
b) Redirecionar o som de um sumidouro para uma fonte?
Obrigado.
Responder1
A configuração a seguir funciona para eu compartilhar o áudio do aplicativo com o Zoom no Linux. A configuração como está alimenta o microfone e o áudio do aplicativo no Zoom. Mas, conforme descrito no final, pode ser alterado para usar apenas um dos dois.
Crie um coletor onde mixaremos o microfone e algum áudio do aplicativo:
pactl load-module module-null-sink sink_name=mix-for-virtual-mic \
sink_properties=device.description=Mix-for-Virtual-Microphone
Crie um coletor que receba o áudio do aplicativo e o envie para nossos alto-falantes e para o coletor de mixagem especial que acabamos de criar (substitua alsa_output….analog-stereo
pelo nome do seu coletor, 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
Loopback do nosso microfone real para o coletor de mixagem (substitua alsa_input…analog-stereo
pelo nome da sua fonte, 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
Não está claro para mim como o Zoom determina o que é realmente um microfone. Não podemos dizer a ele para usar um monitor, mas ele ouvirá um echo-cancel
(como Paul descreveu). Como não há eco que realmente pretendemos cancelar, criamos um coletor falso para cancelar:
pactl load-module module-null-sink sink_name=silence \
sink_properties=device.description=silent-sink-for-echo-cancel
Por fim, criamos a fonte de cancelamento de eco que servirá como microfone que o Zoom detecta:
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
Agora, o Zoom deve mostrar um microfone virtual na seção Microfone.
Para enviar o áudio do aplicativo para o seu microfone virtual, em pavucontrol
, configure o coletor do seu aplicativo para Mix-for-Virtual-Microphone (para enviá-lo apenas para o microfone virtual) ou para "Saída simultânea para Mix-for-Virtual-Microphone, …" para enviá-lo ao microfone e aos alto-falantes.
Observe que você também pode silenciar ou alterar o volume do áudio do aplicativo no microfone virtual e nos alto-falantes independentemente do volume real do seu microfone, alterando o volume de "Saída simultânea em…" no formato pavucontrol
.
Naturalmente, você pode silenciar seu microfone na seção “Dispositivos de entrada” para compartilhar apenas o áudio do aplicativo.
Aqui está uma visualização desta configuração para facilitar a compreensão:
Responder2
Encontrei outra maneira de fazer isso: module-pipe-source.
pactl load-module module-pipe-source source_name=virtualmic file=/tmp/virtualmic format=s16le rate=44100 channels=1
Então:
ffmpeg -re -i movie.mkv -f v4l2 /dev/video2 -f s16le -ar 44100 -ac 1 - > /tmp/virtualmic
(Observe que isso também falsifica uma webcam, usando o módulo v412loopback)
Responder3
Eu queria apenas encaminhar o OBS para o Zoom. Usei V4l2loopback para conectar o vídeo (vejahttps://www.eigenmagic.com/2020/04/22/how-to-use-obs-studio-with-zoom/). Para conectar o áudio, funciona o seguinte:
#!/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
Ao reproduzir vídeos do OBS, tenha o áudio/vídeo alinhado, se você tentar adicionar comentários sobre o vídeo, ele não será sincronizado corretamente.
ATUALIZAR:
Tendo usado isso há algum tempo, aqui está meu fluxo:
- Inicialize o computador,
- Execute o script,
- Inicie o OBS (que assume o controle da câmera e inicia o feed de vídeo virtual),
- Inicie o Zoom (captura os feeds virtuais, mas às vezes apresenta atraso no áudio),
- Sair do OBS,
- Inicie o OBS (o áudio não tem atraso agora).
- dar aula.
Se eu tiver que dar outra aula:
- Sair do zoom,
- Iniciar nova reunião Zoom,
- Sair do OBS,
- Inicie OBS.
- dar aula na 2ª aula
Este processo tem sido confiável para mim já há algum tempo. Não tentei adicionar nenhuma automação adicional ao processo. TEORIA (sem evidências reais): Tenho que iniciar o OBS antes do ZOOM para que os programas peguem os dispositivos certos. O OBS começa a colocar coisas no pipeline de áudio, então tenho que parar e reiniciar o OBS para permitir que o pipeline seja liberado.
Responder4
Encontrei o mesmo problema com o Zoom. Uma alternativa poderia ser o module-echo-cancel
. Isto pode criar uma nova fonte, a partir de uma fonte de monitor existente. Acredito que com as configurações padrão ele faz pouco processamento.
pactl load-module module-echo-cancel \
sink_name="echo_cancel" \
source_master="YourSink.monitor" \
sink_master="DefaultSink" \
aec_method="webrtc"
Defina DefaultSink
qualquer que seja o seu dispositivo de saída padrão e YourSink.monitor
o monitor do coletor (no nosso caso, o coletor de fluxo).
Eu peguei essa solução descript ipwebcam-gst.