当前位置: 首页 > news >正文

5.6.webrtc三大线程

那今天呢?我们来介绍一下web rtc的三大线程,那为什么要介绍这三大线程呢?最关键的原因在于web rtc的所有其他线程都是由这三大线程所创建的。那当我们将这三个线程理解清楚之后呢?我们就知道其他线程与它们之间是怎样关系,那也就知道了。y8 rtc底层逻辑处理的时候。线程是如何进行切换的?所以了解这三大线程呢?对于我们理解y边儿7c就是非常重要的意义。好,
在这里插入图片描述

那下面呢?我们就来看看外拔tc的三大线程,包括哪三个,

第一个呢?就是信号线程,通过这个名字啊,我们基本上也可以猜到它的作用是什么了。就是用于以应用层进行交互。当应用层调用外部r7c的API的时候,进入到API内部,它就会进行线程的切换,从应用层的线程切换到信号线程。

当它做底层逻辑处理的时候呢,又会从信号线程切换到工作线程,所以这是信号线程的主要作用。

好,那第二个重要的线程呢?就是工作线程,那工作线程的作用是负责内部逻辑的处理。所有底层的核心的逻辑都是由工作线程来完成的。

第三个线程呢?是网络线程,网络线程非常简单,就是负责网络数据包的收发,对吧?那这三个线程之间是怎样的关系呢?

实际上工作线程是最为核心的线程。我们来举一个例子啊。当网络线程收到数据包之后。那它首先要把数据包交给谁呢?

交给工作线程,由工作线程做一些逻辑的处理。比如说。是把这个rtb包包头去掉。然后留里边的pllo的数据。还有将多个rtb包组成一个视频帧,这些工作呢,都是由工作线程来完成的。

那当工作线程处理好这些任务之后呢?比如说应用层要收到一些反馈的信息。那这个时候呢,工作线程会将这个信息交给信号线程,信号线程最终传给应用层。

那现在呢?我们就应该知道那外部rtc这三大线程,它主要干了哪些活儿?那了解了它们的主要功能之后呢?下面咱们就来看一下代码。

看看外边儿tc中是如何启动这三大线程的好,我们切换到Windows系统下。那我们依然是从peer connection client这个项目出发来看一下这三大线程是如何创建的。好,那我们进入到慢点CC的文本函数中,那在这个80行呢?我们先设一个断点。实际上,80行跟81行我们在前面的课程中都向你做过详细介绍,对吧?这两行的主要作用。

就是将当前的主线程与win 3 r three的对象做一次绑定。那绑定的目的是什么呢?一会儿我们就会看到我们先将程序运行起来。好,这个时候呢,程序就执行到了men点CC的80行。那我们单步执行一下啊,当我们执行完81行之后呢,我们来看看。win三二three的对象,它的地址是多少?我们可以通过下边的自动窗口来看一下win 3 r three的对象的地址是三五三f。八那现在呢?我们先把这个地址给它记录下来,那一会儿呢,
在这里插入图片描述

我就会告诉你,我们记这个地址是干什么用的?好,那我们继续执行。连接心理服务器。选择一个我们要通信的对端。这时候呢,程序就执行到了conductor点CC的133行。那我在133行呢,设置了一个断点。那这行代码呢?实际大家应该都非常清楚,我在之前的课程中呢,也向你做过介绍,那它就是创建。

在这里插入图片描述

这个对象对吧?在创建peer connection factory这个对象的时候呢,有三个非常重要参数。分别是网络线程对象,工作线程对象以及信令线程对象。

通过这三个参数啊,我们可以知道,如果我们想自己控制这三个线程,我们就可以将这三个线程。及其对象创建好,那把它当做参数,传到这个API中,那这样呢?在y8 rtc底层,它就会使用我们创建好的三个线程。

进行底层的操作了,那如果我们觉得麻烦,你也可以在这里设置成null。那这样呢,在create peer connection factory内部,它就会自动为我们创建好这三个线程。

所以通过这个API,我们就可以知道这三个线程,就是在create peer connection factory内部创建的,对吧?那下面呢,我们就可以跳到这个API内部来看一下它具体是怎么做的?好,我们继续执行。实际上,

在这个API内部啊。它一开始是将所有的参数打包到了。dependency这个对象中。那之所以要创建这个对象呢,是因为它还要调用底层的逻辑,那底层逻辑我们要传很多参数的话就比较麻烦。还不如将它们都打包到一个对象中,这样我们只要传一个对象就OK了。那这一块逻辑呢就是。将我们的参数一项一项的塞到dependence对象中。当所有的参数都设置好之后呢?
在这里插入图片描述

它会调用create modular peer connection factory,这个方法我们继续执行。那在create modular peer connection factory这个方法中呢,它首先通过new创建了一个peer connection factory对象。
在这里插入图片描述

