Audio

PulseAudio RTP - 如何在發件人上播放聲音?

  • March 11, 2020

我正在將音樂從一台控制 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

這是我首選的工作解決方案。它基於:pulsertp-multiroom

https://github.com/mada3k/pulsertp-multiroom/blob/master/scripts/pulsertpm-start.sh

我正在使用它將音頻發送到多個接收器(不同的房間)。有兩行,如下所述,它們使發送者也成為接收者並解決了這個問題。他們是:

  • module-rtp-send 帶有發件人唯一的 IP 地址
  • 帶有發件人唯一 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

對於開始和停止音樂播放,無需對接收器進行任何更改。他們的配置可以永久化。我不需要使用上面的啟動腳本的修改版本對發件人進行任何永久配置更改。

引用自:https://unix.stackexchange.com/questions/471222