热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

webrtc学习笔记三:webrtc架构

文章目录

文章目录

  • Webrtc架构
    • 分层
    • 第一层
    • 第二层
    • 第三层
    • 第四层
  • 每一层所做的事情
    • 音频引擎中,对于音频来说包括了哪些呢?
    • 视屏引擎中:
    • 传输:

Webrtc架构

Webrtc官方网址:https://webrtc.org/
Webrtc老版官网地址:https://webrtc.github.io/webrtc-org/
Webrtc学习网址:https://webrtc.org.cn/
Webrtc中文文档https://github.com/RTC-Developer/WebRTC-Documentation-in-Chinese
W3C API文档:https://www.w3.org/TR/webrtc/
2
可以从webrtc官方找到这张图。
可以简单将这张图分为两大部分,最核心的是绿色的部分:是webrtc库所提供的核心功能。另外在这个方块之外的紫色部分:是浏览器提供的Javascript的api层。也就是说浏览器对webrtc核心层的C++ API做了一层封装,封装成了Javascript接口。上层应用就是这一个个的箭头,一个个的上层应用可以在浏览器中访问浏览器所提供的API,这样,最终就获取到了核心层去获取音频、视频,然后去编解码,通过传输去发送。

分层

这就是它的整体分层,一个是应用层,一个是核心层。我们需要学习的webrtc库是属于核心层,图中的绿色部分,我们自己去实现应用其实也是参考整个浏览器的这个实现模式,在上层可以实现自己的api,最终调核心层的C++ API,也就是通常说的native api,在内部就会一层层的调用下来,最终,实现音视频的整个逻辑。
这是从大体上看,接下来仔细看看核心层,也是比较复杂的部分。
核心层也是按层级区分的,分为4层:

第一层

①第一层webrtc C++ API(PeerConnection),是C++ API,也就是提供给外面的api接口,这些api其实并不多,甚至可以说非常少,可以通过它的源码就能知道。这一层最主要的就是PeerConnection对等连接,也就是连接。Webrtc最主要的就是P2P传输。在peerconnection里又包含了很多,包含传输质量、传输质量报告、各种统计数据、各种流,都是封装在这个peerconnection里的。在这个连接之外,还有设备管理、音视频数据的采集、还有普通的非音视频数据的传输,基本上就分为这几类api。
可以看出webrtc设计的非常精巧。对于上层来说,提供的api越简单,对于应用层来说,做起来就越方面,这样,对于开发就降低了难度。但是对于内部来说,这个native api层就比较复杂了。

第二层

②第二层Session Management/Abstract signaling(Session),是session管理层,也就是上下文管理层。包括创建了音频、视频,也就是说应用里创建了音频视频还有非音视频数据传输,都可以在session层去做处理,也就是说在这一层管理这些相关的逻辑,这一层其实也不是很重,最终的下一层第三层。

第三层

③第三层包括了音频音频Voice Engine、视频音频Video Engine、传输Transport。每一个引擎里又包含了很多模块。稍后再详细介绍。

第四层

④最后一层是与硬件相关的,包括音频的采集与渲染【Audio Capture Render】,视频的采集【Video Capture】(这里需要注意的是在webrtc库的核心层是没有视频的渲染的,所有的渲染都需要应用层或者浏览器自己去做),最后就是【Network IO】网络IO。
图中所有划虚线的框,表示都是可以重载的,这样就增加了更大的灵活度,当不需要webrtc引用库的某些模块的时候,可以自己去实现一个模块去代替它,浏览器一般都是自己实现了一套,比如Chrome就是自己实现了一套,它使用自己的音频采集与渲染、视频采集与渲染,网络IO还是使用webrtc的网络IO。
通过这4层就可以了解到整个webrtc它的整体轮廓,都包括了那些东西。

每一层所做的事情

现在看看第三层,最复杂的这一层都做了哪些事情:
Webrtc采用的这样的设计:将音频、视频、传输,都分开设计就非常棒,非常低的耦合度。传输的时候只关心传输而不需要了解其他的业务逻辑;音频和视频显然应该分开,音频走音频的相关逻辑,视频走视频的逻辑,但是还涉及一个音频与视频的同步,音视频同步实际不是在他的引擎层做的。

音频引擎中,对于音频来说包括了哪些呢?

首先是编解码。比如iSAC/Ilbc Codec。iSAC是Google收购GIPS前GIPS发明的音频引擎。现在市场上用的最多的是opus。还有其他自己实现的模块,比如AAC模块。目前来说编解码方面主要使用的就是AAC、OPUS这两个编解码器。
第二个是NetEQ,这是一个音频缓冲的Buffer,用于做网络适配的,就是防止抖动的,做一个Buffer防止抖动,这里面涉及很多算法。
第三个Echo Canceler/Noise Reduction就是不太好处理的回音消除/降噪,这里提供了非常成熟的回音消除算法,我们需要做的就是调一些参数。

