天天看點

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

基于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,可以用小而美來形容她:

  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内部的結構如下:

基于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端(有沒有熟悉的味道):

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

Windows Client:

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

Windows Client與Web互通:

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

**Demo下載下傳位址: https://pan.baidu.com/s/18Nfnu_MAafFnkyzBrJnq1g 提取碼: jbtu **

總結

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

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