一、Mediasoup源码介绍

news2024/11/23 7:25:57

一、Mediasoup 整体结构

整个Mediasoup库通过Nodejs管理,比如整体逻辑、worker、router、producer、consumer...都是通过JS进行管理的。

其底层的数据传输是通过C++部分进行控制的,通过NodeJs来控制C++部分,以实现整体的数据传输效

二、Mediasoup js类关系

1.几乎所有类都继承自EnhancedEventEmitter,每个对象都可以发送事件

2.每个worker代表一个节点,内部有多个Router,组成Routers结构。每个Worker中都有一个channel,与C++进行通讯

3.对于每一个Router房间来说,是包含Tranports和Produces

4.Transport包含Produces与Consumes,其包括多个子类,如WebRtcTransport(浏览器数据传输)、PlainRtpTransport(非音视频)、PipeTransport(不同router之间数据流转)

二、Mediasoup c++类关系

1.最核心是Router类,房间概念,包含Consumer、Producer,Transport子模块,关系对应1:n

2.Consumer中含有多种子类,如:SimpleConsumer(音视频流)、PipeConsumer(Router之间数据流转)、SvcConsumer(分层、增量)、SimulcastConsumer(分层)

3.Producer,接收共享者传输的流

4.Transport分为3种,同前面JS介绍一致,TransportTuple元组存放本地socket、远端socket、IP、端口

三、Mediasoup 核心类介绍

  1. 对于4种消费者,都包含RtpStreamSend对象,消费者发送数据给客户端,通过RtpStreamSend方法。RtpStreamSend继承自RtpStream,这个类处理Rtp数据流的收发。RtpStream使用到了RtpPacket,这个包是用于对Rtp数据包的分析,Rtp数据有数据包头,对于包头每一个字段的定义都是在这个Packet里面操作的

  2. 因为要对整个数据进行处理,所以使用SeqManager,序列管理器。服务端推送给客户端的数据流是会重新排序的,排序的时候便会依靠这个SeqManager,它会记录某个SSRC所对应的Sequence,以此为起始位置,然后后面的每个包都向下递增一个数

  3. Producer作为服务端的生产者,它是用来接收共享者发送的数据流,所以它里面包含多个RtpStreamRecv,是一对多的关系(为什么是多个RtpStreamRecv呢?因为数据的接收有可能会丢包,丢包重传的也算作一路流,对应的音频的丢包也是需要重传)

  4. 作为数据的接收端,RtpStreamRecv使用到了NackGenerator丢包产生器。接收端能够知道有没有丢包,因为数据包有Sequence,比如发送了100个数据,前50个数据是连续的,但假设当50之后是55,Recv端就知道丢了 51、52、53、54 这4个包了。丢包之后如何解决呢,有两种方式:

  5. Fec:在每个包增加一些冗余,它能计算 出丢失的音频包或视频包

  6. Nack:它会告诉发送端丢了哪些包,发送端会根据策略,若时间比较短的话,会把丢失的包补上来,具体补哪些包就是根据NackGenerator产生的

  7. Transport分为3种,WebRtcTransport(浏览器数据传输)、PlainRtpTransport(非音视频)、PipeTransport(不同router之间数据流转)。TransportTuple元组存放本地socket、远端socket、IP、端口

  8. 最核心的是WebRtcTransport,与浏览器进行数据传输。首先其包含UdpScoket与TcpServer对应两个链接,可以与客户端连接通信

  9. 对于UdpSocket与TcpServere,其继承自PortManager端口管理器,对于Mediasoup来说,默认是从40000到49999共一万个端口号。UdpSocket和TcpServer通过PortManager进行对端口号的管理,首先确定端口号有没有被占用,没有被占用就使用该端口号对数据传输;若被占用,就根据PortManager的策略往后跳。注意Udp和Tcp的使用是互斥的

  10. DtlsTransport:使用dtls对Rtp包进行数据加密的协议,同时在这里面还使用到了Srtp协议,Srtp协议分为数据的收与发,所以在WebRTCTransport中有Srtp send和recv这两个Session

  11. RembClient/RembServer:这两个主要用于对带宽的评估,既可用于client端也可用于server端。对于共享者来说,Mediasoup的WebRTCTransport就是RembClient端;对于消费者来说,就是RembServer端

  12. IceCandidate:候选者包括Host、Server reflexive、Relay reflexive三种,对于WebRTC一般设置成Host,最高优先级

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C语言】指针详解(3)

