技术规范

Runtime

  • NodeJs 14.16.0
  • npm 7.19.1
  • MeidaSoup 3.7.17

业务场景前端

  • Vue Cli 4.5.12
  • Vue 2.0
  • TypeScript 4.1.5

服务端

  • ws7.4.5
  • TypeScript 4.1.5

开发工具

  • Intellij IDEA

术语

通讯 本文泛指基于TCP、UDP协议的Socket通讯技术,包括但不限于基于Http协议的Web Socket、长连接。

通信 本文特指基于WebRTC技术实现的通信。

产品 在SFU模式中,发布者的媒体信息被抽象成一个产品。

订阅 在SFU模式中,由消费者获取一个产品时,称为订阅。

生产者 由端发布的媒体后形成的实例。

消费者 由端订阅媒体后产生的实例。

基本思路

服务端实现基本通讯、通讯协议、通信业务逻辑的拆分。

客户端实现基本通讯、通讯协议、单拨逻辑、组拨逻辑的拆分。

服务端

基本通讯
|-- 通讯协议
    |-- 通信业务(信令)
        |- 通信业务(实体)

客户端

基本通讯
|-- 通讯协议
    |-- 通信业务(双方通信)
    |-- 通信业务(多方通信)

服务端

基本通讯

服务端与客户端的通讯基于标准的WebSocket。服务端WebSocket依靠导入外部包实现。

通讯协议

通过json格式对通讯内容进行封装,包含ev(event name)、args(arguments)、ask(请求)、ans(响应)四个字段。

字段含义及作用如下:

  • ev 事件名称,用于触发服务端/客户端的监听事件。
  • args 事件参数,用于在触发服务端/客户端监听事件时,传入必须的参数。
  • ask 请求编号,用于执行异步的监听事件。客户端/服务器向服务器/客户端发送该字段时,由服务器/客户端封装一个单独的消息返回函数,仅包含ans和args字段,以便客户端/服务器执行返回的监听。
  • ans 响应编号,用于执行异步的监听事件。

通信业务

基础信令

用于维护客户端与服务器之间的连接、客户端的合法校验等等。

  • '''注册'''

用于客户端鉴权、支撑通信业务。由客户端主动向服务端发起,服务端监听register事件,接收用户id、鉴权信息两个字段。服务端收到客户端消息且鉴权成功后,将用户id与用户的socket实例做绑定。对于已存在的注册信息,关闭之前注册的socket实例,保留新的socket实例。服务端可以选择是否为用户发送注册结果。

  • '''心跳'''

用于维护客户端与服务端之间的通讯。由客户端主动向服务端发起,服务端监听ping事件,接收特定十六进制数0x9

双方通信信令
  • '''呼叫'''

由主叫发起,用于创建一个双方通信。服务端需判断被叫用户是否在线,判断用户是否正忙,满足可呼条件后,向被叫用户发起一双方通信呼叫请求。服务端同时需将主叫状态置忙。

  • '''接受'''

由被叫用户发起,用于通知主叫用户双方通信链接可以建立。服务端需将被叫置忙。

  • '''拒绝'''

由被叫用户发起,用于通知主叫用户双方通信链接已经被被叫拒绝。服务端需销毁主叫用户的生产者以及传输实例,同时将主叫状态置闲。

  • '''挂断'''

由通信双方任意一方发起,用于通知另一方双方通信已经结束。服务端需销毁主被叫用户的生产者、消费者以及传输实例。同时将主被叫状态置闲。

双方通信基础信令
  • '''创建WebRTC传输实例'''

用于创建一个WebRTC通讯的传输实例。传输方向分为发送和接收,因此,一个端需要创建两个传输实例,传输实例默认不连接到服务器。

  • '''执行传输实例连接'''

用于将端创建的传输实例连接到服务器。

  • '''创建生产者(生产产品)'''

用于端发布媒体。发布的媒体轨道即为一个生产者。一个媒体流若存在n个媒体轨道,则在不重复的情况下,最大可以创建n个生产者。

  • '''关闭生产者(销毁产品)'''

用于取消一个媒体的发布。

  • '''创建消费者(订阅产品)'''

用于获取一个已经发布的媒体。

  • '''恢复消费者传输(恢复订阅传输)'''

