【征文】初步认识学习webRTC

webRTC是什么:

webRTC(web Real Time Communications)是一个用在实时通讯场景下的技术。想要实现音频或者视频通话的数据传输,这是我们必不可少要用到的,也无法避免。

然而问题来了,在实时传输过程中,我们的数据流都是隐私数据,传输途中不能丢失,因此需要确保完整统一地输送到接收方。如果不能保护消息的完整性,攻击者可以伪造数据甚至重放过去传输过的数据,这样就对我们的实时传输有很大的影响了。故需要一种比较安全有效的技术工具辅助之。基于上述问题,webRTC是使用了 安全实时传输协议(Secure Real-time Transport Protocol,简称SRTP) 对数据流进行了加密,可以确保数据流完整的同时也能防止攻击者重放数据。SRTP是在 实时传输协议(Real-time Transport Protocol,简称RTP) 基础上所定义的一个协议,旨在为单播和多播应用程序中的实时传输协议的数据提供加密、消息认证、完整性保证和重放保护,WebRTC的安全特性是其可靠性的重要组成部分。

webRTC是如何运作的:

学习一个新的技术,我们总得大概研究一下其架构及设计原理,这样才能理解得透彻,日后运用起来也得心应手。
webRTC是谷歌所收购并且开源的一个技术,因此我们可以直接去他们的官网上查阅webRTC的架构说明,如果官网无法直接访问,可以参考WebRTC中文网。在官网中找到的一张架构说明图:

webRTC架构图

从官网的架构图中,我们还是很简单地看懂的,架构层次分明,也用了不同颜色标注区分各个层级,使之直观。大概可以看得出这是一个三层架构的设计,体现了架构设计的自上而下原则。

  1. 顶层的浅紫色部分应该就是Web开发者的应用层,是基于webRTC技术来开发的应用程序入口。我们的web应用直接访问Web API,再由其API调用底层的东西,简单看一下对开发者来说还是挺友好的。

  2. 中间的深紫色部分是开放给应用层开发者调用的API,比如JS的一些API。作为开发者来说,学习一个新的技术,首先还是得简单了解一下其技术的大概原理,看下提供的一些API,每个API的用途等,然后可以尝试写一下demo,动手操作更容易理解哦。

  3. 最后一个绿色大层级是webRTC的具体功能层,这部分内容在webRTC架构中占比很大,都是一些偏核心底层的内容。我们大概可以看出这里也细分了四个层级,第一层是webRTC C++的API层、第二层是会话管理层、第三层是引擎层,可以看得出有音频视频等引擎内容、最后一层是驱动层。

根据架构图的描述,摄像头应该是依赖驱动层中的Video Capture(视频采集模块)来采集我们的视频数据,同理录音工具之类的也是依赖Audio Capture/Render(音频的采集和渲染模块)来采集的,然后通过Network I/O来把数据传输到上层。

往上一层是一个引擎层,那么我们的数据被采集完后,可能还需要编码和解码操作。假想如果我们的音频数据直接进行传输的话,可能在网络丢包严重时出现断断续续的情况,因此这一层中,音频引擎便采用了一些比较好的编码器如 iSAC/iLBC ,二者分别针对不同环境应用的,前者是在宽带和超宽带有优势,而后者便在窄带环境下起优势。
除此之外,还需要对音频进行优化,比如降噪、消除回声等,现在市面上的一些带有这些功能的耳机,如果有体检过的朋友,应该能感觉到体验感十足。而在webRTC中便采取了 NetEQ(网络语音信号处理的组件) 使之自适应网络环境的变化,降低网络抖动时的丢包率,Echo Canceler/Noise Reduction 分别是回声消除模块和降噪模块。而视频引擎的话则是使用了 VP8 作为编解码器,再以 Video Jitter Buffer(视频抖动缓冲器)、Image enhancements(图像质量增强模块) 辅助之,避免了因网络问题导致视频数据丢失以及提升视频画面的质量。
引擎层还有最后一个模块:Transport,即数据传输模块。在webRTC中,数据传输除了音视频流数据之外,还可以传输文本、图片、文件等其他二进制数据,像当下比较热门的场景白板技术便是如此,简单便能实现一个“你画我猜”的场景。那么这里又有个问题,这个模块是如何保证我们的数据完好无损且地传输到接收方呢?上述有提到webRTC是搭配了一个 安全实时传输协议(SRTP) 来实现的,在架构图中这个模块里也有体现出,那么这个协议就是在这里就起作用了,可以最大程度保障了数据传输的安全性。但是这仅仅只是保证了数据的安全性,二进制数据的传输还是会发生丢失的情况,回头看下音视频数据流是通过其对应的引擎,再以子模块辅助才能保证传输质量,降低丢包率。而在二进制数据传输中,使用的是RTCP协议来保证传输质量的,再且便通过 Multiplexing 提高传输效率,最底部的协议就是为了实现P2P通信而使用的技术。


