🌌Mediasoup 的使用
00 分钟
2023-7-6
2023-7-6
type
status
date
slug
summary
tags
category
icon
password
Edited
Jul 6, 2023 12:10 PM
Created
Jul 6, 2023 12:02 PM

介绍

Mediasoup 是推出时间不长的 WebRTC 流媒体服务器开源库,其地址为:
Mediasoup 由应用层和数据处理层组成。应用层是通过 Node.js 实现的;数据处理层由 C++ 语言实现,包括 DTLS 协议实现、ICE 协议实现、SRTP/SRTCP 协议实现、路由转发等。

架构

notion image
Mediasoup 把每个实例称为一个 Worker,在 Worker 内部有多个 Router,每个 Router 相当于一个房间。在每个房间里可以有多个用户或称为参与人,每个参与人在 Mediasoup 中由一个 Transport 代理。换句话说,对于房间(Router)来说,Transport 就相当于一个用户。
Transport 有三种类型,即 WebRtcTransport、PlainRtpTransport 和 PipeTransport。
  • WebRtcTransport 用于与 WebRTC 类型的客户端进行连接,如浏览器。
  • PlainRtpTransport 用于与传统的 RTP 类型的客户端连接,通过该 Transport 可以播放多媒体文件、FFmpeg 的推流等。
  • PipeTransport 用于 Router 之间的连接,也就是一个房间中的音视频流通过 PipeTransport 传到另一个房间。
在每个 Transport 中可以包括多个 Producer 和 Consumer。
  • Producer 表示媒体流的共享者,它又分为两种类型,即音频的共享者和视频的共享者。
  • Consumer 表示媒体流的消费者,它也分为两种类型,即音频的消费者和视频的消费者。
Mediasoup 的实现逻辑非常清晰,它不关心上层应用该如何做,只关心底层数据的传输,并将它做到极致。
Mediasoup 底层使用 C++ 开发,使用 libuv 作为其异步 IO 事件处理库,所以保证了其性能的高效性。同时它支持了几乎所有 WebRTC 为了实时传输做的各种优化,所以说它是一个特别优秀的 WebRTC SFU 流媒体服务器。

官方Demo

官方Documentation

使用

整体结构
notion image

server 端

先创建 Worker 和 Router,同时还要将 router 支持的 RTP 类型传输给 client
后面都是两端相互联动创建连接,创建 WebRtcTransport
注意返回值,transport 是一个 WebRtcTransport 实例,用于与客户端的 transport 建立连接,以便后续流媒体的传输
transport 的实例需要保存,而 params 参数是传输给客户端,这样客户端就知道服务器创建了的 transport,就可以将两个 transport 建立连接了
接下来是 producer ,用于将客户端的音视频传输通过 transport 传输给 mediasoup 服务器
注意一个 producer 只对应与一种流媒体类型,即要么音频,要么视频
当 client 调用 produce()方法后,服务端创建 producer 来接受它的数据并传入给 router,用于后面 consumer 分配
服务端创建 producer
最后是 consumer, 用于将客户端传输给 mediasoup 服务器 的数据发送给客户端
当 client 调用 consume()方法后,指定要接受数据的 producer 的 id,服务端创建 consumer 来接受它的数据并传入给 client

client 端

首先加载 device 数据,查看服务器支持的类型
接着创建 Send Transport,用于将自己的音视频传输给服务器
创建的同时,服务器也创建对应 transport,并与之建立连接
接下来,我们就可以通过 produce()方法将本地音视频传输给服务器的 producer 了
最后建立上连接之后,就可以把 stream 传给 video 了
consume() 是一样的,先创建 Recv Transport,并建立 transport 的连接
接着通过 consume(),接收到对应的 producer 的流媒体,再获取到音视频 track 就可以传输到 video 中了

FIX BUG: 手机端无法正常连接到 mediasoup

修改 config.js
 

源码地址

webrtc-demo
JinSoooUpdated Jul 3, 2023
 
上一篇
TurboMeet:一个基于WebRTC实现的视频会议全栈开发项目
下一篇
流媒体相关知识

评论
Loading...