5.12.webrtc接口调用过程

嗨,大家好,我是李超,在上节课中呢,我向你介绍了外接口的设计以及我们红接口展开之后的样子,对吧?那今天呢?我们再来看看整个接口调用过程。那整个这个调用过程啊,非常的复杂,我通过一张图呢,向你做了一下展示,那么通过这张图,我们可以看到。整个从一开始红的展开,
在这里插入图片描述

到最后我们调用到create peer connection这个API这个过程呢?需要11步。那它还是非常复杂的,我们要理解起来呢,也会非常的费劲,但是通过这张图呢,可以大大简化,我们在理解这个过程中的复杂度。那即使这样,其实我们在理解的时候可能还会遇到各种各样的困难,那这些细节呢?可能你还需要去根据这张图再对照的代码去一点点的抠,才能完全理解。那不过呢,有了我们这张图之后,

它就相当于一个地图,对吧?能指引你怎么去看这个代码?那第一步应该从哪儿开始?第二步怎么走?第三步怎么走?那顺着这个过程,你去一点一点捋就会非常容易将这个代码。理解清楚了,那我们都知道,对于代码的阅读其实是一个非常吃功力的一件事儿,那如果我们的。这个能力不够的时候呢,其实你要根据你自己的一些欠缺去补一些知识,所以我们阅读y八七c代码也好,

还是阅读linux代码也好?一定要有一种恒心,然后去想了解它其中的奥秘,就不要嫌麻烦,不要怕吃苦,对吧?那在这个理解的过程中,一定会对你的整个能力的提升有非常大的帮助,当然这些都是一些题外话了。那我们还是言归正传来看一下。对于外部rtc来说,它是如何一步一步从外层的接口儿最终调用到外部rtc和音库中的接口儿的。那我们来看一下这个过程啊。那第一步当然就是这个宏定义了,这个宏定义其实就是外边其实给我们定义好展开之后就变成了。

第二幅图这个样子对吧?那对于第一幅图中的这些红呢,实际我去掉了一些边边角角的东西,只留了最核心的,便于我们理解的一些代码。那我们先来看一下这个红啊,那首先是红的,一开头它是由begin开始的,后边是某某某proxy map,对吧?那在这里呢,是signaling proxy map,也可能呢,没有signaling。那这些呢?

它的区别是什么?代表的含义是什么?我们在上节课都已经向你做过介绍了,那这里我就不再重复了。那后边就是你要对哪个类做一个代理类对吧?那这里呢?就是peer connection factory。给他做一个代理类,那在其中呢?我只保留了一个方法,就是create peer connection这个方法,其他方法都去掉了。我们只看这一个方法,将这一个方法了解清楚之后,其他的方法你都能够理解了。

那对于create peer connection来说,我们展开啊,就变成了这个样子。首先是class peer connection factory。对吧,后边呢是它的一个后缀with proxy internal,在后边是它的继承关系,那这个呢,我们不太关心,就给它滤掉了。好在这里边呢,是包括了一个方法,就r method,它是可以重载的,根据不同的参数。

那它在内部呢,就生成了一个method call的一个对象,那名字呢,就叫call里边有很多参数。其中第一个参数c下划线杠实际就是web rtc核心中的peer connection factory这个对象。那后边呢,是peer connection factory的对应方法,也就是create peer connection,那再往后就是参数。那当我们有了这个对象之后,它会调用这个对象的master方法。这个muscle是什么含义呢?实际就是一个包裹的意思,只是做了一层简单的封装。那在后边包含了一些参数rtc from here。

那对于这个红呢,后边我们还会做介绍。实际它指的就是我们现在执行的这个代码,行后边我们会看看这个宏是怎么展开的?对于这节课来说呢,我们先不讲解,我们只要知道它表示的就是我们现在执行的这行代码就OK了,那我们重点来看看method call。它是如何实现的?就指向了三三就是method code的一个实现class method code啊,它继承自message,还有message handler继承自这两个类。那么,在这个类中啊,它包含了一个marshall的方法。

