最近 COVID-19 肆虐,视频会议系统受到关注。 本文对近期项目中采用的一款开源系统的架构进行简要分析。

Jitsi Meet 是开源的视频会议系统,基于 WebRTC、React、XMPP 等成熟的开源技术。 它能够独立部署,也可以方便整合到业务系统中。

Jitsi Meet 系统架构

Jitsi Meet 由几个核心组件构成:

  • Jitsi meet:前端代码。运行在客户端(浏览器)中。
  • Prosody:XMPP 服务器。负责各组件间的消息交换。
  • turnsever:WebRTC 视频的网关。
  • Jicofo:会议室(房间)管理。
  • Videobridge:SFU、视频数据路由。
  • Jigasi:SIP 网关。
  • Jibri:直播/录播等。

jitsi

前端应用 Jitsi-meet

Jitsi-meet 是一个纯前端的工程,可以部署在任何静态文件服务器上。 这也意味着用户不需要安装额外的工具即可开始使用。

默认首页很简洁,用户输入会议室名称之后,可以创建或加入会议室。 在浏览器端按照提示进行媒体设备授权之后,就可以开始使用。 会议室页面支持平铺和聚焦两种视频展示方式,工具按钮可实现静音/关闭视频等操作。 管理员可以在菜单中进行会议室管理操作。 会议室还提供简单的文本聊天功能。

这个项目基于 React,用到了 Redux、atlaskit。 与 Jitsi 体系相关的功能,大部分集中在 lib-jitsi-meet 库中。 由于界面操作较多,React 体系的工具可以大大方便各种页面状态的管理。

浏览器方式以外,jitsi-meet 也提供了移动客户端和桌面客户端。 移动客户端提供了对应的 iOS SDK 和 Android SDK。 桌面版基于 Electron。

通讯中枢 Prosody

Jitsi 使用 Prosody 进行模块间的状态同步、数据交换以及管理操作。 它是 Jitsi 架构中的通讯系统、神经中枢。

Prosody 是一个开源的 XMPP 服务器。 它用 Lua 实现,简洁、高效,且易于安装与扩展。

视频转发 Jitsi Videobridge(JVB)

视频路由转发组件,或 SFU。

会话管理 jicofo

用于管理参与者和 JVB 之间的会话。

后期处理 Jibri

JVB 不包含视频混合的功能,由 Jibri 组件用于直播推流、录播归档等需求。

Jibri 的实现原理比较简单: 在一个后台 Xorg-server 中启动 chrome-driver 进程,打开 jitsi-meet 的会议室网页,作为一个特殊用户加入会议室中。 音频信息则使用一个虚拟的声音设备。 使用 FFmpeg 对 chrome-driver 窗口进行视频录制,并采集虚拟声音设备的音频数据。 FFmpeg 的输出方式就比较灵活,官方支持保存到文件,或者使用 RTMP 协议推流到 YouTube。 实际部署时可能需要对流输出进行各种自定义,目前(2020/05)上游还没有针对性的功能发布出来,可以通过一下 hacky 的方式来实现。

Jibri

安装

Jitsi-meet/prosody/jicofo/videobridge/turnserver/jigasi

参考:Jitsi Meet quick install

⚠️ 由于文档采用等操作系统版本较早,新版本系统中可能会遇到文件路径不存在问题。

Jibri

参考:Installing Jibri

默认部署方式,每台服务器只能录制 1 个会议室的内容。 如果有多个会议室需要录制/直播,请部署多台 Jibri。

💻 硬件配置有一定要求,内存需要 4G~8G。


以上为项目应用中对 jitsi 的一些分析,欢迎与我进行更详细的交流。