5.10.WebRTC接口宏

那今天呢?我给大家介绍一下web rtc的接口宏,那之所以在现成的章节中要介绍接口宏。是由于接口在调用的过程中啊,会发生线程的切换,所以把接口宏这部分知识我们放在线程这一章还算比较合适的。
在这里插入图片描述

那另外呢,我们对于接口宏的介绍可能要花费三节到四节的时间,那之所以要用这么大的篇幅来介绍接口宏,是由于接口宏本身是比较复杂的。里边儿涉及到了红的定义,红的展开,如何阅读红代码?

那这些知识呢?对于大多数同学来说呢,可能平常用的不多,所以对这块儿代码都不太熟悉。那这里呢,我就多花一点时间给大家介绍清楚,那以使大家在阅读代码的时候呢,更加便利一些,那对于web rtc来说,哪些是接口宏呢?

实际上,我们在peer connection端用到的大多数的接口都是用宏定义来实现的。那比如说我们调用的create peer connection,create audio track等等,这一系列的与stream track相关的API。

都是外rtc通过宏来实现的,那当我们调用它的时候呢?它首先通过这层宏实现的这个代理类。来去调到代理类中的函数,那再通过一系列的操作,最终呢,才到web rtc真正的核心层去执行相关的逻辑。

之所以要设计的这么复杂,它是有一定原因的,那这个原因呢?我在后边的课程中呢,再向你做详细介绍。那今天呢?我们主要来看一下web rtc是如何定义代理类以及如何定义它要暴露的接口了,如果是我们自己修改web rtc,

我们自己该如何定义这些接口?那首先呢,我们来看一下,对于y8 tc来说,它要定义一个外部接口类,它是如何定义的?首先呢,它提供了几个宏?第一个红呢是begin signaling proxy map,这是我们定义外部接口代理类的一个头。
在这里插入图片描述

那只要我们看到这样一个头,什么什么什么proxy map就证明是web rtc定义的一个代理类。那宏后边这括号里呢,是我们定义的要对哪个类实现一个代理,那这里写的就是peer connection factory,

也就是对这个类在它的外层呢,再做一层代理类。那第二个也就是它的析构函数,如果我们要对我们定义的这个代理类的析构函数进行隐藏的话,我们需要加入这个宏。也就是proxy signaling第三个呢?是在类中,我们要实现一些方法,那在这里呢?proxy method后边这个数字。数字是几?就说明这个方法,它有几个输入参数,那比如说像peer connection factory,它定义的这个create peer connection。

这个方法它一共有四个数,参数后边就紧跟着四个参数,第一个,第二个,第三个,第四个。那它的返回值呢?实际是这个,这是在代理类中定义一个方法,那当这个类结束之后呢?我们要调用and proxy map来结束这个代理类的定义。那通过这样一个定义啊,它就实现了一个代理类,那代理类中包含的方法呢,可以有多可以有少,

那在这里呢,只有一个。当然,实际的代理类中有好几个我这里只列出了一个,这里你有几个method,它就有几个方法。那通过这几条语句,我们就可以实现一个peer connection factory类的,代理类的实现,那我们再看一个啊。那在这里呢,还是通过某某某proxy map实现了一个的这个代理类。但这里的这个某某某proxy map与我们前面的这个就有一些差别了,那中间我们可以看到在前面第一个介绍的例子中呢,里边有一个signaling。
在这里插入图片描述

那第二个中呢?是没有的,那说明一个什么问题呢?就是说明我们第一个类,它只能使用signaling线程。而没有signaling关键字的这个cm AP呢,它是可以支持signaling和working两个线程的。所以这是它们的一个区别,那除此之外呢,对于我们的方法来说,那也可以包含多种方法,第一个方法,后边这个数字代表get。这个函数呢,它只有一个参数,

就是这个参数,而第二个方法呢proxy worker method two说明什么呢?说明我们这个方法是在工作线程中执行的,那如果这里signaling是就说明它是在signaling线程中信令线程中执行的。如果是worker呢,就说明它是在worker线程中执行的,那对于这个函数,它的函数名是什么呢?就是i do。它有两个输入参数,一个是另外一个呢?是那它的返回值呢?是一个void。那最后呢,再通过and proxy map来给它结束掉,

