PulseAudio RTP Multicast - como reproduzir som no remetente também?

1

Estou transmitindo música de um único PC de controle ("remetente") para vários PCs (receptores) na minha LAN, conforme descrito aqui:

link

Como faço para reproduzir a mesma música no PC controlador (remetente)?

Minha configuração atual é muito simples para testes agora:

remetente

pactl load-module module-null-sink sink_name=rtpsink1
pactl load-module module-rtp-send source=rtpsink1.monitor

receptores

pactl load-module module-rtp-recv
    
por MountainX 25.09.2018 / 05:53

2 respostas

1

Esta é a minha solução de trabalho preferida. Ele é baseado em: pulsertp-multiroom - link

Estou usando isso para enviar áudio para vários receptores (salas diferentes). Existem duas linhas, descritas abaixo, que também fazem do remetente um receptor e resolvem essa questão. Eles são:

  • module-rtp-send com o único endereço IP do remetente
  • module-rtp-recv com o único endereço IP do remetente

A vantagem dessa abordagem é que todos os receptores (incluindo o do emissor) permanecem sincronizados. Esse não foi o caso quando combinamos sincronizações como na minha outra resposta.

Após a edição para inserir os endereços IP corretos, eu corro este script no remetente quando estiver pronto para iniciar o unicast RTP:

#!/bin/bash
#
# PulseRTP-multiroom
#   Loads RTP sender modules to setup multiroom audio at request
#
#   Notes
#     * If you have issues, and have multiple network interfaces, add source_ip= with you prefered local IP
#     * mtu=1408 is good initial value. It makes room for 352 PCM frames in 16/44.1k.
#
pa_rtp_mtu=1408
pa_sink="rtpsink1"

echo "timedatectl status:"
timedatectl status --no-pager | grep 'NTP service: active'
if [[ $? -ne 0 ]]; then
    timedatectl set-ntp true
    sleep 2
    timedatectl status --no-pager | grep 'NTP service: active'
    if [[ $? -ne 0 ]]; then
        echo "WARNING: NTP service not active"
    else
        echo "timedatectl status OK"
    fi
fi

pacmd list-modules | grep module-native-protocol-unix
if [ $? -ne 0 ]; then
    pactl load-module module-native-protocol-unix
fi
pacmd list-modules | grep module-default-device-restore
if [ $? -ne 0 ]; then
    pactl load-module module-default-device-restore
fi
pacmd list-modules | grep module-rescue-streams
if [ $? -ne 0 ]; then
    pactl load-module module-rescue-streams
fi
pacmd list-modules | grep module-always-sink
if [ $? -ne 0 ]; then
    pactl load-module module-always-sink
fi
pacmd list-modules | grep module-intended-roles
if [ $? -ne 0 ]; then
    pactl load-module module-intended-roles
fi
pacmd list-modules | grep module-suspend-on-idle
if [ $? -ne 0 ]; then
    load-module module-suspend-on-idle
fi

#hardcoded addresses of each receiver:
pactl load-module module-rtp-send source=${pa_sink}.monitor mtu=${pa_rtp_mtu} destination_ip=192.168.0.1 #this is the sender's IP address (see below)
pactl load-module module-rtp-send source=${pa_sink}.monitor mtu=${pa_rtp_mtu} destination_ip=192.168.0.2
pactl load-module module-rtp-send source=${pa_sink}.monitor mtu=${pa_rtp_mtu} destination_ip=192.168.0.3
pactl load-module module-rtp-send source=${pa_sink}.monitor mtu=${pa_rtp_mtu} destination_ip=192.168.0.4
pactl load-module module-rtp-send source=${pa_sink}.monitor mtu=${pa_rtp_mtu} destination_ip=192.168.0.5

Em cada receptor:

pactl load-module module-rtp-recv sap_address=192.168.0.X

Use o endereço IP real do destinatário, por exemplo, 192.168.0.2

Finalmente, no remetente, faça também um receptor:

pactl load-module module-rtp-recv sap_address=192.168.0.1

Você pode tornar a configuração dos receptores permanentes editando o /etc/pulse/default.pa

Para interromper a transmissão de RTP para os destinatários, execute este script no remetente:

#!/bin/bash
#
# PulseRTP-Multiroom
#   Unloads RTP sender modules to avoid unnecessary bandwidth hogging
#

pa_sink="rtpsink1"

IFS=$'\n'
for rtpn in 'pactl list modules short|grep ${pa_sink}'; do
    PAM_ID='echo $rtpn|awk '{print $1}''
    pactl unload-module $PAM_ID
    echo " * unload-module id $PAM_ID done"
done

Para iniciar e parar a reprodução de música, não são necessárias alterações nos receptores. Sua configuração pode se tornar permanente. Eu não tive a necessidade de fazer qualquer alteração de configuração permanente no remetente com a minha versão modificada do script de início acima.

    
por 27.09.2018 / 12:00
1

Use o módulo combinador-coletor.

No remetente:

pacmd list-sinks

Use os valores de cada coletor a serem combinados na lista de escravos abaixo:

pactl load-module module-combine-sink sink_name=rtp1combined slaves=abcd,wxyz

onde abcd e wxyz seriam os nomes dos dois sumidouros a serem combinados. No meu caso, isso seria slaves = rtpsink1, alsa_output.pci-0000_02_00.1.hdmi-stereo

UPDATE: este método aparentemente tem a desvantagem de o remetente não estar sincronizado com os nós.

    
por 25.09.2018 / 06:08