基于mediasoup的多方通话研究(一)
置顶 敬我岁月无波澜 2018-11-06 21:51:38 13833 收藏 11
分类专栏: webrtc SFU 多人音视频 nodejs mediasoup webrtc
版权
基于mediasoup的多方通话研究(一)
mediasoup简介
mediasoup的特性
安装mediasoup-demo
本地运行Demo
server的配置文件
mediasoup的原理
扩展与展望
总结
mediasoup简介
mediasoup号称尖端的WebRTC的视频会议系统,官网为 https://mediasoup.org/.
安装极其简单:
npm install mediasoup
npm install mediasoup-client
1
2
从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
1
2
安装server:
$ cd server
$ npm install
1
2
复制 config.example.js 重命名 config.js 然后可以自定义设置,目前先不做修改:
$ cp config.example.js config.js
1
安装浏览器端app:
$ cd app
$ npm install
1
2
全局安装 gulp-cli (可能需要使用 sudo):
$ npm install -g gulp-cli
1
本地运行Demo
首先打开一个终端,运行server :
$ cd server
$ node server.js
1
2
在另外一个终端中打开启动app
$ cd app
$ gulp live
1
2
接着就可以用浏览器浏览了。
server的配置文件
这里对于config.js 强调一点:
设置rtcAnnouncedIPv4(同rtcAnnouncedIPv6)以支持公网访问,局域网访问默认不需要修改。
//局域网访问:默认不需要修改
rtcAnnouncedIPv4 : null,
//公网可以访问:将rtcAnnouncedIPv4修改为公网的IP,重启server即可(仅限有公网IP的云服务器)。
rtcAnnouncedIPv4 : '111.111.111.111',
1
2
3
4
设置rtcMinPort和rtcMaxPort:如果需要公网访问,记得防火墙放行,局域网访问默认不需要修改。
rtcMinPort : 40000,
rtcMaxPort : 49999,
1
2
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欢迎互粉。
————————————————
版权声明:本文为CSDN博主「敬我岁月无波澜」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/a345252622/java/article/details/83788934
于webrtc多人音视频的研究(二)
原创置顶 敬我岁月无波澜 最后发布于2017-02-28 17:03:09 阅读数 5069 收藏
展开
基于webrtc多人音视频的研究
之实践篇–SFU服务器
前言
研究webRTC断断续续的也有几个年头了,起初的兴趣来自当时上学时候在开发IM(即时通讯)缺少较好的音视频功能,开始自基于directshow自行开发的视频传输,效果差强人意,更不用说应用于生产环境了。经过百般寻找,这才了解到webRTC,遂开始研究webRTC。
13年的时候貌似还没被墙,webRTC完整下载也就300m。当时实现了基于peerconnection的P2P的音视频,后来撂下数年后在生产环境中需要跨平台的音视频传输解决方案,所以才重新拾起它。此时已是15年,再想编译其已经是无比艰难,有个好用的VPN是最基础的工具,尝试了数月后终于整出完整的VS2013工程(非ninja),整个工程大约9g了,当时都是很惊叹于webRTC的伟大(臃肿)。
物尽其用
webRTC,首先以web开头,显然是用于web端咯。这么好的东西要是只用于web端岂不是很可惜?它当然支持跨平!
我们来聊聊RTC都能干点啥:
首先就是这种社交软件、即时通讯的音视频聊天;
其次就是ipcamera等物联网设备直接可以与用户的终端通讯;
再次就是群组音视频聊天、视频会议;
最后还有直播、医疗等需要实时交互的领域。
我能想到的只有这些了,但是rtc真的很强大,我还没有真正完全的掌握它,一直处于刚刚入门级别。听说新版本的已经支持屏幕分享了,又一大喜事。这写无不促使我去不断地研究这神奇的东西。
理论到实践
好多新人还卡在怎么实现跨平台的P2P音视频通讯,而且这个过程很煎熬。具体技术实现我已经在前几篇文章中提,在此不再赘述。等真正进来后发现其实还是很简单滴。
往下看之前首先确定你已经完全掌握peerconnection的使用,甚至是实现原理,要不然请绕道而行。
华丽的分割线
1
peerconnection是WebRTC音视频传输api中最基础的一个,它是P2P传输音视频流、数据流的载体。我们都知道不管是Offer端还是Answer端都需要创建一个peerconnection,然后交换sdp和candidate就能完成音视频会话。
可是WebRTC并不提供服务器、mixer、router等功能,要实现SFU服务器就得自己去实现这类的功能,我们简单的聊一下实现逻辑:
1、在服务端模拟实现peerconnection,当然你也可以用webRTC自带的(如果你不怕太臃肿的话)。peerconnection基于ICE协议传输数据,这里我选择了libnice。从sdp里面提取出username、password以及candidate后赋予libnice,
这样基本上就可以打通双方的信道开始通讯了。收到数据后,并不是裸视频流!首先通过DTLS协议握手;确认安全后,拿到srtpRTP、srtpRTCP的user和pwd信息。这里提到了dtls、srtp、rtp、rtcp这四个协议,如果不懂还是先研究下。DTLS握手成功以后,ICE收到的数据就会传递给
srtp进行解密,解密后的数据为RTP或RTCP数据包,其中RTP承载的音视频数据流,RTCP承载的是音视频传输控制。
相反,我们要发送数据就要将上面的过程逆过来,先DTLS握手,将合成的RTP、RTCP数据包丢给srtp,加密后通过ICE发出去。
2、有了第1步的模拟操作后,我们就可以接收和发送音视频数据流了,自然也能录制、mixer等操作了。那我们这一步就是实现一对多的传输,peerconnection Sa负责接受客户端Ca的数据,peerconnection Sb、Sc负责向客户端Ca、Cc发送数据,那么只要将Sa收到的数据通过Sb、Sc发出去就能实现Ca向Cb、Cc发送音视频数据了。当然这个过程很复杂。
3、有了这一对多的传输过程,那么我们复制多次,就实现了多对多的过程。
服务器在这里承担了router的功能,将每一方发过来的音视频流分发给其他客户端。这样就达到了多方通话的能力。
到这里基本的思路已经讲完了,表达能力有限请多谅解。我献上我编写的SFU和客户端demo,下载地址
链接: https://pan.baidu.com/s/1ge9OVWB 密码: xb6g
源码已经开源:https://github.com/harvestsure
运行效果如图:
另外补充一句:SFU服务端和客户端都没有平台的限制,不局限于windows平台。本人精力和能力有限,只能先实现这么多,来日方长我会慢慢实现各个平台的功能。
————————————————
版权声明:本文为CSDN博主「等风来不如迎风去」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/commshare/java/article/details/105036467