Licode架构分析

目录

  • Licode架构分析
    • 0 代码框架
    • 1 架构图
    • 2 功能模块说明
    • 3 模块之间的交互
    • 4 发布流
    • 5 WebRtc协议栈对输入输出流的处理
    • 6 发布者和订阅者管理
    • 7 ICE、DTLS及媒体数据传输

Licode架构分析

本文将对Licode的架构进行分析。
源码安装。
API接口说明。

0 代码框架

Licode架构分析_第1张图片
如图是在Ubuntu上编译安装完成后代码的目录结构图。
1)erizo是用c++语言实现的webrtc栈,主要实现了与客户端的交互性连接建立、DTLS握手、媒体数据的发送和接收、使用SRTP实现媒体数据的加解密。
2)erizoAPI是erizo的封装,实现js和c++间的调用;
3)erizo_controller 下的代码使用Javascript语言实现,包括客户端和服务器端的接口模块。其中erizoClient是客户端的API它与运行在服务器端的erizoController使用Socket.io连接实现控制命令和信令(主要是sdp和candidate)的传输。erizoAgent和erizoJS是分布式MCU的一部分,它们也是运行在服务器端,具体的位置如下架构图所示。

1 架构图

Licode架构分析_第2张图片

2 功能模块说明

Licode架构分析_第3张图片

3 模块之间的交互

Licode架构分析_第4张图片在服务端使用高级消息队列(AMPQ)实现模块间的远程调用。

Licode架构分析_第5张图片
浏览器客户端与服务器端的交互包含两个部分,信令使用websocket传输,媒体数据的传输则是基于LibNice库实现的。

4 发布流

Licode架构分析_第6张图片
一个用户在浏览器端可以将本地的视频发布到服务器,这样其他用户就可以知道并订阅该视频。发布视频流的大体处理流程如图所示。

5 WebRtc协议栈对输入输出流的处理

Licode架构分析_第7张图片
Licode服务端中实现了Webrtc协议栈,对输入输出流使用Pipeline进行处理,在管道中对输入输出流按顺序使用不同的模块进行处理。

Licode架构分析_第8张图片
各个模块功能介绍如表格所示。功能模块可能只对输入流做处理,也可能只对输出流做处理,不过大多数模块都是同时对输入输出流做处理。表格中的functional对both的表述,前面部分是输入,后面部分是输出,fireRead表示该模块对输入没有做什么处理,直接抛给下个模块,fireWrite表示该模块对输出没有做什么处理,直接抛给下一个模块。

6 发布者和订阅者管理

Licode架构分析_第9张图片
在licode的服务端,对订阅者和发布者的管理在erizoJS下,使用js实现的,现在用UML图的形式表示如上图所示:
1)当一个用户发布流时将在ErizoJSController中创建一个Client和一个Publisher;
2)一个用户可能会发布自己的视频流并同时订阅多个其他用户的视频流,所以在Client中可能持有多个Connection,每个Connection有自己的WebRtcConnection和MediaStream;
3)多个用户可能会同时订阅同一个视频流,所以一个Publisher中可能持有多个Subscriber;

7 ICE、DTLS及媒体数据传输

Licode架构分析_第10张图片
在erizo中实现了webrtc栈,其中交互性连接的建立(ICE),DTLS握手消息的传递及媒体数据的传送使用的部分类图如上图所示:
1)使用LibNice库实现所有上述消息及数据包的传递;
2)LibNiceConnection收到数据报通过DtlsTransport中转分发给不同的模块处理;
3)处理的先后顺序为先建立里交互性连接,连接完成后通过DtlsSocketContext及DtlsSocket实现握手,握手完成后可以拿到ClientKey及ServerKey并对SrtpChannel进行初始化,之后对收到和发送的媒体数据包可以先用不同的key进行加解密。

你可能感兴趣的:(Licode架构分析)