5.12.webrtc接口调用过程

2023-10-19 06:04
文章标签 接口 过程 调用 webrtc 5.12

本文主要是介绍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群去给我留言,我在那里呢,给你做相应解答好,谢谢。

这篇关于5.12.webrtc接口调用过程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/237807

相关文章

C/C++的编译和链接过程

目录 从源文件生成可执行文件(书中第2章) 1.Preprocessing预处理——预处理器cpp 2.Compilation编译——编译器cll ps:vs中优化选项设置 3.Assembly汇编——汇编器as ps:vs中汇编输出文件设置 4.Linking链接——链接器ld 符号 模块,库 链接过程——链接器 链接过程 1.简单链接的例子 2.链接过程 3.地址和

vue3项目将所有访问后端springboot的接口统一管理带跨域

vue3项目将所有访问后端springboot的接口统一管理带跨域 一、前言1.安装Axios2.创建Axios实例3.创建API服务文件4.在组件中使用API服务 二、跨域三、总结 一、前言 在Vue 3项目中,统一管理所有访问后端Spring Boot接口的最佳实践是创建一个专门的API服务层。这可以让你的代码更加模块化、可维护和集中管理。你可以使用Axios库作为HTT

ScrollView 非手动调用的方法

1. /**  *  非人为的时候调用这个方法  *  *  @param scrollView <#scrollView description#>  */ - (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView {           } 2.判断控制器的view是否加载过 [willShowVC

mysql中存储过过程和游标的联合使用

1.SQL如下: DELIMITER //DROP PROCEDURE IF EXISTS PrintAllEmployeeNames5;CREATE PROCEDURE PrintAllEmployeeNames5()BEGINDECLARE error_count INT DEFAULT 0;DECLARE num INT ;DECLARE done INT DEFAULT

linux常用API接口

linux常用API接口 文章目录 linux常用API接口1.应用层内存映射mmap取消内存映射munmap终端打印可用方式1.puts 函数2.文件操作函数 fprintf3.字符输出函数 putchar4.fwrite 函数 2.内核层 1.应用层 内存映射mmap mmap 是一个用于内存映射的系统调用,它可以将一个文件或设备中的内容映射到进程的地址空间中,允许程

上位机图像处理和嵌入式模块部署(mcu和swd接口)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】         最近学习mcu的时候,接触了不少调试器,这里面有daplink、st-link v2、j-link v9。虽然模块的形状可能不太一样,但是硬件的连线都差不多,都是mcu上的3.3v、clk、dio和gnd四根连线。出于好奇,今天花了点时间了解了一下debug port、sw

【架构设计】模块化-面向接口编程

模块化的优势 结构清晰:业务独立,代码实现分离便于协作:耦合度低,不会影响团队其他成员的开发进度便于维护:各模块管理自身代码、布局、资源,不影响主工程 模块化的特点 高内聚,低耦合 常见的模块化方法 所有模块都放在一个工程里实现每个模块都放在一个独立工程中实现 模块的划分 从高到低 业务层平台能力层基础层 模块间的通信 直接依赖事件或广播通信路由通信面向接口通信 具体实现

使用ig507金融数据库的股票API接口经验有感:Java与Python

一、Java技术: 1. Java调用ig507金融数据库(ig507.com)股票API接口 引言: 随着金融科技的不断发展,数据驱动的投资策略变得越来越重要。本文将介绍如何使用Java语言调用ig507金融数据库的股票API接口,以获取实时股票数据,并展示基本的编程步骤和注意事项。 步骤一:引入依赖库 在Java项目中,首先需要引入用于处理HTTP请求和网络通信的库,如Apache

Class 对象在执行引擎中的初始化过程

一个 class 文件被加载到内存中需要经过 3 大步:装载、链接、初始化。 装载 装载是指 Java 虚拟机查找 .class 文件并生成字节流,然后根据字节流创建 java.lang.Class 对象的过程。 链接 链接过程分为 3 步:验证、准备、解析。 验证: 初始化 这是 class 加载的最后一步,这一阶段是执行类构造器方法的过程,并真正初始化类变量。 1.文件格式检验:检

绿联nas折腾过程中遇到的问题

绿联nas折腾过程中遇到的问题 目录 ssh权限问题超级用户 ssh 权限问题 使用chmod -R 777 目录/ 给指定目录及其所有子目录和文件设置最大的权限,权限设置为 rwxrwxrwx(读、写、执行权限给所有用户)。这个命令会将目录和文件的权限设置为非常宽松,允许所有用户对它们进行任何操作。 700只有所有者有读和写以及执行的权限 查看访问权限:ls -l 当前文件夹下所有用