会捷通客户端 SDK (electron 版) 开发文档
会捷通客户端 SDK (electron 版) 开发文档
更新记录
日期 | 更新内容 | 文档版本 |
---|---|---|
2020 年 9 月 21 日 | 创建文档 | V 1.4.0 |
2020年 11 月 23 日 | 发布新版本 | V 1.4.2 |
发版说明
1.4.2
- Demo 中增加主讲模式布局,以及布局模式切换功能
- Addon 和 Demo 增加发送屏幕共享功能
概述
会捷通客户端 SDK 是⼀款视频会议终端开发套件,开发者可以利⽤本 SDK 开发出具有清晰流畅的⾳视频体验和⾼清内容协作的⾳视频会议终端应用。
会捷通客户端 SDK 具备强⼤的⽹络适应性,和独特的⾳视频抗⽹络丢包算法,配合会捷通云视讯平台使⽤,可以保证在 30% ⽹络丢包环境下视频依然清晰流畅,即使⽹络丢包⾼达 50%,依然可以保证⾳频通畅。 会捷通客户端 SDK 提供了丰富,⽽且简单易⽤的 API 接⼝。开发者不需要掌握丰富的⾳视频和信令相关知识,也可以使⽤本 SDK 开发出专业的视频会议软终端应用。 本⽂档详细介绍了 SDK 的各项功能,以及它们的使⽤⽅法。
系统要求
- 操作系统要求:Windows 10
- 计算机配置推荐
- 低级性能配置:Intel i3-8100 同级别处理器,4G 内存
- 中级性能配置:Intel i5-8250 同级别处理器,8G 内存
- 高级性能配置:Intel i5-9600K 同级别或高级别处理器,16G 内存
典型系统集成方案
如果您开发的产品包含客户端应用和业务服务系统,需要为系统加入音视频通讯能力时,那么您只需要在客户端集成会捷通 SDK,同时通过您的业务服务系统和会捷通平台服务 (我们的公有云服务或者您自建的私有化部署会捷通平台) 进行集成。
- 客户端 App 集成会捷通 SDK,通过会捷通 SDK 实现客户端建立音视频呼叫的功能
- 业务服务系统通过使用会捷通平台的 REST API 使用平台提供的功能,包括创建会议、管理会议等。
一个典型的业务流程示例
下图简要说明了一个典型的业务流程
- 客户端 App 启动,进行会捷通 SDK 的初始化设置
- 客户端 App 向自己的业务系统申请创建一个视频会议
- 业务系统使用会捷通平台 API 创建一个视频会议,并把创建出的会议号码返回给客户端 App
- 客户端 App 调用会捷通 SDK 的接口方法加入到这个会议
- 客户端 App 调用会捷通 SDK 的接口方法离开会议
会捷通平台提供了丰富的 API 接口,您的业务系统可以根据需要选择使用。比如,在上边的例子中,可以在会议进行中通过 API 接口进行对与会者静音、开始录制会议等会议控制操作。
Electron 环境搭建
安装 Node.js
从官网 (https://nodejs.org/en/download/) 下载安装包,安装的版本需要与 Electron 的版本里面使用的 V8 版本匹配,目前 EVSDK 支持的版本是 32 位,EVSDK Demo 中使用的 Electron 版本是 v8.1.1,推荐下载 nodes.js 的版本是 v12.16.3 的 32 位版本。
在安装过程中的配置界面, 请勾选Node.js runtime
、npm package manager
和Add to PATH
这三个选项。
安装完成后,我们需要来确认Node.js是不是可以正常工作。 点击 开始 按钮,输入PowerShell
,找到 Windows PowerShell。 打开 PowerShell 或其他你喜欢的命令行客户端后,通过以下命令来确认 node
和 npm
已经安装成功:
node -v
npm -v
安装 Yarn
通过如下命令安装 yarn
npm i yarn -g
yarn -version
安装 Electron
示例代码下载
git clone https://e.coding.net/hexmeet/evsdk-electron-demo/EVSDK-Electron-Demo.git
Web 浏览 https://hexmeet.coding.net/public/evsdk-electron-demo/EVSDK-Electron-Demo/git
下载示例 EVSDK-Electron-Demo 后, 在 PowserShell 中 cd 到目录 EVSDK-Electron-Demo 中,执行下面命令,完成安装
yarn
安装成功后,可以执行下面命令来启动示例
yarn electron:serve
API 接口列表
初始化和释放
接口 | 接口描述 |
---|---|
initialize(configPath, configFileName) | 初始化 SDK |
release() | 释放SDK |
setRootCA(root_ca_path) | 设置 rootca 文件路径 |
setUserImage(background_file_path, user_image_path) | 设置用户头像和入会后显示的背景图像 |
enableSecure(enable) | 使用SSL加密网络传输 |
日志
接口 | 接口描述 |
---|---|
setLog(level, log_path, log_file_name, max_file_size) | 设置log输出级别,路径和最大文件大小 |
enableLog(enable) | 开启日志 |
用户登录登出
接口 | 接口描述 |
---|---|
loginWithLocation(locationServer, port, username, encryptedPassword) | 登录 |
logout() | 退出登录 |
encryptPassword(password) | 加密方法 |
std::string descryptPassword(EV_DESCRYPT_TYPE type, const char * password, const char* akey, const char* iv); | 解密方法 |
int downloadUserImage(const char * path); | 下载用户头像到本地 |
int uploadUserImage(const char * path); | 上传用户头像到服务器 |
int changePassword(const char * encrypted_oldpassword, const char *encrypted_newpassword); | 修改密码 |
会议能力设置
接口 | 接口描述 |
---|---|
setMaxRecvVideo(num) | 设置可以接收的最大入会视频流数量 |
enableContent(enable) | 设置会议中是否允许发送或接收双流 |
contentEnabled() | 查询会议中是否有发送或接收双流的能力 |
enableContentHighFPS(enable) | 设置会议中是否发送高清双流 |
contentHighFPSEnabled() | 获取当前设置的是帧率优先还是清晰度优先 |
highFPSEnabled(); | 获取当前是否是帧率优先 |
enableHighFPS(enable); | 设置视频会议中帧率优先 |
enableHD(enable); | 设置视频会议中高清优先 |
HDEnabled(); | 获取当前设置是否是高清优先 |
setBandwidth(kbps) | 设置视频会议的带宽 |
getBandwidth() | 获取设置的视频会议带宽 |
会议通讯
接口 | 接口描述 |
---|---|
joinConference(conferenceNumber, displayName, password) | 加入会议 |
joinConferenceWithLocation(location_server, port, conference_name, name_type, display_name, password) | 匿名入会 |
leaveConference(); | 离开会议 |
会议操作
接口 | 接口描述 |
---|---|
cameraEnabled(); | 获取会议中摄像头打开/关闭状态 |
enableCamera(enable) | 打开/关闭摄像头 |
switchCamera() | 切换摄像头 |
micEnabled() | 获取麦克风打开/关闭状态 |
enableMic(enable) | 打开/关闭麦克风 |
remoteMuted() | 获取会控服务器的静音状态 |
requestRemoteUnmute(val) | 请求会控服务器解除静音 |
setVideoActive(active) | 会议中切换视频模式和语音模式 |
videoActive() | 获取当前是视频模式还是语音模式 |
会议视频流窗口设置
接口 | 接口描述 |
---|---|
setLocalVideoWindow(view?: Element): number | 设置本地视频窗口渲染位置 |
setRemoteVideoWindow(idx: number, view?: Element): number | 设置远端视频窗口渲染位置 |
setRemoteContentWindow(view?: Element): number | 设置接受双流的渲染窗口位置 |
resizeRender(streamType: number, isRemote: number, idx: number) | 当渲染窗口发生变化时,调用这个接口来更新渲染区域。 |
会议视频流布局
接口 | 接口描述 |
---|---|
setLayoutCapacity( mode: number, types: Array <Int32Array> , size: number): number | 设置分屏的能力集 |
setLayout(mode: number): number | 设置布局样式 |
setRecvVideo(num: number, max_resolution_width: number, max_resolution_height: number) | 设置会议中收到的People内容源的最大路数 |
会议内容流(双流)
接口 | 接口描述 |
---|---|
sendContent(): number | 开始发送双流 |
stopContent(): number | 停止发送双流 |
int enableContentAudio(bool enable) | 发送双流时同时发送声音 |
enableContentAudio(enable: boolean): number | 获取是否发送双流声音的设置 |
setLocalContentSource(windowtitle: string, windowid: number): number | 发送选择的内容流窗口 |
设备操作
接口 | 接口描述 |
---|---|
int EVEngine::setAudioFile(const char * play_file) | 设置播放声音文件 |
int startAudioPlay() | 开始播放声音 |
stopAudioPlay() | 停止播放声音 |
EVVolume getVolume(EV_DEVICE_TYPE type) | 获取当前音频设备音量 |
int setVolume(EV_DEVICE_TYPE type, EVVolume & vol) | 设置选中音频设备的音量 |
getDevices(type: number): Array<object> | 获取当前所有可以连接的设备列表 |
setDevice(type: number, id: number): void | 选中指定的设备 |
getDevice(type: number): object | 获取当前已经选中的设备 |
网络状态统计
接口 | 接口描述 |
---|---|
getNetworkQuality(): number | 获取网络信号强度 |
getStats(): object | 获取视频流统计信息 |
开发入门
初始化 SDK
使用 EVSDK 时,需要 import EVSDK Electron module。比如demo中的
import EVEngine from '@/assets/libs/electron-evsdk/evsdk/Api'
evsdk在使用过程中,应该始终保持一个单例,以便维持登录状态和会议session。初始化的时候,需要传入配置文件的路径,用来记录一些用户配置。注册回调函数subscribeEvents,用来接受来自evsdk的回调。
getRtcEngine() {
if (!this.rtcEngine) {
this.rtcEngine = new EVEngine()
this.rtcEngine.initialize('.', 'config')
this.subscribeEvents(this.rtcEngine)
window.rtcEngine = this.rtcEngine
}
return this.rtcEngine
}
subscribeEvents(rtcEngine) {
rtcEngine.on('onError', error => {
console.log('[sdkUtils.onError]: ', user)
})
rtcEngine.on('onLoginSucceed', user => {
console.log('[sdkUtils.onLoginSucceed]: ', user)
})
rtcEngine.on('onDownloadUserImageComplete', path => {
console.log('[sdkUtils.onDownloadUserImageComplete]: ', path)
})
rtcEngine.on('onRegisterInfo', (state, errcode, errmsg) => {
console.log('[sdkUtils.onRegisterInfo]: ', state, errcode, errmsg)
})
rtcEngine.on('onCallState', info => {
console.log('[sdkUtils.onCallState]: ', info)
})
rtcEngine.on('onContentState', info => {
console.log('[sdkUtils.onContentState]: ', info)
})
rtcEngine.on('onJoinConferenceIndication', info => {
console.log('[sdkUtils.onJoinConferenceIndication]: ', info)
})
rtcEngine.on('onRecordingIndication', (state, live) => {
console.log('[sdkUtils.onRecordingIndication]: ', state, live)
})
rtcEngine.on('onMessageOverlay', msg => {
console.log('[sdkUtils.onMessageOverlay]: ', msg)
})
rtcEngine.on('onLayoutIndication', info => {
console.log('[sdkUtils.onLayoutIndication]: ', info)
})
rtcEngine.on('onLayoutSiteIndication', info => {
console.log('[sdkUtils.onLayoutSiteIndication]: ', info)
})
rtcEngine.on('onLayoutSpeakerIndication', (name, speakerIndex) => {
console.log('[sdkUtils.onLayoutSpeakerIndication]: ', name, speakerIndex)
})
rtcEngine.on('onMicMutedShow', micMuted => {
console.log('[sdkUtils.onMicMutedShow]: ', micMuted)
})
rtcEngine.on('onWhiteBoardIndication', (type, authServer, server) => {
console.log('[sdkUtils.onWhiteBoardIndication]: ', type, authServer, server)
})
rtcEngine.on('onDeviceAdded', device => {
console.log('[sdkUtils.onDeviceAdded]: ', device)
})
rtcEngine.on('onDeviceRemoved', device => {
console.log('[sdkUtils.onDeviceRemoved]: ', device)
})
}
日志设置
EVSDK 会持续收集日志,打开日志收集需要做以下设置,可以设置log文件名字和大小。
getRtcEngine()->setLog(1, "./", "evsdk", 20 * 1024 * 1024);
getRtcEngine()->enableLog(true);
rootca 文件
添加 rootca.pem 文件,将⽂件拷⻉到某目录下边,设置给 SDK。
getRtcEngine()->setRootCA("./rootca.pem");
如果不设置rootca,加密的注册会失败。
设备设置
SDK 提供方法来让用户选择自己的设备,具体如下
获取当前设备的列表
devices1 = getRtcEngine()->getDevices(0);
devices2 = getRtcEngine()->getDevices(1);
devices3 = getRtcEngine()->getDevices(2);
获取当前已经选中的设备
device1 = getRtcEngine()->getDevice(0);
device2 = getRtcEngine()->getDevice(1);
device3 = getRtcEngine()->getDevice(2);
设置呼叫基本能力
带宽
SVC 可以设置2M到4M带宽
bandwidth = 2048;
具体带宽设置需要根据使用场景的网络情况设定。
getRtcEngine()->setBandwidth(bandwidth);
接收视频流的数量上限
int const maxRxCount = 16;
getRtcEngine()->setMaxRecvVideo(maxRxCount);
登录
用户正常登录
/**
用户定位登录(包含定位跟登录)
@param location_server 定位服务器
@param port 端口号
@param username 用户名
@param password 密码
@return 返回API结果
*/
getRtcEngine()->loginWithLocation(location_server, port, username, encrypted_password) ;
/** 登录后会收到SDK以下回调 */
//定位或者登录错误会回调
rtcEngine.on('onError', error => {
})
//登录成功会回调
rtcEngine.on('onLoginSucceed', user => {
})
匿名方式入会
匿名登录方式仅用于匿名呼叫的场景,在用户没有登录的情况下,直接入会。
/**
用户执行匿名登录入会
@param location_server 定位服务器
@param port 端口号
@param conference_name 会议号码
@param name_type 参考EV_SVC_CONFERENCE_NAME_TYPE, 如果conference_name是会议号码,则此处设置EV_SVC_CONFERENCE_NAME_ID
@param display_name 用户在会议中的名称
@param password 会议密码
@return 返回 SDK 处理结果
*/
getRtcEngine()->joinConferenceWithLocation(location_server, port, conference_name, name_type, display_name, password)
窗口设置
添加图片说明
EVSDK视频窗口分为三类: 远端主流窗口,本地视频窗口,内容流窗口 (辅流或双流)
远端窗口设置
如上图所示,画面中显示了接收到的远端窗口视频,每一个格子就是一路远端窗口,上图中有九个远端窗口,UI需要设置一个窗口列表给SDK,然后由SDK负责把接收到的视频流解码渲染到窗口上。UI首先需要设置最大要接收的远端窗口数量,然后再设置这些窗口dom所在的位置。
int const maxRxCount = 16; getRtcEngine()->setMaxRecvVideo(maxRxCount); for (let i = 0; i < this.maxRemoteVideo; i++) { const id = `remote-video-${i}` let el = document.getElementById(id) window.rtcEngine.setRemoteVideoWindow(i, el) }
本地窗口设置
本地窗口是指本地的摄像头采集到的视频图像。
this.localVideoContainer = document.getElementById('local-video-container') window.rtcEngine.setLocalVideoWindow(this.localVideoContainer)
内容窗口设置
内容窗口是指别的与会者发送的内容共享,设置内容窗口,SDK会把接收到的内容流画到这个窗口上。
this.contentContainer = document.getElementById('content-container') window.rtcEngine.setRemoteContentWindow(this.contentContainer)
实现视频通话
视频通话主要分为两种,一种是匿名入会(参考登录模块的匿名登录入会),一种是用户登录后入会
设置用户入会后的头像以及视频背景图片(关闭摄像头所展示的图片)
/** 设置会议中用户的头像以及背景图片 @param background_file_path 背景图片 @param user_image_path 用户图片 @return */ window.rtcEngine.setUserImage(background_file_path, user_image_path)
用户登录后主动入会
/** 用户加入会议 @param conference_number 会议号码 @param display_name 会议中显示的名称 @param password 会议密码 @return */ window.rtcEngine.joinConference(conference_number, display_name, password); //注:会议如果没有密码可以不用给SDK传值,不传display_name则SDK会取用户名称当作会议名称
当调用了入会的 API 后,UI 会收到 SDK 回调:入会成功、入会失败,需要做出处理。
rtcEngine.on('onCallState', info => { console.log('[sdkUtils.onCallState]: ', info) })
分屏模式
分屏模式指的是应用的 UI 如何为接收到的远端视频做布局展示。典型分屏样式有:主讲视图 (即一大多小布局) 和画廊视图 (平均大小布局)。当布局样式为主讲视图时,一般希望大窗口显示的视频流分辨率比较其他远端视频流更高,而当布局样式为画廊视图时,一般希望每个视频流的分辨率尽量一致。因此,在 UI 需要改变布局样式时,需要通知 SDK,这样 SDK 可以根据需要向平台发出相应请求,告知平台 UI 希望呈现的分屏布局样式,从而平台可以尽量提供满足 app 需要的视频流。
另外,当平台侧通过会议控制,对分屏进行改变时,SDK 也会接收到变化通知,此时 SDK 通知 UI 分屏模式发生了何种变化,UI 应该根据变化的样式进行对应的布局改变。
相关细节可参考 API 的布局类型、分屏样式请求和布局变化事件回调部分。
- 主讲视图 (一大多小布局) 实现示例
主讲视图模式
/**
设置视频模式(主讲模式、画廊模式)
@param mode 取值可参考EV_LAYOUT_MODE
@return
*/
setLayout(mode: number)
//示例代码里主讲视图模式下
window.rtcEngine.setLayout(2);
- 画廊视图 (平均大小布局) 实现示例
画廊视图模式
/**
设置视频模式(主讲模式、画廊模式)
@param mode 取值可参考EV_LAYOUT_MODE
@return 返回结果
*/
下面示例代码设置画廊模式
window.rtcEngine.setLayout(1);
静音和解除静音
执行本地麦克风开启或者关闭
/**
是否启用麦克风
@param enable true为开启, false为关闭
@return
*/
//示例代码
1.关闭麦克风
window.rtcEngine.enableMic(false);
2.开启麦克风
window.rtcEngine.enableMic(true);
关闭或打开本地视频
执行本地摄像头开启或者关闭
/**
是否启用摄像头
@param enable true为开启, false为关闭
@return
*/
//示例代码
1.关闭摄像头
window.rtcEngine.enableCamera(false);
2.开启摄像头
window.rtcEngine.enableCamera(true);
接收和显示共享内容
收到共享,发送共享或者共享结束, SDK 都会通过回调的形式告诉UI。
/**
接收到内容分享或者内容分享结束的回调
@param info 可以参考ts文件中接口EVContentState
*/
rtcEngine.on('onContentState', info => {
console.log('[sdkUtils.onContentState]: ', info)
})
发送共享内容
发送共享主要需要以下步骤:
- 首先通过 getContentSourceList 获取可以共享的内容源列表供用户选择。
- 然后通过 setLocalContentSource 将选择的内容源设置给SDK。
- UI 之后调用 sendContent 来请求发送内容流视频,如果平台协商一致同意当前终端发送内容源,会收到 onCallState, 回调。
window.rtcEngine.sendContent();
接收到分屏变化通知时应如何处理
rtcEngine.on('onLayoutIndication', info => {
console.log('[sdkUtils.onLayoutIndication]: ', info)
})
//当参会人数发生改变时,比如有人参会,有人离开会议;或者speaker布局下,主讲人发生改变时,会得到这个通知,此时,UI需要重新布局所有窗口。
//EV_LAYOUT_MODE mode; 当前应该展示的布局模式。
//EV_LAYOUT_MODE setting_mode;服务器当前使用的布局模式。
//EV_LAYOUT_TYPE type; 当前应该展示的布局具体类型。
//bool mode_settable; 服务器的设置,用来通知客户端是否可以改变布局模式。
//speaker_name; 主讲人名字
//speaker_index; 主讲人所在窗口的下标
//sites_size; 一共有多少个可展示窗口
// EVSite sites[EV_LAYOUT_SIZE]; 可展示窗口的数组。
}
rtcEngine.on('onLayoutSiteIndication', info => {
console.log('[sdkUtils.onLayoutSiteIndication]: ', info)
})
//当前展示的窗口属性发生变化时会得到这个通知,比如某个参会人名字或audio mute状态发生改变,通过device_id可以查找是哪个参会人发生了改变。UI需要更新相应的窗口状态。
rtcEngine.on('onLayoutSpeakerIndication', info => {
console.log('[sdkUtils.onLayoutSpeakerIndication]: ', info)
})
//在gallery布局样式下,如果主讲人发生变化,会得到这个通知,客户端可以在主讲人所在的view上更新样式,比如加黄边框。speaker_index对应于最近一次收到的onLayoutIndication中的可展示窗口数组的下标。
结束呼叫
在需要结束呼叫的时候调用 SDK 的离会 API
个人离开会议,但会议还在继续。
window.rtcEngine.leaveConference();
//退出成功后,会收到sdk的回调
rtcEngine.on('onCallState', info => {
console.log('[sdkUtils.onCallState]: ', info)
})
附录
错误码表
服务器错误码
错误号 | 错误 | 描述 |
---|---|---|
1000 | EV_SERVER_API_VERSION_NOT_SUPPORTED | 系统不支持您使用的API版本 |
1001 | EV_SERVER_INVALID_TOKEN | 无效的token |
1002 | EV_SERVER_INVALID_PARAMETER | 无效的参数 |
1003 | EV_SERVER_INVALID_DEVICESN | 参数deviceSN为空或者不合法 |
1004 | EV_SERVER_INVALID_MEDIA_TYPE | 无效的媒体类型,只支持”application/json” |
1005 | EV_SERVER_PERMISSION_DENIED | 您不具备执行此操作的权限 |
1006 | EV_SERVER_WRONG_FIELD_NAME | JSON串内字段名拼写错误 |
1007 | EV_SERVER_INTERNAL_SYSTEM_ERROR | 系统内部错误 |
1008 | EV_SERVER_OPERATION_FAILED | 操作失败! |
1009 | EV_SERVER_GET_FAILED | 获取失败! |
1010 | EV_SERVER_NOT_SUPPORTED | 不支持! |
1011 | EV_SERVER_REDIS_LOCK_TIMEOUT | 请重试 |
1019 | EV_SERVER_LOCAL_ZONE_STOPPED | 本地可用区已停止。 |
1100 | EV_SERVER_INVALID_USER_NAME_PASSWORD | 无效的用户名或密码 |
1101 | EV_SERVER_LOGIN_FAILED_MORE_THAN_5_TIMES | 登录失败超过5次,账号会被锁定,您还有{0}次机会 |
1102 | EV_SERVER_ACCOUNT_TEMPORARILY_LOCKED | 您的账户已被临时锁定,请稍后再试或直接联系管理员解锁。 |
1103 | EV_SERVER_ACCOUNT_DISABLED | 您的账户已被停用,请联系管理员。 |
1104 | EV_SERVER_NO_USERNAME | 没有找到这个用户名 |
1105 | EV_SERVER_EMAIL_MISMATCH | 邮箱和用户名不匹 |
1106 | EV_SERVER_COMPANY_ADMINISTRATOR_NOT_IN_ANY_COMPANY | 该公司管理员未分配到任何公司 |
1200 | EV_SERVER_FILE_UPLOAD_FAILED | 文件上传失败 |
1201 | EV_SERVER_INVALID_LICENSE | 无效许可证 |
1202 | EV_SERVER_INVALID_IMPORT_USER_FILE | 无效的导入用户文件 |
1300 | EV_SERVER_INVALID_TIME_SERVICE_ADDRESS | 无效的时间服务地址 |
1301 | EV_SERVER_FAILED_UPDATE_SYSTEM_PROPERTIES | 系统参数修改失败 |
1400 | EV_SERVER_CONF_NOT_EXISTS | 会议不存在 |
1401 | EV_SERVER_NUMERICID_CONFLICTS | 该会议号码已被占用 |
1402 | EV_SERVER_CONF_UPDATING_IN_PROGRESS | 正在修改会议 |
1403 | EV_SERVER_CONF_DELETING_IN_PROGRESS | 正在删除会议 |
1404 | EV_SERVER_CONF_TERMINATING_IN_PROGRESS | 正在结束会议 |
1405 | EV_SERVER_CONF_LAUNCHING_IN_PROGRESS | 正在开启会议 |
1406 | EV_SERVER_CONF_NOT_IN_APPROVED_STATUS | 会议不处于预约状态 |
1407 | EV_SERVER_CONF_NUMERICID_ONGOING | 会议已开启 |
1409 | EV_SERVER_CONF_NOT_APPROVED_OR_ONGOING | 会议已失效 |
1410 | EV_SERVER_PARTICIPANT_NOT_EXISTS_IN_CONF | 该终端未加入会议 |
1412 | EV_SERVER_NUMERICID_ALREADY_IN_USE | 该会议号码已被占用! |
1415 | EV_SERVER_INVALID_CONF_TIME | 无效的会议时间 |
1418 | EV_SERVER_INVALID_CONF_ID | 无效的会议ID |
1421 | EV_SERVER_NOT_FOUND_SUITABLE_MRU | 未找到合适的MRU. |
1422 | EV_SERVER_NOT_FOUND_SUITABLE_GATEWAY | 未找到合适的Gateway |
1424 | EV_SERVER_FAILED_TO_CONNECT_MRU | 连接MRU失败 |
1427 | EV_SERVER_NOT_ALLOW_DUPLICATED_NAME | 不允许重名 |
1430 | EV_SERVER_NOT_FOUND_CONF_IN_REDIS | 数据没有找到当前会议 |
1431 | EV_SERVER_NOT_IN_LECTURER_MODE | 当前不是主会场模式 |
1433 | EV_SERVER_FAILED_TO_MUTE_ALL_PARTICIPANTS | 全部静音失败 |
1436 | EV_SERVER_FAILED_TO_CONNECT_PARTICIPANT | 连接与会者失败 |
1439 | EV_SERVER_FAILED_TO_DISCONNECT_PARTICIPANT | 挂断与会者失败 |
1442 | EV_SERVER_FAILED_TO_CHANGE_LAYOUT | 分屏设置失败 |
1445 | EV_SERVER_FAILED_TO_SET_SUBTITLE | 字幕设置失败 |
1448 | EV_SERVER_FAILED_TO_MUTE_PARTICIPANT_AUDIO | 对与会者静音失败 |
1451 | EV_SERVER_FAILED_TO_DELETE_PARTICIPANT | 删除与会者失败 |
1454 | EV_SERVER_FAILED_TO_INVITE_AVC_ENDPOINT | 邀请AVC终端失败 |
1455 | EV_SERVER_FAILED_TO_INVITE_SVC_ENDPOINTS | 邀请SVC终端失败 |
1456 | EV_SERVER_CONF_ROOM_COMPLETELY_FULL | 会议室已满 |
1457 | EV_SERVER_TIMEOUT_TO_GENERATE_NUMERICID | 产生云会议室号失败,已超时 |
1460 | EV_SERVER_NOT_FOUND_PROFILE_NAMED_SVC | 未找到名为SVC的会议模板 |
1463 | EV_SERVER_FAILED_TO_PROLONG_CONF | 会议延时失败 |
1500 | EV_SERVER_INVALID_MEETING_CONTROL_REQUEST | 无效的会议控制请求 |
1600 | EV_SERVER_NAME_IN_USE | 终端名字以被占用 |
1601 | EV_SERVER_EMPTY_ENDPOINT_NAME | 终端名称不能为空 |
1602 | EV_SERVER_EMPTY_ENDPOINT_CALL_MODE | 终端呼叫模式不能为空 |
1603 | EV_SERVER_EMPTY_ENDPOINT_SIP_USERNAME | 终端的SIP号码不能为空 |
1604 | EV_SERVER_EMPTY_ENDPOINT_SIP_PASSWORD | 终端的SIP密码不能为空 |
1605 | EV_SERVER_EMPTY_ENDPOINT_ADDRESS | 终端的IP地址不能为空 |
1606 | EV_SERVER_INVALID_SIP_USERNAME | 无效的SIP号码 |
1607 | EV_SERVER_INVALID_IP_ADDRESS | 无效的IP地址 |
1608 | EV_SERVER_ENDPOINT_NOT_EXIST | 指定的终端不存在 |
1609 | EV_SERVER_E164_IN_USE | 该E164号码已被占用 |
1610 | EV_SERVER_ENDPOINT_DEVICE_SN_EXIST | 该序列号已被占用,请重新输入 |
1611 | EV_SERVER_SIP_USERNAME_REGISTERED | 该SIP号码已被占用 |
1612 | EV_SERVER_ENDPOINT_E164_INVALID | 无效的E164号 |
1613 | EV_SERVER_NOT_FOUND_ENDPOINT_DEVICE_SN | 该终端不存在 |
1614 | EV_SERVER_NOT_FOUND_ENDPOINT_PROVISION_TEMPLATE | 终端配置文件不存在 |
1615 | EV_SERVER_DEVICE_SN_EXISTS | 这些设备序列号已被分配了 |
1700 | EV_SERVER_CAN_NOT_DELETE_USER_IN_RESERVED_MEETING | 不能删除正在会议中的用户 |
1701 | EV_SERVER_EMPTY_USER_PASSWORD | 密码不能为空 |
1702 | EV_SERVER_EMPTY_USERNAME | 用户名不能为空 |
1703 | EV_SERVER_EMPTY_USER_DISPLAY_NAME | 姓名不能为空 |
1704 | EV_SERVER_INVALID_USER_EMAIL | 无效的邮箱地址 |
1705 | EV_SERVER_INVALID_CELLPHONE_NUMBER | 无效的手机号码 |
1706 | EV_SERVER_ORIGINAL_PASSWORD_WRONG | 原密码输入错误 |
1707 | EV_SERVER_DUPLICATE_EMAIL_NAME | 邮箱重复 |
1708 | EV_SERVER_DUPLICATE_CELLPHONE_NUMBER | 手机重复 |
1709 | EV_SERVER_DUPLICATE_USERNAME | 账号重复 |
1710 | EV_SERVER_INVALID_CONF_ROOM_MAX_CAPACITY | 无效的最大会议室容量 |
1711 | EV_SERVER_SHOULD_ASSIGN_DEPARTMENT_TO_DEPARTMENT_ADMINISTRATOR | 请为部门管理员选择所在部门 |
1712 | EV_SERVER_EMPTY_USER_EMAIL | 邮箱不能为空 |
1713 | EV_SERVER_EMPTY_USER_CELLPHONE_NUMBER | 手机号不能为空 |
1714 | EV_SERVER_NOT_ORGANIZATION_ADMINISTRATOR | 该用户不是公司管理员 |
1800 | EV_SERVER_COMPANY_NOT_EXIST | 该公司不存在 |
1801 | EV_SERVER_SHORT_NAME_OF_COMPANY_USED | 公司短名字已被占用 |
1802 | EV_SERVER_FULL_NAME_OF_COMPANY_USED | 公司全名已被占用 |
1803 | EV_SERVER_COMPANY_NOT_EMPTY | 清理该公司下用户和终端后再删除该公司 |
1804 | EV_SERVER_EMPTY_COMPANY_SHORT_NAME | 公司名称不能为空 |
2000 | EV_SERVER_CONF_ROOM_EXPIRED | 该云会议室已过期 |
2001 | EV_SERVER_NOT_ACTIVED | 没有被激活 |
2003 | EV_SERVER_NOT_FOUND_SUITABLE_ROOM | 未找到可用的云会议室 |
2005 | EV_SERVER_NOT_FOUND_TEMPLATE_OR_ROOM | 没有找到模板和房间 |
2006 | EV_SERVER_CONF_ROOM_IN_USE | 该云会议室已被使用 |
2009 | EV_SERVER_CONF_ROOM_NUMBER_IN_USE | 该云会议室号码已被占用 |
2012 | EV_SERVER_CONF_ROOM_CAPACITY_EXCEEDS_LIMIT | 会议数量超过最大容量 |
2015 | EV_SERVER_INVALID_CONF_ROOM_CAPACITY | 无效的云会议室方数 |
2018 | EV_SERVER_INVALID_CONF_ROOM_NUMBER | 无效的云会议室号码 |
2021 | EV_SERVER_ROOM_NOT_EXISTS | 该云会议室不存在 |
2031 | EV_SERVER_ROOM_ONLY_ALLOW_OWNER_ACTIVE | 只有会议主持人才能激活会议 |
2033 | EV_SERVER_ROOM_NOT_ALLOW_ANONYMOUS_CALL | 该会议不允许匿名入会 |
2035 | EV_SERVER_TRIAL_ORG_EXPIRED | 公司许可过期 |
2100 | EV_SERVER_CAN_NOT_DELETE_DEPARTMENT_WITH_SUBORDINATE_DEPARTMENT | 该部门有子部门,不能删除 |
2101 | EV_SERVER_CAN_NOT_DELETE_DEPARTMENT_WITH_USERS_OR_ENDPOINTS | 该部门内有用户或终端,不能删除 |
2200 | EV_SERVER_INVALID_ACS_CONFIGURATION | 无效的ACS配置 |
地址服务器错误码
错误号 | 错误 | 描述 |
---|---|---|
10000 | EV_LOCATE_FAILED_TO_READ_BODY | 定位服务读取消息体出错 |
10001 | EV_LOCATE_FAILED_TO_PARSE_BODY | 定位服务解析消息体出错 |
10002 | EV_LOCATE_LOCATION_TIMEOUT | 定位服务定位超时 |
10003 | EV_LOCATE_ERROR_INFO_GENERAL | 定位服务通用信息错误 |
10004 | EV_LOCATE_ERROR_INFO_BAD_FORMAT | 定位服务信息格式错误 |
10005 | EV_LOCATE_UNEXPECTED | 定位服务异常 |
10006 | EV_LOCATE_FAILED_TO_LOCATE_CLIENT | 定位服务不能定位客户端 |
10007 | EV_LOCATE_FAILED_TO_LOCATE_ZONE | 定位服务不能定位可用区 |
10008 | EV_LOCATE_NO_LOCATION_DOMAIN | 地址服务没有域 |
10009 | EV_LOCATE_ERROR_LOCATION_REQUEST | 定位服务请求错误 |
10010 | EV_LOCATE_ERROR_INFO_QUERY_ZONE_IP_IN_HIM | 定位服务在HIM中查询域IP出错 |
会议错误码
错误 | 错误号 | 描述 |
---|---|---|
11 | EV_CALL_BYE_EP_NO_PACKET_RECEIVED | 终端没有码流,断会 |
100 | EV_CALL_BYE_MRU_NORMAL | MRU正常挂断会议 |
101 | EV_CALL_BYE_MRU_OPERATOR_DISCONNECT | MRU管理员挂断终端 |
102 | EV_CALL_BYE_MRU_NO_PACKET_RECEIVED | MRU没有收到码流,断会 |
1001 | EV_CALL_INVALID_NUMERICID | 无效的会议号码 |
1005 | EV_CALL_INVALID_USERID | 无效 的用户ID |
1007 | EV_CALL_INVALID_DEVICEID | 无效的设备ID |
1009 | EV_CALL_INVALID_ENDPOINT | 无效的终端 |
2001 | EV_CALL_SERVER_UNLICENSED | 服务器许可证过期 |
2003 | EV_CALL_NOT_FOUND_SUITABLE_MRU | 呼叫的云平台尚未激活 |
2005 | EV_CALL_NEITHER_TEMPLATE_NOR_ONGOING_NOR_BINDED_ROOM | 没有可用的会议端口资源 |
2007 | EV_CALL_LOCK_TIMEOUT | 呼叫超时 |
2009 | EV_CALL_TEMPLATE_CONF_WITHOUT_CONFROOM | 模板会议没有会议室 |
2011 | EV_CALL_ROOM_EXPIRED | 会议室超过最大数量 |
2015 | EV_CALL_INVALID_PASSWORD | 无效的密码 |
2017 | EV_CALL_NO_TIME_SPACE_TO_ACTIVATE_ROOM | 没有时间激活会议室 |
2023 | EV_CALL_CONF_PORT_COUNT_USED_UP | 当前入会人数已达上限 |
2024 | EV_CALL_ORG_PORT_COUNT_USED_UP | 当前与会人数已达组织端口上限 |
2025 | EV_CALL_HAISHEN_PORT_COUNT_USED_UP | 当前与会人数已达平台会议端口上限 |
2027 | EV_CALL_HAISHEN_GATEWAY_AUDIO_PORT_COUNT_USED_UP | 网关语音通话数量已达到云平台的许可上限 |
2029 | EV_CALL_HAISHEN_GATEWAY_VIDEO_PORT_COUNT_USED_UP | 网关视频通话数量已达到云平台的许可上限 |
2031 | EV_CALL_ONLY_ROOM_OWNER_CAN_ACTIVATE_ROOM | 只允许会议室拥有者激活会议室 |
2033 | EV_CALL_NOT_ALLOW_ANONYMOUS_PARTY | 该会议不允许匿名呼叫 |
2035 | EV_CALL_TRIAL_ORG_EXPIRED | 公司许可过期 |
2043 | EV_CALL_LOCAL_ZONE_NOT_STARTED | 可用区没有启动 |
2045 | EV_CALL_LOCAL_ZONE_STOPPED | 可用区停止 |
4057 | EV_CALL_ROOM_BUSY | 会议室忙碌 |
4064 | EV_CALL_INVALID_FROM_URL | 无效的URL地址 |