目录

 

概述

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官网的架构图如下:

javax 多媒体 mediasoup java_javax 多媒体

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也是一个很好的参考例子。