5.11.Webrtc接口的设计原理
在上节课中呢,我向你介绍了web rtc的接口宏,那有很多同学会产生疑问啊,那觉得web rtc为什么要把接口设计的这么复杂?还非要通过宏来实现一个代理类,再通过代理类来调用到web rtc内部。

那为什么要这么设计呢?实际上它的这样一种设计啊,它是有一定理论的,那下面呢,我们就来详细看一下web rtc为什么要这么做?那这张图呢,就是web rtc它设计接口的一个架构。

那在中间层呢,就是通过接口宏来实现的,代理层在代理层之上是应用层,比如我们前面向你介绍的peer connection client就是应用层。而在proxy之下呢,是y8r7c的核心库,那所有的比如信令线程工作线程网络线程以及对于音视频的采集编码传输等等的。这些都是在外边儿tc的核心库中实现的,那么通过这个代理层做一层代理之后,那就将应用层与核心库之间做了一层隔离。那这样做有什么好处呢?那我想呢,至少有以下几点好处,那第一点呢,就是只输出必要的接口儿。
也就是说,我们迈达tc可能提供了几百个甚至上千个接口儿,但是这些接口儿呢,对于应用层来说,不必要全都知道。我们只需要暴露,必须暴露给外层的接口就可以了,比如说只有五个或者十个应用层,只要调用这些接口就可以满足它的需求。而对于其他的几百个或者上千个接口,都是我们内部需要的接口,那这些呢?是不应该暴露给用户的。如果我们把这些接口也暴露给用户,那实际上是增加了用户的使用成本,
他要将上千个接口把他们都捋出来。那要花费大量的学习时间,那不如我们就给它暴露一些必要的接口,那这样呢,用户学起来就非常的容易。所以这是一个非常好的设计方式,这样一种设计还是非常灵活的,当我们需要把y八二七c的某些接口释放出来的时候。我们只要在这个代理类中增加相关的接口,那用户呢,就可以直接调了,当我们不需要让用户了解这些接口的时候呢?还可以把它从代理类中取消掉,用户就没法再访问这些接口了。那这样一种设计其实是非常灵活的,
这是第二点。那第三点呢,就是当我们使用了代理类之后,就将应用层与web rtc核心库进行了一层隔离。防止了应用层去污染这个web rtc核心层所有的调用,必须通过代理类进行调用。而且在调用的过程中呢,要进行线程的切换,假如说我们在应用层创建了五个线程,那如果我们不使用代理类的话,很可能这五个线程就会与y八二tc内部的线程。产生一些冲突或者说应用层的线程会注入到y八二tc的核心库中去,那这样呢,就会造成发生错误的时候。我们很难判断,
具体是由于外边儿,室内核儿引起的原因,还是说我们应用层由于创建了一些线程?这些线程呢,进入到了web rtc核心层引起的问题,你就不好把这件事说清楚,但是通过这个代理层之后,那我们很容易就能确定你到底是应用层的问题,还是web rtc核心库的问题。所以对于web rtc这种设计来说,它是有效的,防止了应用层对web rtc核心库的污染。好,这是使用代理类的几点好处?当然,

它同时也带来一些麻烦,就是我们在定义我们自己接口的时候,你必须按照它的步骤一二三,这样去定义。之后呢,才可以进行调用,所以这是增加了我们一些这个学习成本,但是对于你研发web rtc部的核心开发人员来说呢,那这就不算什么了。但是对于从外层理解外边儿tc来说,确实是增加了一些难度,所以这是鱼和熊掌不可兼得的一个东西。那就是为了更好的防护外部rtc,就要将接口架构设计的复杂一些,但同时带来好处就是我们可以有效的将外部rtc库与应用层进行一个隔离。
而且接口的放出与隐藏都是非常方便的,好,那接下来呢?我们来看看接口类的关系图。

