Streaming audio output from Linux to Windows using PulseAudio.
VNC RFB本身只是遠端桌面協定,不像RDP支援音訊傳輸。
有些VNC伺服器自行實作了解決方案,例如RealVNC和KasmVNC都有自家的音訊串流方案,他們的客戶端也支援播放聲音。至於使用開源TightVNC、TigerVNC、x11VNC的我等,就得自行想辦法解決音訊問題。
目前大多數Linux發行版音訊伺服器是PulseAudio,它能夠用「Simple TCP Protocol」模組,經由網路播放音效。利用這個原理,我們只要跑個PulseAudio接收端,就能夠播放遠端Linux桌面的音效了。
這代表你得一邊開著VNC客戶端,一邊開著其他程式來接收遠端Linux桌面的音訊。
如果你的Linux發行版使用PipeWire,無妨!PulseAudio的串流功能PipeWire也能用。
1. 遠端Linux伺服端的設定#
- Ubuntu/Debian安裝PulseAudio套件,並設定自動啟動服務
sudo apt install pulseaudio pavucontrol
systemctl --user enable --now pulseaudio
- 安裝VNC伺服器服務,例如 TigerVNC
2. 設定Simple TCP Protocol模組#
- 取得Linux的IP
ip addr
- 列出Linux桌面音訊裝置
pactl list sources short
- 載入Simple TCP Protocol模組,
source=
後面填寫音訊裝置,IP使用Linux的IP,通訊埠使用8000
pactl load-module module-simple-protocol-tcp rate=48000 channels=2 source="auto_null.monitor" record=true listen="Linux的IP" port=8000
若要讓Simple TCP Protocol模組跟著VNC一起啟動,在
~/.vnc/xstartup
加入以上指令。然後開放Linux防火牆
sudo ufw allow 8000
sudo ufw reload
- 在Linux開啟pavuconttrol程式,觀察音訊輸出。有PulseAudio客戶端連線的時候就會跳出capture。
3. 播放PulseAudio音訊的客戶端#
請先開啟VNC客戶端,連線到Linux遠端桌面。接著再開啟要接收PulseAudio音訊的客戶端。
Windows#
Android#
下載 Simple Protocol Player,填入Linux IP和通訊埠即可。
4. 另類解法:ffmpeg RTP串流PulseAudio音效#
這可以讓PulseAudio播放的音效透過rtp串流,再用ffmpeg播放。
- 在要接收PulseAudio音訊的電腦,執行ffplay
ffplay -nodisp -ac 2 -acodec pcm_s16le -ar 48000 -analyzeduration 0 -probesize 32 -f s16le -i udp://0.0.0.0:18181?listen=1
開放防火牆18181通訊埠
(請在VNC視窗執行指令,不可以用SSH)在遠端Linux載入
module-null-sink
模組,再執行ffmpeg串流到接收端電腦
pactl load-module module-null-sink sink_name=remote
ffmpeg -f pulse -i "remote.monitor" -ac 2 -acodec libmp3lame -ar 44100 -ab 128000 -f rtp rtp://接收端電腦的IP:18181
- 在Linux開啟pavucontrol,設定音訊輸出為remote即可。
或許我們可以把PulseAudio的音訊變成RTP串流,然後再用VLC播放?我沒試成功就是了。