集成会议功能

1.简介

本文档描述了Windows 端集成会议功能的实现,集成会议主要会涉及到三个类:JCConference, JCConferenceInfo, JCparticipant。JCConference 用于管理会议的基本操作。JCConferneceInfo用于获取会议的基础属性(会议ID,会议主题等)。JCparticipant 用于管理会议的成员。在做会议相关操作前请先确认你已经初始化SDK和完成登录

2.加入会议

  1. 和登录操作类似,会议界面需要继承多个监听类JCConference.JCEventListener, JCConference.JCParticipantListener, JCConference.JCVolumeListener,用来监听会议事件的通知,会议成员更新通知,和会议音量变化通知。

  2. 同样和登录操作类似,会议界面在初始化时也需要注册监听器调用:
    JCConference.getInstance().registerJCEventListener(this); JCConference.getInstance().registerJCVolumeListener(this); JCConference.getInstance().registerJCParticipantListener(this);

  3. 加入会议统一调用以下接口
    JCConference.getInstance().join(roomId, password, nickname);

    roomId: 会议号 (如果存在此会议号则加入此会议,如果不存在则会创建这个会议号的会议)
    password:会议密码
    nickname:昵称(会议中使用的昵称)

  4. 发起Join后,SDK会回调界面的事件监听函数,界面可以根据不同的事件实现更新
    JCEventPosted(int eventName, int eventCode);
    eventName:监听的事件名
    eventCode: 监听的事件代码(具体的事件名和代码请参考监听会议相关事件接口)
    具体函数关键代码如下

    public void JCEventPosted(int eventName, int eventCode)
    {
        switch (eventName)
        {
        //如果接收到会议加入事件
        case EVENT_CONF_JOIN:
            //判断触发事件的原因是“加入成功”
            if (eventCode == REASON_JOIN_OK)
            {
                //加入成功后UI做的操作
            }
            else
            {
                //加入失败事件后UI做的操作
            }
            break;
            //如果接收到会议结束事件
        case EVENT_CONF_END:
            //接收到会议结束事件后UI做的操作
            break;
        //如果接收屏幕共享事件
        case EVENT_CONF_SCREEN_SHARE:
            //接收到屏幕共享事件后UI做的操作
            break;
        }
    }
    
  5. 和登录操作类似,会议相关操作结束后也需要取消注册的监听器

JCConference.getInstance().unregisterJCEventListener(this);
JCConference.getInstance().unregisterJCParticipantListener(this);
JCConference.getInstance().unregisterJCVolumeListener(this);

3.离开会议

  1. 离开会议调用以下接口
    int leave();

  2. 发起leave后,SDK会回调界面的事件监听函数,界面实现更新

   public void JCEventPosted(int eventName, int eventCode)
   {
       switch (eventName)
       {
           ...
           //接收到会议结束事件后UI做的操作
           case EVENT_CONF_END:
           //判断如果是正常退出
           if (eventCode == REASON_END_QUIT)
           {
               //停止摄像头
               stopCamera();
               ...
           }
           //判断如果是由于断网的退出
           else if (eventCode == REASON_END_OFFLINE)
           {
               //UI做的操作
           }
           break;
           ...
       }
   }

4. 会议成员变化

  1. 当会议有新成员加入或者旧成员退出时,SDK会回调界面的成员更新事件监听函数:
    public void JCParticipantUpdated(string userId, int eventName, int eventCode)
    {
        switch(eventName)
        {
            //接收到有新成员加入会议的事件
            case EVENT_PARTP_JOIN
            //UI更新
            ...
            break;
            ...
            //接收到有成员退出会议的事件
            case EVENT_PARTP_LEAVE
            //UI更新
            ...
            break;
        }
    }
    