那么咱们来看一下peer connection factory构造函数中做了哪些事情?那首先呢,它会将dependencies中的这个成员呢,一项一项的拿出来设置到peer connection factory对象中。包括了network three的worker threed。signal three的pass query factory等等等,这一系列的参数对吧?这我们就不看了,那之后呢,在它的主逻辑中首先判断。network three的是否为空?如果为空,它就会在内部调用。
在这里插入图片描述

create with socket server方法。来创建three的对象。当three的对象创建好之后呢,它调用start方法将这个线程启动起来,那现在我们就知道network three的这个对象,它是在哪创建的,以及这个线程。

是如何启动起来的?那关于这个线程,具体内部的启动逻辑呢?我这里就不往下跟了,那后边儿呢?我还会向你做详细介绍,那现在我们只要知道。这一块逻辑就是来启动network three的这个线程的network,three的创建好之后呢,紧接着它会判断。

worker three的那逻辑呢?也是类似的,只不过这次创建three的对象的时候呢,它使用了create方法。而不是create with socket server这个方法,那这两个方法有什么区别呢?关键的一个区别就在于。create with socket server,它是用于处理网络事件的,而create呢,它不处理网络事件,只是一个普通的事件。所以这是它们的一个最大区别。

那除了线程事件不同之外呢,其他地方都是一样的,那它同样通过start来启动这个线程。好,我们继续弹幕执行。
在这里插入图片描述

那第三个呢,它就处理signal three的。通过这句话,我们可以看到啊,对于y8 rtc来说,它默认把应用的主线程当做。信令线程对吧?所以它调了three的current这个方法,那为了更好的了解这段逻辑啊,我们来看一下three的current。这个函数内部它是如何实现的?
在这里插入图片描述

OK,在street current这个API内部呢?他首先获得street manager这个对象。之后呢,调用current three的方法来获取线程对象。那我们再来看看current它做了哪些事情。
在这里插入图片描述

在current three的内部,它只有一行代码,就是调用tls get value这个方法,那这个方法实际我们在上节课向你做过介绍。它作用是从线程本地存储空间中读取,当前线程保存的值这个值呢,实际应该是在之前。通过tls set value来设置的,那如果你现在还记得上节课,

我们介绍的thread manager那张图的话。那你就知道这个函数,它的含义是什么了?好,那现在我们再联想我们之前介绍中的80行和81行的时候,就已经将win三二three的。设置到manager three的对象中了,所以这个时候我们再要用get value这个API,我们就可以将之前。

设置的这个线程呢,给它获取出来,也就是主线程,所以current three的这个API的返回值呢,一定是我们之前创建的这个主线程的。win 3 r three的对象地址对吧?

好,那么我们执行一下,咱们来看一下这个three的,它的地址是多少?就是三五三七f八。至于我们一开始看81行的v3r three的对象的地址是一模一样的,对不对?所以从这一点上,我们就可以看到,通过current这个API对于y八二tc来说,它就拿到了应用程序的主线程。作为它的心灵线程了,那么继续执行好,当这个函数返回之后呢?它赋给了信令线程,(main函数创建的thread作为主线程)
在这里插入图片描述

现在的信令线程就是peer connection clan的,这个应用程序的主线程。好由于此时呢,这个signal three的已经不为空了,那这样呢,就直接跳出去了。那到这个时候呢,我们就将web rtc的三大线程全部创建出来了。好,那再往后,它就会做一次线程的切换,也就是说,从当前线程切换到新的线程,那一块逻辑的切换呢?其实还是蛮复杂的,
在这里插入图片描述

那我会在后边给你做更详细的介绍。对于我们今天的课来说呢,主要就是介绍三大线程的创建。他们是什么时候创建的?创建的位置是在哪?那现在呢?我们都非常清楚了,那以上呢?就是我们这节课。所要向你介绍的内容,在这节课中呢,我向你介绍了y八二tc有三个非常重要的线程,分别是信号线程,工作线程以及网络线程。那另外呢,

在课程中我还通过阅读代码的方式向你介绍了这三大线程是什么时候创建的,对吧?尤其是信号线程。对于我们的一般应用程序来说呢,如果你不做特殊的处理,它就会使用主线程,当做信号线程。但是对这三个线程来说呢,实际我们在写应用程序的时候,可以自己先把它创建好,然后传给外部rtc,让外部rtc用我们创建好的线程来做底层的处理。如果你觉得这种方式比较繁琐的话,你可以直接让y八二tc在底层做线程的创建。是吧,

这都是完全可以的好,那以上呢,就是我们这节课所介绍的内容好,谢谢。

相关文章:

5.6.webrtc三大线程

