目录

概述

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架构分析相关推荐

  1. pass基础架构分析

    pass基础架构分析 Relay 和 TVM IR,包含一系列优化passes,可提高模型的性能指标,如平均推理,内存占用,或特定设备的功耗.有一套标准优化,及特定机器学习的优化,包括常量折叠,死代码 ...

  2. Yolov3网络架构分析

    Yolov3网络架构分析 上图三个蓝色方框内表示Yolov3的三个基本组件:  CBL:Yolov3网络结构中的最小组件,由Conv+Bn+Leaky_relu激活函数三者组成.  Res uni ...

  3. 转:秒杀系统架构分析与实战

    原文出处: 陶邦仁   欢迎分享原创到伯乐头条 0 系列目录 秒杀系统架构 秒杀系统架构分析与实战 1 秒杀业务分析 正常电子商务流程 (1)查询商品:(2)创建订单:(3)扣减库存:(4)更新订单: ...

  4. CommuntyServer架构分析

    CommuntyServer架构分析 程序执行流程 *.aspx                                   <CS:ContentContainer.../> - ...

  5. 大型网站系统架构分析--转

    大型网站系统架构分析 原文地址:http://www.cnblogs.com/Mainz/archive/2009/04/28/1445424.html 千万级的注册用户,千万级的帖子,nTB级的附件 ...

  6. Android10.0 日志系统分析(二)-logd、logcat架构分析及日志系统初始化-[Android取经之路]

    摘要:本节主要来讲解Android10.0 日志系统的架构分析,以及logd.logcat的初始化操作 阅读本文大约需要花费15分钟. 文章首发微信公众号:IngresGe 专注于Android系统级 ...

  7. 《libGDX移动游戏开发从入门到精通》一第2章 libGDX的架构分析

    本节书摘来异步社区<libGDX移动游戏开发从入门到精通>一书中的第2章,第2.1节,作者: 黄俊东 责编: 陈冀康,更多章节内容可以访问云栖社区"异步社区"公众号查看 ...

  8. 【转】秒杀系统架构分析与实战

    0 系列目录 秒杀系统架构 秒杀系统架构分析与实战 1 秒杀业务分析 正常电子商务流程 (1)查询商品:(2)创建订单:(3)扣减库存:(4)更新订单:(5)付款:(6)卖家发货 秒杀业务的特性 (1 ...

  9. 研究项目: JBoss架构分析

    原文转自:http://www.huihoo.org/jboss/jboss.cn.html 研究项目: JBoss架构分析 Jenny Liu School of Information Techn ...

最新文章

  1. brightness temperature
  2. C++ primer学习方法
  3. SAP同一公司不同工厂间物料转储方案比较
  4. 16 大常考算法知识点,你掌握了吗?
  5. 统计所有带有null的特征
  6. 查看表状态及索引碎片语句
  7. python numpy中数组.min()
  8. docker pull下载很慢_假如服务器上没有 Docker 环境,你还能愉快的拉取容器镜像吗?...
  9. VS2015 Cordova Ionic移动开发(一)
  10. 原创Netty学习系列导航
  11. VGG16和VGG19的理解
  12. 一封没有读出来的感谢信,勾勒出蔡文胜30年创业史!
  13. 成功在神舟K650c-i7 d2(i7-4700MQ、HM87)上装好了Windows XP
  14. Exchange Server 2016 CU22升级更新
  15. 数据建模 - 概念模型,逻辑模型,物理模型 的区别以及建模方式
  16. python数据结构与算法 20 递归和递归三定律
  17. 判断输入的手机号码格式是否正确(用Java实现)
  18. 如何创新地解决光缆运维痛点?
  19. Xcode info.plist各种key
  20. 【LB】稀疏矩阵的快速转置原理及其算法

热门文章

  1. Eclipse中建多层级包时出现的问题
  2. 3.高精度加法(使用C++的string实现高精度加法运算的实例代码)包含auto解决办法
  3. 去除csv文件中空行
  4. 去掉每行行首空格及行尾空格,无空行的方法
  5. 【低代码】手写低代码中的编译器/翻译器
  6. Live2D Web端实现
  7. mysql的报错日志哪里看_mysql错误日志
  8. html的text滚条设置,textarea 滚动条属性设置
  9. 安卓自动无限试玩,只需一根WiFi玩法
  10. DSP28335学习之旅2-最小系统