首先我们通过webRTC官网上的一张图了解一下webRTC的架构:
网上也有很多资料说这张图在webRTC的官网上,但是很多童鞋根本就找不到。这是因为很多童鞋没有进行科学上网:
WebRTC架构说明英文文档:https://webrtc.github.io/webrtc-org/architecture/
对于WebRTC的架构说明,官方的英文文档已经说的很清楚了,所以本文可能更多的是充当这一个翻译者的角色。下面我们从上往下分别了解WebRTC的架构设计。
三层架构
首先我们从图中可以看出webRTC被划分成了三部分,分别是绿色部分、深紫色部分以及浅紫色部分。
其中最上层的带箭头的浅紫色部分是指开发者的应用层,就是指开发者基于webRTC技术规范所开发的应用程序。严格来说这并不属于WebRTC的架构内容。
其中深紫色的中间层Web API (Edited by W3C WG)
部分表示的是WebRTC开放给应用层开发人员调用的API(主要是JavaScript API 供web端使用),
在这层中开发者无需关心复杂的底层技术,只需了解webRTC的大致流程原理,调其API即可利用WebRTC实现点对点的通讯功能。
其次绿色部分才是WebRTC的核心功能层,而这一层又被分为了四个子核心功能层。分别是C++API层、会话管理层、引擎层、驱动层。
Your web app层
也就是带箭头的浅紫色层Your web app # 1...
。上面已经提到严格来说这并不属于WebRTC的架构内容,所以这里就不作介绍了。
Web API层
Web API层也就是深紫色部分Web API (Edited by W3C WG)
,表示的是WebRTC开放给应用层开发人员的API(主要是JavaScript API 供web端使用),
在这层中开发者无需关心复杂的底层技术,只需了解webRTC的大致流程原理,调其API即可利用webRTC实现点对点的通讯功能。
WebRTC C++ API层
绿色部分包裹的浅紫色WebRTC C++ API (PeerConnection)
部分,这部分主要是一些C++的接口层,这一层提供了一些 C++ API,主要是供浏览器支持WebRTC规范而调用的API,又比如需要Android上实现webRTC功能就需要编写JNI函数调用这一层API。
这一层的主要作用就是把WebRTC的核心功能暴露出来,如设备管理,音视频流数据采集等,方便各个软件厂商集成到自家应用中,比如浏览器厂商等。
其中 PeerConnection是该层最核心的一个模块,即对等连接模块;该模块中实现了很多功能,如P2P穿墙打洞、通信链路的建立和优选、流数据传输、非音视频数据传输、传输质量报告和统计等等。
Session management层
绿色部分被Session management / Abstract signaling (Session)
标注的一层就是会话管理层。
这一层提供了会话功能管理功能,可进行创建会话、管理会话、管理上下文环境等。而这一层又会涉及到各种协议,比如说信令服务器的SDP协议等,主要用于进行信令交互和管理 RTCPeerConnection的连接状态。
引擎层
这一层为WebRTC核心层中最重、最复杂的一层。而这一层又分为三个小模块,分别是:Voice Engine(音频引擎)、Video Engine(视频引擎)以及Transport(传输模块)。
第一个模块 Voice Engine(音频引擎), Voice Engine是一个包含了系列音频处理功能的框架,如音频采集、音频编解码、音频优化(包括降噪、回声消除等)等一系列的音频功能。
第二个模块Video Engine(视频引擎),Video Engine是一个包含了系列视频处理功能的框架,如视频采集、视频编解码、根据网络抖动动态修改视频传输质量、图像处理等。
第三个模块Transport(传输模块),在WebRTC中,数据传输除了音视频等流媒体数据之外,还可以传输文件、文本、图片等其他二进制数据,这些功能就是这个模块所提供的。
从图中我们可以看出每个引擎的下面又包含多个子引擎,下面我们再来讲解各个引擎下的子引擎功能。
iSAC / iLBC Codec
iSAC和iLBC是WebRTC内置的音频编码器。其中iSAC是针对VoIP(Voice over Internet Protocol,即基于IP的语音传输)和音频流在宽带和超宽带环境中进行音频传输的编解码器,
是WebRTC音频引擎的默认的编解码器,技术成熟,且被广泛应用在各种实时通信软件中;而iLBC则是VoIP在窄带环境中的语音编解码器,在网络丢包较为严重的情况下仍能保持较好通话质量。
NetEQ for voice
NetEQ是网络语音信号处理的组件,这个算法能自适应网络环境的变化,有效的处理因网络抖动而导致数据丢包所造成的音频质量问题,这一技术可谓是当年WebRTC的前身GIPS的看家本领。
Echo Canceler/Noise Reduction
Echo Canceler是处理回声消除模块,能有效的消除采集音频带来的回声影响,比如说在实时音视频通话的过程中,打开手机扬声器的话,
本来的需求是录制本人的声音实时发送给对方的,但是由于存在回声,也会把对方说话的声音也录制进去。目前笔者测试发现市场上的一些手机录音的时候
本身是自带了回音消除功能,而且Android也提供有相关的API,但是好像大多数情况下,这个API都没起作用,可能是由于厂商兼容性问题,甚至有可能是直接阉割掉这个功能了。
因此想要做到录音是全平台适配回声消除功能的话就可以使用WebRTC的这个功能。而iOS平台上的录音是带有回声消除功能的。
而Noise Reduction则是抑制噪音模块(也就是降噪),如有效的抑制多种噪音(如嘶嘶声,风扇噪音等)。
VP8 Codec
VP8是第八代的On2视频,能以更少的数据提供更高质量的视频,而且只需较小的处理能力即可播放视频,为致力于实现产品及服务差异化的网络电视、IPTV和视频会议公司提供理想的解决方案。
其数据压缩率和性能方面比市场上其他编解码器高,其功能特点非常适合实时通信,是WebRTC中默认的视频编解码器。
VP9是Google提供的开源的免费视频codec,是VP8的后续版本,初始开发时命名为下一代开源视频或者VP-NEXT。
VP9的开发始于2011年Q3,试图降低VP8的50%的码率而保持相同的质量,另外希望VP9比H.265( High Efficiency Video Coding)有更好的编码效率。
Video Jitter Buffer
Video Jitter Buffer——视频抖动缓冲器,实时视频通信难免会因为网络的原因导致视频的抖动或者视频数据的丢失,
视频抖动缓冲器依靠独特的算法,有效的解决这类情况对直播会议质量造成较大的影响。
Image enhancements
mage enhancements——图像质量增强模块,这个模块是用来做图像处理以提升视频画面质量的,如图像明暗度检测、颜色增强、降噪处理等。
SRTP
SRTP属于传输模块中的内容,在了解SRTP之前我们先来了解一下RTP。
RTP 是(Real Time Protocol)提供了具有实时特征的、端到端的数据传送服务协议。而我们通常所说的RTCP等则是对RTP的控制协议。
RTP不像http和ftp等可完整的下载整个影视文件,它是以固定的数据格式在网络上发送数据,如果RTP的头部几个字节表示什么,音频数据或者视频数据包含在RTP中那几个字节中等等。
在RTP中,并未考虑到数据传输的安全性,比如没有加密功能,所以不符合安全性要求较高的应用需求,因此为了解决此问题,SRTP应运而生。
SRTP(SecureReal-time Transport Protocol)是在RTP的基础上加入了安全机制的传输协议,SRTP为数据提供了加密、消息认证、完整性保证和重放保护等功能,最大程度保障了数据传输的安全性。
所以RTP与SRTP的关系大概就是http与https的关系。
Multiplexing
Multiple exing,通道复用,即多个流数据传输共用一个通道, 以此提高传输效率。
说实话,目前笔者也不懂这个是如何复用的,先搁置一下呗。。。
P2P STUN+TURN+ICE
前面已经说过WebRTC是一种基于P2P的通信技术。而STUN、TURN、ICE这些则是实现P2P的一些关键技术。
STUN、TURN、ICE又称为NAT穿透,在现实生活中不同局域网中的内外ip是无法直接通信的,比如说局域网A中192.168.2.1与局域网B中192.168.2.2是无法互相直接发送消息的,
那么如果要在两个不同的局域网中建立起可以直接通信的通道就得依靠STUN+TURN+ICE这些技术。
而STUN、TURN和ICE又是使用不同方案进行穿透的,这个不是三言两语可以说的清楚的,后面我们结合例子再详细了解一下。
驱动层
也就是浅蓝色虚线部分,这部分有Audio Capture/Render(音频的采集和渲染模块)、Video Capture(视频采集模块)和Network I/O(网络IO模块)组成。
而这些音视频的采集和渲染,网络IO的传输功能,我们都是直接调用各平台提供的相关API即可实现,至于底层的驱动是如何实现的,笔者也不清楚,也就不在这里误人子弟了。
总结
从WebRTC优秀的分层架构设计中,我们至少学习到优秀的架构设计大多都能做到分而治之。每一层都是一个小的功能点,我们要做的就是将每一层都做得足够优秀,然后再将最优的每一层通过各种组装而铸造一个伟大的项目。
WebRTC其实是一个很庞大的内容,如果能把每一个模块都做得足够优秀,优化得足够好,甚至都可以单独提取出来做一个专业的项目运营了。可想而知要想深入学习研究通透WebRTC需要花费多少的精力以及时间。
WebRTC最为一个建立在音视频基础之上的项目,不仅仅需要了解学习通讯相关的知识,还需要音视频的相关知识,而这些知识想要吃得通透都是需要大量的实战的,
如果要做到知其然也知其所以然,那么就需要童鞋们有强大的自控力以及持续学习的持久力呀。
参考资料
《搞定WebRTC音视频直播通信技术(核心技术精讲篇)》
关注我,一起进步,人生不止coding!!!