Gravar a origem do monitor (mix de saída) de outro computador usando o PulseAudio

2

Estou projetando uma parede de visualização LED baseada em Raspberry Pi que pode, por exemplo, exibir o espectro de freqüência da saída de som de outro computador. A escolha lógica seria usar o PulseAudio para monitorar o áudio pela LAN.

Existe um problema, no entanto. Posso facilmente reproduzir áudio de um computador para outro e também gravar uma entrada de microfone remota, então não há nada errado com minha configuração básica, mas por algum motivo eu não consigo gravar a fonte do monitor que deve fornecer uma mistura de todo áudio reproduzido no controle remoto computador. Eu posso até ver a fonte do monitor remoto na lista de entrada do PulseAudio Volume Control (pavucontrol), mas tudo que consigo é silêncio quando é selecionado para gravação. Localmente, a fonte do monitor funciona bem. A pia é uma saída HDMI com PCM estéreo regular, não passagem AC3 / DTS.

Estou sentindo falta de algo essencial aqui? O acesso à rede para monitorar fontes é impedido por algum motivo?

Se houver uma solução para isso, ficarei feliz em ver uma alternativa de CLI também, já que isso é o que eu preciso principalmente para o meu projeto.

Eu usei todo o meu Google-fu sem sucesso, mas eu ficaria surpreso se ninguém tivesse feito isso antes.

Atualização: Adicionada a saída de pacmd list-sources | grep name: conforme solicitado. Os itens encapsulados são listados duas vezes por causa do IPv6, mas isso não é um problema.

name: <alsa_output.pci-0000_00_1b.0.analog-stereo.monitor>
name: <alsa_input.pci-0000_00_1b.0.analog-stereo>
name: <tunnel.mediacenter.local.alsa_input.pci-0000_00_14.2.analog-stereo>
name: <tunnel.mediacenter.local.alsa_input.pci-0000_00_14.2.analog-stereo.2>
name: <tunnel.mediacenter.local.alsa_output.pci-0000_01_00.1.hdmi-stereo.monitor>
name: <tunnel.mediacenter.local.alsa_output.pci-0000_00_14.2.iec958-stereo.monitor>
name: <tunnel.mediacenter.local.alsa_output.pci-0000_01_00.1.hdmi-stereo.2.monitor>
name: <tunnel.mediacenter.local.alsa_output.pci-0000_00_14.2.iec958-stereo.2.monitor>
    
por Martin Laakso 28.08.2017 / 22:04

1 resposta

2

Estou postando uma solução minha, encontrada com a ajuda de desenvolvedores do PulseAudio, para que outros possam evitar minhas dificuldades.

O problema acabou sendo um bug no módulo zeroconf do PulseAudio 10.0 e provavelmente será consertado mais cedo ou mais tarde. Até lá, a única solução (além de criar um túnel manualmente) é gravar diretamente do servidor remoto do PulseAudio, ignorando o módulo do túnel. Isso provavelmente não funcionará com aplicativos GUI, no entanto. Exemplo de comando para gravar uma fonte de monitor remoto:

PULSE_SERVER=REMOTE_HOST parecord --device=MONITOR_SOURCE > recording.wav

Substitua REMOTE_HOST e MONITOR_SOURCE pelos valores apropriados, usando o nome local da fonte (ou seja, no meu caso alsa_output.pci-0000_01_00.1.hdmi-stereo.monitor).

Uma conexão direta semelhante do PulseAudio pode ser usada com o GStreamer, que possui ferramentas e ligações CLI convenientes para várias linguagens de programação. Exemplo de comando para reproduzir uma fonte de monitor remoto localmente:

gst-launch-1.0 pulsesrc server=REMOTE_HOST device=MONITOR_SOURCE ! pulsesink

O GStreamer também pode fornecer dados de espectro, que podem ser úteis em projetos de visualização. Exemplo com um intervalo longo e sem taxa de transferência de áudio:

gst-launch-1.0 -m pulsesrc server=REMOTE_HOST device=MONITOR_SOURCE\
 ! spectrum interval=400000000 bands=10 threshold=-100 ! fakesink
    
por 11.10.2017 / 00:07

Tags