送信者

送信者

次のように、1つの制御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

複数の受信機(他の部屋)にオーディオを送信するために使用します。以下に示すように、送信者を受信者にし、問題を解決する2つの行があります。彼らは:

  • 発信者の一意の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およびは、結合する2つの受信機の名前です。私の場合、これはslaves = rtpsink1、alsa_output.pci-0000_02_00.1.hdmi-stereoです。

更新:このアプローチには、送信者がノードと同期しないという欠点があるようです。

関連情報