보내는 사람

보내는 사람

다음과 같이 하나의 제어 PC("발신자")에서 LAN에 있는 여러 PC(수신기)로 음악을 스트리밍하고 있습니다.

https://www.freedesktop.org/wiki/Software/PulseAudio/Documentation/User/Network/#index2h3

제어하는 PC(발신자)에서 동일한 음악을 어떻게 재생할 수 있나요?

현재 설정은 지금 테스트하기에 매우 간단합니다.

보내는 사람

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

수화기

pactl load-module module-rtp-recv

답변1

이것이 내가 선호하는 작업 솔루션입니다. 기반: pulseertp-multiroom
https://github.com/mada3k/pulsertp-multiroom/blob/master/scripts/pulsertpm-start.sh

여러 수신기(다른 방)에 오디오를 보내는 데 사용합니다. 아래와 같이 송신자를 수신자로 만들고 문제를 해결하는 두 개의 라인이 있습니다. 그들은:

  • 발신자의 고유 IP 주소로 module-rtp-send
  • 발신자의 고유 IP 주소가 포함된 module-rtp-recv

이 접근 방식의 장점은 모든 수신기(송신기의 수신기 포함)가 동기화된 상태를 유지한다는 것입니다. 다른 답변에서와 마찬가지로 동기화를 결합하는 경우에는 그렇지 않습니다.

올바른 IP 주소를 편집한 후 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

각 수신기에서:

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

수신자의 실제 IP 주소를 사용하세요(예: 192.168.0.2).

마지막으로 발신자에서도 수신자로 만듭니다.

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

/etc/pulse/default.pa를 편집하여 수신기의 구성을 영구적으로 만들 수 있습니다.

수신자에 대한 RTP 캐스팅을 중지하려면 발신자에서 다음 스크립트를 실행하세요.

#!/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

음악 재생을 시작하고 중지하기 위해 수신기를 변경할 필요가 없습니다. 해당 구성을 영구적으로 설정할 수 있습니다. 위 시작 스크립트의 수정된 버전을 사용하여 발신자에 대한 영구적인 구성 변경을 수행할 필요가 없습니다.

답변2

모듈을 사용하여 수신기를 결합합니다.

보낸 사람:

pacmd list-sinks

아래 슬레이브 목록에 결합된 각 수신기의 값을 사용하십시오.

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

여기서 abcdwxyz는 결합할 두 수신기의 이름입니다. 제 경우에는 이것은slaves=rtpsink1,alsa_output.pci-0000_02_00.1.hdmi-stereo입니다.

업데이트: 이 접근 방식에는 보낸 사람이 노드와 동기화되지 않는다는 단점이 있는 것 같습니다.

관련 정보