集成会议功能
1.简介
本文档描述了Windows 端集成会议功能的实现,集成会议主要会涉及到三个类:JCConference, JCConferenceInfo, JCparticipant。JCConference 用于管理会议的基本操作。JCConferneceInfo用于获取会议的基础属性(会议ID,会议主题等)。JCparticipant 用于管理会议的成员。在做会议相关操作前请先确认你已经初始化SDK和完成登录。
2.加入会议
和登录操作类似,会议界面需要继承多个监听类JCConference.JCEventListener, JCConference.JCParticipantListener, JCConference.JCVolumeListener,用来监听会议事件的通知,会议成员更新通知,和会议音量变化通知。
同样和登录操作类似,会议界面在初始化时也需要注册监听器调用:
JCConference.getInstance().registerJCEventListener(this); JCConference.getInstance().registerJCVolumeListener(this); JCConference.getInstance().registerJCParticipantListener(this);
加入会议统一调用以下接口
JCConference.getInstance().join(roomId, password, nickname);
roomId: 会议号 (如果存在此会议号则加入此会议,如果不存在则会创建这个会议号的会议)
password:会议密码
nickname:昵称(会议中使用的昵称)发起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; } }
和登录操作类似,会议相关操作结束后也需要取消注册的监听器
JCConference.getInstance().unregisterJCEventListener(this);
JCConference.getInstance().unregisterJCParticipantListener(this);
JCConference.getInstance().unregisterJCVolumeListener(this);
3.离开会议
离开会议调用以下接口
int leave();
发起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. 会议成员变化
- 当会议有新成员加入或者旧成员退出时,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.渲染本地视频和成员视频
请求成员视频调用以下接口
public abstract int requestVideo(string userId, int picSize);
userId: 对应成员ID
picSize: 对应分辨率大小(PICTURE_SIZE_LARGE, PICTURE_SIZE_SMALL, etc)渲染成员视频调用以下接口
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.开关语音发送
加入会议后默认是关闭语音的,此时会议中的成员是听不到该成员的声音的。开关语音需要调用以下接口
public abstract int enableLocalAudioStream(bool enable);
enable: 开启或关闭会议成员通过回调函数收到该成员的语音状态变化。然后更新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.开关视频发送
加入会议后默认是开启视频的,此时会议里的成员都能看到此成员的视频。开关视频需要调用以下接口:
public abstract int enableLocalVideoStream(bool enable);
enable: 开启或关闭会议成员通过回调函数收到该成员的视频状态变化。然后更新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() | 是否存在视频 |