5.12.webrtc接口调用过程

news2025/1/15 21:09:14

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

到最后我们调用到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.coloradmin.cn/o/1108247.html

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

相关文章

域控操作二:设置域用户使用简单密码

过程太多简单 直接写出路径更改即可 组策略—计算机配置----策略—Windows设置–安全设置----账户策略–密码策略 按自己想法改就行了 注意一点!!!!! 要么自己设置策略,要么从默认策略改!&am…

数学分析:傅里叶级数

卓里奇书好的一点就是,不是直接引出公式,而是告诉你理由。先引出正交的概念,然后在函数空间中,也有正交,只不过是无限维的空间。 这里要注意,明确说明了是有限个。 在函数空间里面,内积是指进行…

CUDA编程入门系列(九)CUDA程序执行与硬件映射

一、GPU流式多处理器 1.kernel的线程组织层次,一个kernel实际上会启动很多线程,这些线程时逻辑上并行的,但是在物理层上不一定是并行的。 2.GPU硬件的一个核心组件时SM,streaming multiprocessor 流式多处理器 3.SM的核心组件包括…

数字电子技术——半导体存储电路

一、半导体存储电路概述 1.存储电路及其分类 存储单元:一位数据 寄存器:一组数据 存储器:大量数据 2.存储单元分类 1)静态存储单元 门电路连接而成 2)动态存储单元 电容电荷积累 3.存储单元的触发方式与逻辑…

SSH连接华为交换机慢

ssh连接交换机慢是因为交换计算密钥算法阶段默认使用安全性更高的秘钥,由于性能问题导致连接比较慢,如一台华为S5735S-L24T4S-QA2的交换机默认使用如下秘钥,安全行由高到低。 ssh server key-exchange dh_group16_sha512 dh_group15_sha512 …

firewalld常用的基础配置

firewalld防火墙是centos7系统默认的防火墙管理工具,取代了之前的iptables防火墙,也是工作在网络层,属于包过滤防火墙。 支持IPv4、IPv6防火墙设置以及以太网桥支持服务或应用程序直接添加防火墙规则接口拥有两种配置模式:临时模…

C#桶排序算法

前言 桶排序是一种线性时间复杂度的排序算法,它将待排序的数据分到有限数量的桶中,每个桶再进行单独排序,最后将所有桶中的数据按顺序依次取出,即可得到排序结果。 实现原理 首先根据待排序数据,确定需要的桶的数量。…

网工记背命令(6)----链路聚合配置

目录 1.配置手工负载分担模式链路聚合 2.配置LACP模式的链路聚合 3.HUAWEI设备与C厂商设备对接 链路聚合(Link Aggregation)是将多条物理链路捆绑在一起成为一条逻辑链路,从而增加链路带 宽的技术。 常用配置命令 1、执行命令 interface …

轻重链剖分+启发式合并专题

Codeforces-741D(Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths) 一棵根为1 的树,每条边上有一个字符(a-v共22种)。 一条简单路径被称为Dokhtar-kosh当且仅当路径上的字符经过重新排序后可以变成一个回文串。 求每个子树中…

第三章 内存管理 九、基本分段存储管理方式

目录 一、概括 二、什么是分段 三、段表 四、地址转换 五、分段和分页的对比 六、总结 一、概括 基本分段存储管理方式是一种操作系统的内存管理方式,采用这种方式,将进程所需的内存分成若干个段,每个段都可以单独进行管理和保护。 具…

分享一下怎么开发一个陪诊小程序

开发一个陪诊小程序需要综合考虑许多方面,包括但不限于市场需求、用户体验、技术实现和运营策略。以下是一篇以开发陪诊小程序为主题的文章。 一、背景介绍 随着社会的发展和人口老龄化的加剧,越来越多的老年人、病患和孕妇需要就医,而由于各…

攻防世界web篇-unserialize3

得出php代码残篇 将代码补全后再在线php运行工具中进行运行 在浏览器输入后得到下面的界面 这里需要将O:4:“xctf”:1:{s:4:“flag”;s:3:“111”;} 改为 O:4:“xctf”:2:{s:4:“flag”;s:3:“111”;}

【Leetcode】212.单词搜索II(Hard)

一、题目 1、题目描述 给定一个 m x n 二维字符网格 board 和一个单词(字符串)列表 words, 返回所有二维网格上的单词 。 单词必须按照字母顺序,通过 相邻的单元格 内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母在一个单词中…

【java】Java项目从开发到部署生产完整流程梳理

文章目录 前言一、开发环境二、项目搭建2.1 Maven创建项目2.1.1 创建maven项目2.1.2 引入依赖2.1.3 maven常用命令 三、SpringBoot基础配置四、项目打包4.1 打包jar4.2 打包war4.2.1 修改项目打包为war包4.2.2 排除内嵌的tomcat,引入外部tomcat4.2.3 添加servlet-ap…

Unity可视化Shader工具ASE介绍——8、UI类型的特效Shader编写

阿赵的Unity可视化Shader工具ASE介绍目录 Unity的UGUI图片特效角色闪卡效果 大家好,我是阿赵。   继续介绍Unity可视化Shader编辑插件ASE的使用。这次讲一下UI类特效Shader的写法。 一、例子说明 这次编写一个Shader,给一张UGUI里面的图片增加一个闪卡…

攻防世界web篇-Training-WWW-Robots

直接点击给出的地址,然后会转到另一个网页界面,在这个界面,已经给出了提示,robots.txt 在浏览器中,直接在地址的后面加上robots.txt,会进到下面这个界面 因为对php语言一窍不通,所以这里纯粹就…

Swagger有哪些非常重要的注释?

Swagger是一种用于描述和定义RESTful API的强大工具,它提供了一种规范来编写API文档,生成客户端SDK以及进行自动化测试。其中的注释(Annotations)在Swagger规范中扮演着关键的角色,用于为API端点、操作、模型等添加元数…

在UniApp中使用uni.makePhoneCall方法调起电话拨打功能

目录 1.在manifest.json文件中添加权限 2. 组件中如何定义 3.如何授权 4.相关知识点总结 1.在manifest.json文件中添加权限 {"permissions": {"makePhoneCall": {"desc": "用于拨打电话"}} }2. 组件中如何定义 <template>…

Spring Security的认证和授权(1)

1、Spring Security 简介 Java企业级开发生态丰富&#xff0c;无论你想做哪方面的功能&#xff0c;都有众多的框架和工具可供选择, 以至于SUN公司在早些年不得不制定了很多规范&#xff0c;这些规范在今天依然影响着我们的开发&#xff0c; 安全领域也是如此&#xff0c;然而&…

TOGAF架构开发方法—初步阶段

本章描述了满足新企业体系结构业务指令所需的准备和启动活动,包括组织特定体系结构框架的定义和原则的定义。 一、目标 初步阶段的目标是: 确定组织所需的体系结构功能: 审查进行企业架构的组织背景确定受体系结构功能影响的企业组织的元素并确定其范围确定与架构功能相交的…