提示:本文为之前mediasoup基础介绍的优化
mediasoup基础概览
Mediasoup 是一个构建在现代 Web 技术之上的实时通信(RTC)解决方案,它是一个完全兼容 WebRTC 的高性能 Selective Forwarding Unit(SFU)服务器。Mediasoup 允许开发人员轻松地在应用程序中实现音视频通话、会议和直播等功能。
Mediasoup 的设计目标是提供高性能和可扩展性,同时保持足够的灵活性,以适应不同的应用场景和需求。它适用于需要实时音视频通信的 Web 应用程序,并且可以与现有的 Web 技术栈无缝集成。
以下是 Mediasoup 的一些关键特性和概念:
架构:
与现有的其他 SFU(选择性转发单元)实现不同,mediasoup 不是一个独立的服务器,而是一个无特定意见的 Node.js 模块,它可以被集成到更大的应用程序中:
const mediasoup = require("mediasoup");
因此,在内部,mediasoup 可以被拆分为两个独立的组件:
一个为 Node.js 提供现代 ECMAScript API 的 JavaScript 层,以及 一组处理媒体层(ICE、DTLS、RTP 等)的 C/C++ 子进程。 这两个组件通过进程间通信的方式相互交流。然而,从开发者的角度来看,应用程序只需要关心 JavaScript API 的集成。
Mediasop 由 TypeScript 语言实现的 master 端和基于 libuv 的 C++ 语言实现的 worker 模块组成。
2.特性:
优点
- ECMAScript 低层级 API:Mediasoup 提供了基于 ECMAScript(JavaScript)的 API,允许开发者以较低的抽象级别与 WebRTC 相关的功能进行交互,从而实现更精细的控制。
- 高性能:Mediasoup 底层使用 C++ 实现,运行在 libuv 之上,利用了现代 CPU 的多核能力,提供了高效的媒体数据转发能力。
- 低延迟:专为低延迟通信设计,适用于实时视频会议和交互式应用。
- 多流支持:Mediasoup 允许在单个 ICE(Interactive Connectivity Establishment)和 DTLS(Datagram Transport Layer Security)传输上发送和接收多个音视频流,这有助于减少建立连接的开销。
- IPv6 准备就绪:Mediasoup 支持 IPv6 协议,这使得它能够适应现代网络环境,并利用 IPv6 提供的更广阔的地址空间和更好的网络性能。
- ICE / DTLS / RTP / RTCP 支持:Mediasoup 支持通过 UDP 和 TCP 协议进行 ICE、DTLS、RTP 和 RTCP 的传输,这为建立安全且高效的 WebRTC 连接提供了基础。
- Simulcast 和 SVC 支持 :
- Simulcast:Mediasoup 支持 Simulcast,允许发送者发送多个不同分辨率的视频流,接收者可以根据带宽和处理能力选择合适的流。
- SVC(Scalable Video Coding):Mediasoup 还支持 SVC,这是一种视频编码技术,允许视频流在不同的层级上进行扩展,以适应不同的网络条件和解码能力。
- 拥塞控制:Mediasoup 实现了拥塞控制机制,可以动态调整传输速率,以优化网络条件并防止数据包丢失。
- 带宽估计:Mediasoup 包括发送端和接收端的带宽估计功能,使用空间/时间层分布算法来优化视频流的质量,根据可用带宽动态调整视频的分辨率和帧率。
- 强大的媒体工作进程:Mediasoup 的媒体工作进程是用 C++ 编写的,并在 libuv(一个跨平台的异步 I/O 库)之上运行,这使得 Mediasoup 能够提供高性能的媒体处理能力,特别是在处理大量并发连接时。
缺点
- 仅限于 WebRTC:Mediasoup 主要针对 WebRTC 进行了优化,不支持其他类型的媒体传输协议。
- 默认没有实现分布式集群实现。
3.mediasoup常见类介绍
js部分
AudioLevelObserver.js | 检测声音大小 |
---|---|
Channel.js | 与mediasoup的c++部分进行通信 |
Consumer.js | 消费者 |
EnhancedEventEmitter.js | EventEmitter,事件发射器 |
Logger.js | 日志 |
PipeTransport.js | 每个进程Worker中连接Router之间的通信 |
PlainTransport.js | 主要用于普通的非加密的RTP数据的传输 |
Producer.js | 视频或者音频的生产者 |
Router.js | 对应每个房间或者路由器 |
RtpObserver.js | RTP观察者 |
Transport.js | 一个基类,PipeTransport和PlainTransport这些都继承它实现。 |
WebRtcTransport.js | webrtc传输 |
Worker.js | 进程控制 |
errors.js | 错误信息 |
index.js | mediasoup库的索引 |
ortc.js | 以对象的形式存储帧率码率等相关信息,和sdp对比 |
supportedRtpCapabilities.js | 支持rtp的能力 |
utils.js | 公共配置 |
c++
类名 | 解释 | 详细介绍 |
---|---|---|
Worker | 进程类 | Mediasoup 的 worker 是实际进行媒体数据流转发的进程,可以根据 CPU 核心数启动相应数量的 worker。 |
Router | 房间类 | 在 Mediasoup 中,Router 代表一个房间或者路由器,负责管理传输和媒体流。 |
Request | 消息类 | 用于接收和发送数据(send) |
Notifier | 通知类 | 用于通知(Emit) |
UnixStreamSocket | 数据传输类 | libuv的上层封装 |
Transport | 通道类 | Mediasoup 支持多种传输方式,包括 WebRtcTransport、PlainRtpTransport 和 PipeTransport,用于终端与 MediaSoup Router 之间的连接和媒体传输。 |
producer | 生产者类 | 作为服务端的生产者,用于接收共享者发送的数据流。包含多个 RtpStreamRecv,以处理可能的丢包和重传。 |
consumer | 消费者类 | 代表服务端的消费者,用于将数据发送给客户端。Consumer 是 PipeConsumer、SimulcastConsumer、SvcConsumer 和 SimpleConsumer 的基类。 |
RtpStreamSend 和 RtpStreamRecv | stream类 | 处理 RTP 数据流的发送和接收。RtpStreamSend 用于 Consumer 将数据发送给客户端,而 RtpStreamRecv 用于 Producer 接收客户端发送的数据流。 |
SeqManager | seq管理类 | 负责对传输的数据进行重新排序,确保数据包的顺序正确。 |
NackGenerator | 丢包处理类 | 用于处理丢包情况,生成重传请求,以便发送端可以补充丢失的数据包。 |
PortManager | 端口管理类 | 端口管理器,负责管理端口的使用,确保端口号没有被占用。 |
4.mediasoup类图
5.业务类图