它有很多参数,那第一个参数呢就是post from,也就是rtc from here,它是一个固定的值,就是我们当前执行的这行代码。好在后边呢,是线程是在哪个线程执行?就是signaling three的信令线程执行。好在这个marshal方法中,它又定义了一个对象,这个对象的类型呢是?synchronize method call就是同步调用,那当生成这个对象之后呢?调用它的invoke方法。那下面呢,

我们再来看看它是如何定义的,就是从四到五了,对吧?那它的定义就如这里展示的,它继承自message data以及message handler。这两个类,那其中的一个重要的方法就是invoke我们来看看invoke中它是怎么做的。那实际invoke中做的事儿呢,就是从五到六,这个就是synchronized method call invoke它做的事儿。它实际在这个函数中啊,非常简单,就是调了一个post。那这post是什么含义呢?就是进行线程的切换。

那关于线程切换这一块的详细内容,我们在下节课中向你做详细介绍,那现在我们只要知道,只要调了post,实际就是从我们当前执行的这个线程。发送了一个消息给我们的目标线程,那当把这个消息发送完了之后,在invoke中做了什么事呢?就是wait。那这个wait是干什么呢?就是等待目标线程执行完成之后,再从这个wait唤醒,继续下边的逻辑。所以pose的目的就是向目标线程发送一个消息,那这样呢,

就从当前执行的线程告诉目标线程,你去执行吧,我在这等你,等你执行完了之后呢?再把我叫醒,我再继续干活儿,就是这个意思,非常简单,那进入到目标线程之后,由于我们在发送的时候。是给他构造了一个消息,而这个消息呢,是有一些特殊要求的。它是继承自message handler的。那么,

在message handler中呢?会有on message方法。也就是说,当进入到目标线程之后,它执行哪句呢?就执行这一句,在接收到的message里边,有一个handler,那么handler里有on message。这个方法。然后就切换到on message这个逻辑中去执行,而on message是在哪儿呢?实际还是在synchronized method code这个对象中定义的,也就是在这里。on message那在on message中,

它会调用什么呢?调用proxy所指向的message,那这个proxy下划线又是谁呢?实际就是我们在调用method call的时候传入的this,那这时候这个this呢?实际就是method call,所以就会执行到method call中的。on message方法,所以从七就跳到了八就执行它的on message,那在on message中呢,又会调用自己内部的invoke。在自己内部的中呢,又会调r下划线的in,而r下划线指的就是return type。那也就是说,

调用到了return type中的in moke,那在return type中的in moke中呢?调用了。c里边的method。那c是谁呢?c实际就是peer connection factory,那method呢?就是我们在宏中定义的create。那它最终就切换到了web rtc核心库中的peer connection factory。里边儿的create peer connection这个方法中,最后就执行到了中的这个方法。那从而呢,就从外层的接口层调入了y8 tc的内核层,从外层的。代理类调用到了核心类中的,

具体的print peer connection方法,对吧?这就是它的一个完整的过程。所以如果没有这张图,你去看代码的时候理解起来也是非常困难的,但有了这张图,那很多的这个细节啊,步骤啊。都一步一步的向你展示清楚了,第一步就是宏展开,宏展开是在预编译时进行宏展开的,当我们。真正执行起来的时候呢,它调用的就是peer connection victory with proxy internal这个对象中的方法。所以执行的就是第二步,

那么在第二步中呢,它创建了一个method call对象,那么又执行到第三步,第三步中呢,又有m方法。执行般数方法从第四步到第五步,那就这样一步一步执行,从第一步一直到第11步,最终。从应用层调入了y8 tc的内核层。而且中间进行了一次切换。那我们还要知道,当整个过程都执行完成之后呢?实际目标线程还会发送一个唤醒消息。让应用层从这个等待处唤醒。

