Redirecionando o coletor Pulseaudio para uma fonte virtual

Redirecionando o coletor Pulseaudio para uma fonte virtual

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-stereopelo 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-stereopelo 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:

gráfico da configuraçã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:

  1. Inicialize o computador,
  2. Execute o script,
  3. Inicie o OBS (que assume o controle da câmera e inicia o feed de vídeo virtual),
  4. Inicie o Zoom (captura os feeds virtuais, mas às vezes apresenta atraso no áudio),
  5. Sair do OBS,
  6. Inicie o OBS (o áudio não tem atraso agora).
  7. dar aula.

Se eu tiver que dar outra aula:

  1. Sair do zoom,
  2. Iniciar nova reunião Zoom,
  3. Sair do OBS,
  4. Inicie OBS.
  5. 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 DefaultSinkqualquer que seja o seu dispositivo de saída padrão e YourSink.monitoro monitor do coletor (no nosso caso, o coletor de fluxo).

Eu peguei essa solução descript ipwebcam-gst.

informação relacionada