那通过这两个例子啊,我相信你已经知道web rtc是如何通过宏来定义代理类的了。当然,对于代理类的宏实现后的样子,后边我还会向你做详细介绍,那现在我们只要知道web rtc,它是通过这几个宏来定义一个类的代理类的。
在这里插入图片描述

那了解了这些知识之后呢?下面我们就可以自己定义一个代理类了,但是我们在定义代理类的时候,也就是说定义我们自己的外部接口的时候。它是有一定规范的,你必须按照这个步骤来去做,才能最终实现你的接口暴露给外层应用。也就是说,
在这里插入图片描述

外层应用才能通过你的接口调入到中,那第一步呢,就是实现接口文件,也就是说我们要为一个类。通过宏定义,它的代理类,我们必须让它继承自这个一个接口文件,那接口文件的名字一般怎么写呢?就是某某某interface,所以我们在定义接口的时候呢,我们第一步要实现一个接口类,它的名字就是你的原来的这个类的,这个名字加上一个interface。在这里边儿呢,我们可以定义几个突出的方法,

这是我们要暴露给外边儿的,那外边儿呢,只要通过调用这几个接口儿就可以调入到我们外边儿tc那份儿中来,实现它自己的逻辑。我这里是test类,对吧?就是test interface好第二步呢,是外部rtc,内部要实现这个接口类,那比如我这里介绍这个task这个类。它是继承自哪儿呢?继承自task interface,也就是说在我这个类中要实现这两个接口,那最终呢,当外层调入进来之后。

它才会真正到外边儿tc内部去执行你实现的这两个函数,这是第二步,那第三步呢,就是我们要通过宏来给它定义一个接口类了。
在这里插入图片描述

就begin proxy map,如果你是在新定线程中执行的,你应该加一个signaling proxy map。如果不加的呢,就是既可以在新的线程中执行,也有可能在work线程中执行,这括号里的名字呢,就是我们的类名test。我们给它定义一个七个函数signaling three的,也就是说在信令线程中执行的七个函数。那对于这个类来说呢,

它有两个方法,一个是func 1,一个是func 2,那对于第一个来说呢?它是可以在任何线程中执行的,所以呢,没有加线程的名字,并且呢,它没有输入参数。所以就是类型的返回值funce,而第二个方法呢,它是明确要求在worker线程中执行的。那也没有输入参数,所以呢,是string func two,

最后呢,通过and proxy map,那将这个代理类结束掉。那在预编译的时候,编译器就会将这个宏转换成,这个具体的代理类,那这样呢,我们就实现了一个自己定义的接口。统共分三步,第一步呢,我们要实现一个接口类,第二个我们要在web rtc内部实现这个接口类。第三步呢,我们要通过宏定义一个代理类,那这样呢,

外层就可以使用这个代理类,最终调入到我们外部rtc内部实现的这个类了。那如何使用呢?那使用的时候也非常简单,就是通过你的类名加上proxy,然后调用它的静态方法。
在这里插入图片描述

由于我们在定义代理类时候没有加,所以呢,你需要传入和working th。最后,将我们之前定义的接口的对象指针放入进去,那这样呢,外层就可以通过这个方法来创建一个test proxy with internal。这样一个对象指针了它的返回值,就是test proxy with internal。

那有了这个指针之后,你后边儿就可以调用里边儿的方法了。那这些呢,回头在我们后边的课程中介绍外边tc代码的时候,我们再看一下外边tc是如何这个使用接口类的,那通过上面介绍呢,你应该对外边tc的接口宏有了一定了解。那至少我们应该通过这节课啊,掌握一点信息,就是说我们可以自己在外边rtc里边去定义自己的接口。如果我们需要的话,我们就可以随时增加自己的接口,那这些接口的定义实际是有一定规则的。不是说你随便定义一个接口,外边都可以调,

