Audio
PulseAudio RTP - 如何在發件人上播放聲音?
我正在將音樂從一台控制 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
對於開始和停止音樂播放,無需對接收器進行任何更改。他們的配置可以永久化。我不需要使用上面的啟動腳本的修改版本對發件人進行任何永久配置更改。