mediasoup基础概览

提示:本文为之前mediasoup基础介绍的优化

mediasoup基础概览

    • 架构:
    • 2.特性:
      • 优点
      • 缺点
    • 3.mediasoup常见类介绍
      • js部分
      • c++
    • 4.mediasoup类图
    • 5.业务类图


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 模块组成。
微信图片_20240602100208.png

2.特性:

优点

  1. ECMAScript 低层级 API:Mediasoup 提供了基于 ECMAScript(JavaScript)的 API,允许开发者以较低的抽象级别与 WebRTC 相关的功能进行交互,从而实现更精细的控制。
  2. 高性能:Mediasoup 底层使用 C++ 实现,运行在 libuv 之上,利用了现代 CPU 的多核能力,提供了高效的媒体数据转发能力。
  3. 低延迟:专为低延迟通信设计,适用于实时视频会议和交互式应用。
  4. 多流支持:Mediasoup 允许在单个 ICE(Interactive Connectivity Establishment)和 DTLS(Datagram Transport Layer Security)传输上发送和接收多个音视频流,这有助于减少建立连接的开销。
  5. IPv6 准备就绪:Mediasoup 支持 IPv6 协议,这使得它能够适应现代网络环境,并利用 IPv6 提供的更广阔的地址空间和更好的网络性能。
  6. ICE / DTLS / RTP / RTCP 支持:Mediasoup 支持通过 UDP 和 TCP 协议进行 ICE、DTLS、RTP 和 RTCP 的传输,这为建立安全且高效的 WebRTC 连接提供了基础。
  7. Simulcast 和 SVC 支持
    • Simulcast:Mediasoup 支持 Simulcast,允许发送者发送多个不同分辨率的视频流,接收者可以根据带宽和处理能力选择合适的流。
    • SVC(Scalable Video Coding):Mediasoup 还支持 SVC,这是一种视频编码技术,允许视频流在不同的层级上进行扩展,以适应不同的网络条件和解码能力。
  8. 拥塞控制:Mediasoup 实现了拥塞控制机制,可以动态调整传输速率,以优化网络条件并防止数据包丢失。
  9. 带宽估计:Mediasoup 包括发送端和接收端的带宽估计功能,使用空间/时间层分布算法来优化视频流的质量,根据可用带宽动态调整视频的分辨率和帧率。
  10. 强大的媒体工作进程:Mediasoup 的媒体工作进程是用 C++ 编写的,并在 libuv(一个跨平台的异步 I/O 库)之上运行,这使得 Mediasoup 能够提供高性能的媒体处理能力,特别是在处理大量并发连接时。

缺点

  1. 仅限于 WebRTC:Mediasoup 主要针对 WebRTC 进行了优化,不支持其他类型的媒体传输协议。
  2. 默认没有实现分布式集群实现。

3.mediasoup常见类介绍

js部分

AudioLevelObserver.js检测声音大小
Channel.js与mediasoup的c++部分进行通信
Consumer.js消费者
EnhancedEventEmitter.jsEventEmitter,事件发射器
Logger.js日志
PipeTransport.js每个进程Worker中连接Router之间的通信
PlainTransport.js主要用于普通的非加密的RTP数据的传输
Producer.js视频或者音频的生产者
Router.js对应每个房间或者路由器
RtpObserver.jsRTP观察者
Transport.js一个基类,PipeTransport和PlainTransport这些都继承它实现。
WebRtcTransport.jswebrtc传输
Worker.js进程控制
errors.js错误信息
index.jsmediasoup库的索引
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 和 RtpStreamRecvstream类处理 RTP 数据流的发送和接收。RtpStreamSend 用于 Consumer 将数据发送给客户端,而 RtpStreamRecv 用于 Producer 接收客户端发送的数据流。
SeqManagerseq管理类负责对传输的数据进行重新排序,确保数据包的顺序正确。
NackGenerator丢包处理类用于处理丢包情况,生成重传请求,以便发送端可以补充丢失的数据包。
PortManager端口管理类端口管理器,负责管理端口的使用,确保端口号没有被占用。

4.mediasoup类图

20200224113930707.png


5.业务类图

20210116195335968.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/338558.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

openssl 常用命令demo

