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

* mediasoup简介
<https://blog.csdn.net/a345252622/article/details/83788934#mediasoup_2>
* mediasoup的特性
<https://blog.csdn.net/a345252622/article/details/83788934#mediasoup_16>
* 安装mediasoup-demo
<https://blog.csdn.net/a345252622/article/details/83788934#mediasoupdemo_32>
* 本地运行Demo <https://blog.csdn.net/a345252622/article/details/83788934#Demo_68>
* server的配置文件
<https://blog.csdn.net/a345252622/article/details/83788934#server_86>
* mediasoup的原理
<https://blog.csdn.net/a345252622/article/details/83788934#mediasoup_103>
* 扩展与展望 <https://blog.csdn.net/a345252622/article/details/83788934#_115>
* 总结 <https://blog.csdn.net/a345252622/article/details/83788934#_136>


<>mediasoup简介

mediasoup号称尖端的WebRTC的视频会议系统,官网为 https://mediasoup.org/ <https://mediasoup.org/>
.
安装极其简单:
npm install mediasoup npm install mediasoup-client
从ibc <https://github.com/ibc>开发这套系统一直跟进到最新的版本,经历了V1到V2的变迁,api从webrtc
<https://webrtc.org/>到ortc <https://ortc.org/>的变更,一点一点的完善,目前好评度越来越高。

有没有兴趣跟我一起学习研究这个优秀的系统呢?

需要强调一点的是:希望大家能提前对ORTC有个大概的了解。

<>mediasoup的特性

脱颖而出mediasoup,可以用小而美来形容她:

* 支持目前主流的浏览器,chrome、Firefox、safari、Edge等等。
* 支持UnifiedPlanSdp和PlanBSdp两种方式;
* ORTC的api风格调用方式,避免了WebRTC的不足,使协议更简洁;
* json-rpc远程调用方法,协议清晰简洁。;
* 增加了支持simulcast;
* 编码简洁、结构清晰;
纵使她很让人喜欢,但也有不尽人意的地方:

* 上层接口是nodejs,这个根据我们情况集成可能有麻烦(后面我们讲讲怎么解决这个问题)。
* 功能比较简单,后续的开发较多;
<>安装mediasoup-demo

首先呢找一台linux服务器吧,推荐用ubuntu,安装最新版本的npm,快速安装可参考npm最新版本安装方法
<https://github.com/nodesource/distributions>。另外网速不好的同学建议修改npm源npm源修改办法
<https://blog.csdn.net/gupar/article/details/78657091>。

* 首先克隆项目: $ 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
<https://pan.baidu.com/s/18Nfnu_MAafFnkyzBrJnq1g> 提取码: jbtu **

<>总结

* Windows下面与mediasoup-worker的管道通讯遇到了好多问题,好在坚持不懈的解决了,毕竟Libuv文档稀有;
* nodejs用了ES6新特性,如promise,考虑到维护原版的特性和结构,千辛万苦地用promise-cpp
<https://github.com/xhawk18/promise-cpp>勉强解决了;
* 很久没有更新博客了,是因为没有新的成果,mediasoup的研究让我又有了新的乐趣,希望能坚持下去;
* 上面涉及的代码后期可能考虑开源。
另外附上我的Github地址https://github.com/harvestsure <https://github.com/harvestsure>
欢迎互粉。