webRTC架构说明

本文涉及的产品
数据传输服务 DTS,数据同步 small 3个月
推荐场景:
数据库上云
数据传输服务 DTS,数据迁移 small 3个月
推荐场景:
MySQL数据库上云
数据传输服务 DTS,数据同步 1个月
简介: WebRTC系列

首先我们通过webRTC官网上的一张图了解一下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!!!

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
Sqoop 企业级大数据迁移方案实战
Sqoop是一个用于在Hadoop和关系数据库服务器之间传输数据的工具。它用于从关系数据库(如MySQL,Oracle)导入数据到Hadoop HDFS,并从Hadoop文件系统导出到关系数据库。 本课程主要讲解了Sqoop的设计思想及原理、部署安装及配置、详细具体的使用方法技巧与实操案例、企业级任务管理等。结合日常工作实践,培养解决实际问题的能力。本课程由黑马程序员提供。
目录
相关文章
|
Web App开发 算法 JavaScript
WebRTC整体架构分析
1 设计WebRTC的目的 WebRTC(Web Real-Time Communication)项目的最终目的主要是让Web开发者能够基于浏览器(ChromeFireFox...)轻易快捷开发出丰富的实时多媒体应用,而无需下载安装任何插件,Web开发者也无需关注多媒体的数字信号处理过程,只需编写简单的Javascript程序即可实现。
3450 0
|
Web App开发 编解码 ice
即构自研WebRTC网关服务器架构实践
即构为什么要自研WebRTC网关服务器?我们从开源和自行研发的优劣势说起。
3932 0
|
19天前
|
弹性计算 API 持续交付
后端服务架构的微服务化转型
本文旨在探讨后端服务从单体架构向微服务架构转型的过程,分析微服务架构的优势和面临的挑战。文章首先介绍单体架构的局限性,然后详细阐述微服务架构的核心概念及其在现代软件开发中的应用。通过对比两种架构,指出微服务化转型的必要性和实施策略。最后,讨论了微服务架构实施过程中可能遇到的问题及解决方案。
|
28天前
|
Cloud Native Devops 云计算
云计算的未来:云原生架构与微服务的革命####
【10月更文挑战第21天】 随着企业数字化转型的加速,云原生技术正迅速成为IT行业的新宠。本文深入探讨了云原生架构的核心理念、关键技术如容器化和微服务的优势,以及如何通过这些技术实现高效、灵活且可扩展的现代应用开发。我们将揭示云原生如何重塑软件开发流程,提升业务敏捷性,并探索其对企业IT架构的深远影响。 ####
42 3
|
1月前
|
Cloud Native 安全 数据安全/隐私保护
云原生架构下的微服务治理与挑战####
随着云计算技术的飞速发展,云原生架构以其高效、灵活、可扩展的特性成为现代企业IT架构的首选。本文聚焦于云原生环境下的微服务治理问题,探讨其在促进业务敏捷性的同时所面临的挑战及应对策略。通过分析微服务拆分、服务间通信、故障隔离与恢复等关键环节,本文旨在为读者提供一个关于如何在云原生环境中有效实施微服务治理的全面视角,助力企业在数字化转型的道路上稳健前行。 ####
|
18天前
|
Java 开发者 微服务
从单体到微服务:如何借助 Spring Cloud 实现架构转型
**Spring Cloud** 是一套基于 Spring 框架的**微服务架构解决方案**,它提供了一系列的工具和组件,帮助开发者快速构建分布式系统,尤其是微服务架构。
135 68
从单体到微服务:如何借助 Spring Cloud 实现架构转型
|
20天前
|
设计模式 负载均衡 监控
探索微服务架构下的API网关设计
在微服务的大潮中,API网关如同一座桥梁,连接着服务的提供者与消费者。本文将深入探讨API网关的核心功能、设计原则及实现策略,旨在为读者揭示如何构建一个高效、可靠的API网关。通过分析API网关在微服务架构中的作用和挑战,我们将了解到,一个优秀的API网关不仅要处理服务路由、负载均衡、认证授权等基础问题,还需考虑如何提升系统的可扩展性、安全性和可维护性。文章最后将提供实用的代码示例,帮助读者更好地理解和应用API网关的设计概念。
48 8
|
1月前
|
Dubbo Java 应用服务中间件
服务架构的演进:从单体到微服务的探索之旅
随着企业业务的不断拓展和复杂度的提升,对软件系统架构的要求也日益严苛。传统的架构模式在应对现代业务场景时逐渐暴露出诸多局限性,于是服务架构开启了持续演变之路。从单体架构的简易便捷,到分布式架构的模块化解耦,再到微服务架构的精细化管理,企业对技术的选择变得至关重要,尤其是 Spring Cloud 和 Dubbo 等微服务技术的对比和应用,直接影响着项目的成败。 本篇文章会从服务架构的演进开始分析,探索从单体项目到微服务项目的演变过程。然后也会对目前常见的微服务技术进行对比,找到目前市面上所常用的技术给大家进行讲解。
53 1
服务架构的演进:从单体到微服务的探索之旅
|
25天前
|
消息中间件 运维 Kubernetes
后端架构演进:从单体到微服务####
本文将探讨后端架构的演变过程,重点分析从传统的单体架构向现代微服务架构的转变。通过实际案例和理论解析,揭示这一转变背后的技术驱动力、挑战及最佳实践。文章还将讨论在采用微服务架构时需考虑的关键因素,包括服务划分、通信机制、数据管理以及部署策略,旨在为读者提供一个全面的架构转型视角。 ####
34 1
|
27天前
|
弹性计算 运维 开发者
后端架构优化:微服务与容器化的协同进化
在现代软件开发中,后端架构的优化是提高系统性能和可维护性的关键。本文探讨了微服务架构与容器化技术如何相辅相成,共同推动后端系统的高效运行。通过分析两者的优势和挑战,我们提出了一系列最佳实践策略,旨在帮助开发者构建更加灵活、可扩展的后端服务。