一、Mediasoup源码介绍
一、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 核心类介绍
-
对于4种消费者,都包含RtpStreamSend对象,消费者发送数据给客户端,通过RtpStreamSend方法。RtpStreamSend继承自RtpStream,这个类处理Rtp数据流的收发。RtpStream使用到了RtpPacket,这个包是用于对Rtp数据包的分析,Rtp数据有数据包头,对于包头每一个字段的定义都是在这个Packet里面操作的
-
因为要对整个数据进行处理,所以使用SeqManager,序列管理器。服务端推送给客户端的数据流是会重新排序的,排序的时候便会依靠这个SeqManager,它会记录某个SSRC所对应的Sequence,以此为起始位置,然后后面的每个包都向下递增一个数
-
Producer作为服务端的生产者,它是用来接收共享者发送的数据流,所以它里面包含多个RtpStreamRecv,是一对多的关系(为什么是多个RtpStreamRecv呢?因为数据的接收有可能会丢包,丢包重传的也算作一路流,对应的音频的丢包也是需要重传)
-
作为数据的接收端,RtpStreamRecv使用到了NackGenerator丢包产生器。接收端能够知道有没有丢包,因为数据包有Sequence,比如发送了100个数据,前50个数据是连续的,但假设当50之后是55,Recv端就知道丢了 51、52、53、54 这4个包了。丢包之后如何解决呢,有两种方式:
-
Fec:在每个包增加一些冗余,它能计算 出丢失的音频包或视频包
-
Nack:它会告诉发送端丢了哪些包,发送端会根据策略,若时间比较短的话,会把丢失的包补上来,具体补哪些包就是根据NackGenerator产生的
-
Transport分为3种,WebRtcTransport(浏览器数据传输)、PlainRtpTransport(非音视频)、PipeTransport(不同router之间数据流转)。TransportTuple元组存放本地socket、远端socket、IP、端口
-
最核心的是WebRtcTransport,与浏览器进行数据传输。首先其包含UdpScoket与TcpServer对应两个链接,可以与客户端连接通信
-
对于UdpSocket与TcpServere,其继承自PortManager端口管理器,对于Mediasoup来说,默认是从40000到49999共一万个端口号。UdpSocket和TcpServer通过PortManager进行对端口号的管理,首先确定端口号有没有被占用,没有被占用就使用该端口号对数据传输;若被占用,就根据PortManager的策略往后跳。注意Udp和Tcp的使用是互斥的
-
DtlsTransport:使用dtls对Rtp包进行数据加密的协议,同时在这里面还使用到了Srtp协议,Srtp协议分为数据的收与发,所以在WebRTCTransport中有Srtp send和recv这两个Session
-
RembClient/RembServer:这两个主要用于对带宽的评估,既可用于client端也可用于server端。对于共享者来说,Mediasoup的WebRTCTransport就是RembClient端;对于消费者来说,就是RembServer端
-
IceCandidate:候选者包括Host、Server reflexive、Relay reflexive三种,对于WebRTC一般设置成Host,最高优先级
相关文章:
一、Mediasoup源码介绍
一、Mediasoup 整体结构 整个Mediasoup库通过Nodejs管理,比如整体逻辑、worker、router、producer、consumer...都是通过JS进行管理的。 其底层的数据传输是通过C部分进行控制的,通过NodeJs来控制C部分,以实现整体的数据传输效 二、Mediasou…...
⑧ 嵌套路由配置
这种就是路由嵌套 在index.js中加上三级页面 引入到二级导航里面 增加重定向配置 三级页面默认显示第一个页面信息 在这里插入图片描述...
【ppt技巧】将幻灯片里的图片背景设置为透明
在PPT中添加了图片,想要将图片中的背景设置为透明或者想要抠图,有什么方法吗?今天分享两个方法。 方法一: 添加图片,选中图片之后,点击【图片格式】功能,点击最左边的【删除背景】 PPT会自动帮…...
rrweb入门
rrweb 背景 rrweb 是 record and replay the web,是当下很流行的一个录制屏幕的开源库。与我们传统认知的录屏方式(如 WebRTC)不同的是,rrweb 录制的不是真正的视频流,而是一个记录页面 DOM 变化的 JSON 数组&#x…...
OSCP系列靶场-Esay-Vegeta1保姆级
OSCP系列靶场-Esay-Vegeta1保姆级 目录 OSCP系列靶场-Esay-Vegeta1保姆级总结准备工作信息收集-端口扫描目标开放端口收集目标端口对应服务探测 信息收集-端口测试22-SSH端口的信息收集22-SSH端口版本信息与MSF利用22-SSH协议支持的登录方式22-SSH手动登录尝试(无)22-SSH弱口令…...
AJAX学习笔记9 搜索联想自动补全
AJAX学习笔记8 跨域问题及解决方案_biubiubiu0706的博客-CSDN博客 其实就一个功能 搜索联想 自动补全 键盘按下事件keydown 键盘弹起事件keyup 做模糊查询 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><t…...
Docker启动失败报错Failed to start Docker Application Container Engine解决方案
Docker启动失败报错Failed to start Docker Application Container Engine解决方案_天涯人6的博客-CSDN博客...
安装React脚手架
在安装React脚手架之前,你需要决定使用哪个包管理工具。这里我们选择使用npm。运行下面的命令来安装React脚手架: npm install -g create-react-app这个命令会在全局安装React脚手架工具create-react-app。 现在,你已经准备好创建一个新的R…...
想要精通算法和SQL的成长之路 - 受限条件下可到达节点的数目
想要精通算法和SQL的成长之路 - 受限条件下可到达节点的数目 前言一. 相交链表(邻接图和DFS) 前言 想要精通算法和SQL的成长之路 - 系列导航 一. 相交链表(邻接图和DFS) 原题链接 public int reachableNodes(int n, int[][] ed…...
加快项目开发进度常用5种方法
项目进度管理是根据进度目标,制定合理的进度计划,全程监控项目进度的执行情况。这样有利于明确项目目标,协调团队行动,提高开发效率,从而最大化项目利益。而加快项目进度,有利于提高项目整体效率࿰…...
leetcode做题笔记136. 只出现一次的数字
给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。 思路一:快排(…...
vuex 模拟异步调用
在页面中首先定义一个调用vuex异步函数的方法 <el-button click fetchData></el-button> {{asyncData}} vuex 中 const store new Vuex.Store({state: {asyncData: null,},mutations: {SET_ASYNC_DATA(state, data) {state.asyncData data;},},actions: {fe…...
error:Failed building wheel for XXX
解决方案适用于大多数的pip 安装时出现的Failed building wheel for XXX 出现问题 按以往快速安装包的经验,第一反应当然是使用简单又快捷的terminal命令加上镜像,如下: pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple结…...
【linux命令讲解大全】112.Linux 系统管理工具:dpkg-statoverride 和 dstat 的使用介绍
文章目录 dpkg-statoverride补充说明语法选项实例 dstat补充说明下载安装方法一方法二 使用说明语法常用选项实例 从零学 python dpkg-statoverride 在 Debian Linux 中覆盖文件的所有权和模式。 补充说明 dpkg-statoverride 命令用于在 Debian Linux 中覆盖文件的所有权和模…...
ffmpeg草稿
avformat 用于解析容器和协议(protocol)。 avcodec 用于编码和解码基本流(您已经拥有的)。 Qt/C音视频开发44-本地摄像头推流(支持分辨率/帧率等设置/实时性极高)_feiyangqingyun的博客-CSDN博客 void FFmpegThread::initInputFormat() {//本地摄像头/桌…...
熵 | 无线通信知识
文章目录 一、信息论(熵、联合熵、条件熵)二、Bernoulli熵三、联合熵和条件熵四、互信息五、相对熵(KL距离)六、微分熵七、最大熵分布常需要的不等式公式 一、信息论(熵、联合熵、条件熵) 熵定义: H ( X ) E [ − l …...
黑马JVM总结(七)
(1)StringTable_编译器优化 “a”“b”对应#4:是去常量池中找ab的这个符号 astore 5:是把这个存入编号为5的局部变量 “ab”对应的指令 #4,跟“a”“b”对应#4下面弄是一样的 在执行s3“ab”这行个代码时…...
Vue3核心语法一
Vue3核心语法一 rectiveshallowReactiverefcomputedwatchwatchEffet 使用Vue3创建项目template中标签可以多个根标签,可以通过setup开启组合式API,组合式API优点可以使相同业务放到一起 rective 定义响应式数据, import { reactive} from "vue";const data reactiv…...
5.11.Webrtc接口的设计原理
在上节课中呢,我向你介绍了web rtc的接口宏,那有很多同学会产生疑问啊,那觉得web rtc为什么要把接口设计的这么复杂?还非要通过宏来实现一个代理类,再通过代理类来调用到web rtc内部。 那为什么要这么设计呢…...
2022年09月 C/C++(八级)真题解析#中国电子学会#全国青少年软件编程等级考试
C/C++编程(1~8级)全部真题・点这里 第1题:道路 N个以 1 … N 标号的城市通过单向的道路相连:。每条道路包含两个参数:道路的长度和需要为该路付的通行费(以金币的数目来表示) Bob and Alice 过去住在城市 1.在注意到Alice在他们过去喜欢玩的纸牌游戏中作弊后,Bob和她分手…...
Vue3 监听属性-watch
文章目录 Vue3 监听属性-watch1. 概念2. 实例2.1 通过使用 watch 实现计数器2.2 千米与米之间的换算2.3 异步加载中使用 watch2.4 小计 Vue3 监听属性-watch 1. 概念 Vue3 监听属性 watch,可以通过 watch 来响应数据的变化。 watch 的作用:用于监测响应…...
JWT安全
文章目录 理论知识cookie(放在浏览器)session(放在 服务器)tokenjwt(json web token)headerpayloadSignatureJWT通信流程 JWT与Token 区别相同点区别 WebGoat靶场--JWT tokens环境启动第四关第五关第七关 属于越权漏洞 理论知识 cookie(放在浏览器) …...
LabVIEW利用人工神经网络辅助进行结冰检测
LabVIEW利用人工神经网络辅助进行结冰检测 结冰对各个领域构成重大威胁,包括但不限于航空航天和风力涡轮机行业。在起飞过程中,飞机机翼上轻微积冰会导致升力降低25%。研究报告称,涡轮叶片上的冰堆积可在19个月的运行时间内造成29MWh的功率损…...
Linux安装MySQL8.0
又又又又..Linux装MySQL。 删除原有的MySQL 查看安装的mysql信息:rpm -qa|grep -i mysql 删除mysql相关服务:rpm -e --nodeps 查询mysql遗留文件和依赖信息:find / -name mysql 手动删除mysql配置文件:rm -rf /etc/my.cnf 相关…...
【【萌新编写RISCV之前言CPU的部分介绍.3】】
萌新编写RISCV之前言CPU的部分介绍.3 CPU的数字电路结构实际十分简单,最主要的模块有PC(地址生成),ALU(运算),Register(寄存),Decode(译码&#…...
dl_model_param
set_dl_model_param —设置深度学习模型的参数 get_dl_model_param — Return the parameters of a deep learning model 返回深度学习模型的参数 使用read_dl_model读取前一步初始化后的网络模型,得到模型的句柄DLModelHandle。 接着用read_dict读取预处理后的数…...
Android相机调用-CameraX【外接摄像头】【USB摄像头】
Android相机调用有原生的Camera和Camera2,我觉得调用代码都太复杂了,CameraX调用代码简洁很多。 说明文档:https://developer.android.com/jetpack/androidx/releases/camera?hlzh-cn 现有查到的调用资料都不够新,对于外接摄像…...
第一个Java程序
1. 将扩展名.text更改为.java 2.文件夹(Hello.java)上方输入“cmd空格回车”(没有加号) 3.在命令提示符内输入“javac空格文件夹名称.java回车” (javac空格Hello.java回车) 执行成功后,文件夹下多一个Hello.class…...
OpenCV之霍夫变换检测直线
霍夫变换 首先是笛卡尔坐标系到霍夫空间的转换,比如笛卡尔坐标系中有一条直线 yaxb。 笛卡尔坐标系中一条直线,对应霍夫空间的一个点。 反过来同样成立(霍夫空间的一条直线,对应笛卡尔坐标系的一个点) 原理其实很简单 …...
lv3 嵌入式开发-11 Linux下GDB调试工具
目录 1 GDB简介 2 GDB基本命令 3 GDB调试程序 1 GDB简介 GDB是GNU开源组织发布的一个强大的Linux下的程序调试工具。 一般来说,GDB主要帮助你完成下面四个方面的功能: 1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序&#…...
电商网站会员体制怎么做/郑州专业seo哪家好
1、纯CSS3实现人物摇头动画这次我们要来分享一款超级可爱的纯CSS3人物摇头动画,初始化的时候人物的各个部位是利用CSS3动画效果拼接而成,接下来就是人物听音乐的场景,一边听音乐一边摇着脑袋,十分陶醉的样子,周围还会出…...
专门做企业名录的网站/西安优化排名推广
原标题:Unity编辑器中使用GitHub管理项目Git作为代码协作工具已帮助了成千上万的开发者,但对于游戏开发来说还是稍有不便。最近GitHub官方推出了GitHub for Unity扩展工具,该工具对程序员及设计师均适用,Unity游戏开发者可以更好地…...
深圳做网站优化费用/广州网站优化公司排名
【摘 要】随着人们生活水平的不断提高,家用轿车保有量每年都在不断的攀升,导致城市交通问题日益突出。为缓解城市停车难的问题,本文提出了基于android平台下开发的共享停车系统app,意在帮助用户在高峰期劈开停车难的问题ÿ…...
dreamweaver建设网站/全网整合营销
作为一个男人,尤其作为一个真正的爷们,应该做好下列小事: 1,朋友请你吃饭,不要觉得理所当然,请礼尚往来,否则你的名声会越来越臭。 2,给自己定目标,一年,两年,五年&#…...
用vs2010做网站登入/百度搜索优化软件
张超:又拍云系统开发高级工程师,负责又拍云 CDN 平台相关组件的更新及维护。Github ID: tokers,活跃于 OpenResty 社区和 Nginx 邮件列表等开源社区,专注于服务端技术的研究;曾为 ngx_lua 贡献源码,在 Ngin…...
连云港网站建设培训学校/百度推广入口登录
标签定义及使用说明 <abbr> 标签用来表示一个缩写词或者首字母缩略词,如"WWW"或者"NATO"。 通过对缩写词语进行标记,您就能够为浏览器、拼写检查程序、翻译系统以及搜索引擎分度器提供有用的信息。 实例 被标记的缩写词如…...