那么,唤醒之后,应用层又开始继续执行它的逻辑了,这是一个完整的过程。那通过这个讲解呢?应该你对整个过程啊,都非常清楚了。那下面呢,我们就来看一下代码,看看代码是如何实现的,那代码的位置是在哪?它是怎么做的?那我们现在切换到Windows系统下。好,那现在呢?

我们已经切换到Windows系统下,那上面我们所介绍的接口从应用层调到外边tc核心层。整个逻辑的实现,实际都是在src下边的API目录下,在API目录下呢,我们找。lib间隔share connection API找这个项目,那在这个项目中呢?我们可以发现两个文件。叫做proxy点h和proxy点CC那首先我们点开proxy点h,那么在proxy点h中呢?我们刚才介绍的所有的这个逻辑都是在这里出现的。首先我们看一下宏的定义。那宏定义是在哪呢?那我们可以搜索一下ctrl ctrl f。
在这里插入图片描述

begin.好。那我们搜begin之后呢,就会看到。有两个重要的宏,一个是begin signaling proxy map,一个是begin proxy map。那么,在这两个红经意中啊,在里边又加入了其他的紫红,对吧?在这些紫红的后边呢,是它的一个静态方法print,也就是创建代理类的一个方法。那我们来看看这些紫红都是干什么的,

就是我们在进行红展开的时候,并不像我们想象的它就是一个红下边儿,所有代码都写在这里了,对吧?不是的,它又进行了其他的封装,那我们看每一个封装都实现了一个具体的功能。proxy map polar print,那这个红是定义代理类的名字,我们可以看到它是通过两个双井号。来连接。前边和后边的。那c呢,是传入的参数,后边连接的呢,
在这里插入图片描述

就是它后缀。那再后边呢,是它继承自哪?好,除此之外呢?它还给这个类呢,定义了一个别名,就在我们之前的课程中呢,已经向你做过介绍了,对吧?那其他的一些呢,都不太重要了,所以对这个红来说呢,它主要干两件事,第一件事呢就是定义代理类的类名。

第二呢,是给代理类的类名儿起一个别名儿。就这两件事。好,这是第一个紫红,那我们再看第二个。那第二个紫红呢,就是它的构造函数了,对吧?某某某类的proxy with internal这个代理类。而且呢,它的构造函数是受保护的,也就是说外部是不能直接访问的。对吧,那除此之外呢?
在这里插入图片描述

它还包括了线程成员signaling thread和worker thread,那所有的接口呢,都是在这两个线程中。执行的,所以我们一定要知道y8其实有很多线程,但其中能够用于处理接口的只有这两个线程。好,这是第二个,那第三个宏呢?用于析构函数的定义,并且呢,定义了真正使用类的类型。比如说我们设置的代理类是peer connection factory proxy with internal,那么这里的这个c盖呢?指的就是。
在这里插入图片描述

peer connection factory OK,这就是笔跟红,它的一个作用,那下面呢,我们再来看看and。对于and proxy map来说。

在这里插入图片描述

它只定义了一个右画括号分号,代表一个类的结束,这非常好理解好我们再看一下method那对于proxy method来说呢?它是根据你后边儿的这个number来确定参数的数量的,如果零就说明这个method没有参数,如果是一。代表method有参数。那么,对于这个proxy method红来说,
在这里插入图片描述

它实际就是定义一个个method。它是一个可重载的函数。那么是根据输入参数来进行重载的,在它内部定义的就是master call对象。那当定义好method靠对象之后呢,就可以调用call的m方方法,那要切换的线程呢,就是signaling three的。在这里呢,都做了明确的指示。那我们根据刚才我们介绍那张图,然后再进入到m如何定义的里是执行的什么逻辑这样一步一步往下推演,你就能知道具体它是怎么从应用层调入到外边核心层的?那以上呢,就是我们这节课所要介绍的内容,

