mediasoup架构分析
目录
概述
1.medisoup模块
2.worker进程
2.1拥塞控制
2.2router
2.3producer
2.4consumer
2.5transport
2.6关键帧请求
3 总结
概述
mediasoup是一个性能优异的webrtc服务器,它只对接收到的音视频数据包进行转发,不进行任何解码或者转码操作,在一个多方会议中,一个参与者会上传一路本端视频,现时接收多路其它参与者的视频,因此mediasoup属于一个sfu类型的服务器。mediasoup服务端可以分为两个部分,使用javascript语言实现的mediasoup业务管理模块和使用c++实现worker进程,mediasoup客户端和服务端的信令交互采用了protoo,protoo是一个基于node.js的多方实时通信信令框架。mediasoup官网的架构图如下:
1.medisoup模块
mediasoup基于node.js,主要提供的功能是信令管理和房间管理。mediasoup与客户端通过websocket进行通信,mediasoup与worker进程通过管道进行进程间通信。信令管理包括但不限于创建房间、更新设置、获取worker资源使用情况等等,
2.worker进程
worker进程不能单独启动,只能由mediasoup来启动, medisaoup和worker之间通过libuv模块进行管道通信。在一个主机上可以启动多个worker进程,worker进程之间也通过管道进行通信,worker进程的数量可以通过config.js配置文件来设置,默认等于cpu核心数。
worker进程是mediasoup服务器的核心,它负责RTP/RTCP包的接收和转发、IceCandidate的收集。实际上可以把worker进程理解成webrtc中的一个peer,只不过这个peer不仅具备一对一的通信能力,还具备一对多的通信能力。worker接收客户端发送过来的音视频流,然后转发给其它客户端或者worker,可通过mediasoup来控制worker的转发,一般来说worker会将RTP数据转发给同一个房间的其它成员,也可以让worker将rtp数据转发给外部的某一个地址以实现录像功能(例如ffmpeg)。
在worker中有几个重要的概念我觉得是有必要进行分析的,分别是拥塞控制、router、producer、consumer、transport,下面分别对这几个概念进行分析。
2.1拥塞控制
worker具备拥塞控制功能,其拥塞控制采用了webrtc中的congestion_controller模块,通过congestion_controller模块可以得到远端带宽评估值,worker可以根据远端带宽评估值选择发送不同的视频流(客户端启用了simulcast功能),当带宽良好时向客户端发送较高码率的视频流,当带宽较差时发送码率较低的视频流,当网络状况非常差时甚至会停止视频流的发送。
由于worker只是对RTP包进行转发,不会对视频流进行转码,因此worker无法根据远端带宽的状况动态的发送与其带宽绝对匹配的视频流,只能发送相对匹配的视频流。而且这相对匹配的视频流的可选数量往往是2到3个,这决定于会话参与者是否启用了simulcast功能,只有参与者启用了simulcast功能,参与者才会发出多路不同分辨率的视频流,worker才有机会根据其它参与者的带宽状况选择转发不同的视频流。因此在对mediasoup的客户端进行弱网测试时会发现,限制客户端的下行带宽,观察房间其它成员的视频会发现视频清晰度变化很显示,而且清晰度切换过程比较长,不像点对点的webrtc通信那样流畅变化。
2.2router
router和房间是一对一的关系,一个router就表示一个房间。当router接收到房间内成员的RTP数据后,会转发给所有房间内的其它成员,或者其它worker。
2.3producer
producer接收客户端或者其它worker的RTP数据,经过一定的处理后再将RTP数据转发给其它consumer。
2.4consumer
consumer消费producer产生的数据,这些数据最终会被发往客户端,或者其它worker。worker中定义了一个基类Consumer,其派生类包括PipeConsumer、SimpleConsumer、SimulcastConsumer、SvcConsumer。其中PipeConsumer用于向其它worker发送RTP数据,SimpleConsumer用于客户端只发出一路视频流的情况,SimulcastConsumer用于客户客户端发出多路视频流的情况,SvcConsumer用于客户端启用了Svc(可伸缩视频编码)的情况。
2.5transport
transport是一个传输实例,一个transport可以用于发送数据或者接收数据。worker中定义了一个基类Transport,其派生类包括DirectTransport、PipeTransport、PlainTransport、WebRtcTransport。DirectTransport不对RTP数据包进行加密,PipeTransport用于worker进程间通信, WebRtcTransport用于和webrtc客户端进行通信。
一个webrtc客户端在worker中对应两个WebRtcTransport,分别用于发送、接收。
2.6关键帧请求
webrtc客户端在需要切换解码视频流或者因为丢包过多而通过FIR/PLI 消息请求关键帧时,worker将收到这些请求,并被这些请求转发给视频源的发送者,具体代码见RtpStreamRecv::RequestKeyFrame函数。
3 总结
mediasoup服务器得益于其清晰的架构设计,它的运行效率非常高,端到端的视频延迟在同类的sfu类型的webrtc服务器中也非常出色,但是它不具备传统媒体服务器的录像、转码、话单记录、对接sip终端等功能,而这些功能往往在项目中是必不可少的,从这个意义上说mediasoup并不是一个完整的媒体服务器。因此在决定将mediasoup引入项目应用时,应当充分评估mediasoup是否能够满足项目需求,开发团队是否有能力对mediasoup进行扩展开发以实现所需功能。
即使mediasoup服务器具备的功能并不是很完善,我仍然觉得它是一个非常优秀的webrtc服务器。mediasoup具备灵活的可扩展性和清晰的架构设计,当我们需要增加一些额外的功能时将不会存在太大的难度。如果希望从零开始开发一个webrtc服务器,mediasoup也是一个很好的参考例子。
mediasoup架构分析相关推荐
- pass基础架构分析
pass基础架构分析 Relay 和 TVM IR,包含一系列优化passes,可提高模型的性能指标,如平均推理,内存占用,或特定设备的功耗.有一套标准优化,及特定机器学习的优化,包括常量折叠,死代码 ...
- Yolov3网络架构分析
Yolov3网络架构分析 上图三个蓝色方框内表示Yolov3的三个基本组件: CBL:Yolov3网络结构中的最小组件,由Conv+Bn+Leaky_relu激活函数三者组成. Res uni ...
- 转:秒杀系统架构分析与实战
原文出处: 陶邦仁 欢迎分享原创到伯乐头条 0 系列目录 秒杀系统架构 秒杀系统架构分析与实战 1 秒杀业务分析 正常电子商务流程 (1)查询商品:(2)创建订单:(3)扣减库存:(4)更新订单: ...
- CommuntyServer架构分析
CommuntyServer架构分析 程序执行流程 *.aspx <CS:ContentContainer.../> - ...
- 大型网站系统架构分析--转
大型网站系统架构分析 原文地址:http://www.cnblogs.com/Mainz/archive/2009/04/28/1445424.html 千万级的注册用户,千万级的帖子,nTB级的附件 ...
- Android10.0 日志系统分析(二)-logd、logcat架构分析及日志系统初始化-[Android取经之路]
摘要:本节主要来讲解Android10.0 日志系统的架构分析,以及logd.logcat的初始化操作 阅读本文大约需要花费15分钟. 文章首发微信公众号:IngresGe 专注于Android系统级 ...
- 《libGDX移动游戏开发从入门到精通》一第2章 libGDX的架构分析
本节书摘来异步社区<libGDX移动游戏开发从入门到精通>一书中的第2章,第2.1节,作者: 黄俊东 责编: 陈冀康,更多章节内容可以访问云栖社区"异步社区"公众号查看 ...
- 【转】秒杀系统架构分析与实战
0 系列目录 秒杀系统架构 秒杀系统架构分析与实战 1 秒杀业务分析 正常电子商务流程 (1)查询商品:(2)创建订单:(3)扣减库存:(4)更新订单:(5)付款:(6)卖家发货 秒杀业务的特性 (1 ...
- 研究项目: JBoss架构分析
原文转自:http://www.huihoo.org/jboss/jboss.cn.html 研究项目: JBoss架构分析 Jenny Liu School of Information Techn ...
最新文章
- brightness temperature
- C++ primer学习方法
- SAP同一公司不同工厂间物料转储方案比较
- 16 大常考算法知识点,你掌握了吗?
- 统计所有带有null的特征
- 查看表状态及索引碎片语句
- python numpy中数组.min()
- docker pull下载很慢_假如服务器上没有 Docker 环境,你还能愉快的拉取容器镜像吗?...
- VS2015 Cordova Ionic移动开发(一)
- 原创Netty学习系列导航
- VGG16和VGG19的理解
- 一封没有读出来的感谢信,勾勒出蔡文胜30年创业史!
- 成功在神舟K650c-i7 d2(i7-4700MQ、HM87)上装好了Windows XP
- Exchange Server 2016 CU22升级更新
- 数据建模 - 概念模型,逻辑模型,物理模型 的区别以及建模方式
- python数据结构与算法 20 递归和递归三定律
- 判断输入的手机号码格式是否正确(用Java实现)
- 如何创新地解决光缆运维痛点?
- Xcode info.plist各种key
- 【LB】稀疏矩阵的快速转置原理及其算法