那你必须按照它的规则来实现,要实现这些接口呢,至少有三大步。第一大步,你要自己定义一个接口类,第二大步,你要在外部rtc源码的内部去实现你定义的这个接口类。第三步呢,我们要通过接口宏来实现一个代理类,最后一步是我们使用这个代理类来去调用我们真正的接口。那整个这过程啊,还是非常复杂的,那这其中的原因,我们在下节课中呢,给你做详细介绍,

那我们这节课呢,就到这里,谢谢。

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

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

相关文章

分库分表---理论

目录 一、垂直切分 1、垂直分库 2、垂直分表 3、垂直切分优缺点 二、水平切分 1、水平分库 2、水平分表 3、水平切分优缺点 三、数据分片规则 1、Hash取模分表 2、数值Range分表 3、一致性Hash算法 四、分库分表带来的问题 1、分布式事务问题 2、跨节点关联查询…

IT运维:利用数据分析平台采集Windows event log数据

概述 本文将介绍如何借助Winlogbeat和Vector在鸿鹄里采集Windows event log数据,使技术人员能够在鸿鹄里更便捷和高效地分析Windows event log数据。 操作步骤 Winlogbeat是一个开源的日志数据采集器,专门用于采集Windows操作系统中的event log数据。它可…

C语言之指针进阶篇(3)

目录 思维导图 回调函数 案例1—计算器 案例2—qsort函数 关于qsort函数 演示qsort函数的使用 案例3—冒泡排序 整型数据冒泡排序 回调函数搞定各类型冒泡排序 cmp_int比较大小 cmp传参数 NO1. NO2. 解决方案 交换swap 总代码 今天我们学习指针难点之回调函数…

支付宝小程序排名优化,一个小白的成长手记

那是一个风和日丽的周末早上,阳光透过窗帘洒进屋内,温暖了我的双脚。这是我加入新公司的第一个周末,我坐在桌前,满怀激情地准备开发我的第一个支付宝小程序。【名即薇】 经过两天两夜的奋战,我终于完成了一个初版的支付宝小程序。是一个集美食资讯、餐厅点评、外卖订餐于一体的…

连nil切片和空切片一不一样都不清楚?那BAT面试官只好让你回去等通知了。