这一层的核心技术比较多,总得来说还是得慢慢“品尝”体会才能get到其中的设计思想。

数据的编码完毕,经过优化和加密认证等操作后,便传输到上一层会话管理层中。会话层在运输层提供的服务上,这里的功能应该就是可以管理上下文环境,比如创建会话之类的,主要功能是提供建立连接并有序传输数据。

回到了第一层的c++ API层,这一层主要就是实现P2P连接。括号里 PeerConnection 是的一个核心模块,该模块实现了很多功能,比如p2p穿洞、建立通信链路、数据的传输、统计传输质量等。因为是c++接口层,所以这里一般是提供给浏览器厂商各自集成到自己的应用当中,然后提供JS API给开发者的应用所调用的。

webRTC有何用途:

了解一种新的技术,我们还需要知道它到底有何用,可以给我们的生活和工作带来那些方便,了解其用途可以大大提高我们的学习兴趣。
webRTC提供了音视频的核心技术,包括音视频的采集、编解码、网络传输、显示等,目前支持跨平台,比如谷歌浏览器、火狐浏览器、移动端的Android系统和ios系统等。基于此核心技术,经过数年的技术发展和业界大佬们的专研,萌生出很多依赖webRTC技术的领域。例如:
社交互动,最近比较火爆的元宇宙便可以基于此技术去实现一些语音交流,视频播放等功能。
image1

云游戏,在云中渲染游戏的画面,然后实时把画面发送给玩家,结合5G体验更棒。

智慧农业,通过webRTC实时监控农产品的存活状况,远程操控无人机等去管理农业,甚至还能远程采集农产品。小时候体会到农民伯伯的艰辛,在如今网络科技发达的时代,真是期待某一天我们能够一边喝着快乐水,一边远程操控采集,无需顶着日晒雨淋去干活。

总结

在学习webRTC技术的过程中,让笔者回想起以前接触的架构设计的一些思想,在其中都有体现出。
webRTC具备自上而下、分层架构的设计特点,体现出架构设计的分治思想,将技术层层分解为多个架构元素,降低复杂度,保证分解后的各个层级还能够高内聚、低耦合。同时webRTC技术运用到的技术面也比较广泛,不仅包含了众多协议内容、计算机网络通讯相关的知识,还包含了丰富的音视频相关知识,有一些是以前读书接触过的,有一些便是在其中学习到的。不得感叹计算机技术的广度和深度。同时webRTC技术所支撑的领域众多,衣食住行、娱乐、学习教育等都可以覆盖。期待webRTC技术可以把实时互动领域推向一个新高度的时刻!

推荐阅读
作者信息
相关专栏
音视频杂谈
158 文章
本专栏仅用于分享音视频相关的技术文章,与其他开发者和声网 研发团队交流、分享行业前沿技术、资讯。发帖前,请参考「社区发帖指南」,方便您更好的展示所发表的文章和内容。