1. Mediasoup 基本组件框图
2. Mediasoup 的初始化基本流程
1. 客户端访问 https://192.168.2.84:3000/?info=true , 返回初始化页面 html
2. 这是一个新发起的请求 websocket
wss://192.168.2.84:4443/?roomId=7xexh3xi&peerId=za4svz6e
客户端一个请求过来,首先根据 url 里的 roomId 查找 Room,如果不存在 Room,则轮询挑选一个 worker ,产生一个协议层面的 Room 以及通过 worker 产生一个 router ,
通过 router 产生一个与底层交互的 DirectTransport ,这个用来 js 与底层 worker 的信令或数据交互,然后创建一个上层的 Room 对象,包含这些新产生的对象
3. 客户端首先获取 getRouterRtpCapabilites
4. 客户端产生一个 createWebRtcTransport 生产者 和一个 createWebRtcTransport 消费者
5. 客户端然后执行加入 Room 的指令 join
6. 客户端执行 connectWebRtcTransport 进行 ice 的相关动作,两次一个生产者一个消费者
7. 客户端执行产生 produce ,并为 Room 的每个用户创建相应的 consume ,后续通过 produce 上传音视频数据
3. Producer 的简单说明
每个 producer 分为三个种类 : all, audio & video ,根据产生 produce 的 json 字段 kind 指定,
同时也支持三种类型 type 的输出,分别为 none, simple, simulcast, svc, pipe,根据产生 producer 的 json 字段 encodings 进行判断
当 encodings 列表个数为 1 时,判断 if (encoding.spatialLayers > 1 || encoding.temporalLayers > 1) 则为 SVC,否则就为 SIMPLE, 当
encodings 列表个数大于 1 时, 则 type 为 SIMULCAST,如果 encodings 为 0 时,则为 NONE
4. 数据接收及转发流程
UdpSocket ---> WebRtcTransport --- 根据 ssrc 获取 producer ---> Producer ---> WebRtcTransport ---> Router --- 根据 producer 获取 consumer ---> consumer (抖动缓冲) ---> WebRtcTransport
5. 题外话
新用户加入到 Room 会为当前 Room 内已经存在的每一个 producer 产生一个 consumer ,consumer 产生成功,把此 consumer 的信息通过上述通道,发送指令 newConsumer 到新用户的客户端上,这样就建立了客户端与服务器端的 consumer 的通道,而新用户的每次创建一个 producer 就会为当前 Room 的已经存在的用户产生一个 consumer ,然后把此信息发送到已经存在的用户客户端上,这样就为已经存在的用户建立 了consumer 的通道。