1.3、WebRTC架构
文章导读:本文的讲解的是webrtc技术架构,不想了解的读者可以跳过。为什么要了解技术架构?一句话:理解优秀项目背后的技术架构。本节内容会涉及一些专业名词,阅读起来可能有些晦涩,所以这里推荐的阅读方式推荐:了解名词,了解架构。
本书目录
正文开始。
在之前的文章里,已经简单的提到过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++接口层主要提供给浏览器厂商,浏览器厂商基于此层来适配出对应的JavaScript API ,共同为上层应用层的开发者提供便利;会话管理层我们不太关注,真正用到的都对我们透明了;引擎层是webrtc的心脏,重要程度不言而喻;驱动层和底层硬件打交道。
一层一层,铸成了一个伟大的项目。
最后,祝你学习愉快。
附上本书指定交流微信公众号——“晨叔周刊”,一起讨论吧。