那实际上我们在上节课中,在介绍实现自己接口的这个方案的时候呢,已经向你做过介绍了,它需要三大步,那第一步呢,我们要实现一个接口类。也就是以你的类的名字,后边加一个interface后缀为接口类的名字,那有了这个接口类之后呢?我们需要在外边rtc内核中去实现。
这个接口也就是说要生成一个类,继承自某某某interface这个接口类,并且呢,将其中的方法都实现了。之后,我们需要通过y8 tc的接口宏来定义一个代理类,那这个代理类最终转换成一个真实的类名呢,就是某某某proxy with internal。这样一个类名,由于这个类名啊,比较长。所以在接口宏中呢,还给它起了一个别名儿,就是某某某proxy,当我们把这个类展开之后呢,
你会发现它有几个方法?那第一个方法呢,就是create它是一个静态方法,就是通过create可以创建出某某某proxy with internal代理类对象。之后呢,我们就可以使用这个代理类了,那么在这个代理类中呢,包括了很多的method的方法,当然method它是可重载的,有不同的输入参数。在method内部,它使用了method后来生成一个后对象,那这个后对象呢,就是为了调用我们web rtc内部的这个真实的实现类。它是这个作用,
那么在这个q对象创建成功之后呢,再调用它的marshal方法,那最终呢,经过一系列的里边儿的运转,就可以调到这个时间类了。那这个还是比较有意思的一个过程,那在后边的课程中呢,我会向你做详细的介绍,那现在我们只要知道通过接口宏之后进行宏展开,就会生成这样一个代理类。以及代理类中有哪些方法,那当然它还有一个重要的成员,就是实现类的一个指针。通过这个成员来指向实现类,那这样呢,
它才能在内部去调用实现类中的方法。这就是接口类的一个类关系图,那下面呢?我们就来看看具体它这红是如何展开的,还是以我们上节课中的peer connection factory这个类为例。

为一个例子,我们来看一下刚才定义的peer connection factory这个代理类,它展开之后是什么样子?