视屏引擎中:

包括老版本中自带的VP8/VP9 Codec,现在使用的是比较新的AVY Codec这个新的编解码器。还有H264也支持了,包括xH264、openH264,官方的webrtc里是不支持xH264的,若想支持则可以按照openH264的模块进行添加。
第二,视屏有gitterBuffer防止视屏抖动。
第三,包括图像的处理,图像增强,但是webrtc的图像增强相对功能薄弱一些,但是webrtc也预留出了相应的接口,如果想做美颜、P图等等这些图像增强操作的话,可以实现相应的接口。还可以加入人脸识别等。

传输:

传输,webrtc底层采用的是UDP传输,在上层用的是RTP。由于浏览器需要非常安全的传输,所以有SRTP(安全RTP,加密后的RTP),RTP为了控制整个传输,所以又有RTCP可以把相应的发送和接收报告发送给对方,对方就可以做流量控制。
第二Multiplexing,就是复用。可以多个流复用一个通道。
第三,再底层就是P2P相关的,(P2P包括 STUN+TURN+ICE),整个就是P2P的一套协议。

通过这个结构图图,就对webrtc有了一个整体的了解,它最核心的部分就是第三层引擎层:音频引擎+视频引擎+传输。 所有音频视频的传输与发送,都是通过传输模块去做的,在传输层包括线路的检测,整个网络链路是不是完好的,丢包量,抖动情况等等,通过这些计算去估算网络带宽,由网络带宽然后去进行音视频的传输。
当然不仅仅有音视频数据的传输,还有非音视频数据的传输,包括文件、文本、二进制数据。比如玩游戏的时候,就是传输二进制数据;二进制数据可以通过使用这里的传输模块,去直接传输数据;而对于音频视频数据要想进行传输,则需要通过音频视频引擎的接口去调用传输层的接口,然后才能进行传输。

这样就明白整个webrtc库,是一个分层设计,并且在底层又划分了各个模块(音频模块、视频模块、传输模块),各个模块之间又有相互的调用关系;对于上层来说,需要访问的是webrtc native api这一层。
这以上就是webrtc的整体结构。


推荐阅读
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • Linux如何安装Mongodb的详细步骤和注意事项
    本文介绍了Linux如何安装Mongodb的详细步骤和注意事项,同时介绍了Mongodb的特点和优势。Mongodb是一个开源的数据库,适用于各种规模的企业和各类应用程序。它具有灵活的数据模式和高性能的数据读写操作,能够提高企业的敏捷性和可扩展性。文章还提供了Mongodb的下载安装包地址。 ... [详细]
  • LVS实现负载均衡的原理LVS负载均衡负载均衡集群是LoadBalance集群。是一种将网络上的访问流量分布于各个节点,以降低服务器压力,更好的向客户端 ... [详细]
  • 本文介绍了如何使用PHP向系统日历中添加事件的方法,通过使用PHP技术可以实现自动添加事件的功能,从而实现全局通知系统和迅速记录工具的自动化。同时还提到了系统exchange自带的日历具有同步感的特点,以及使用web技术实现自动添加事件的优势。 ... [详细]
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 生成对抗式网络GAN及其衍生CGAN、DCGAN、WGAN、LSGAN、BEGAN介绍
    一、GAN原理介绍学习GAN的第一篇论文当然由是IanGoodfellow于2014年发表的GenerativeAdversarialNetworks(论文下载链接arxiv:[h ... [详细]
  • 解决Cydia数据库错误:could not open file /var/lib/dpkg/status 的方法
    本文介绍了解决iOS系统中Cydia数据库错误的方法。通过使用苹果电脑上的Impactor工具和NewTerm软件,以及ifunbox工具和终端命令,可以解决该问题。具体步骤包括下载所需工具、连接手机到电脑、安装NewTerm、下载ifunbox并注册Dropbox账号、下载并解压lib.zip文件、将lib文件夹拖入Books文件夹中,并将lib文件夹拷贝到/var/目录下。以上方法适用于已经越狱且出现Cydia数据库错误的iPhone手机。 ... [详细]
  • RouterOS 5.16软路由安装图解教程
    本文介绍了如何安装RouterOS 5.16软路由系统,包括系统要求、安装步骤和登录方式。同时提供了详细的图解教程,方便读者进行操作。 ... [详细]
  • GreenDAO快速入门
    前言之前在自己做项目的时候,用到了GreenDAO数据库,其实对于数据库辅助工具库从OrmLite,到litePal再到GreenDAO,总是在不停的切换,但是没有真正去了解他们的 ... [详细]
author-avatar
zg18156zg你
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有