時(shí)音視頻服務(wù)器入門:3 步跑通免費(fèi)的 WebRTC SFU)
LiveKit 實(shí)時(shí)音視頻服務(wù)器入門3 步跑通免費(fèi)的 WebRTC SFU【免費(fèi)下載鏈接】livekitEnd-to-end realtime stack for connecting humans and AI項(xiàng)目地址: https://gitcode.com/GitHub_Trending/li/livekitLiveKit 是一個(gè)用 Go 編寫的開(kāi)源實(shí)時(shí)音視頻棧核心是一臺(tái)高性能的 WebRTC 媒體服務(wù)器SFU負(fù)責(zé)把多個(gè)參與者的音視頻流轉(zhuǎn)給彼此。它免費(fèi)、無(wú)使用量限制自帶 JWT 鑒權(quán)和分布式能力適合想自建實(shí)時(shí)通話、連麥或 AI 語(yǔ)音應(yīng)用的人。一個(gè)典型的卡點(diǎn)媒體流到底怎么轉(zhuǎn)發(fā)先說(shuō)清楚 LiveKit 解決什么問(wèn)題。兩個(gè)人要互相看到視頻最笨的辦法是客戶端兩兩直連P2P10 個(gè)人的房間就需要 45 條連接每個(gè)人的上行帶寬還要乘以 9 倍——基本不可行。LiveKit 的做法是引入一個(gè)分發(fā)中心術(shù)語(yǔ)叫 SFUSelective Forwarding Unit。你可以把它想象成電視臺(tái)的中轉(zhuǎn)站每個(gè)人只把視頻上傳一份到服務(wù)器服務(wù)器再按需轉(zhuǎn)發(fā)給每個(gè)觀眾。上傳流量恒定為 1 份和房間人數(shù)無(wú)關(guān)而且服務(wù)器可以根據(jù)每個(gè)觀眾的網(wǎng)速挑選不同清晰度的流轉(zhuǎn)發(fā)。這套邏輯的實(shí)現(xiàn)在 pkg/sfu/ 下包括碼率自適應(yīng)bwe、 simulcast 層選擇、丟包重傳NACK/RTX等都是圍繞轉(zhuǎn)發(fā)這一件事做的深度優(yōu)化。三步跑通最小環(huán)境LiveKit 官方提供了安裝腳本 install-livekit.shLinux 上一條命令裝好單二進(jìn)制文件curl -sSL https://get.livekit.io | bash第二步啟動(dòng)開(kāi)發(fā)模式它會(huì)自動(dòng)加載一套占位密鑰devkey / secretlivekit-server --dev第三步讓一個(gè)假人進(jìn)房推流驗(yàn)證服務(wù)器活著lk room join ws://localhost:7880 \ --api-key devkey --api-secret secret \ --identity bot-user1 --publish-demo my-first-room能連上就說(shuō)明信令端口默認(rèn) 7880工作正常。想從源碼構(gòu)建倉(cāng)庫(kù)里也備好了 bootstrap.sh裝好 Go 1.23 后運(yùn)行./bootstrap.sh mage即可??炊渲梦募妊b好更重要生產(chǎn)部署前建議通讀一遍 config-sample.yaml這個(gè)文件注釋極全覆蓋了 90% 的決策點(diǎn)。挑幾個(gè)真正關(guān)鍵的密鑰keys所有房間訪問(wèn)令牌JWT都由 API Key/Secret 簽發(fā)。生產(chǎn)環(huán)境務(wù)必?fù)Q成livekit-server generate-keys生成的強(qiáng)密鑰別用 devkey。Redis只要配置了 Redis 地址LiveKit 就自動(dòng)進(jìn)入分布式模式客戶端連到任意節(jié)點(diǎn)都會(huì)被路由到同一個(gè)房間。單機(jī)跑可以完全不配。RTC 端口port_range_start/end示例中 50000-60000是客戶端媒體流量的 UDP 端口段必須在防火墻放通入站tcp_port用于 UDP 不通時(shí)的 TCP 兜底。TURN 服務(wù)器在強(qiáng) NAT 環(huán)境下部分企業(yè)網(wǎng)、移動(dòng)端UDP 和 TCP 直連都可能失敗需要中繼。LiveKit 內(nèi)置了 TURNpkg/service/turn.go在turn段開(kāi)啟即可不用另起 coturn。節(jié)點(diǎn)選擇器node_selector分布式部署時(shí)決定新房間落在哪臺(tái)節(jié)點(diǎn)支持sysload按系統(tǒng)負(fù)載、cpuload、regionaware按地域就近實(shí)現(xiàn)在 pkg/routing/selector/。多機(jī)房部署時(shí)選 regionaware把房間調(diào)度到離用戶最近的區(qū)域??捎^測(cè)性prometheus_port打開(kāi)后在 6789 暴露指標(biāo)倉(cāng)庫(kù)自帶 Grafana 大盤 deploy/grafana/livekit-server-overview.json導(dǎo)入即可監(jiān)控房間數(shù)、碼率、丟包等。從開(kāi)發(fā)到上線最容易踩的坑7880 端口別放裸奔這是信令 RoomService 的主端口生產(chǎn)環(huán)境應(yīng)置于負(fù)載均衡器之后并終止 TLS。媒體 UDP 流量本身帶 DTLS 加密不需要額外套 TLS但 7881 這類 TCP 兜底端口不能放在負(fù)載均衡后面必須直接暴露在節(jié)點(diǎn)上配置文件里有明確注釋。云服務(wù)器公網(wǎng) IP 發(fā)現(xiàn)AWS/阿里云機(jī)器通常只有一個(gè)內(nèi)網(wǎng) IP 彈性公網(wǎng) IP 映射需要開(kāi)use_external_ip: true讓服務(wù)器通過(guò) STUN 發(fā)現(xiàn)自己的公網(wǎng)地址并告訴客戶端發(fā)現(xiàn)錯(cuò)誤時(shí)用node_ip手動(dòng)指定。開(kāi)發(fā)模式的綁定陷阱--dev且未提供密鑰時(shí)服務(wù)器只綁定 127.0.0.1見(jiàn) cmd/server/main.go這是刻意的安全設(shè)計(jì)。別在開(kāi)發(fā)機(jī)上跑通后以為上線也只需改個(gè)端口。UDP 端口段要夠?qū)捁俜浇ㄗh端口數(shù)量不少于 vCPU 數(shù)太少會(huì)限制并發(fā)連接能力。房間默認(rèn)會(huì)自動(dòng)創(chuàng)建默認(rèn)auto_create: true任何人持有效 token 連一個(gè)不存在的房間名就會(huì)創(chuàng)建它。對(duì)外暴露前建議關(guān)掉或配好max_participants上限。什么場(chǎng)景合適什么場(chǎng)景要三思適合多人會(huì)議、連麥直播、在線教育、以及人在房間 AI 也在房間的實(shí)時(shí)語(yǔ)音 Agent 應(yīng)用pkg/agent/ 就是 Agent 工作進(jìn)程的調(diào)度與任務(wù)分發(fā)層。需要錄制、拉取 RTMP/WHIP 外部流時(shí)配套生態(tài)有 Egress錄制/轉(zhuǎn)推和 Ingress外部流接入兩個(gè)獨(dú)立組件。要三思的小規(guī)模一對(duì)一通話兩端直連 P2P 就能解決中間放一臺(tái) SFU 屬于殺雞用牛刀還多了媒體服務(wù)器的帶寬和運(yùn)維成本。超大規(guī)模純直播萬(wàn)人級(jí)單向觀看場(chǎng)景專門的 CDN 推流方案在成本上通常更優(yōu)LiveKit 更擅長(zhǎng)可交互的房間模型。單機(jī)扛不住SFU 是 CPU/帶寬密集型服務(wù)節(jié)點(diǎn)容量參考值約為每 CPU 400 條軌道見(jiàn)limit段注釋。用戶量大時(shí)要么橫向加節(jié)點(diǎn)加 Redis 即可要么做跨區(qū)域調(diào)度。一句話總結(jié)LiveKit 的價(jià)值在于把 SFU 最難的部分——轉(zhuǎn)發(fā)效率、擁塞控制、分布式路由、TURN 兜底——都替你做好了你只需要管好密鑰、端口和 Redis 三件事就能把實(shí)時(shí)音視頻能力嵌進(jìn)自己的產(chǎn)品里?!久赓M(fèi)下載鏈接】livekitEnd-to-end realtime stack for connecting humans and AI項(xiàng)目地址: https://gitcode.com/GitHub_Trending/li/livekit創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考