会议议定书

本文旨在描述我们将在会议管理方面所做的发展 (音频/视频).目标是改进目前的实施,简单地将SIP电话合并并并提供网格视图,以显示参与者列表的位置,可以独立缓和,或视频布局改变 (只显示一个参与者)

定义

  • 主持人:是混合音频/视频流的用户

  • 参与者:会议上的每个用户,包括主持人

免责声明

目前,本文仅描述了第一步,这意味着将参与者和所有参与者发送的视频混合器中的位置进行识别.

可能的布局

  • 格里:每个成员均具有相同的高度/宽度

  • 缩小一个成员,显示另一个预览

  • 单_BIG:一个成员将全屏幕呈现

在CallManager中,可使用两个新的方法来管理会议布局:

/**
 * Change the conference layout
 * @param confId
 * @param layout    0 = matrix, 1 = one big, others in small, 2 = one in big
 */
void setConferenceLayout(const std::string& confId, int layout);

/**
 * Change the active participant (used in layout != matrix)
 * @param confId
 * @param participantId    If participantId not found, the local video will be shown
 */
void setActiveParticipant(const std::string& confId, const std::string& participantId);

实施

执行非常简单.所有操作都由: conference.cpp (将参与者链接到来源) 和: video_mixer.cpp (将所需布局呈现).

协调会议信息

注:实际上,参与者这个词用于会议中混合的调用.这可能会导致API的某些问题,并且必须在未来解决.

目的是通知所有参与者,即将显示的视频的元数据. 这意味着参与者在会议上是谁,视频在哪里.

如果参与者本身是会议,则应将其接入的布局信息合并,当将其发送给其他参与者时.

布局信息

布局是为客户端存储的VectorMapStringString,内部存储的是以下格式的向量:

Layout = {
    {
        "uri": "participant", "x":"0", "y":"0", "w": "0", "h": "0", "isModerator": "true"
    },
    {
        "uri": "participant1", "x":"0", "y":"0", "w": "0", "h": "0", "isModerator": "false"
    }
    (...)
}

可能的密钥是:

  • 乌里=账户的乌里

  • 设备 =设备的ID

  • 媒体 = 媒体的身份

  • 活动 = 如果参与者是活动的

  • 视频中的x =位置 (x)

  • 视频中的位置 (y)

  • 视频中的尺寸 (宽度)

  • 视频中的h = 尺寸 (高度)

  • 视频音 = 如果视频音

  • 音频LocalMuted = 如果音频是本地默默的

  • 音频调节器置 = 如果音频由调节器置

  • 如果是调节者

  • 举起手 = 如果举起手

  • 语音活动 = 如果流有语音活动

  • 录音 = 如果同行正在录音会议

新的API

采用新的方法 (在CallManager中) 和新的信号来获得当前会议信息和更新:

VectorMapStringString getConferenceInfos(const std::string& confId);

void onConferenceInfosUpdated(const std::string& confId, const VectorMapStringString& infos);

实施

Conference]]对象 (只存在于我们混合调用,这意味着我们是主机) 根据每个 Call`对象的布局信息来管理整个会议的信息. getConferenceInfos将直接从这个对象中获取信息.

因此,每个调用物体现在都有一个配置信息,如果更新,请要求会议物体更新其信息.

会议主持人通过SIP道发送信息,以以下类型的MIME信息:

所以,如果一个电话收到一些信息, 我们知道这个电话是会议的成员.

通调用管理收到的布局, 会议管理的发送布局.

改变会议的状态

为了改变会议的状态,参与者需要发送主机处理的命令.

协议需要:

会议的内容是:

  • 参与者的身份的账户

  • 设备,因为每个帐户可以通过多个设备连接

  • 媒体,因为设备可以有多个视频 (例如1台相机和1台屏幕共享)

为了节约带宽,客户应该能够同时发送多个订单.

总行动

为了改变布局,调节者可以发送一个用量,以”应用程序/confOrder+json”为类型:在0是网格, 1是一个大用户,其他小用户, 2是一个大用户

账户的行为

现在没有支持的行动,但在未来 调节者:应处理 true/false 来更换调节者.

设备的操作

  • hangup: true 取决于会议上的设备 (仅供调节者)

  • raisehand: true/false 升动手的状态改变. 只有设备本身才能做到,否则会掉下来.

媒体的行动

  • muteAudio只有调节者才能置参与者的音频

  • muteVideo尚未支持.

  • active 标记媒体为活跃.

  • 语音活动表示媒体流的语音活动状态 (仅适用于音频)

举例

因此, 申请/confOrder+json将包含:

{
    "989587609427420" : {
        "moderator": true/false,
        "devices": {
            "40940943604396R64363": {
                "hangup": true,
                "raisehand": true/false,
                "media":{
                    "3532532662432" : {
                        "muteAudio": true/false,
                        "muteVideo": true/false,
                        "active": true/false,
                        "voiceActivity": true/false
                    }
                }
            }
        }
    },
    "layout": 0/1/2,
}

注意:媒体类型应包含在会议信息中,可用于客户端改善显示 (例如不要切割屏幕共享)

控制调节者

实际上有3种可能性:

  • 换账户配置添加调节者列表 (在config.yml (defaultModerators可以包含默认调节者的列表)

  • 如果是正确的,则设备的所有帐户将是调节者

  • 如果所有调节者被启动是真的,

未来

  • 单独的流域,让更多的控制?

备注/评论

现在,我们需要一个版本的字段,如果这个字段没有,我们会识别旧版本.