Webrtc从理论到实践二: 架构

一、架构图总览

                                                                                            图1.1  Webrtc 架构图

二、架构分解

2.1 Web API

                                                               图2.1  Web API

      这一层是面向web开发者封装的JavaScript接口层,是在Webrc native C++接口上进一步的封装。由W3C WG(World Wide Web Consortium Working Group,万维网联盟工作组,这是一个行业联盟,旨在通过制定规范和参考软件来促进Web发展的标准和WWW产品之间的互操作性.)编制,并且于2021年1月26日正式成为W3C推荐标准。

JavaScript API有几个比较核心的接口:

  • getUserMedia():用于捕获音频和视频
  • RTCPeerConnection():这是Webrtc暴露给用户的统一接口,它表示本地计算机和远程对等方之间的Webrtc连接。它的内部由多个模块组成,如网络处理模块,服务质量模块,音视频引擎模块等等,你可以把它想象成一个超级socket,通过它可以轻松完成端到端的数据传输
  • RTCDataChannel():它表示一个网络通道,可以用于任意数据的双向对等传输。每个通道都有一个相关联的RTCPeerConnection().每个对等连接理论上最多可以有65534个数据通道,实际情况可能因浏览器而异。

更多的接口详细信息可以在MDN中查看

WebRTC API - Web APIs | MDNWebRTC (Web Real-Time Communication) is a technology that enables Web applications and sites to capture and optionally stream audio and/or video media, as well as to exchange arbitrary data between browsers without requiring an intermediary. The set of standards that comprise WebRTC makes it possible to share data and perform teleconferencing peer-to-peer, without requiring that the user install plug-ins or any other third-party software.https://developer.mozilla.org/en-US/docs/Web/API/WebRTC_API

   2.2 WebRTC  Native  API 

                                                        图2.2  WebRTC Native API

         WebRTC不仅仅提供了JavaScript API 用于网页APP开发,同时也提供了规范的设计良好的各个终端的API。

        Google Chrome对WebRTC实现(简称Google WebRTC)是完全开源的,其核心代码是用C++编写的,实现了WebRTC标准定义的API。此外,WebRTC的代码库里也包含了Android和IOS/macos 平台的SDK封装,分别提供Java和Objective-C接口,便于这些平台开发者调用,Windows和Linux平台则可以直接调用WebRTC的C++接口进行开发。

      WebRTC Native App使用的最多的SDK就是Google WebRTC(api - src - Git at Google (googlesource.com)),但现在也有一些其他的开源实现,比如https://github.com/awslabs/amazon-kinesis-video-streams-webrtc-sdk-cpion/webrtc: Pure Go implementation of the WebRTC API 。从功能完整 度来看,Google WebRTC是最完整的,但后两者更轻量,而且 pion/webrtc还是纯Go语言实现,有其独特的应用场景。

  2.3  会话/传输层

                                                        图2.3   会话层

         会话层组件采用libjingle库的部分组件实现,无需使用XMPP/Jingle协议。(简单介绍一下上述提到的协议,首先XMPP的全称是Extensible Messaging and Presence Protocol,即可扩展通讯和表示协议,是一种以XML为基础的开放式即时通讯协议。Jingle协议是在XMPP协议上的扩展协议,它着手解决在XMPP协议框架下的点对点的连接问题,即P2P连接。libjingle是一个方便实现的P2P传输的开源库,由google公司开发,并于2005年12月15日发布第一个版本,可以粗略看成是Jingle协议的C++实现库。详细的解释可以参考以下文章Libjingle库 综述 - 高调coding,低调做人 - C++博客 (cppblog.com)

我们需要重点关注的是以下三个部分:

  • RTP(Real-time  Transport Protocol,实时传输协议):主要用来传输对实时性要求比较高的数据,比如音视频数据。
  • STUN(Session Traversal Utilities for NAT,NAT环境下的会话传输工具)/ICE(Interactive Connectivity Establishment,交互式连接建立) :因为终端往往处于不同的局域网中,两者无法直接通信,所以要使两个终端能够通信,可以通过STUN和ICE组件来建立连接。
  • Session Management:这是一个抽象的会话层,提供会话建立和管理功能。该层协议留给应用开发者自定义实现,这一层提供了会话功能管理功能,可进行创建会话、管理会话、管理上下文环境等。而这一层又会涉及到各种协议,比如说信令服务器的SDP协议等,主要用于进行信令交互和管理 RTCPeerConnection的连接状态。

2.4 引擎层

                                                         图2.4  引擎层

这一层是webrtc核心层中最重要,最复杂的一层,这一层又分为三个小模块,分别是音频引擎,视频引擎和传输模块

音频引擎

      包含了一系列音频处理功能的框架,比如音频采集、音频编解码、音频优化(降噪,回声消除等)等功能。

       iSAC/iLBC Codec是WebRTC内置的音频编码器。iSAC是针对VOIP(Voice over Internet Protocol,基于IP的语音传输)的音频流在宽带和超宽带环境中进行音频传输的编解码器,是WebRTC音频引擎默认的编解码器。而iLBC则是针对VOIP在窄带环境中的语音编解码器,在网络丢包严重的情况下可以保持比较好的通话质量。

      NetEQ for voice 是网络语音信号处理的组件,这个算法可以自适应网络环境的变化,有效的处理因网络抖动而导致数据丢包所造成的音频质量问题。

      Echo Canceler/Noise Reduction, Echo Canceler是回声消除模块,这里的回声问题指的是在实时音视频通话过程中,本来想要录制的是自己的声音,但是由于存在回声,所以也会把对方说话的声音也录制进去。 Noise Reduction则是降噪模块,可以有效抑制多种噪音。

视频引擎

     VP8 Codec,VP8是On2 Technologies公司开发的第八代视频编解码器,能以更少的数据提供更高的视频质量,而且只需要较小的处理能力就可以播放视频。其压缩率和性能相比于市场上其他编解码器要好,非常适合实时通信,是WebRTC中默认的编码器。

     Video Jitter Buffer,视频抖动缓冲器,依靠独特的算法可以解决网络原因造成的视频抖动或者视频数据的丢失

     Image enhancements,图像质量增强模块,这个模块是用来做图像处理以提升视频画面质量的,比如图像明暗度检测,颜色增强,降噪处理等


传输模块

      SRTP(Secure Real-time Transport Protocol)是在RTP基础上加入了安全机制的传输协议,SRTP为数据提供了加密、消息认证、完整性保证和重放保护等功能,最大程度保障了数据传输的安全性。

     Multiplexing,通道复用,即多个流数据传输共用一个通道,以此提高传输效率。

     P2P STUN+TURN+ICE ,在上述会话层简单介绍了一下Stun协议,总的来说,STUN,TURN,ICE都是用来使处于不同局域网的终端进行通信,涉及到NAT穿透相关的知识,不是一两句话可以讲明白的,后面会详细介绍。

2.5 驱动层

                                                               图2.5  驱动层

      驱动层包含了音频的采集和渲染,视频的采集,网络I/O等模块,webrtc针对不同平台的音视频采集API作了封装,实现了跨平台的功能。如果对于webrtc底层源码结构感兴趣的可以参考下面这篇文章(1条消息) WebRTC架构简介_麦晓宇的博客-CSDN博客

下一篇:Webrtc从理论到实践三:角色

猜你喜欢

转载自blog.csdn.net/qq_39304481/article/details/125477506