那今天呢?我们来介绍一下web rtc的三大线程,那为什么要介绍这三大线程呢?最关键的原因在于web rtc的所有其他线程都是由这三大线程所创建的。那当我们将这三个线程理解清楚之后呢?我们就知道其他线程与它们之间是怎样关系&#xf…...

@Slf4j报错:Not generating field log: A field with same name already exists

错误出处: 错误原因: 同时使用了Slf4j注解以及LittlecLogger private static final LittlecLogger log LittlecLoggerFactory.getLogger(TimeTrackController.class); 修复方法: 将log改为LOG,便于区分,代码即用到了…...

乖宝宠物上市,能否打破外资承包中国宠物口粮的现实

近日,乖宝宠物上市了,这是中国宠物行业成功挂牌的第三家公司。同时,昨日,宠物行业最大的盛事“亚洲宠物展”时隔3年,于昨日在上海成功回归。 这两件事情的叠加可谓是双喜临门,行业能够走到今天实属不易&…...

Ubuntu安装Apache+Php

环境:ubuntu 22.04 虚拟机 首先更新一下 sudo apt-get update sudo apt-get upgrade安装Apache2: sudo apt-get install apache2 输入y,继续。等着他恐龙抗浪抗浪的下载安装就好了 打开浏览器访问http://localhost/ 安装php: …...

open cv学习 (四)图像的几何变换

图像的几何变换 demo1 # dsize实现缩放 import cv2 img cv2.imread("./cat.jpg") dst1 cv2.resize(img, (100, 100)) dst2 cv2.resize(img, (400, 400)) # cv2.imshow("img", img) # cv2.imshow("dst1", dst1) # cv2.imshow("dst2&quo…...

matlab 检测点云中指定尺寸的矩形平面

目录 一、概述1、算法概述2、主要函数二、代码示例三、结果展示四、参数解析输入参数名称-值对应参数输出参数五、参考链接一、概述 1、算法概述 detectRectangularPlanePoints:检测点云中指定尺寸的矩形平面 <...

HCIP——STP配置案例

STP配置案例 一、简介二、实现说明1、华为实现说明2、其他厂商实现 三、STP原理1、协商原则2、角色和状态3、报文格式4、BPDU报文处理流程4.1 BPDU报文的分类4.2 BPDU报文的处理流程4.3 BPDU报文格式 四、使用注意事项五、配置举例1、组网需求2、配置思路3、操作步骤4、配置文件…...

JCTools Mpsc源码详解(二) MpscArrayQueue

MpscArrayQueue是一个固定大小的环形数组队列,继承自ConcurrentCircularArrayQueue MpscArrayQueue的特点: 环形队列底层数据结构为数组有界 看一下MpscArrayQueue的属性(填充类除外)--- //生产者索引 private volatile long producerIndex; //生产者边界 private volatile…...

前端面试的性能优化部分(13)每天10个小知识点

目录 系列文章目录前端面试的性能优化部分&#xff08;1&#xff09;每天10个小知识点前端面试的性能优化部分&#xff08;2&#xff09;每天10个小知识点前端面试的性能优化部分&#xff08;3&#xff09;每天10个小知识点前端面试的性能优化部分&#xff08;4&#xff09;每天…...

C++ STL无序关联式容器(详解)

STL无序关联式容器 继 map、multimap、set、multiset 关联式容器之后&#xff0c;从本节开始&#xff0c;再讲解一类“特殊”的关联式容器&#xff0c;它们常被称为“无序容器”、“哈希容器”或者“无序关联容器”。 注意&#xff0c;无序容器是 C 11 标准才正式引入到 STL 标…...

Python爬虫解析工具之xpath使用详解

文章目录 一、数据解析方式二、xpath介绍三、环境安装1. 插件安装2. 依赖库安装 四、xpath语法五、xpath语法在Python代码中的使用 一、数据解析方式 爬虫抓取到整个页面数据之后&#xff0c;我们需要从中提取出有价值的数据&#xff0c;无用的过滤掉。这个过程称为数据解析&a…...

Linux防火墙报错:Failed to start firewalld.service Unit is masked

Linux防火墙报错&#xff1a;Failed to start firewalld.service: Unit is masked. 1、故障现象&#xff1a; 启动防火墙失败&#xff0c;报错情况如下&#xff1a; systemctl start firewalld # 报错&#xff1a; Failed to start firewalld.service: Unit is masked.原因是…...

前端面试:【Vuex】Vue.js的状态管理利器

嗨&#xff0c;亲爱的Vuex探险家&#xff01;在Vue.js开发的旅程中&#xff0c;有一个强大的状态管理库&#xff0c;那就是Vuex。Vuex是Vue.js的官方状态管理工具&#xff0c;通过State、Mutation、Action和Module等核心概念&#xff0c;协助你轻松管理应用的状态。 1. 什么是V…...

