Janus WebRTC网关技术架构分享
 # **Janus WebRTC网关** Janus是由Meetecho开发的通用WebRTC服务器,提供了一个用于构建 WebRTC 应用程序的模块化框架。本文档对 Janus WebRTC Gateway 的架构、核心组件及其交互方式进行了高层次概述。  **主要特性:** - 模块化架构:将核心 WebRTC 功能与特定于应用的逻辑分离。 - 轻量级核心:使用 C 语言编写,占用资源小。 - 插件系统:可通过插件扩展,适用于各种应用(视频会议、流媒体、SIP 网关-集成FreeSWITCH等开源SIP软交换)。 - 多种传输机制:支持 HTTP/REST、WebSockets、RabbitMQ、MQTT、Nanomsg 和 Unix 套接字。 - 会话管理:处理连接、WebRTC 会话和插件附加。 - 媒体处理:处理媒体协商、编码和传输。 - 录制功能:支持通过 .mjr 文件和后处理工具录制 WebRTC 会话。 --- # **概述** Janus 是由 Meetecho 开发的通用 WebRTC 服务器,提供了一个用于构建 WebRTC 应用程序的模块化框架。本文档提供了 Janus WebRTC 网关架构的高级概述、其核心组件以及它们之间的交互方式。 ## **目的和范围** Janus WebRTC 网关设计目标为一个轻量级的通用 WebRTC 服务器,除了实现以下功能外,本身不提供任何其他功能: - • 与浏览器建立 WebRTC 媒体通信 - • 在客户端和服务器之间交换 JSON 消息 - • 在浏览器和服务器端应用程序逻辑之间中继 RTP/RTCP 和消息 实际功能是在服务器端插件中实现的,浏览器通过 Janus 核心连接到这些插件。这种模块化架构允许占用很小的空间,同时提供最大的灵活性。 ## **主要特性** - • **模块化架构**:将核心 WebRTC 功能与应用特定逻辑分离 - • **轻量级核心**:用 C 编写,占用空间小 - • **插件系统**:可通过各种应用程序插件扩展(视频会议、流媒体、SIP 网关等) - • **多种传输机制**:支持 HTTP/REST、WebSockets、RabbitMQ、MQTT、Nanomsg 和 Unix 套接字 - • **会话管理**:处理连接、WebRTC 会话和插件附加 - • **媒体处理**:处理媒体协商、编码和传输 - • **录制功能**:支持通过 `.mjr` 文件录制 WebRTC 会话和后处理工具 ## **高级架构** ### **Janus 系统架构** 插件层 Janus 核心 传输层 客户端应用程序 Web 浏览器 移动应用程序 自定义客户端 libjanus_http.so libjanus_websockets.so libjanus_mqtt.so libjanus_rabbitmq.so libjanus_nanomsg.so libjanus_unixsockets.so janus_session janus_ice_handle WebRTC 栈(libnice, OpenSSL, libsrtp) libjanus_videoroom.so libjanus_audiobridge.so libjanus_streaming.so libjanus_sip.so libjanus_echotest.so libjanus_textroom.so libjanus_recordplay.so ## **核心组件和流程** ### **核心组件和交互流程** 应用程序插件 Janus 核心逻辑 传输插件 JSON API janus_transport janus_session_find janus_plugin_push_event janus_ice_setup_connectivity DTLS 握手 密钥交换 janus_plugin_incoming_rtp janus_plugin_incoming_data 客户端应用程序 janus_transport_callbacks janus_session janus_ice_handle libnice (ICE) OpenSSL (DTLS) libsrtp (SRTP) usrsctp (数据通道) janus_plugin_callbacks ### **会话和句柄关系** Janus 通过分层结构组织客户端连接: 1. 1. **会话**:表示从客户端到网关的连接。会话由唯一的 `session_id` 标识。 1. 2. **句柄**:在会话中,客户端创建句柄以附加到特定插件。句柄是特定应用程序用例的上下文(例如,特定的 VideoRoom)。 1. 3. **对等连接**:每个句柄管理自己的 WebRTC 对等连接,包括 ICE 代理、DTLS 状态和 SRTP 密钥。 这种架构允许单个客户端通过在单个会话中维护多个句柄来同时与多个插件交互。 ## **会话生命周期** Janus 会话的典型生命周期包括: 1. 1. **会话创建**:客户端通过传输连接并发送 `create` 请求。 1. 2. **插件附加**:客户端发送 `attach` 请求指定插件(例如 `janus.plugin.videoroom`)。 1. 3. **媒体协商**:客户端和插件通过核心交换 JSEP(JavaScript 会话建立协议)消息(SDP 提供/应答)。 1. 4. **媒体交换**:一旦对等连接建立,RTP/RTCP 或数据通道数据包开始流动。 1. 5. **会话终止**:句柄被分离,会话通过 `destroy` 请求或超时被销毁。 ### **媒体交换期间的数据流** "媒体栈 (libnice/libsrtp)""插件 (例如 libjanus_videoroom.so)""Janus 核心 (janus.c)""传输 (例如 libjanus_websockets.so)""WebRTC 客户端""媒体栈 (libnice/libsrtp)""插件 (例如 libjanus_videoroom.so)""Janus 核心 (janus.c)""传输 (例如 libjanus_websockets.so)""WebRTC 客户端"ICE/DTLS 连接已建立创建会话janus_session_create()session_id附加插件janus_ice_handle_create()init() / create_handle()handle_idSDP 提供 (JSEP)janus_ice_handle_process_jsep()handle_message()janus_plugin_push_event(SDP 应答)nice_agent_gather_candidates()发送应答SDP 应答加密的 RTP解密 (SRTP)incoming_rtp()中继/处理relay_rtp()加密 (SRTP)加密的 RTP ## **插件系统** Janus 提供了一个插件架构,允许开发人员在不修改核心的情况下实现各种 WebRTC 应用程序。插件是在运行时加载的共享对象。其包含的核心插件: - • **VideoRoom**:用于视频会议的 SFU(选择性转发单元) - • **AudioBridge**:用于会议的音频混音器 - • **Streaming**:允许向 WebRTC 客户端广播 RTP/RTSP/HLS 流 - • **SIP**:到传统 SIP/VoIP 网络的网关,对接FreeSWITCH 模块 - • **TextRoom**:基于数据通道的聊天 - • **Lua/Duktape**:允许用脚本语言编写插件逻辑  ## **传输层** 传输层是可插拔的,允许通过各种协议控制 Janus: - • **HTTP/REST**:Web 集成的默认选项(`libmicrohttpd`) - • **WebSockets**:双向低延迟控制(`libwebsockets`) - • **消息队列**:通过 RabbitMQ 或 MQTT 与后端系统集成 - • **Unix 套接字**:高性能本地控制 ## **结论** Janus WebRTC网关通过其模块化架构为构建 WebRTC 应用程序提供了灵活的框架。通过将 WebRTC 功能(核心)与应用程序逻辑(插件)和通信机制(传输)分离,Janus使开发人员能够专注于构建其特定应用程序,而无需处理底层WebRTC栈的复杂性。 参考资料: https://www.januscon.it/2019/slides/LucaPradovera-JanusCon.pdf