1.3、WebRTC架构
文章导读:本文的讲解的是webrtc系统架构,每个人都要Get到这些知识:第一、了解webrtc架构分层;第二、对每层技术有一个清晰的认知。学完本节内容可以为我们后面学习核心API起到至关重要的作用,前期的理论基础不能怠慢。本节内容会涉及一些专业名词,阅读起来可能有些晦涩,所以这里推荐的阅读方式推荐:了解名词,理解架构。
在之前的文章里,已经简单的提到过webrtc的架构相关的内容,相关技术细节没讲清楚,所以本节内容的重点将聚焦在webrtc的架构中。
如下图1.3.1,这张图就是来自webrtc官网的系统架构图,本书的内容也将从这张图开始。

图 1.3.1 (webrtc分层架构图)
图中分为两大部分,分别是深紫色、绿色。浅紫色部分不属于webrtc架构组成部分。浅紫色的箭头为Your web app,表示的是用户基于webrtc技术规范开发的应用程序;深紫色为Web API层,表示的是WebRTC开放给开发人员的JavaScript API ,这一层属于最上层的应用层,开发者无需关心复杂的底层技术,只需知其原理,调其API,这也是本书的重点。
在往下就是一大块绿色的部分就是为webrtc的核心层, 在核心层中分为四个子核心层,下面分别对这些子核心层逐一讲解。
首先,来看第一个子核心层——WebRTC C++ API,即C++ 接口层。这一层提供了一些 C++ API,数量不多,接口规范而且简简单,较大程度降低了开发者的开发难度。这一层的主要作用就是把webrtc的核心功能暴露出来,如设备管理,音视频流数据采集等,方便各个软件厂商集成到自家应用中,比如浏览器厂商、其他工程应用软件厂商。其中 PeerConnection是该层最核心的一个模块,即对等连接模块;该模块中实现了很多功能,如P2P 穿洞、通信链路的建立和优选、流数据传输、非音视频数据传输、传输质量报告和统计等。
其次,再来看第二个子核心层—— Session management,即会话管理层。在通信应用中,会话管理是一个非常重要的功能,每个会话中都有对应的上下文环境。这一层提供了会话功能管理功能,可进行创建会话、管理会话、管理上下文环境等。
再次,看第三个子核心层——引擎层。这一层为webrtc核心层中最重、最复杂的一层。引擎层分为三大模块,分别是Voice Engine(音频引擎)、Video Engine(视频引擎)、Transport(传输模块)。 这三大模块分别处理音频、视频、传输。在webrtc中,音频、视频、传输时是分在不同的模块中处理,由此可以看出webrtc的设计哲学,各类业务分而治之,却又相互紧密联系。接下里来分析引擎层的每个模块。
第一个模块Voice Engine, Voice Engine是一个包含了系列音频多媒体处理功能的框架,如音频的采集、音频数据优化、音频编解码等。分别来陈述这几个功能:①、编解码器,webrtc内置的编码器有iSAC、iLBC。iSAC是针对VoIP(Voice over Internet Protocol,基于IP的语音传输)和音频流在宽带和超宽带环境中进行音频传输的编解码器 ,是WebRTC音频引擎的默认的编解码器。技术成熟,被广泛应用在各种实时通信软件中,如Skype、QQ;iLBC则是VoIP在窄带环境中的语音编解码器,在网络丢包较为严重的情况下仍能保持较好通话质量,该编解码器应用广泛。②、NetEQ是针对音频数据进行语音信号处理的组件,其算法能自适应网络环境的变化,有效的处理因网络抖动而导致数据丢包所造成的音频质量问题,这一技术可谓是GIPS的看家本领,在webrtc中占据着至关重要的位置。③、Echo Canceler/Noise Reduction,Echo Canceler是处理回声消除模块,能有效的消除采集音频带来的回声影响;Noise Reduction是抑制噪音模块,如有效的抑制多种噪音(如嘶嘶声,风扇噪音等)。总而言之,在音频引擎中各种语音处理模块/组件都非常优秀,并且广泛在各类工程应用软件中。
第二个模块Video Engine,Video Engine是一个包含了系列的视频多媒体处理的框架,如编码、防网络抖动、图像处理等。分别来陈述这几个功能:①、编解码器,VP8是专为解决网络传输延时设计的视频编解码器,基于此编解码技术可以以更少的数据量得到更高的视频质量,其数据压缩率和性能方面比市场上其他编解码器高,其功能特点非常适合实时通信,是webrtc中默认的视频编解码器。②、Video Jitter Buffer——视频抖动缓冲器,实时视频通信难免会因为网络的原因导致视频的抖动或者视频数据的丢失,视频抖动缓冲器依靠独特的算法,有效的解决这类情况对视频质量造成的影响。③、Image enhancements——图像质量增强模块,本模是用来做图像处理以提升视频画面质量的,如图像明暗度检测、颜色增强、降噪处理等。
第三个模块Transport,即数据传输模块。在webrtc中,数据传输除了音视频流数据之外,如文件、文本、图片等其他二进制数据均可传输。我们在使用webrtc开发应用时,完全可以根据需求有针对性的选择某些模块单独使用,比如单独选择传输模块来帮我们解决复杂的传输问题,我们无需考虑传输时的P2P链路搭建,传输链路优选,数据丢包重传等问题。接下来分别来陈述本模块的几个重要组成部分:①、传输协议,在webrtc中,数据传输底层协议基于UDP(关于UDP和TCP,请读者自行查阅资料),上层基于RTP/SRTP协议。RTP 是(Real Time Protocol)提供了具有实时特征的、端到端的数据传送服务协议,适用于传输声音,图像数据,更多关于RTP协议的资料可以自行查阅。在RTP中,并未考虑到数据传输的安全性,所以不符合安全性要求较高的应用中,为了解决此问题,SRTP应运而生。数据安全传输协议SRTP(SecureReal-time Transport Protocol)是在RTP的基础上加入了安全机制的传输协议,SRTP为数据提供了加密、消息认证、完整性保证和重放保护等功能,最大程度保障了数据传输的安全性。注意,RTP/SRTP协议本身并不能保证传输质量,即数据传输过程中丢失是很常见的。传输质量由下层的网络质量决定,但即使网络质量能保证足够好,RTP/SRTP也不能保证数据包的按顺序到达,于是引入了RTCP/SRTCP,即RTP控制协议(RTP Control Protocol),该协议用于数据传输时的服务质量监视与反馈、媒体间同步,以及多播组中成员的标识,一句话来讲就是监控RTP传输的质量,例如数据发送端或者接收端通过RTCP数据检测此刻网络传输的效果不理想,丢包率较高,发送端和接收端会自动调整收发数据包的速率,必要的情况下还会更换通信链路,以此来尽可能的提高传输质量。SRTCP如同 SRTP一样,属于对应协议的加密版,这里不在赘述。②、Multiple exing,通道复用,即多个流数据传输共用一个通道, 以此提高传输效率。③、P2P相关技术,实现P2P通信需要用到这些技术:STUN、TURN、ICE; 为了把握内容展开的节奏,尽可能的做到循序渐进,深入浅出,我决定在没有讲清楚相关计算机网络知识的情况下,我不会深入的讲解这几个技术,在第三章里专门讲解这一块内容,可见其重要程度。在这里你只需要知道通过这三个技术就可以实现数据通信,P2P优先,中转次之。
到此,webrtc核心层的内容就讲完了,最后看下最底层和驱动相关的模块——驱动层,如上图1.3.1的虚线蓝框部分,本层有三个部分组成:①、Audio Capture/Render,音频的采集和渲染模块。②、Video Capture,视频采集模块,在webrtc中,视频的渲染在应用层。③、Network I/O,网络IO模块,所有网络传输的数据都在这里“进进出出”。这一层没太多内容可讲。
本文的内容到此就结束了,接下来做个小结。webrtc的架构分为两大部分, 第一部分为 Web API ,属于上层应用层,该层为应用开发者提供JavaScript接口,丰富多彩的应用在这一层诞生。第二部分为webrtc核心层,核心层又分为了四个子核心层,分别是C++ 接口层、会话管理层、 引擎层、驱动层。C++接口层主要提供给浏览器厂商,浏览器厂商基于此层的C++接口来适配出对应的JavaScript API ,共同为上层应用层的开发者提供便利;会话管理层我们不太关注,真正用到的都对我们透明了;引擎层是webrtc的心脏,重要程度不言而喻;驱动层和底层硬件打交道。
一层一层,铸成了一个伟大的项目。最后,祝你学习愉快。
附上本书指定交流微信公众号——“晨叔周刊”,回复:“webtrc”,即可进入本书讨论的圆桌。小伙伴有任何问题,进入圆桌讨论吧。
1.3、WebRTC架构的更多相关文章
- WebRTC架构和协议栈-zz
为了便于理解,我们来看一个最基本的三角形WebRTC架构(图4).在这个架构中,移动电话用“浏览器M”表示,笔记本电脑用“浏览器L”表示,通过Web服务器将它们连接起来.要建立一个实时媒体通讯,两台设 ...
- Android IOS WebRTC 音视频开发总结(七七)-- WebRTC的架构和协议栈
本文主要介绍WebRTC的架构和协议栈(我们翻译和整理的,译者:litie),最早发表在[编风网] 支持原创,转载必须注明出处,欢迎关注我的微信公众号blacker(微信ID:blackerteam ...
- WebRTC音视频引擎研究(1)--整体架构分析
WebRTC技术交流群:234795279 原文地址:http://blog.csdn.net/temotemo/article/details/7530504 1.WebRTC目的 ...
- 转: WebRTC音视频引擎研究(1)--整体架构分析
转自: http://blog.csdn.net/temotemo/article/details/7530504 目录(?)[+] WebRTC技术交流群:234795279 原文地址:ht ...
- WebRTC
WebRTC,名称源自网页实时通信(Web Real-Time Communication)的缩写,是一个支持网页浏览器进行实时语音对话或视频对话的技术,是谷歌2010年以6820万美元收购Globa ...
- Android IOS WebRTC 音视频开发总结(九)-- webrtc入门001
下面这篇介绍webrtc的文章不错,我花了大半天翻译了一下. 翻译的时候不是逐字逐句的,而是按照自己的理解翻译的,同时为了便于理解,也加入一些自己组织的语言. 本文主要介绍webrtc的信令,stun ...
- Android WebRTC 音视频开发总结
www.cnblogs.com/lingyunhu/p/3621057.html 前面介绍了WebRTCDemo的基本结构,本节主要介绍WebRTC音视频服务端的处理,,转载请说明出处(博客园RTC. ...
- WebRTC 音视频开发
WebRTC 音视频开发 webrtc Android IOS WebRTC 音视频开发总结(七八)-- 为什么WebRTC端到端监控很关键? 摘要: 本文主要介绍WebRTC端到端监控(我们翻译 ...
- webrtc教程
cdsn博客不支持word文件,所以这里显示不完全.可到本人资源中下载word文档: v0.3:http://download.csdn.net/detail/kl222/6961491 v0.1:h ...
随机推荐
- 阿里面试Java程序员都问些什么?
刚开始也是小白,也是一步步成成起来的.需要提的一点是,你将来是需要靠这个吃饭的,所以请对找工作保持十二分的热情,而且越早准备越好. 阿里一面 一面是在上午9点多接到支付宝的面试电话的,因为很期望能够尽 ...
- [Python]爬取首都之窗百姓信件网址id python 2020.2.13
经人提醒忘记发网址id的爬取过程了, http://www.beijing.gov.cn/hudong/hdjl/com.web.consult.consultDetail.flow?original ...
- vue项目中使用element ui上传图片到七牛
1.获取token值 后台有接口调用直接返回token值 //请求后台拿七牛云token async getQiniuToken() { //token let uploadtoken = await ...
- codechef Future of draughts
难度 super-hard 题意 官方中文题意 做法 定义1:\(G\)为邻接矩阵,\(I\)为单位矩阵 定义2:\(H\)为转移矩阵,可以不动,即\(H=G+I\) 定义3:\(e_i(x_1,.. ...
- 使用uni-app开发小程序,关于小程序更新后与用户本地不会及时更新解决办法
1.原因分析 在小程序更新开发版本之后,用户本地并没有对之前版本的小程序进行删除,那么再进入小程序的时候的版本是不会发生变化的,这是由于发版是异步执行,因此新版本将会覆盖的比较慢,本质是小程序的启动方 ...
- VPS性能测试shell工具以及锐速安装
比较熟悉的UnixBench非常耗费资源,需要长时间跑满cpu和IO,很多主机商都深恶痛绝,会做各种限制,其实也代表不了实际使用的业务效果,毕竟真正需要那么多cpu和IO的应用并不多.而网络状况却是大 ...
- Git和TortoiseGit
1.简介 Git是一个开源的分布式版本控制系统,用于敏捷高效的处理任何或大或小的项目.它采用了分布式版本库的方式,不必服务器端软件支持. 2.Git和Svn的区别 1.Git 是分布式的,SVN 不是 ...
- Spring-Cache手动清缓存
Spring Cache 手动清Redis缓存 注册cacheRedisTemplate 将 cache 的 RedisTemplate 注册为Bean @Bean(name = "cach ...
- Babel 7 主要改变
1.不支持Node:0.10,0.12,4,5版本 2.更换命名-@babel/xxx 3.移除以年份命名的presets,统一更换成@babel/preset-env 4.移除 ’Stage‘ pr ...
- nginx 无法启动:bind() to 0.0.0.0:443 failed
bind to 0.0.0.0:443 failed.其实就是443端口被其它程序占用,要结束占用443端口导致nginx不能启动的应用. CMD: 1.查看所有程序使用的端口 netstat -ao ...