快轉到主要內容

VNC + PulseAudio,串流播放Linux遠端桌面的音訊

分類   Linux系統 Self-hosting自架
標籤   VNC PulseAudio PipeWire
🗓️ 民國113年 甲辰年
✍ 切換正體/簡體字
目錄

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伺服端的設定
#

  1. Ubuntu/Debian安裝PulseAudio套件,並設定自動啟動服務
sudo apt install pulseaudio pavucontrol

systemctl --user enable --now pulseaudio
  1. 安裝VNC伺服器服務,例如 TigerVNC

2. 設定Simple TCP Protocol模組
#

  1. 取得Linux的IP
ip addr
  1. 列出Linux桌面音訊裝置
pactl list sources short
  1. 載入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
  1. 若要讓Simple TCP Protocol模組跟著VNC一起啟動,在~/.vnc/xstartup加入以上指令。

  2. 然後開放Linux防火牆

sudo ufw allow 8000
sudo ufw reload
  1. 在Linux開啟pavuconttrol程式,觀察音訊輸出。有PulseAudio客戶端連線的時候就會跳出capture。

3. 播放PulseAudio音訊的客戶端
#

請先開啟VNC客戶端,連線到Linux遠端桌面。接著再開啟要接收PulseAudio音訊的客戶端。

Windows
#

下載 SimpleProtocolServer

Android
#

下載 Simple Protocol Player,填入Linux IP和通訊埠即可。

4. 另類解法:ffmpeg RTP串流PulseAudio音效
#

這可以讓PulseAudio播放的音效透過rtp串流,再用ffmpeg播放。

  1. 在要接收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
  1. 開放防火牆18181通訊埠

  2. (請在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
  1. 在Linux開啟pavucontrol,設定音訊輸出為remote即可。

或許我們可以把PulseAudio的音訊變成RTP串流,然後再用VLC播放?我沒試成功就是了。

參考資料
#

相關文章

給VNC遠端桌面啟用GPU加速,Linux VirtualGL設定方式
分類   Linux系統 Self-hosting自架
標籤   VNC VirtualGL Raspberry Pi
noVNC,用任意網頁瀏覽器存取Linux VNC遠端桌面
分類   Linux系統 Self-hosting自架
標籤   VNC Remote Desktop
Linux設定TigerVNC遠端桌面,用Systemd執行vncserver
分類   Linux系統 Self-hosting自架
標籤   VNC Remote Desktop

留言板

此處提供二種留言板。點選按鈕,選擇您覺得方便的留言板。要討論程式碼請用Giscus,匿名討論請用Disqus。

這是Giscus留言板,需要Github帳號才能留言。支援markdown語法,若要上傳圖片請貼Imgur或Postimages。您的留言會在Github Discussions向所有人公開。

這是Disqus留言板,您可能會看到Disqus強制投放的廣告。為防止垃圾內容,有時留言可能會被系統判定需審核,導致延遲顯示,請見諒。若要上傳圖片請善用圖床網站。