那实际上在这节课中,我向你介绍的最为最为关键的就是我们前面介绍那张图。告诉你y8 rtc的接口是如何定义以及是如何从宏展开到最终调用到y8 rtc核心库的这样一个完整的过程,一共需要11步。这个过程还是非常复杂的,有的同学可能会有疑问啊,经过这样一个复杂的过程,是不是y8 tc的学习效率会非常低呢?因为从开始到结束,函数反复的进出都是会消耗资源的。实际答案是并不会影响效率。其中的原因呢,是经过编译器优化之后,真正从接口层到核心层,只需要很短的一个路径,

就能够达到。我们在调试的时候在看代码的时候,它是一层一层多次抽检,进入到核心层的,但经过编译之后呢?只需要两三个调用,就进入到y八二七四的核心库了,所以这个担心呢,并没有必要。那以上呢,就是我们这一课所介绍内容有任何的问题呢,你可以通过讨论区或者是q群去给我留言,我在那里呢,给你做相应解答好,谢谢。

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

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

相关文章

QCustomPlot实现曲线拖拽

本文内容目录 需求场景:一、选择控件二、将QCustomPlot库整合到你的Qt项目中1、下载源代码2、创建.pri 三、鼠标框选,实现坐标缩放四、曲线拖动1、定位曲线2、移动时改变曲线 五、问题的产生与解决1、查看源码2、修改本项目代码 需求场景: 曲…

【算法题】2906. 构造乘积矩阵

题目: 给你一个下标从 0 开始、大小为 n * m 的二维整数矩阵 grid ,定义一个下标从 0 开始、大小为 n * m 的的二维矩阵 p。如果满足以下条件,则称 p 为 grid 的 乘积矩阵 : 对于每个元素 p[i][j] ,它的值等于除了 g…

excel 日期与时间戳的相互转换

1、日期转时间戳:B1INT((A1-70*365-19)*86400-8*3600)*1000 2、时间戳转日期:A1TEXT((B1/10008*3600)/8640070*36519,"yyyy-mm-dd hh:mm:ss") 以上为精确到毫秒,只精确到秒不需要乘或除1000。 使用以上方法可以进行excel中日期…

行业追踪,2023-10-18

自动复盘 2023-10-18 凡所有相,皆是虚妄。若见诸相非相,即见如来。 k 线图是最好的老师,每天持续发布板块的rps排名,追踪板块,板块来开仓,板块去清仓,丢弃自以为是的想法,板块去留让…

Redis LFU缓存淘汰算法

前言 Redis 在 4.0 版本之前的缓存淘汰算法,只支持 random 和 lru。random 太简单粗暴了,可能把热点数据给淘汰掉,一般不会使用。lru 比 random 好一点,会优先淘汰最久没被访问的数据,但是它也有一个缺点,…

英语——分享篇——每日200词——1001-1200

1001——responsibility——[rɪˌspɒnsəbɪlətɪ]——n.责任——responsibility——res热死(拼音)ponsi胖子(谐音)bili比利(拼音)ty题(谐音)——热死的胖子比利做题时很有责任心——The responsibility for her family bears down on a young woman.——家庭的责任沉重地落…

攻防世界web篇-PHP2

直接点击进入到http网页中,会得到这样一个界面 这里,我最开始使用了burp什么包也没有抓到,然后接着又用nikto进行探测,得到的只有两个目录,当时两个目录打开后,一个是fond界面,一个是这个网页的…

【QT】常用控件——按钮组

