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、修改本项目代码 需求场景: 曲…

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 显示图片、文本 显示图片(图片和文字都有时&#…

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

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

快速解决 Resource not accessible by integration

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

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

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

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层二、透明类型(先渲染不透明)三、物体的SortingLayer(越小越先渲染)四、sorting order(越小越先渲染)五、RenderQueue (越小越优先)六、距离相机z…

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

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

BookStack 详解及 Docker-Compose 部署

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

Pika v3.5.1发布!

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

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

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

CLIP模型原理

CLIP模型 CLIP(Contrastive Language-Image Pre-Training) 模型是 OpenAI 在 2021 年初发布的用于匹配图像和文本的预训练神经网络模型,是近年来在多模态研究领域的经典之作。OpenAI 收集了 4 亿对图像文本对(一张图像和它对应的文本描述)&a…

Messari发布Moonbeam简报,每日交易量稳步增长,首次公布利润数据

区块链数据公司Messari首次发布Moonbeam项目分析简报,从项目市值、链上数据表现、质押以及Moonbeam的技术优势XCM使用量等角度全面分析。这个再熊市初期上线的项目一直在默默开发,并在跨链互操作领域拥有了相当的实操成绩。我们翻译了Messari简报中的部分…

【Vue项目】通过设置全局的异常处理来统一处理后端返回的异常

文章目录 简介方法一创建统一异常处理模块使用axios拦截器处理异常在页面中使用异常处理 方法二创建全局异常处理函数在main.js中配置全局异常处理在网络请求中捕获异常 方法三创建全局异常处理插件在main.js中注册全局异常处理插件在网络请求中捕获异常 总结 简介 在Vue项目中…

aps.net core 6.0 web API SwaggerUI IIS部署【23.10.15】亲测,通过

目录 一、aps.net core 6.0 web API 项目配置 创建项目设置 Swagger UI 为起始页发布项目二、在 IIS 部署 安装IIS安装 Hosting Bundle三、内网穿透 使用的是 VS2022社区版,WebAPI的版本是 .netcore6.0 一、aps.net core 6.0 web API 项目配置 1.创建项目 运行项目…