RSA Private Key的结构(ASN.1) RSAPrivateKey :: SEQUENCE { version Version, modulus INTEGER, -- n publicExponent INTEGER, -- e privateExponent INTEGER, -- d prime1 INTEGER, -- …

三丰云免费服务器

三丰云网址: https://www.sanfengyun.com 可申请免费云服务器,1核/1G内存/5M宽带/有公网IP/10G SSD硬盘/免备案。 收费云服务器,买2年送1年,有很多优惠

空调外机清洁机器人设计

现在的空调,有很多安装在高层,一旦安装使用后,外机几乎不可能再清洗。因为费用高,清洁工人的钱应该是好几百还不止;清洁风险高,空调师傅需要高空作业,如果发生意外业主难以承担。但空调运行几年…

欧科云链:Web3.0时代 具备链上数据分析能力的公司愈发凸显其价值

在当今激烈的市场竞争中,新兴互联网领域迅速崛起,Web2.0已相对成熟,用户创造数据,但不拥有数据。被视为新的价值互联网的Web3.0,赋予用户真正的数据自主权,它的到来被认为是打破Web2.0垄断的机遇。 在Web3…

kafka 发送文件二进制流及使用header发送附属信息

文章目录 背景案例发送方接收方 背景 需要使用kafka发送文件二进制以及附属信息 案例 发送方 import org.apache.kafka.clients.producer.KafkaProducer; import org.apache.kafka.clients.producer.ProducerRecord;import java.io.InputStream; import java.nio.charset.S…

Ubuntu20.04安装ffmpeg,并捕获视频流

工控机:幻影峡谷 系统:Ubuntu20.04 摄像头:杰瑞微通环星光USB摄像头记录一下使用ffmpeg拉取视频流的原因:刚开始用的是ubuntu系统自带的 茄子 软件,但是视频流很卡(非常卡,基本上不能用&#xf…

开箱即用的Spring Boot 企业级开发平台【毕设项目推荐】

项目概述 基于 Spring 实现的通用权限管理平台(RBAC模式)。整合最新技术高效快速开发,前后端分离模式,开箱即用。 核心模块包括:用户、角色、职位、组织机构、菜单、字典、日志、多应用管理、文件管理、定时任务等功能…

【kubernetes】关于k8s集群如何将pod调度到指定node节点(亲和与反亲和等)

目录 一、调度约束 1.1K8S的 List-Watch 机制 ⭐⭐⭐⭐⭐ 1.1.1Pod 启动典型创建过程 二、调度过程 2.1Predicate(预选策略) 常见的算法 2.2priorities(优选策略)常见的算法 三、k8s将pod调度到指定node的方法 3.1指定…

css动态导航栏鼠标悬停特效

charset "utf-8"; /*科e互联特效基本框架CSS*/ body, ul, dl, dd, dt, ol, li, p, h1, h2, h3, h4, h5, h6, textarea, form, select, fieldset, table, td, div, input {margin:0;padding:0;-webkit-text-size-adjust: none} h1, h2, h3, h4, h5, h6{font-size:12px…

为什么GD32F303代码运行在flash比sram更快?

我们知道一般MCU的flash有等待周期,随主频提升需要插入flash读取的等待周期,以stm32f103为例,主频在72M时需要插入2个等待周期,故而代码效率无法达到最大时钟频率。 所以STM32F103将代码加载到sram运行速度更快。 但使用GD32F30…

20.Redis之缓存

1.什么是缓存? Redis 最主要的用途,三个方面:1.存储数据(内存数据库)2.缓存 【redis 最常用的场景】3.消息队列【很少见】 缓存 (cache) 是计算机中的⼀个经典的概念. 在很多场景中都会涉及到. 核⼼思路就是把⼀些常⽤的数据放到触⼿可及(访问速度更快)的地⽅, ⽅…

前端逆向之查看接口调用栈

一、来源 再分析前端请求接口数据的时候,其中有一个sid不知道是前端如何获取的,一般情况下只需要全局搜搜sid这个字符串或者请求接口的名称就可以了,基本都能找到sid的来源,但是今天这个不一样,搜什么都搜不到 接口地…

安装 ArchLinux 和 KDE Plasma 6 | 双系统/虚拟机

注:本文写于 2024/06/02 ,ArchLinux 最新版为 2024.06.01 (为什么用 Arch 懒得写了,给个别人写的链接:写在主力使用archlinux一年之后(一)Why Arch Linux? ,总之就是pacman真香&…

【UnityShader入门精要学习笔记】第十六章 Unity中的渲染优化技术 (下)

本系列为作者学习UnityShader入门精要而作的笔记,内容将包括: 书本中句子照抄 个人批注项目源码一堆新手会犯的错误潜在的太监断更,有始无终 我的GitHub仓库 总之适用于同样开始学习Shader的同学们进行有取舍的参考。 文章目录 减少需要处…

数据结构复习指导之交换排序(冒泡排序,快速排序)

目录 交换排序 复习提示 1.冒泡排序 1.1基本思想 1.2算法代码 1.3性能分析 2.快速排序 2.1基本思想 2.2算法代码 2.3性能分析 交换排序 复习提示 所谓交换,是指根据序列中两个元素关键字的比较结果来对换这两个记录在序列中的位置。 基于交换的排序算法很…

ROS无人机追踪小车项目开发实战 | 第四届中国智能汽车创新大会圆满结束

2024年5月26日,阿木实验室在深圳第四届中国智能汽车创新大会上,开展的《Prometheus开源平台-ROS无人机追踪小车项目开发实战课》圆满结束。 该实战课从初学者的角度出发,通过实践性讲解和开发,使开发者们系统地学习了硬件系统架构…

vue3使用vue3-print-nb打印

打印效果 1.下载插件 Vue2.0版本安装方法 npm install vue-print-nb --saveVue3.0版本安装方法: npm install vue3-print-nb --save2.main.js引入 vue2引入 import Print from vue-print-nb Vue.use(Print)vue3引入 import print from vue3-print-nb // 打印…

在Windows安装Flutter

一、安装 Android Studio 官网: 下载 Android Studio 和应用工具 - Android 开发者 | Android Developers 教程:Android Studio 安装配置教程 - Windows(详细版)-CSDN博客 Flutter 官网:Windows | Flutter 中文文档 - Flutter 中文开发…

JVM学习-详解类加载器(一)

类加载器 类加载器是JVM执行类加载机制的前提 ClassLoader的作用 ClassLoader是Java的核心组件,所有的Class都是由ClassLoader进行加载的,ClassLoader负责通过各种方式将Class信息的二进制数据流读入JVM内部,转换为一个与目标类型对应的ja…

打开C语言常用的内存函数大门(三) —— memset()函数(内含讲解用法和模拟实现)

文章目录 1. 前言2. memset函数2.1 memset函数原型2.2 memset函数参数的介绍2.3 memset函数的使用演示 3. memset函数的模拟实现4. 总结 1. 前言 哈喽,我们又见面了。通过前面两个内存函数(memcpy、memmove函数)讲解的锤炼后,对如何解析一个自己从来没有…