展开的第一步呢就是将peer connection factory proxy with internal给它起一个别名,因为这个名字太长了。那我们在写代码的时候呢,就非常的费劲,所以它会怎么做呢?会将前面的这个类名后边加一个proxy的后缀。作为它的别名,
这样我们书写起来会方便一些,少写很多字母,那对于类的定义呢?它还是先要写一个proxy with internal这样一个类名。之后呢,让它继承自interface,也就是我们自己手工编写的这个接口类,当它继承了这个接口之后,后边它再调用具体的实现类的时候,就会非常方便。因为他知道都有哪些方法了,这是它继承自interface的一个主要作用,那在这个类的内部,它会实现很多方法。比较重要的呢是有两个,
第一个呢是create,这个create是一个静态方法,也就是说通过代理类的create方法就可以发现出某某proxy with internal这样一个代理类的对象。那有了这个对象之后就可以调用它里边的method方法,当然method方法呢,它是一个重载的。可以通过不同的参数进行区分,这刚才我们已经介绍过了,那在method内部呢?会创建method q对象。之后呢,调用marshal方法,最终调用到实现类的具体方法,那这些呢,我们都会在后边儿向你做详细介绍整个过程,
它是怎么运转起来的?除了这两个重要的方法之外,那它还有几个重要成员,其中signaling thread和worker thread是关于线程的两个成员。那除此之外呢,最为关键的是peer connection factory指针,也就是说通过c下划线指向了它具体实现类的对象。那所以这个c下划线是非常关键的,那么在method方法中只有通过指向实现类的这个指针才能调到实现类中的相应方法。否则的话,我们是没法找到具体的实现方法的,那这个呢,就是peer connection factory代理类的一个展开。那么展开之后,我们看这个代码就比较亲切了,
当然这与我们手写的代码还是有一定的差别,这个名字特别的长。但由于是机器产生的,为了防止与人血的发生冲突,所以它就使用了这样一个非常长的名字来减少这个冲突。那了解了这个红展开之后,后面我们再介绍整个它调用的过程的时候你就不会觉得很晕了。否则的话,如果我们不了解这个宏定义,不了解宏展开,不了解它在整个编译过程中是在预编译时进行宏展开的。你对web rtc接口的调用理解起来就会非常困难,那以上呢,就是我们这节课所要介绍的内容。那这节课中呢?
主要是向你介绍web rtc,为什么要这样设计接口?这样设计接口的好处是什么?以及当我们使用接口宏,定义好代理类之后,它展开之后的样子是什么样的?了解了这些之后呢,才能让我们更好的理解外拔接口它的调用过程是怎样的?那我们今天的课呢?就到这里,谢谢。
相关文章:
5.11.Webrtc接口的设计原理
在上节课中呢,我向你介绍了web rtc的接口宏,那有很多同学会产生疑问啊,那觉得web rtc为什么要把接口设计的这么复杂?还非要通过宏来实现一个代理类,再通过代理类来调用到web rtc内部。 那为什么要这么设计呢…...
2022年09月 C/C++(八级)真题解析#中国电子学会#全国青少年软件编程等级考试
C/C++编程(1~8级)全部真题・点这里 第1题:道路 N个以 1 … N 标号的城市通过单向的道路相连:。每条道路包含两个参数:道路的长度和需要为该路付的通行费(以金币的数目来表示) Bob and Alice 过去住在城市 1.在注意到Alice在他们过去喜欢玩的纸牌游戏中作弊后,Bob和她分手…...
Vue3 监听属性-watch
文章目录 Vue3 监听属性-watch1. 概念2. 实例2.1 通过使用 watch 实现计数器2.2 千米与米之间的换算2.3 异步加载中使用 watch2.4 小计 Vue3 监听属性-watch 1. 概念 Vue3 监听属性 watch,可以通过 watch 来响应数据的变化。 watch 的作用:用于监测响应…...
JWT安全
文章目录 理论知识cookie(放在浏览器)session(放在 服务器)tokenjwt(json web token)headerpayloadSignatureJWT通信流程 JWT与Token 区别相同点区别 WebGoat靶场--JWT tokens环境启动第四关第五关第七关 属于越权漏洞 理论知识 cookie(放在浏览器) …...
LabVIEW利用人工神经网络辅助进行结冰检测
LabVIEW利用人工神经网络辅助进行结冰检测 结冰对各个领域构成重大威胁,包括但不限于航空航天和风力涡轮机行业。在起飞过程中,飞机机翼上轻微积冰会导致升力降低25%。研究报告称,涡轮叶片上的冰堆积可在19个月的运行时间内造成29MWh的功率损…...
Linux安装MySQL8.0
又又又又..Linux装MySQL。 删除原有的MySQL 查看安装的mysql信息:rpm -qa|grep -i mysql 删除mysql相关服务:rpm -e --nodeps 查询mysql遗留文件和依赖信息:find / -name mysql 手动删除mysql配置文件:rm -rf /etc/my.cnf 相关…...
【【萌新编写RISCV之前言CPU的部分介绍.3】】
萌新编写RISCV之前言CPU的部分介绍.3 CPU的数字电路结构实际十分简单,最主要的模块有PC(地址生成),ALU(运算),Register(寄存),Decode(译码&#…...
dl_model_param
set_dl_model_param —设置深度学习模型的参数 get_dl_model_param — Return the parameters of a deep learning model 返回深度学习模型的参数 使用read_dl_model读取前一步初始化后的网络模型,得到模型的句柄DLModelHandle。 接着用read_dict读取预处理后的数…...
Android相机调用-CameraX【外接摄像头】【USB摄像头】
Android相机调用有原生的Camera和Camera2,我觉得调用代码都太复杂了,CameraX调用代码简洁很多。 说明文档:https://developer.android.com/jetpack/androidx/releases/camera?hlzh-cn 现有查到的调用资料都不够新,对于外接摄像…...
第一个Java程序
1. 将扩展名.text更改为.java 2.文件夹(Hello.java)上方输入“cmd空格回车”(没有加号) 3.在命令提示符内输入“javac空格文件夹名称.java回车” (javac空格Hello.java回车) 执行成功后,文件夹下多一个Hello.class…...
OpenCV之霍夫变换检测直线
霍夫变换 首先是笛卡尔坐标系到霍夫空间的转换,比如笛卡尔坐标系中有一条直线 yaxb。 笛卡尔坐标系中一条直线,对应霍夫空间的一个点。 反过来同样成立(霍夫空间的一条直线,对应笛卡尔坐标系的一个点) 原理其实很简单 …...
lv3 嵌入式开发-11 Linux下GDB调试工具
目录 1 GDB简介 2 GDB基本命令 3 GDB调试程序 1 GDB简介 GDB是GNU开源组织发布的一个强大的Linux下的程序调试工具。 一般来说,GDB主要帮助你完成下面四个方面的功能: 1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序&#…...
Zabbix监控平台概念
1.概念 Zabbix是一款开源的、免费的、分布式监控平台支持web管理,WEB界面可以方便管理员使用可以监控硬件服务器CPU温度、风扇转速、操作系统CPU、EME、DISK、I/O、流量宽带、负载、端口、进程等Zabbix是C/S架构,Client客户端和Server端组成 2.Zabbix可…...
【javaSE】 枚举与枚举的使用
文章目录 🎄枚举的背景及定义⚾枚举特性总结: 🌲枚举的使用🚩switch语句🚩常用方法📌示例一📌示例二 🎍枚举优点缺点🌴枚举和反射🚩枚举是否可以通过反射&…...
NetSuite知识会汇编-管理员篇顾问篇2023
本月初,开学之际,我们发布了《NetSuite知识会汇编-用户篇 2023》,这次发布《NetSuite知识会汇编-管理员篇&顾问篇2023》。本篇挑选了近两年NetSuite知识会中的一些文章,涉及开发、权限、系统管理等较深的内容,共19…...
根号分治与多项式的巧妙结合:GYM-104386G
使用范围:序列上对于每种数的计数问题 考虑对每种数的出现次数进行根号分治 如果出现次数很少,直接平方暴力即可 如果很大考虑任意 ( i , j ) (i,j) (i,j),我们拆一下,再移一下,然后就变成了卷积形式...
通过FTP高速下载几百G数据
基因组下载 (FTP) 常见问题解答 基因组FTP站点有哪些亮点?下载多个基因组组装数据的最简单方法是什么?下载大型数据集的最佳协议是什么?为什么 NCBI 基因组 FTP 站点要重组?我如何及时了解 NCBI 基因组 FTP 站点的变化?...
cudnn-windows-x86_64-8.6.0.163_cuda11-archive 下载
网址不太好访问的话,请从下面我提供的分享下载 Download cuDNN v8.6.0 (October 3rd, 2022), for CUDA 11.x 此资源适配 cuda11.x 将bin和include文件夹里的文件,分别复制到C盘安装CUDA目录的对应文件夹里 安装cuda时自动设置了 CUDA_PATH_V11_8 及path C:\Progra…...
多线程案例(1) - 单例模式
目录 单例模式 饿汉模式 懒汉模式 前言 多线程中有许多非常经典的设计模式(这就类似于围棋的棋谱),这是用来解决我们在开发中遇到很多 "经典场景",简单来说,设计模式就是一份模板,可以套用。…...
Arduino驱动TCS34725传感器(颜色传感器篇)
目录 1、传感器特性 2、硬件原理图 3、控制器和传感器连线图 4、驱动程序 TCS34725是一款低成本,高性价比的RGB全彩颜色识别传感器,传感器通过光学感应来识别物体的表面颜色。...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...
未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...
最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...
sqlserver 根据指定字符 解析拼接字符串
DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...
力扣-35.搜索插入位置
题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...
第7篇:中间件全链路监控与 SQL 性能分析实践
7.1 章节导读 在构建数据库中间件的过程中,可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中,必须做到: 🔍 追踪每一条 SQL 的生命周期(从入口到数据库执行)&#…...
React从基础入门到高级实战:React 实战项目 - 项目五:微前端与模块化架构
React 实战项目:微前端与模块化架构 欢迎来到 React 开发教程专栏 的第 30 篇!在前 29 篇文章中,我们从 React 的基础概念逐步深入到高级技巧,涵盖了组件设计、状态管理、路由配置、性能优化和企业级应用等核心内容。这一次&…...
接口 RESTful 中的超媒体:REST 架构的灵魂驱动
在 RESTful 架构中,** 超媒体(Hypermedia)** 是一个核心概念,它体现了 REST 的 “表述性状态转移(Representational State Transfer)” 的本质,也是区分 “真 RESTful API” 与 “伪 RESTful AP…...
C# WPF 左右布局实现学习笔记(1)
开发流程视频: https://www.youtube.com/watch?vCkHyDYeImjY&ab_channelC%23DesignPro Git源码: GitHub - CSharpDesignPro/Page-Navigation-using-MVVM: WPF - Page Navigation using MVVM 1. 新建工程 新建WPF应用(.NET Framework) 2.…...