继承Widget PushButton 设置图片,先导入图片资源,见:【QT】资源文件导入_复制其他项目中的文件到qt项目中_StudyWinter的博客-CSDN博客 在布局中添加图片 调整尺寸 toolButton 显示图片、文本 显示图片(图片和文字都有时&#…

容器安全 - 利用容器的特权配置实现对Kubernetes容器的攻击

《OpenShift / RHEL / DevSecOps 汇总目录》 文章目录 准备环境利用特权配置对Kubernetes容器攻击privileged hostpathprivileged hostpidprivilegedhostpathhostpidhostipchostnetwork 参考 通过将运行 Pod 的 privileged 设为 true,容器就以特权模式运行在宿主…

使用Python+selenium实现第一个自动化测试脚本

这篇文章主要介绍了使用Pythonselenium实现第一个自动化测试脚本,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 最近在学web自动化,记录一下学习过程。…

leeetcode_2530 执行k次操作后的最大分数

1. 题意 给定一个整数数组&#xff0c;每次可以取出一个数累加并丢弃&#xff0c;并将该数的1/3 向上取整放回。 执行k次操作后的最大分数 2. 题解 每次取插入后的最大值&#xff0c;所以需要大根堆。 STL里面用priority_queue<int> pq默认大根堆。 小根堆priority_…

快速解决 Resource not accessible by integration

简介 最近好久没有写博客了&#xff0c;今天在写开源项目 python-package-template 的时候&#xff0c;正好遇到一个问题&#xff0c;记录一下吧。本文将介绍 Resource not accessible by integration 的几种解决方案。 也欢迎大家体验一下 python-package-template 这个项目&…

黑白棋(Othello, ACM/ICPC World Finals 1992, UVa220)rust解法

你的任务是模拟黑白棋游戏的进程。黑白棋的规则为&#xff1a;黑白双方轮流放棋子&#xff0c;每次必须让新放的棋子“夹住”至少一枚对方棋子&#xff0c;然后把所有被新放棋子“夹住”的对方棋子替换成己方棋子。一段连续&#xff08;横、竖或者斜向&#xff09;的同色棋子被…

SpringCloud: sentinel热点参数限制

一、定义controller package cn.edu.tju.controller;import com.alibaba.csp.sentinel.annotation.SentinelResource; import com.alibaba.csp.sentinel.slots.block.BlockException; import org.springframework.web.bind.annotation.PathVariable; import org.springframewo…

Unity笔记--渲染顺序

目录 Unity中的渲染顺序一、Camera层二、透明类型&#xff08;先渲染不透明&#xff09;三、物体的SortingLayer&#xff08;越小越先渲染&#xff09;四、sorting order&#xff08;越小越先渲染&#xff09;五、RenderQueue &#xff08;越小越优先&#xff09;六、距离相机z…

【算法设计zxd】第6章 回溯法

目录 6.1 回溯法的设计技术 &#xff1a; 四皇后问题 回溯法&#xff1a; 算法框架&#xff1a; 思考题&#xff1a; 回溯算法的适用条件 【例6-1】求满足下列不等式的所有整数解&#xff1a; 6.2回溯算法的经典例题 【例6-2】装载问题  问题分析 计算模型  算法设计与描…

BookStack 详解及 Docker-Compose 部署

BookStack 是一款用于创建文档和文档管理的开源平台。它提供了一个直观且功能丰富的界面&#xff0c;可用于组织和管理各种文档&#xff0c;包括文档编写、编辑和共享。本文将介绍 BookStack 的核心功能&#xff0c;并展示如何使用 Docker-Compose 快速部署 BookStack。 BookS…

Pika v3.5.1发布!

Pika 社区很高兴宣布&#xff0c;我们今天发布已经过我们生产环境验证 v3.5.1 版本&#xff0c;https://github.com/OpenAtomFoundation/pika/releases/tag/v3.5.1 。 该版本不仅做了很多优化工作&#xff0c;还引入了多项新功能。这些新功能包括 动态关闭 WAL、ReplicationID…

BI零售数据分析,当代零售企业的核心竞争力

在数字化转型中&#xff0c;BI智能零售数据分析成为了极其重要的核心竞争力之一。通过对大数据的采集和分析&#xff0c;零售企业可以更好地了解消费者的需求和行为模式&#xff0c;从而做出更准确的决策。例如&#xff0c;通过分析消费者的购物历史、浏览记录等数据&#xff0…

小程序无感刷新

下载wechat-http依赖 npm install wechat-http封装请求拦截器和相应拦截器&#xff0c;借助refreshToken实现无感刷新 // 导入 http 模块 import http from wechat-http // 基础路径&#xff0c;同时需添加合法请求域名 http.baseURL https://live-api.itheima.net // 配置请…