Kotlin协程runBlocking并发launch,Semaphore同步1个launch任务运行

Kotlin协程runBlocking并发launch&#xff0c;Semaphore同步1个launch任务运行 <dependency><groupId>org.jetbrains.kotlinx</groupId><artifactId>kotlinx-coroutines-core</artifactId><version>1.7.3</version><type>pom&…...

c++ Union之妙用

union的作用基本是它里面的变量都用了同一块内存&#xff0c;跟起了别名一样&#xff0c;类型不一样的别名。 基本用法&#xff1a; struct Union{union {float a;int b;};};Union u;u.a 2.0f;std::cout << u.a << "," << u.b << std::endl…...

JSON的处理

1、JSON JSON(JavaScript Object Notation)&#xff1a;是一种轻量级的数据交换格式。 它是基于 ECMAScript 规范的一个子集&#xff0c;采用完全独立于编程语言的文本格式来存储和表示数据。 简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。易于人阅读和编写&#…...

matlab使用教程(20)—插值基础

1.网格和散点样本数据 插值是在位于一组样本数据点域中的查询位置进行函数值估算的方法。函数值是根据最接近查询点的样本数据点计算的。MATLAB 根据样本数据的结构&#xff0c;可以执行两种插值。样本数据可以形成网格&#xff0c;也可以是分散的。 网格化的样本数据使得插值…...

Python功能制作之简单的3D特效

需要导入的库&#xff1a; pygame: 这是一个游戏开发库&#xff0c;用于创建多媒体应用程序&#xff0c;提供了处理图形、声音和输入的功能。 from pygame.locals import *: 导入pygame库中的常量和函数&#xff0c;用于处理事件和输入。 OpenGL.GL: 这是OpenGL的Python绑定…...

leetcode-5-最长回文串

题目描述 给你一个字符串 s&#xff0c;找到 s 中最长的回文子串。 如果字符串的反序与原始字符串相同&#xff0c;则该字符串称为回文字符串。 示例 1&#xff1a; 输入&#xff1a;s “babad” 输出&#xff1a;“bab” 解释&#xff1a;“aba” 同样是符合题意的答案。 示…...

二、Oracle 数据库安装集

一、CentOS 安装 OCI下载地址 1. 启动 # 1. 登录服务器&#xff0c;切换到oracle用户&#xff0c;或者以oracle用户登录 su - oracle# 2. 打开监听服务 lsnrctl start# 3. 查看Oracle监听器运行状况 lsnrctl status# 4. 以sys用户身份登录 sqlplus /nolog# 5. 切换用户conn 用…...

RestClient

什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端&#xff0c;它允许HTTP与Elasticsearch 集群通信&#xff0c;而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级&#xff…...

Ubuntu系统下交叉编译openssl

一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机&#xff1a;Ubuntu 20.04.6 LTSHost&#xff1a;ARM32位交叉编译器&#xff1a;arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力

引言&#xff1a; 在人工智能快速发展的浪潮中&#xff0c;快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型&#xff08;LLM&#xff09;。该模型代表着该领域的重大突破&#xff0c;通过独特方式融合思考与非思考…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI

前一阵子在百度 AI 开发者大会上&#xff0c;看到基于小智 AI DIY 玩具的演示&#xff0c;感觉有点意思&#xff0c;想着自己也来试试。 如果只是想烧录现成的固件&#xff0c;乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外&#xff0c;还提供了基于网页版的 ESP LA…...

VTK如何让部分单位不可见

最近遇到一个需求&#xff0c;需要让一个vtkDataSet中的部分单元不可见&#xff0c;查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行&#xff0c;是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示&#xff0c;主要是最后一个参数&#xff0c;透明度…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成

厌倦手动写WordPress文章&#xff1f;AI自动生成&#xff0c;效率提升10倍&#xff01; 支持多语言、自动配图、定时发布&#xff0c;让内容创作更轻松&#xff01; AI内容生成 → 不想每天写文章&#xff1f;AI一键生成高质量内容&#xff01;多语言支持 → 跨境电商必备&am…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战

在现代战争中&#xff0c;电磁频谱已成为继陆、海、空、天之后的 “第五维战场”&#xff0c;雷达作为电磁频谱领域的关键装备&#xff0c;其干扰与抗干扰能力的较量&#xff0c;直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器&#xff0c;凭借数字射…...

优选算法第十二讲:队列 + 宽搜 优先级队列

优选算法第十二讲&#xff1a;队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...

20个超级好用的 CSS 动画库

分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码&#xff0c;而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库&#xff0c;可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画&#xff0c;可以包含在你的网页或应用项目中。 3.An…...

【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看

文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...