默认情况下,订阅产品时,为了使媒体的传输稳定有效。在端真正获取到产品之前,订阅是处于传输暂停状态的。这样做可以使视频媒体在获得到第一帧时,不至于获取到空帧导致视频效果出现闪烁、绿条等问题。

双方通信场景信令
  • '''查询全部双方通信'''

查询正在进行的全部双方通信业务。

  • '''查询指定双方通信'''

根据用户id查询用户正在参与的双方通信业务。

  • '''终止全部双方通信'''

终止服务器上的正在进行的全部双方通信业务。

  • '''终止指定双方通信'''

终止指定用户正在进行的双方通信业务。

多方通信信令
  • '''进群'''

用于端加入一个群组。服务端需创建用于执行语音视频业务的路由,并将该路由于群组信息绑定,同时需更新群组状态。

  • '''离群'''

用于端离开一个群组。服务器需销毁端创建的生产者、消费者以及传输实例,同时更新群组的状态。

  • '''通知生产者已创建'''

用于端在创建生产者后,通知群组内其他成员,可以订阅该生产者。

  • '''获取全部生产者'''

用于端在初次进群时,查询群内已有的生产者信息。

多方通信基础信令

以下描述参考"双方通信基础信令"描述的内容

  • 创建WebRTC传输实例
  • 执行传输实例连接
  • 创建生产者(生产产品)
  • 关闭生产者(销毁产品)
  • 创建消费者(订阅产品)
  • 恢复消费者传输(恢复订阅传输)
多方通信场景信令
  • '''设置场景'''

当具有频道管理权限的用户进入频道时,频道场景可依据管理人员设定进行变换。支持以下场景:

  1. 自由发言。所有在频道内的用户可以自由发言
  2. 自由开麦。所有在频道内的用户保持默认闭麦,可以通过发言按钮自由发言,不限制发言人数。
  3. 平等抢麦。所有在频道内的用户保持默认闭麦,可以通过发言按钮进行发言,当存在用户发言时,只能等待用户发言完毕后才能发言。
  4. 权限抢麦。所有在频道内的用户保持默认闭麦,可以通过发言按钮进行发言,用户角色权限大的用户将使正在发言的低权限用户闭麦,高权限用户发言,低权限用户无发言权力。
  5. 全体禁言。所有在频道内的低权限用户保持默认闭麦状态,高权限用户具有通过发言按钮进行发言的权力。
  6. 范围禁言。禁止指定权限范围的用户发言。
  • '''摘机'''

用于抢麦的群组场景,摘机后用户可发言。

  • '''挂机'''

用于抢麦的群组场景,挂机后用户不可发言。

  • '''查询全部多方通信'''

查询服务器上当前正在进行的全部多方通信信息。

  • '''查询指定多方通信'''

若指定用户id,查询用户参与的多方通信及参与多方通信的用户。若指定群组id,查询群组id查询参与多方通信的用户。

  • '''终止指定多方通信'''

若指定用户id,终止用户的多方通信状态。若指定群组id,终止整个多方通信。

客户端

基本通讯

客户端与服务端的通讯基于标准的WebSocket。WebSocket实现由浏览器提供。

通讯协议

参考"服务端-通讯协议"的内容。

通信业务

  • 注册

创建客户端实例时,会自动向服务器进行注册。客户端注册后,应同时监听call(呼叫)事件,以便接收来自于服务器的双方通信信令。

  • 心跳

创建客户端实例时,会自动触发心跳方法,客户端内部监听pong事件,接收特定十六进制数0xa。由业务内部自行维护。

双方通信
  • '''呼叫'''

用于呼叫一个用户。

  • '''接受'''

用于接收一个来自于主叫的呼叫。

  • '''拒绝'''

用于拒绝一个来自于主叫的呼叫。

  • '''挂断'''

用于挂断一个已存在的通话。

''其余双方通信业务参考:双方通信场景信令''

多方通信
  • '''进群'''

用于进入一个群组。

  • '''离群'''

用于离开一个群组。

  • '''创建生产者'''

用于发布媒体。

  • '''废除生产者'''

用于取消一个已经发布的媒体。

  • '''创建消费者'''

用于订阅一个媒体。

  • '''获取群组生产者'''

用于获取群组内已经创建的生产者信息。

''其余多方通信业务参考:多方通信场景信令''