5.渲染本地视频和成员视频

  1. 请求成员视频调用以下接口

    public abstract int requestVideo(string userId, int picSize);
    

    userId: 对应成员ID
    picSize: 对应分辨率大小(PICTURE_SIZE_LARGE, PICTURE_SIZE_SMALL, etc)

  2. 渲染成员视频调用以下接口
    public abstract void startRender(ZmfImageSource view, string userId, int renderMode);

    view: 渲染的view

    userId: 渲染的用户ID

    renderMode: 渲染的方式(RENDER_MODE_FULLCONTENT, RENDER_MODE_FULLSCREEN, etc)

    离开会议后需要调用 stopRender(ZmfImageSource view) 释放内存。
    切换不同成员视频需要先stopRender原先的视频然后再渲染切换的成员视频。
    切换不同的分辨率只需请求新的分辨率的视频,无需重新渲染。

6.开关语音发送

  1. 加入会议后默认是关闭语音的,此时会议中的成员是听不到该成员的声音的。开关语音需要调用以下接口
    public abstract int enableLocalAudioStream(bool enable);enable: 开启或关闭

  2. 会议成员通过回调函数收到该成员的语音状态变化。然后更新UI状态

    public void JCParticipantUpdated(string userId, int eventName, int eventCode)
        switch(eventName)
        {
            ...        
            //接收到成员状态变化
            case EVENT_PARTP_STATE_CHANGED
                //获取此用户
                JCParticipant participant = JCConference.getInstance().getParticipant(userId);
                if(participant.hasAudio() && participant.IsPermitAudio)
                {
                    //此成员有语音时,UI的状态更新
                }
                else
                {
                    //此成员无语音时,UI的状态更新
                }
                break;
            ...
        }
    }
    

7.开关视频发送

  1. 加入会议后默认是开启视频的,此时会议里的成员都能看到此成员的视频。开关视频需要调用以下接口:
    public abstract int enableLocalVideoStream(bool enable); enable: 开启或关闭

  2. 会议成员通过回调函数收到该成员的视频状态变化。然后更新UI的状态:

public void JCParticipantUpdated(string userId, int eventName, int eventCode)
    switch(eventName)
    {
        ...        
        //接收到成员状态变化
        case EVENT_PARTP_STATE_CHANGED
            //获取此用户
            JCParticipant participant = JCConference.getInstance().getParticipant(userId);
            if(participant.hasVideo() && participant.IsPermitVideo)
            {
                //此成员有视频时,UI的状态更新
            }
            else
            {
                //此成员无视频时,UI的状态更新

            }
            break;
        ...
    }
}

8.监听会议相关事件接口

事件名称(数值) 说明
EVENT_CONF_JOIN(1) 会议加入相关
EVENT_CONF_END(2) 会议结束相关
EVENT_CONF_SCREEN_SHARE(3) 会议屏幕共享相关
EVENT_CONF_TITLE(4) 会议标题修改相关
EVENT_CONF_ATTR_CHANGED(5) 会议属性修改相关
EVENT_CONF_ERROR(6) 会议错误相关

触发某个事件后都有各自的触发事件原因,界面可以根据不同的触发原因更新状态,比如以下是触发加入会议事件的原因:

触发加入会议事件的原因(数值) 说明
REASON_JOIN_OK(1) 加入成功
REASON_JOIN_FAIL_NOT_EXIST(2) 加入失败(会议不存在)
REASON_JOIN_FAIL_FULL(3) 加入失败(会议已满)
REASON_JOIN_FAIL_INVALID_PASSWORD(4) 加入失败(密码无效)
REASON_JOIN_FAIL_TIMEOUT(5) 加入失败(长时间未响应)

9.监听成员变化相关事件接口

事件名称(数值) 说明
EVENT_PARTP_JOIN(0) 成员加入
EVENT_PARTP_LEAVE(1) 成员离开
EVENT_PARTP_STATE_CHANGED(2) 成员状态变化(声音视频等状态)
EVENT_PARTP_ROLE_CHANGED(3) 成员角色变化
EVENT_PARTP_KICK(4) 成员剔除
EVENT_PARTP_INVITE(5) 成员邀请

10.成员对象常用属性

属性名称 说明
public string UserUri 成员URL
public string UserId 成员ID
public int UserType 成员类型
private bool isLocal 成员是否是本地
public bool hasAudio() 是否存在音频
public bool hasVideo() 是否存在视频