大家好,我是苏貝,本篇博客带大家了解指针(2),如果你觉得我写的还不错的话,可以给我一个赞👍吗,感谢❤️ 目录 一.函数指针数组二.指向函数指针数组的指针(不重要)三.回调函数 一.函…

9.13 | day 6 |day 45| to 完全平方数

● 70. 爬楼梯 &#xff08;进阶&#xff09; class Solution {public int climbStairs(int n) {int[] dp new int[n1];//设置背包容量&#xff1a;n个int m 2;//有两个物品&#xff0c;注意这是一个完全背包问题dp[0] 1;//initialize ​for(int i 1;i<n;i){//遍历背包f…

前缀和思想

何为前缀和 有一个数组a, 为 ...... 前缀和 ...... 有两个问题: 1.如何求? 只需要从前往后遍历,令 就可以了,最开始是 ,定义 0 2. 有什么用? 能够快速地求出原数组中某一段的和,预处理的…

利用procdump+Mimikatz绕过杀软获取Windows明文密码

利用procdumpMimikatz绕过杀软获取Windows明文密码 1.原理2.实操部分 1.原理 Mimikatz是从lsass.exe中提取明文密码的&#xff0c;当无法在目标机器上运行Mimikatz时&#xff0c;我们可使用ProcDump工具将系统的lsass.exe进程进行转储&#xff0c;导出dmp文件&#xff0c;拖回…

计算机网络工程毕业设计题目选题大全

文章目录 0 简介1 如何选题2 最新网络工程选题2.1 Java web - SSM 系统2.2 大数据方向2.3 人工智能方向2.4 其他方向 4 最后 0 简介 学长搜集分享最新的网络工程专业毕设毕设选题&#xff0c;难度适中&#xff0c;适合作为毕业设计&#xff0c;大家参考。 学长整理的题目标准…

windows 下使用virtualbox7.0设置共享文件夹详细,绝对好用

1、打开virtualbox软件 &#xff0c;点击设置-》存储-》控制器-》新建虚拟光驱&#xff0c;如下图所示 2、 重启virtualbox&#xff0c;重启方式可使用 enter键方式&#xff0c;会弹出一个小窗口&#xff0c;在小窗口中点击 设备-》安装增强功能 点击后&#xff0c;进入linux…

万字总结线程安全问题

目录 1. 线程安全 1.1 线程不安全的原因 1&#xff09;修改共享数据 2&#xff09;原子性 2&#xff09;可见性 2. synchronized 关键字-监视器锁 monitor lock 2.1 synchronized 的特性 1&#xff09;互斥 2&#xff09;可重入 2.2 使用 synchronized 解决上面的线程…

阿里张勇“下课” “逍遥子”从此逍遥了

作者&#xff1a;积溪 琥珀消研社快评&#xff1a;他服务过两个首富&#xff0c;曾被称为找工皇帝&#xff0c;如今张勇从干了16年的阿里辞职&#xff0c; 逍遥子从此逍遥了&#xff1f;#阿里 #张勇 #马云 马爸爸曾说过&#xff0c;他天不怕地不怕&#xff0c;就怕CFO当CEO&a…

【Linux网络】TCP/IP三次握手、四次挥手流程

目录 一、三次握手&#xff0c;建立连接 二、四次挥手&#xff0c;断开连接 三、主要字段 1、标志位&#xff08;Flags&#xff09; 2、序号&#xff08;sequence number&#xff09; 3、确认号&#xff08;acknowledgement number&#xff09; 四、三次握手的报文变化 五…

python3如何安装各类库的小总结

我的python3的安装路径是&#xff1a; C:\Users\Administrator\AppData\Local\Programs\Python\Python38 C:\Users\Administrator\AppData\Local\Programs\Python\Python38\python3.exeC:\Users\Administrator\AppData\Local\Programs\Python\Python38\Scripts C:\Users\Admin…

