Depth.Love Blog

GitHub:https://github.com/depthlove

0%

WebRTC 开发(三)架构设计剖析

上一篇写的是 WebRTC 源码的下载和编译,为什么不先剖析 WebRTC 的架构设计而是先讲编译过程呢?原因是通过观察 WebRTC 的编译过程,能看到 WebRTC 里有什么。很多人觉得编译过程耗时长,就去干点其它的事坐等编译过程结束。我喜欢观察编译过程的打印信息,通过观察,可以看到 WebRTC 里面有什么,形成对 WebRTC 源码库有基本的认识。接触一个东西时,最初都是从局部到整体。知道 WebRTC 里面存在一些东西,但这些东西是如何组织在一起形成一个完整的解决方案的呢?那就要分析 WebRTC 的架构和设计了。

整体架构图

WebRTC 整体架构图

组件介绍

(1) Your Web App

(2) Web API

(3) WebRTC Native C++ API

(4) Transport / Session

  • RTP Stack
  • STUN / ICE
  • Session Management

(5) VoiceEngine

  • iSAC / iLBC / Opus
  • NetEQ for Voice
  • Acoustic Echo Canceler (AEC)
  • Noise Reduction (NR)

(6) VideoEngine

  • VP8
  • Video Jitter Buffer
  • Image enhancements

代码结构

webrtc/src 目录下的代码结构如下:

src-code-structure

功能模块

(1) 音频模块

WebRTC 的音频部分,包含设备、编解码(Opus/iLIBC/iSAC/G722/PCM16/RED/AVT、NetEQ)、加密、声音文件、声音处理、声音输出、音量控制、音视频同步、网络传输与流控(RTP/RTCP)等功能。

  • 音频设备 audio_device

源代码在 webrtc/src/modules/audio_device 目录下,包含接口和各个平台的源代码。

在 Windows 平台上,WebRTC 采用的是 Windows Core Audio 和 Windows Wave 技术来管理音频设备,还提供了一个混音管理器。

利用音频设备,可以实现声音输出,音量控制等功能。

  • 声音处理 audio_processing

源代码在 webrtc\modules\audio_processing 目录下。

声音处理针对音频数据进行处理,包括回声消除(AEC)、AECM(AEC Mobile)、自动增益(AGC)、降噪(NS)、静音检测(VAD)处理等功能,用来提升声音质量。

  • 音频编解码 audio_coding

源代码在 webrtc/src/modules/audio_coding 目录下。

WebRTC 采用 CNG/G711/G722/iLBC/iSAC/Opus/PCM16b/Red 编解码技术。

webrtc/src/modules/audio_coding/neteq 还提供 NetEQ 功能 — 抖动缓冲器及丢包补偿模块,能够提高音质,并把延迟减至最小。

另外一个核心功能是基于语音会议的混音处理。

  • 声音加密 voice_engine_encryption

和视频一样,WebRTC 也提供声音加密功能。

(2) 视频模块

  • 视频采集 video_capture

源代码在 webrtc/src/modules/video_capture 目录下,包含接口和各个平台的源代码。

在 Windows 平台上,WebRTC 采用的是 dshow 技术,来实现枚举视频的设备信息和视频数据的采集,这意味着可以支持大多数的视频采集设备。对那些需要单独驱动程序的视频采集卡(比如海康高清卡)就无能为力了。

视频采集支持多种媒体类型,比如 I420、YUY2、RGB、UYUY 等,并可以进行帧大小和帧率控制。

  • 视频图像处理 video_processing

源代码在 webrtc/src/modules/video_processing 目录下。

视频图像处理针对每一帧的图像进行处理,包括明暗度检测、颜色增强、降噪处理等功能,用来提升视频质量。

  • 视频显示 video_render

源代码在 /webrtc/src/sdk 目录下。

在 Windows 平台,WebRTC 采用 direct3d9 和 directdraw 的方式来显示视频。

  • 视频编解码 video_coding

源代码在 webrtc/src/modules/video_coding 目录下。

WebRTC 采用 I420/VP8 编解码技术。VP8 是 google 收购 ON2 后的开源实现,并且也用在 WebM 项目中。VP8 能以更少的数据提供更高质量的视频,特别适合视频会议这样的需求。

  • 视频加密 video_engine_encryption

视频加密是 WebRTC 的 video_engine 一部分,相当于视频应用层面的功能,给点对点的视频双方提供了数据上的安全保证,可以防止在 Web 上出现视频数据的泄漏。

视频加密在发送端和接收端进行加解密视频数据,密钥由视频双方协商,代价是会影响视频数据处理的性能;也可以不使用视频加密功能,这样在性能上会好些。

视频加密的数据源可能是原始的数据流,也可能是编码后的数据流。估计是编码后的数据流,这样加密代价会小一些。

(3) 传输模块

  • 网络传输与流控

对于网络音视频,数据的传输与控制是核心价值。WebRTC 采用的是成熟的 RTP/RTCP 协议来传输音视频数据。

参考文献

WebRTC Architecture

WebRTC – architecture & protocols