基於mediasoup的多方通話研究(一)

mediasoup簡介

mediasoup號稱尖端的WebRTC的視頻會議系統,官網爲 https://mediasoup.org/.
安裝極其簡單:

npm install mediasoup
npm install mediasoup-client

ibc開發這套系統一直跟進到最新的版本,經歷了V1到V2的變遷,api從webrtcortc的變更,一點一點的完善,目前好評度越來越高。

有沒有興趣跟我一起學習研究這個優秀的系統呢?

需要強調一點的是:希望大家能提前對ORTC有個大概的瞭解。

mediasoup的特性

脫穎而出mediasoup,可以用小而美來形容她:

  1. 支持目前主流的瀏覽器,chrome、Firefox、safari、Edge等等。
  2. 支持UnifiedPlanSdp和PlanBSdp兩種方式;
  3. ORTC的api風格調用方式,避免了WebRTC的不足,使協議更簡潔;
  4. json-rpc遠程調用方法,協議清晰簡潔。;
  5. 增加了支持simulcast;
  6. 編碼簡潔、結構清晰;

縱使她很讓人喜歡,但也有不盡人意的地方:

  1. 上層接口是nodejs,這個根據我們情況集成可能有麻煩(後面我們講講怎麼解決這個問題)。
  2. 功能比較簡單,後續的開發較多;

安裝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下載地址:快馬加鞭的趕工中(UI上面有些體驗的不足,後續完善中)

總結

  • Windows下面與mediasoup-worker的管道通訊遇到了好多問題,好在堅持不懈的解決了,畢竟Libuv文檔稀有;
  • nodejs用了ES6新特性,如promise,考慮到維護原版的特性和結構,千辛萬苦地用promise-cpp勉強解決了;
  • 很久沒有更新博客了,是因爲沒有新的成果,mediasoup的研究讓我又有了新的樂趣,希望能堅持下去;
  • 上面涉及的代碼後期可能考慮開源。

另外附上我的Github地址https://github.com/harvestsure歡迎互粉。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章