全球视野,共赴“睛”彩!四川眼科医院2023全国眼科学术大会行圆满收官!

9月6日—10日&#xff0c;国内眼科学界最盛大的学术会议——中华医学会第二十七次全国眼科学术大会(CCOS 2023)在湖南长沙隆重举办!逾万名国内外眼科专家、学者代表参加盛会&#xff0c;聚焦眼科发展的新技术、新知识以及新的经验&#xff0c;分享眼科和视觉科学方面最新的研究…

如何在JavaScript中实现链式调用(chaining)?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ JavaScript中的链式调用⭐ 示例⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff01;这个专栏是为那些对Web开发感兴…

JD(商品详情)API接口

为了进行电商平台 的API开发&#xff0c;首先我们需要做下面几件事情。 1&#xff09;开发者注册一个账号 2&#xff09;然后为每个JD应用注册一个应用程序键&#xff08;App Key) 。 3&#xff09;下载JDAPI的SDK并掌握基本的API基础知识和调用 4&#xff09;利用SDK接口和…

肖sir__mysql之介绍__001

mysql之介绍 一、认识数据库 &#xff08;1&#xff09;什么是数据库&#xff1f; 是存放数据的电子仓库。以某种方式存储百万条&#xff0c;上亿条数据&#xff0c;供多个用户访问共享。 如&#xff1a; &#xff08;2&#xff09;数据库分关系型数据库和非关系型数据库 a、…

互联网行业:是走下坡路还是瘦死的骆驼比马大?看看这个你就知道了!

随着互联网行业的快速发展&#xff0c;一些人开始质疑这个行业是否已经开始走下坡路了。 但是&#xff0c;我们想说的是&#xff0c;互联网行业还远远没有达到饱和状态&#xff0c;它仍然是一个充满机遇和挑战的领域。 让我们来看一些数据。根据最新的统计数据显示&#xff0c…

第二证券:低位放量下跌是什么征兆?

近年来&#xff0c;股市的波动一直是人们重视的热点。低位放量跌落是出资者最不愿意看到的&#xff0c;可是却经常呈现。那么&#xff0c;低位放量跌落是什么预兆呢&#xff1f;从多个角度剖析一下原因&#xff0c;帮助出资者更好地了解商场动态。 从技能面剖析&#xff0c;低…

033:跨域,vue端和 Nignx反向代理的配置详细解析

第033个 查看专栏目录: VUE ------ element UI 专栏目标 在vue和element UI联合技术栈的操控下&#xff0c;本专栏提供行之有效的源代码示例和信息点介绍&#xff0c;做到灵活运用。 &#xff08;1&#xff09;提供vue2的一些基本操作&#xff1a;安装、引用&#xff0c;模板使…

我的创作纪念日---从考研调剂到研一的旅程

文章目录 一、前言二、机缘三、收获四、日常五、憧憬 一、前言 大家好&#xff0c;我是小馒头学Python&#xff0c;小馒头学Python就是我&#xff0c;今天是我第一次收到创作纪念日的私信&#xff0c;去年的今天我还在考研&#xff0c;那个时候整天浑浑噩噩的&#xff0c;迷茫…

flex布局学习笔记

flex布局 推荐网址&#xff1a;弹性框完整指南 |CSS-Tricks - CSS-Tricks 基础知识和术语 由于flexbox是一个完整的模块&#xff0c;而不是一个单一的属性&#xff0c;它涉及很多事情&#xff0c;包括它的整套属性。其中一些应该在容器&#xff08;父元素&#xff0c;称为“…

【窗体】Winform两个窗体之间通过委托事件进行值传递,基础篇

2023年&#xff0c;第38周。给自己一个目标&#xff0c;然后坚持总会有收货&#xff0c;不信你试试&#xff01; 在实际项目中&#xff0c;我们可能会用到一些窗体做一些小工具或者小功能。比如&#xff1a;运行程序&#xff0c;在主窗体A基础上&#xff0c;点击某个按钮希望能…