会议集成开发指南

综述

XSwitch 会议系统是基于 XSwitch 软交换系统开发的音视频会议系统,支持开放的通信协议标准、支持常见的标准 SIP 音视频终端、支持常用的 MCU 功能、支持集群功能、可实现大规模音视频会议(1000+)。

术语定义

  • MCU:多点控制单元
  • 软交换:基于分组交换网络的多媒体(音频、视频)交换系统或平台
  • SIP 协议:Session Initiation Protocol,通信领域通用的协议标准
  • SIP 客户端:支持 SIP 协议的终端软件或硬件
  • HTTP:Hyper Text Transfer Protocol,超文本传输协议。
  • REST:Representational State Transfer。一种软件架构风格,提供了一种设计网络应用程序的方法,使得网络应用程序具有一定的可伸缩性、可扩展性、可移植性、可维护性、可理解性、可靠性、安全性等特性。
  • Websocket:一种在单个 TCP 连接上进行全双工通信的协议,由 HTTP 升级而成。
  • UUID:Universal Unique IDentifer。
  • XSwitch:软交换平台。
  • Conference:会议,系统底层的会议实现,包含音视频处理等。
  • Meeting:会议,是会议的逻辑概念,包含会议的基本信息、成员信息、会议相关的参数等。
  • Floor:与会者的一个标志,详见会议基于概念中的描述。
  • BFCP:SIP 双流协议,一跟通话可以有两个视频流,如一路摄像头(主流),一路共享屏幕的视频(辅流)。BFCP 的全称是 Binary Floor Control Protocol,即二进制 Floor 控制协议。

会议基本概念

下面是会议相关的基本概念:

  • 会议室:会议室具有名称(name)和号码(nbr)属性。加入同一个会议室的成员可以开会(互相能听见、看见)。会议室跟真实世界的会议室类似——同一个会议室,同时只能开一场会议;不同的会议室,可以同时开多场会议;同一个会议室,在不同时段也可以开不同的会议。会议室是一个逻辑概念,仅在数据库中存在。
  • 会议:当第一个成员加入会议室时,会自动启动一个会议。当所有成员离开会议室时,会议结束。会议是个“运行时”概念,当会议启动后,系统中会启动相应的线程运行会议,在会议运行过程中会对外发送相关的事件,报告会议的运行状态,与会者人数等。
  • 会议模板:会议室通常有很多属性(如“装修风格”等),将这些属性统一起来,就是会议模板。会议模板可以被多个会议室使用(类似相同的装修风格),如“720p 标清视频会议模板”、“1080p 高清视频会议模板”等。
  • 会议号:会议号是一个字符串,用于标识一个会议。会议号可以是任意字符串,但是通常是一个数字字符串。如果会议号对应一个电话号码,则可以通过拨打该号码加入会议。
  • 用户:用户指人,可以登录到系统进行管理的人员。
  • 分机:指设备,可以注册 SIP 分机、WebRTC 分机、微信小程序分机等。一个用户可以有多个分机。
  • 会议室成员:指加入会议室的分机,或 PSTN 外线号码以及其他加入渠道来的音视频终端,如微信小程序、WebRTC 网页端等。静态的成员对应数据库中的分机号,动态(运行时)的成员对应一路通话,会有一个动态的 memberID。
  • 开发 Key:又称 DevKey,一个用户可以有多个开发 Key,便于不同的应用程序与系统通过 API 方式对接,参见开发 Key
  • Token:Token 是访问 API 的唯一凭证,所有 API 请求必须携带 Token 头域。Token 在下次系统重启后过期。如果应用在请求 API 时遇到 403 错误,需要重新获取 Token。
  • memberID(或member_id):与会者(成员)的唯一 ID,整数,对应一路通话(Channel)和一个 Channel UUID。
  • Floor:Floor 分为音频 Floor 和视频 Floor 两种。
    • 音频 Floor,可以强制某成员具有 Floor,一个会议中有且只有一个 Floor。如果是自动选择模式,则当前发言声音大的成员会自动获得 Floor。
    • 视频 Floor。视频 Floor 可以由音频 Floor 自动获取,即说话声音大的人会自动获得 Floor。也可以由管理员强制指定(通过按界面上的“星星”图标)。具有视频 Floor 的人会占据“有利位置”,如在演讲者布局中占据大屏的位置(其他人以小头像展示)。
  • 双流:在 SIP 会议中即 BFCP 协议。在一个 SIP 会议上允许上、下行最大两路视频,上行视频可用于在演讲同时播放 PPT 等,下行视频可以展示在一个屏幕或两个屏幕上(多画布)。在 XSwitch 内部,双流会被分成两者主、被叫号码相同的与会者(实现为两个 Channel)。

