会捷通客户端 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 开发出具有清晰流畅的⾳视频体验和⾼清内容协作的⾳视频会议终端应用。

gallery-view

会捷通客户端 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 的接口方法离开会议

gallery-view

会捷通平台提供了丰富的 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 runtimenpm package managerAdd to PATH这三个选项。

安装完成后,我们需要来确认Node.js是不是可以正常工作。 点击 开始 按钮,输入PowerShell,找到 Windows PowerShell。 打开 PowerShell 或其他你喜欢的命令行客户端后,通过以下命令来确认 nodenpm已经安装成功:


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视频窗口分为三类: 远端主流窗口,本地视频窗口,内容流窗口 (辅流或双流)

画廊视图

  1. 远端窗口设置

    如上图所示,画面中显示了接收到的远端窗口视频,每一个格子就是一路远端窗口,上图中有九个远端窗口,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)
    }
    
  2. 本地窗口设置

    本地窗口是指本地的摄像头采集到的视频图像。

    this.localVideoContainer = document.getElementById('local-video-container')    window.rtcEngine.setLocalVideoWindow(this.localVideoContainer)
    
  3. 内容窗口设置

    内容窗口是指别的与会者发送的内容共享,设置内容窗口,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)
})

发送共享内容

发送共享主要需要以下步骤:

  1. 首先通过 getContentSourceList 获取可以共享的内容源列表供用户选择。
  2. 然后通过 setLocalContentSource 将选择的内容源设置给SDK。
  3. 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地址
上次更新: 2/9/2021, 1:09:58 PM