2022年5月14日 星期六

pulseaudio 一對一聲音串流超簡單

兩部 linux 機器之間可以做聲音串流嗎? 假設有一部 M(ute) 機沒有喇叭; 另一部 S(peaker) 機有喇叭。 想要在 M 機上面用 mpg123 指令 (無聲地) 播放音樂, 再透過網路傳送到 S 機用它的喇叭真的把聲音放出來。

S 機要安裝 pulseaudio-utils 套件。 (M 機也許也要? 不知道, 因為我的 M 機是 linux mint, 本來就有安裝。 至於 S 機則是 android/lineage OS 加 termux, 實際的安裝指令是: pkg install pulseaudio。) 假設兩部機器位於同一個區網 192.168.97.0/24 。 先在 S 機執行:

pulseaudio --start --exit-idle-time=-1
pacmd load-module module-native-protocol-tcp auth-ip-acl=192.168.97.0/24

然後在 M 機執行:

export PULSE_SERVER=192.168.97.ss
mpg123 some-music.mp3

其中 192.168.97.ss 是 S 機的 IP, 這樣 M 機的播放指令就透過 S 機的喇叭播出來啦! 沒想到這麼簡單~ 跟 X Window 或 ssh 可以完全沒有關係, 也不需要 root 的權限。 我曾用 ctrl-alt-F1 切換到純文字終端機 VT1 底下, 一樣成功。 不過用 ogg123 播放 .ogg 檔時, 會斷斷續續的, 不知跟平板速度慢有沒有關係? 用 mpg123 播 .mp3 檔則很順暢沒問題。

當然這完全沒有顧慮安全性: 區域網路裡面的其他 linux 也可以任意藉由你的喇叭開口。 是說... 就算我老婆用 linux (<= 假設語氣) 我也沒那個膽子把她的機器設成 S 機來鬧她... 總之, S 機比較謹慎的做法是, 啟動時改成這樣:

pulseaudio --start --exit-idle-time=-1
pacmd load-module module-native-protocol-tcp

並且將 S 機的 ~/.config/pulse/cookie 這個檔案複製給 M 機放相同的位置, 也就是不特別放行任何機器的情況下, 唯有握有通關密碼的 M 機才會被允許借用 S 機的喇叭發聲。 如果兩部機器不在同一個區網裡, 這也是比較好的設定方式。 不過必須先把舊的兩個 processes 砍掉再重啟, 新的設定才會生效。 還有, 如果 S 機並未啟動服務, 而 M 機本身其實有喇叭, 那麼 M 機在串流失敗之後幾秒, 會改用自己的喇叭播放。

Hmmm 應該再來研究一下麥克風, 或許可以拿來實作樹莓派對講機?

最早是在 這裡 看到的; archlinux 的文件 有很詳細的說明。

沒有留言:

張貼留言

因為垃圾留言太多,現在改為審核後才發佈,請耐心等候一兩天。