基于mediasoup的多方通話研究(一)
-
- mediasoup簡介
- mediasoup的特性
- 安裝mediasoup-demo
- 本地運作Demo
- server的配置檔案
- mediasoup的原理
- 擴充與展望
- 總結
mediasoup簡介
mediasoup号稱尖端的WebRTC的視訊會議系統,官網為 https://mediasoup.org/.
安裝極其簡單:
npm install mediasoup
npm install mediasoup-client
從ibc開發這套系統一直跟進到最新的版本,經曆了V1到V2的變遷,api從webrtc到ortc的變更,一點一點的完善,目前好評度越來越高。
有沒有興趣跟我一起學習研究這個優秀的系統呢?
需要強調一點的是:希望大家能提前對ORTC有個大概的了解。
mediasoup的特性
脫穎而出mediasoup,可以用小而美來形容她:
- 支援目前主流的浏覽器,chrome、Firefox、safari、Edge等等。
- 支援UnifiedPlanSdp和PlanBSdp兩種方式;
- ORTC的api風格調用方式,避免了WebRTC的不足,使協定更簡潔;
- json-rpc遠端調用方法,協定清晰簡潔。;
- 增加了支援simulcast;
- 編碼簡潔、結構清晰;
縱使她很讓人喜歡,但也有不盡人意的地方:
- 上層接口是nodejs,這個根據我們情況內建可能有麻煩(後面我們講講怎麼解決這個問題)。
- 功能比較簡單,後續的開發較多;
安裝mediasoup-demo
首先呢找一台linux伺服器吧,推薦用ubuntu,安裝最新版本的npm,快速安裝可參考npm最新版本安裝方法。另外網速不好的同學建議修改npm源npm源修改辦法。
- 首先克隆項目:
$ git clone https://github.com/versatica/mediasoup-demo.git
$ cd mediasoup-demo
- 安裝server:
$ cd server
$ npm install
- 複制
重命名config.example.js
然後可以自定義設定,目前先不做修改:config.js
$ cp config.example.js config.js
- 安裝浏覽器端app:
$ cd app
$ npm install
- 全局安裝
(可能需要使用gulp-cli
):sudo
$ npm install -g gulp-cli
本地運作Demo
- 首先打開一個終端,運作server :
$ cd server
$ node server.js
- 在另外一個終端中打開啟動app
$ cd app
$ gulp live
- 接着就可以用浏覽器浏覽了。
server的配置檔案
這裡對于config.js 強調一點:
- 設定rtcAnnouncedIPv4(同rtcAnnouncedIPv6)以支援公網通路,區域網路通路預設不需要修改。
//區域網路通路:預設不需要修改
rtcAnnouncedIPv4 : null,
//公網可以通路:将rtcAnnouncedIPv4修改為公網的IP,重新開機server即可(僅限有公網IP的雲伺服器)。
rtcAnnouncedIPv4 : '111.111.111.111',
- 設定rtcMinPort和rtcMaxPort:如果需要公網通路,記得防火牆放行,區域網路通路預設不需要修改。
rtcMinPort : 40000,
rtcMaxPort : 49999,
mediasoup的原理
下圖舉例三個Client (browser或者用戶端)同時加入一個房間,每個app同時釋出一路視訊和一路音頻,并且接受來自其他app的音視訊流,mediasoup内部的結構如下:
- 每個Client建立兩個Peerconnection分别用于發送和接受媒體流,發送端用于發送承載本地videoTrack和audioTrack的localStream,接收端接受來自其他Client的remoteStream;
- 同時Room會為每個Client建立一個Peer,Peer管理兩個Transport用于接受Client的媒體流和向Client發送媒體流;
- Peer為對應的Client發送的videoTrack和audioTrack分别建立一個Producer(共2個);
- Peer為其他兩個Client發送的videoTrack和audioTrack分别建立2個Consumer(共2個);
- Producer将媒體資料發送給每一個訂閱者Consumer。
到此為止,可能會有一個簡單的了解了,這裡不再細分,有興趣的話可以私下找我交流。
擴充與展望
mediasoup作為一個SFU伺服器,有着出色的性能和極小的開銷,多程序負載均衡的方式讓我們體會到它的強悍。美中不足的是它的信令隻有nodejs接口,并不能滿足所有人的胃口。慶幸的是出于對c++的情懷,我将所有的nodejs邏輯翻譯成了c++版本,并且開發了對應的native用戶端:
- c++版本伺服器,支援跨平台的編譯;保持原有mediasoup-worker代碼99.9%完整和不變;
- c++版本用戶端,Qt5+WebRTC68,支援windows、Mac OS、Linux的編譯,且與mediasoup-demo互通;
- 用戶端增加Gpu Video Accelerator,支援H264的硬體encode/decode功能。
未來将加入的新功能
- 用戶端和伺服器的音視訊流錄制功能;
- rtsp和rtmp與meidasoup的互通功能;
- H264硬體編解碼的持續優化。
現獻上效果圖
server端(有沒有熟悉的味道):
Windows Client:
Windows Client與Web互通:
**Demo下載下傳位址: https://pan.baidu.com/s/18Nfnu_MAafFnkyzBrJnq1g 提取碼: jbtu **
總結
- Windows下面與mediasoup-worker的管道通訊遇到了好多問題,好在堅持不懈的解決了,畢竟Libuv文檔稀有;
- nodejs用了ES6新特性,如promise,考慮到維護原版的特性和結構,千辛萬苦地用promise-cpp勉強解決了;
- 很久沒有更新部落格了,是因為沒有新的成果,mediasoup的研究讓我又有了新的樂趣,希望能堅持下去;
- 上面涉及的代碼後期可能考慮開源。
另外附上我的Github位址https://github.com/harvestsure歡迎互粉。