会议室是一个静态的概念,就是一个房间,大家有空可以来开会。而会议专指一次会议,是动态的。同一个会议室中同时只能进行一个会议(即运行时的会议名称必须唯一)。在不同的时间段,可以开不同的会议。

一般来说,会议室主要是为了方便管理会议相关的参数,如最大参会人数(对应真实世界中会议室的面积或座位数量)、是否启用视频,如果启用了视频还有视频分辨率、帧率等。

会议开始时,系统为每一位与会者生成一个唯一的 memberID。可以通过 memberID 针对该与会者进行静音等操作。一个 memberID 对应一路通话的 Channel UUID。

XSwitch 中的会议室和会议无需事先创建(开始)、第一个加入会议室的成员会自动创建一个会议,最后一个离开会议室的成员会自动结束会议。

但在有些场景中,为了更好地对会议进行管理,需要提前创建会议室,比如会议室的属性(如最大参会人数)需要提前确定、参会人员需要事先确认(非授权成员不让进)、会后需要对会议数据进行统计分析(如统计会议人数和参会时长、关联会议纪要等)。

会议操作

一个运行时的会议只在需要时被创建,并在会议中最后一个成员离开时销毁。第一个加入会议中的成员(通话、通道)会创建一个会议。在会议创建时,如果它关联了一个模板,则模板相应的参数会关联到会议上,如会议允许的最大成员数、会议的画布大小、帧率、音频采样率,以及将会议室锁定(锁定后新成员不可加入会议)等。

在会议的运行时,可以通过命令(或 API 接口)对会议进行控制,如修改视频会议的画布大小、帧率,调整带宽等;也可以对与会成员进行控制,如静音、关闭视频、踢出等。

会议功能简介

XSwitch 底层会议功能强大,本节简单列举一下底层的功能,便于集成时参考。

会议模板

通过会议模块(profile),可以预设会议的参数。当第一个成员加入时,系统会自动创建一个会议运行时,运行时的特性由预设的参数决定。典型的参数有:

  • 是否开启舒适噪声:如果开启,在会议中无人讲话时,大家能听到一些高斯白噪声(嘶嘶声),这些噪声声音不大,却又能听见,不会引起人的不适,因而称为舒适噪声。如果不开启舒适噪声,则会议中无人讲话时,人们什么都听不到,有可能误以为电话断掉或故障。
  • 音频采样率:默认 PSTN 电话使用 8000Hz 采样率,WebRTC 会议使用 48000Hz 高清采样率。
  • 视频画布大小:默认使用 1080p。
  • 视频帧率:默认 30fps。
  • 会议模式:如是否融屏(MCU),还是透传(SFU)模式。XSwitch 的 SFU 模式只能透传一个人。
  • 有新成员加入时,是否播放一个声音(如“滴”)通知所有人。
  • 有成员退出会议时,是否播放一个声音(如“嘟”)通知所有人。
  • 会议 Flag,如是否动态发送成员列表等事件(以便与前端 Web 控制页面集成)。
  • 编码器优化:如果所有人都使用相同的视频编码,可以使用同一个编码器,编码出来的视频发给所有与会者,这样能节省 CPU。
  • 实时上行带宽调整:上行指从终端到 XSwitch 服务器的带宽。如通常上行 720p 视频使用 2Mbps 带宽,在 1x1 或 2x2 画面可以看得很清楚,但如果与会者比较多,画布上显示 10x10 的画布,由上行带宽可以变成 256Kbps 或更低,这样可以节省带宽,也可以节省解码 CPU。

详细的参数可参见用户手册中会议相关内容

成员参数

在成员入会时,可以预设一些参数,也影响他们在会议中的状态。如:

  • 成员入会后自动静音。
  • 成员入会后自动关闭摄像头。
  • 成员设为“管理员”,可以有会议的操控权限
  • 成员设为“Floor”,自动占据 Floor 的位置(主画面)。
  • 详细的会议参数