连nil切片和空切片一不一样都不清楚?那BAT面试官只好让你回去等通知了。 问题 package mainimport ("fmt""reflect""unsafe" )func main() {var s1 []ints2 : make([]int,0)s4 : make([]int,0)fmt.Printf("s1 pointer:%v, s2 p…

两种方法教你在postman设置请求里带动态token

问题描述 在使用postman调试接口时,遇到一些需要在请求里加上token的接口,若token出现变化,需要手动修改接口的token值,带来重复的工作量,翻看postman使用手册后,我发现了两种方法可以解决这个问题。 01 …

MySQL之数据类型

目录 一、MySQL数据类型分类 二、数值类型 1、整数类型 2、bit类型 3、小数类型 三、字符串类型 1、char 2、varchar 3、char和varchar比较 四、日期和时间类型 五、enum和set 一、MySQL数据类型分类 MySQL 数据类型可以大致分为以下三类: 数值类型:用于…

git快速查看某个文件修改的所有commit

1. git blame file git blame 可以显示历史修改的每一行记录,有时候我们只想了解某个文件一共提交几次commit,只显示commit列表,这种方式显然不满足要求。 2.git log常规使用 (1)显示整个project的所有commit (2)显示某个文件的所有commit 这是git log不添加参数的常规…

.Net MVC 使用Areas后存在相同Controller时报错的解决办法; 从上下文获取请求的Area名及Controller名

先来说个额外的问题:如何在请求上下文(比如过滤器的中)获取请求对应的Area和Controller 名字?(假设请求上下文对象为 filterContext ): 1. 获取Area名: (string)filterContext.RouteData.DataTo…

Windows下防火墙端口配置

在电脑或者服务器上部署某个应用后,如果需要对外提供服务可能就需要在主机防火墙上设置开启需要的端口,那么具体怎样操作呢 1.打开windows防火墙 2.设置防火墙入站规则 如下图“高级安全Windows Defender 防火墙”页面,点击左侧“入站规则”…

并联电容器交流耐压试验方法

对被试并联电容器两极进行充分放电。 检查电容器外观、 污秽等情况, 判断电容器是否满足试验要求状态。 用端接线将并联电容器两极短接连接湖北众拓高试工频耐压装置高压端, 外壳接地。 接线完成后经检查确认无误, 人员退出试验范围。 接入符合测试设备的工作电源,…

[Linux]进程间通信--管道

[Linux]进程间通信–管道 文章目录 [Linux]进程间通信--管道进程间通信的目的实现进程间通信的原理匿名管道匿名管道的通信原理系统接口管道特性管道的协同场景管道的大小 命名管道使用指令创建命名管道使用系统调用创建命名管道 进程间通信的目的 数据传输:一个进…

【多线程】常见的锁策略

常见的锁策略 1. 乐观锁 vs 悲观锁2. 读写锁 vs 普通互斥锁3. 重量级锁 vs 轻量级锁4. 自旋锁(Spin Lock)vs 挂起等待锁5. 公平锁 vs 非公平锁6. 可重入锁 vs 不可重入锁7. Synchronized8. 相关面试题 1. 乐观锁 vs 悲观锁 悲观锁: 总是假设…

GStreamer MIME类型

MIME type的全称是 Multipurpose Internet Mail Extensions (MIME) ,可以标志一个文件的类型。 Table of Audio Types Media Type Description All audio types. audio/* All audio types channels integer channel-mask bitmask format string layou…

NLP机器翻译全景:从基本原理到技术实战全解析

目录 一、机器翻译简介1. 什么是机器翻译 (MT)?2. 源语言和目标语言3. 翻译模型4. 上下文的重要性 二、基于规则的机器翻译 (RBMT)1. 规则的制定2. 词典和词汇选择3. 限制与挑战4. PyTorch实现 三、基于统计的机器翻译 (SMT)1. 数据驱动2. 短语对齐3. 评分和选择4. PyTorch实现…

MybatisPlus分页插件使用

一. 效果展示 二. 代码编写 2.1 pom <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.2</version> </dependency>2.2 添加配置类 Configuration MapperScan(…

软考知识汇总--结构化开发方法

文章目录 1 结构化开发2 耦合3 内聚4 设计原则5 系统文档6 数据流图6.1 数据流图的基本图形元素 7 数据字典 1 结构化开发 结构化方法总的指导思想是自顶向下、逐层分解&#xff0c;它的基本原则是功能的分解与抽象。它是软件工程中最早出现的开发方法&#xff0c;特别适合于数…

U3D外包开发框架及特点

U3D&#xff08;Unity3D&#xff09;是一款流行的跨平台游戏开发引擎&#xff0c;用于创建2D和3D游戏以及交互性应用程序。U3D有许多常用的开发框架和库&#xff0c;这些框架和库可以扩展其功能&#xff0c;使开发人员更轻松地构建游戏和应用程序。以下是一些常用的U3D开发框架…

Si3262 一款低功耗刷卡+触摸+mcu 三合一SOC芯片

Si3262是-款高度集成的低功耗soC芯片&#xff0c;其集成了基于RISC-V 核的低功耗MCU和工作在13.56MHz的非接触式读写器模块。 该芯片ACD模式下刷卡距离可达4-5cm&#xff08;天线决定&#xff09;&#xff0c;适用于智能门锁&#xff0c;电子锁&#xff0c;柜锁&#xff0c;桑拿…

Android相机调用-CameraX【外接摄像头】【USB摄像头】

Android相机调用有原生的Camera和Camera2&#xff0c;我觉得调用代码都太复杂了&#xff0c;CameraX调用代码简洁很多。 说明文档&#xff1a;https://developer.android.com/jetpack/androidx/releases/camera?hlzh-cn 现有查到的调用资料都不够新&#xff0c;对于外接摄像…