Golang 透過 WebSocket 串流 PCM Audio Stream 到 Web UI
RemdesKVM (P.S.這是一個網頁) 最近因為在開發 RemdesKVM (一套開源的 IP-KVM 裝置),所以需要想辦法在 Linux 下把 USB HDMI capture card 的 audio stream 串流到 Web UI。聽上去好像很簡單,但是想不到實際上做起來一點也不容易( 為甚麼先不用 WebRTC? 如果你跟一個現代的 Web Developer 講這功能,他第一時間回覆你的當然就是 WebRTC 了。WebRTC 是一種基於 UDP 的技術,容許 Server 跟 Client 之間透過 UDP 進行 real-time communication & streaming。那也是因為 UDP 的關系,所以 packet 就是送出去就不理了,自然就不會有太大的 latency 問題。然而使用 WebRTC 協議會出現兩個問題: HTTP 是基於 TCP,因此如果本身你已經有整套 HTTP proxy / routing infrastructure,使用 UDP 就要額外再增加一套 proxying services (雖然 Zoraxy 跟 NPM 之類的都有 build-in 就是了)WebRTC 需要 opus (然後 opus 沒有 go native 的 encoder implementation) 所以這裡我先使用了基於 websocket 的方案,之後有空再來弄 WebRTC 的方案。 Alsa 與 Linux Audio Device 在真正講到怎樣串流之前,先講一下我怎樣從 USB HDMI device 抓出 PCM data。簡單來說在 Linux 裡面 everything is a file,所以自然地你可以從 /dev/snd/ 裡面其中一個裝置抓到你需要的 PCM 資料。我這裡用的是 arecord 工具,可以透過以下指令安裝: sudo apt install alsa-utils 之後就是透過 -l 指令列出所有 Audio device $ arecord -l **** List of CAPTURE Hardware Devices **** card 0: sofhdadsp [sof-hda-dsp], device 0: HDA Analog (*) [] Subdevices: 1/1 Subdevice #0: subdevice #0 card 0: sofhdadsp [sof-hda-dsp], device 6: DMIC (*) [] Subdevices: 1/1 Subdevice #0: subdevice #0 card 0: sofhdadsp [sof-hda-dsp], device 7: DMIC16kHz (*) [] Subdevices: 1/1 Subdevice #0: subdevice #0 card 1: MS2109 [MS2109], device 0: USB Audio [USB…