除此之外,成员还有一些运行时的属性,这些属性有些是系统内部用的。如:

  • ghost:幽灵成员,系统内部使用,非正常成员。
  • is_moderator:是否是管理员,管理员
  • kicked:该成员是否被踢出。
  • video:成员是否有视频。
  • end_conference:成员是否有结束会议标志,会议中,最后一个具有该标志的成员离开会议后,会议会自动结束。

画布布局

在视频会议中,可以事先指定或动态切换画布布局。关于画布布局,详见视频一节。

XSwitch 支持自动画布布局,即事先可以选定一组布局,XSwitch 会根据与会者人数自动切换布局,如:

  • 会议室中只有一人时使用1x1画面
  • 会议室中有两人时使用2x1画面
  • 会议室中有 3-4 人时使用2x2画面
  • 会议室中有 5-9 人时使用3x3画面
  • 会议室中有 100 人时使用10x10画面

也可以使用固定布局,超出布局容纳人数后,部分成员将不显示。

关闭视频的人也不显示在画布上。

会议中操作

  • 切换画布布局
  • 将成员静音
  • 将成员踢出
  • 关闭成员视频
  • 将成员倒立(翻转)
  • 禁听:成员听不到任何内容
  • 推流:将视频推送到流媒体服务器(如推送到微信视频号)
  • 其他

会议场景

以视频会议为例。

  • 会议中有一个画布,可以设置画布的背景色、背景图片能参数。
  • 画布可以事先设置固定的布局,如2x23x3等,也可以使用“自动”布局,根据与会者人数自动切换相应的布局,如group:grid就是自动布局,它包含1x110x10共 10 种布局,会根据参会人数自动变化。
  • 所有参会人员都显示在画布上。如果将某人的视频关掉(或他自己关掉),则如果在设置了video-mute-exit-canvas的情况下,该成员会从画布上移除,否则,会显示一个默认的头像。
  • 画布布局上面有多个“层”(Layer),每个参会者会占据一个层,层可以平铺,也可以相互覆盖(Overlay)。
  • 有的画布布局中有floor=true参数,如1up+5布局,是典型的演讲者布局,演讲者(将其设为 Floor)占据屏幕中区域较大的位置。floor=true参数用于设置哪个位置是供 Floor 用的。
  • 有的画布布局允许预订位置,如1号位置供某位领导使用等,对应reservation参数。
  • 有的画布布局可以分配角色,具有相应角色的可以占据相应的位置,对应role参数。
  • 有些会议可以启用多画布,可以在会议中动态将成员移动(通过 API)到不同的画布上,也可以控制哪个成员观看些个画布(具有双流的成员可以同时观看两个画布)。
  • 在多画布情况下,可以事先设置哪个成员在呼入时自动放到哪个画布上,自动看哪个画布等。
  • 可以设置某位成员(一般是管理员),呼入后自动变成 Floor(从而占据大屏主位)。
  • 在会议中可以播放事先上传到服务器的视频文件,或远程视频流(如常用的直播 RTMP 流、监控摄像头 RTSP 流等)。
  • 在会议中可以录音、录像,多个录音、录像不冲突(目前系统 Web 界面上只允许录一个)。
  • 会议室可以被锁定,锁定后新成员无法入会。
  • 会议室成员列表可以动态广播,以便 Web 会控界面显示成员列表和当前的状态(如是否静音等)。
  • 会议中可以发送文字聊天,文字聊天可以自动记录到会议记录中。文字聊天在某些会控界面上也可以以弹幕方式呈现。
  • 会议中可以添加语音翻译机器人,可以自动进行语音识别生成会议记录。
  • 会议中,可以动态改变会议的画布大小、目标带宽、帧率等,可以动态修改与会者占据的画布、在画布上的位置、观看的画布等。
  • 会议中有一个特殊模式,可以通过命令(如点击某人的图像)将该成员图像放大,只看这一个人大图,不影响其它人员看到的内容。
  • 会议中可以开启自动轮循,自动以一定的间隔开、关成员的视频,达到轮流在画布上显示的效果。
  • 会议支持空间音频,支持立体声,在空间音频场景下,可以听到某人在你的左边、右边或前方讲话。
欢迎