小鱼易连 Electron SDK(XY Electron SDK) 基于 Node.js 配合 小鱼易连 C++ SDK(XYLink C++ SDK) 底层库开发,为 Electron 平台用户提供稳定可靠的多人音视频能力的 SDK。
import { XYRTC, Render } from '@xylink/xy-electron-sdk';
除了主方法 XYRTC
外,SDK还暴露出来一个 Render 通用模块,用来实现 SDK 外部渲染画面:
方法 | 描述 |
创建 xyRTC 实例对象 |
方法 | 描述 |
获取 SDK 版本,兼容:v0.x ~ v1.x | |
获取 SDK 版本,兼容:v3.x+ |
方法 | 描述 |
小鱼账号登录 | |
三方用户统一认证登录-第三方账号登录 | |
三方用户统一认证登录-Token登录 | |
单点登录,兼容:v1.0.4 | |
注销登录 |
方法 | 描述 |
发起会议呼叫 | |
挂断会议 | |
结束全体会议,兼容:v1.0.4 | |
切换语音模式 | |
获取会控H5地址,兼容:v0.x ~ 1.x | |
获取会控H5地址,兼容:v3.x+ | |
举手发言 | |
发言结束 | |
取消举手 | |
会中邀请H323设备 | |
遥控硬终端摄像头 | |
签到 |
方法 | 描述 |
绑定 Video 元素,内部渲染画面 | |
【自动布局】切换多种布局模型 | |
请求参会者列表画面数据 | |
订阅参会者信息 | |
停止所有 video 的渲染 | |
通过callback函数上报所有参会者视频数据 | |
上报指定参会者YUV Buffer数据流,用于自定义渲染,例如需要跨窗口/外接屏幕下渲染画面使用
| |
停止外接屏渲染 | |
对某个参会者进行全屏显示 | |
【自动布局】翻页查看更多参会者画面 | |
【自动布局】重新计算Layout布局数据 |
方法 | 描述 |
取消麦克风静音/麦克风静音 | |
开启/关闭摄像头 | |
设置 mic 声音峰值范围[0, 100] | |
获取远端音频能量 | |
通过sourceId获取某一帧视频原始数据 | |
开启远端音频能量峰值计量 | |
设置视频配置,呼叫前设置有效 | |
设备本地预览画面分辨率,不影响发送端分辨率 |
方法 | 描述 |
获取设备列表 | |
切换输出、输出设备 | |
获取当前正在使用的设备 | |
开始采集麦克风 | |
结束采集麦克风 |
方法 | 描述 |
麦克风检测 | |
获取麦克风声音峰值 | |
获取当前扬声器峰值 | |
开始音频检测, 播放 wav 格式音频文件 | |
停止音频检测 | |
设置扬声器音量 | |
获取扬声器当前音量 |
方法 | 描述 |
获取通话统计信息 |
方法 | 描述 |
分享桌面内容,兼容:v0.x ~ 1.x | |
分享桌面内容,兼容:v3.x+ | |
区域共享更新区域坐标范围 | |
暂停采集content | |
获取显示器列表 | |
获取显示器列表,包含位置信息 | |
获取显示器缩略图 | |
获取 app 列表 | |
获取 app 缩略图数据 | |
获取 App icon 图标数据 | |
恢复采集content | |
结束分享桌面 |
方法 | 描述 |
广播本地电子铭牌到远端: 开启后接收端可以收到广播出去的人脸信息 | |
是否开启人脸识别模式 | |
获取人脸信息详情 |
方法 | 描述 |
开启云端录制 | |
停止云端录制 |
方法 | 描述 |
检查是否支持通话字幕 | |
通话字幕切换语言 |
方法 | 描述 |
设置虚拟背景效果 | |
设置虚拟背景图片 | |
设置视频美颜 | |
设置视频滤镜 |
方法 | 描述 |
开始批注 | |
结束批注 | |
清空批注 | |
发送批注线数据 |
方法 | 描述 |
检测是否支持 WebGL 渲染 | |
设置日志等级 | |
Audio dump开关 | |
上传日志到云端 |
事件 | 描述 |
登录状态回调 | |
会议连接状态回调 | |
会议呼叫状态 | |
布局结果数据,包含参会者基础信息、状态、流 ID 等数据 | |
分享 content 状态 | |
【AUTO 布局】返回布局容器大小信息 | |
会议参会信息变化事件 | |
Local 声音大小回调 | |
会控消息 | |
账号被踢、过期失效消息 | |
设备变动监听回调,返回变动设备的类型,业务层基于类型重新获取设备列表数据 | |
监听错误信息 | |
本地网络状况 | |
是否检测到啸叫(用户可降低声音或关闭麦克风结束啸叫) | |
上报 MicMute 状态 | |
字幕消息 | |
出入会提醒 | |
本地麦克风状态 | |
会议质量状态 | |
人脸识别数据回调,兼容:v0.3.0 ~ v1.x | |
人脸识别数据回调,兼容:v3.x+ | |
getFaceInfo 回调 ,人脸信息详情 | |
上报当前画面全屏的rosterId信息 | |
响应会控关闭摄像头 | |
云端录制回调,兼容:v0.3.0 ~ v1.x | |
云端录制回调,兼容:v3.x+ | |
云端录制状态回调 | |
自动布局模型切换回调 | |
翻页信息回调 | |
会议室详情信息事件回调 | |
会控主持人回调 | |
会控上报等候室状态事件 | |
会控取消举手事件 | |
会控互动工具事件 | |
签到结果事件 | |
设备列表事件 | |
正在使用的设备 | |
是否支持同传字幕 | |
同传字幕内容 | |
会控H5链接 | |
App共享采集状态 | |
监听content接收者发送的线条 | |
监听批注凊除 |
Render 模块是一个独立的渲染器模块类,用于需要自定义视频画面渲染。
import { Render } from '@xylink/xy-electron-sdk';
// 实例化 Render 模块
const render = new Render(canvasElement);
render.draw(bufferData, width, height, rotation);
创建 xyRTC 实例对象,通过此实例,可以调用内部暴露的所有 API
参数:
type IModel = "auto" | "custom";
type ITemplateModel = "SPEAKER" | "GALLERY";
interface IConfig {
offset?: [number, number];
httpProxy?: string;
model?: IModel;
muteAudio?: boolean;
muteVideo?: boolean;
templateModel?: ITemplateModel;
dllPath?: string;
logPath?: string;
clientId: string;
clientSecret: string;
autoResizeLayout?: boolean;
container?: {
// 使用此节点id计算容器大小
elementId?: string;
// 基于节点id设置上下左右偏移量
offset?: number[];
};
// 应用类型,数据统计用到,默认:electron_sdk
appType?: string;
// 共享屏幕篮筐,默认: true
enableSharingIndicator?: boolean;
};
// 创建 xyRTC 实例对象
const xyRTC = XYRTC.getXYInstance(config?: IConfig): XYRTC;
获取 SDK 版本信息
兼容:v0.x ~ 1.x
// 返回值类似:0.0.1 - build on 2020-08-07 17:02
xyRTC.getVersion(): ;
获取 SDK 版本信息
兼容:v3.10.1+
xyRTC.getVersion(): IVersion;
/**
* Electron sdk version
*
* @property {string} version Electron sdk 版本号
* @property {string} buildTime Electron sdk 构建时间
* @property {string} cppVersion 依赖c++ sdk 版本号
* @property {string} info Electron sdk 构建详情
*/
interface IVersion {
version: string;
buildTime: string;
cppVersion: string;
info: string;
}
小鱼用户账号登录
v3.10.3+ 已废弃,但不影响老客户调用,建议使用新登录方式:loginXYAccount
参数:
xyRTC.login(userName: string, password: string): result<IResult>;
interface IResult {
code: number;
msg: string;
data: object;
}
新的小鱼账户登录
兼容:v3.10.3+
xyRTC.loginXYAccount(params: IXYParams):IResult
/**
* 新的三方登录-小鱼账户
*
* @property {string} extID 企业id
* @property {string} countryCode 国家代码
* @property {string} account 账号
* @property {string} password 密码
*/
export interface IXYParams {
extID: string,
countryCode?: string,
account: string,
password: string
}
interface IResult {
code: number;
msg: string;
data: object;
}
第三方账号登录,第三方业务请使用此接口进行登录操作。
v3.10.3+对此方法进行了安全升级,但需要传authCode和isTempUser两个参数;为兼容旧的登录方式,authCode和isTempUser作为可选参数
参数:
xyRTC.loginExternalAccount(extID: string, extUserId: string, displayName: string, authCode?: string, isTempUser?: boolean): void;
提示
v1.0.2版本以下,displayName需使用encodeURI或encodeURIComponent进行编码
三方用户统一认证登录-Token登录
兼容:v3.10.3+
xyRTC.loginExtToken(params: IExtTokenParams): result<IResult>;
/**
* 三方登录-token登录方式
*
* @property {string} extID 企业id
* @property {string} token token信息
*/
export interface IExtTokenParams {
extID: string,
token: string,
}
interface IResult {
code: number;
msg: string;
data: object;
}
单点登录
兼容:v1.0.4
参数:
xyRTC.loginXYAccountWithToken(token: string): result<IResult>;
退出登录
xyRTC.logout(): void;
发起会议呼叫, 通过回调:CallState 监听是否呼叫成功
参数:
/**
* 发起呼叫
*
* @param number 会议号
* @param meetingPwd 入会密码,如果没有,则填写空字符
* @param displayName 入会昵称,本地和远端显示此名称
* @param muteVideo 是否关闭摄像头入会
* @param muteAudio 是否静音入会
* @param config 其他配置参数
* @param config.callMode 会议模式,"AudioVideo": 音视频模式 | "AudioOnly":语音模式
*
* @returns
*/
xyRTC.makeCall(
number: string,
meetingPwd: string,
displayName: string,
muteVideo: boolean = false,
muteAudio: boolean = false,
config? : {
callMode?: string,
meetingId?: string;
}
): result<IResult>;
// 返回值
// 3002(XYSDK:900106):未登录
// 3000(XYSDK:903000):正在呼叫
// 3001(XYSDK:903001):会议号或入会昵称不能为空
interface IResult {
code: number;
msg: string;
data: {}
};
切换语音模式
兼容:v0.3.0+
/**
* 切换语音模式
*
* @param { TCallMode } callMode AudioOnly 语音模式, AudioVideo 音视频模式
*/
xyRTC.switchCallMode(callMode: TCallMode): void;
type TCallMode = "AudioVideo" | "AudioOnly";
获取会议控制H5页面地址,打开页面后,可以管控会议;
兼容:v0.x ~ v1.x
xyRTC.getConfMgmtUrl(confNumber: string): IResult;
interface IResult {
// pc版本会控页面地址
pc: string;
// 手机版本会控页面地址
mobile: string;
// 参会者列表地址
members: string;
}
获取会议控制H5页面地址,打开页面后,可以管控会议;
兼容:v3.10.1+
// 获取到的数据需要在HostMeetingUrl事件回调中获取取
xyRTC.getConfMgmtUrl(confNum?: string):void;
举手发言🙋♂️
兼容:v1.0.0+
xyRTC.sendSpeakingRequest(): void;
发言结束
兼容:v1.0.0+
xyRTC.sendSpeakingEnd(): void;
取消举手
兼容:v1.0.0+
xyRTC.cancelSpeakingRequest(): void;
会中邀请H323设备
兼容:v1.0.0+
参数:
xyRTC.sendDtmf(key: string, remoteUri?: string): void;
挂断会议,自动释放设备资源,退会时必须主动调用;
挂断完成的状态需要监听CallState事件,返回Disconnected
即代表完成;
xyRTC.endCall(): void
结束全体会议,只有会议owner才可以结束全体会议;是否是owner需监听ConfHostChanged事件;
结束全体会议完成的状态需要监听CallState事件,返回Disconnected
即代表完成;
兼容:v1.0.4
参数:
xyRTC.endMeeting(conferenceNo: string): void
第三方业务层需要给布局画面的参会者创建Canvas元素,通过此方法与sourceId绑定,SDK内部会启动定时器按照屏幕刷新率30帧/s的方法获取流数据并通过WebGL渲染;
设置完成后,第三方不需要关注画面的渲染,只关注业务逻辑即可;
业务层在 sourceId 发生变化时,重新执行此 setVideoRender 方法;
参数:
xyRTC.setVideoRender(sourceId: string, canvasEle: HTMLCanvasElement): void;
初始化SDK对model
属性设置为auto
布局时,可切换布局模型,有多种布局模型可选,支持会中动态切换;
如果没有指定具体的布局模型,则会按照顺序自动切换;
兼容:上述中从3之后的布局模型仅v1.0.0+之后支持;
切换完布局后,会在 VideoStreams 回调事件中上报参会人员列表数据,上层业务可以直接进行渲染即可;
切换完布局后,会在 TemplateModelChanged 回调事件中上报布局结果数据,可以在业务上显示对应的布局状态;
xyRTC.switchLayout(templateModel?: TemplateModel): Promise<{
code: string;
msg: string;
data: Record<string, any>;
}>;
enum TemplateModel {
"SPEAKER" = "SPEAKER",
"GALLERY" = "GALLERY",
"MULTI_PIC_CONTENT_HIGH_PRIORITY" = "MULTI_PIC_CONTENT_HIGH_PRIORITY",
"MULTI_PIC_ACTIVE_HIGH_PRIORITY" = "MULTI_PIC_ACTIVE_HIGH_PRIORITY",
"TWO_PIC_PIP" = "TWO_PIC_PIP",
"CONTENT_ONLY" = "CONTENT_ONLY",
"TWO_PIC_SYMMETRIC" = "TWO_PIC_SYMMETRIC",
}
旧版本只支持第一个参数:reqList;
model 设置为 custom 布局,即自定义布局时,可以基于分页形式请求视频画面数据; 需要根据 ConfInfoChanged
回调的数据计算每个参会者 画面质量数据,可设置分辨率、画面质量两个数据;
兼容:v0.1.5+
参数:
ConfInfoChanged
回调的 people+content 数量配合 maxSize 计算得到;xyRTC.requestLayout(reqList: IReqItem[], maxViewCount: number, pageIndex:number): void;
interface IReqItem {
isContent: boolean;
callUri: string;
resolution: number; // 0:90, 1: 180, 2:360, 3: 720, 4: 1080
quality: number; // 0: low, 1: normal, 2: high
}
分页显示画面时,SDK 底层会按照一定的优先级排序参会者列表数据进行分页展示,如果想要将某一些参会成员提高优先级,那么需要订阅这些人的数据,那么可以在靠前页看到这些人的画面;
兼容:v0.1.5+
参数:
xyRTC.subscribeRoster(uriList: calluri[]): void;
停止所有视频的渲染, 需要外接屏渲染画面时,建议先执行此方法;
兼容:v0.1.15+
xyRTC.stopAllVideoRender(): void
上报所有参会者YUV Buffer数据流,用于自定义渲染;
兼容:v0.2.6+
参数:
xyRTC.startAllExternal(( id: stirng, videoFrame: IVideoFrame, sourceId: string ) => {}, intervel: number): void;
interface IVideoFrame {
hasData: boolean;
sourceId: string;
buffer: unit8Array[];
width: number;
height: number;
rotation: number;
}
上报指定参会者YUV Buffer数据流,用于自定义渲染,例如需要跨窗口/外接屏幕下渲染画面使用;
兼容:v0.2.6+
参数:
xyRTC.startExternal(id: string): void;
停止外接屏渲染
兼容:v0.2.6+
xyRTC.stopExternal(): void;
自动布局下,全屏请求&查看设备画面;
参数:
兼容:v0.3.0+
xyRTC.forceFullScreen(id: string): Promise<{code: string; msg: string; data: { id: string } }>;
翻页查看更多参会者画面;
参数:
兼容:v1.0.0+
xyRTC.switchPage(pageIndex: number): Promise<{code: string; msg: string; data: {currentPage: number}}>;
切换麦克风状态
参数:
xyRTC.muteMic(status:boolean): void;
切换摄像头状态
参数:
xyRTC.muteCamera(status:boolean): void;
兼容:v0.2.0+
设置 mic 声音峰值范围[0, 100]
参数:
xyRTC.setMicVolume(volume: number): void;
兼容:v0.2.0+
获取远端音频能量
xyRTC.getAudioPeakMeters(): IAudioMeterInfo[];
interface IAudioMeterInfo {
callUri: string,
energy: number,
pid: number,
}
通过sourceId获取某一帧视频原始YUV Buffer数据,此数据可以转化为RGB格式在WebGL或者Canvas上渲染;
参数
VideoStreams
事件获取所有正在接收画面的人员和画面资源数据;xyRTC.getVideoFrame(sourceId: string, isContent: boolean): IFrame;
/**
* YUV Frame原始画面数据
*
* @property { boolean } hasData - 是否存在YUV数据
* @property { ArrayBuffer } buffer - YUV 420 Buffer数据
* @property { number } width - 画面宽度
* @property { number } height - 画面高度
* @property { number } sarWidth - 画面除去黑边宽度
* @property { number } sarHeight - 画面除去黑边高度
* @property { number } rotation - 画面旋转方向
*/
interface IFrame {
hasData: boolean;
buffer: ArrayBuffer;
width: number;
height: number;
sarWidth: number; // v3.10.3+
sarHeight: number; // v3.10.3+
rotation: number;
}
提示
如何渲染YUV Buffer数据为图像?可以通过WebGL或者Canvas将YUV转为RGB数据格式进行渲染,进而可以保存图片或者显示;
如果觉得复杂,小鱼Electron SDK提供了一个Render工具库,专门用于渲染YUV Buffer数据,具体可以参考:Render
开启远端音频能量峰值计量
兼容:v0.2.0+
参数:
xyRTC.setAudioPeakMeterEnabled(enable: boolean): void;
设置视频配置,呼叫前设置有效,控制本地发送和预览画面分辨率值; 该方法暂只支持以下配置:
兼容:v0.2.0+
参数:
xyRTC.setVideoProfile(videoProfile: IVideoProfile): void;
interface IVideoProfile {
// 最大发送(编码)分辨率
maxResPvtx: number;
// 最大接收(解码)分辨率
maxResPvrx: number;
// 最大发送(编码)帧率
maxFpsPvtx: number;
// 最大接收(解码)帧率
maxFpsPvrx: number;
}
设备本地预览画面分辨率,不影响发送端分辨率,默认是 360P 分辨率;
兼容:v0.2.0+
xyRTC.setLocalPreviewResolution(res: TPreviewResolution): void;
// 0: 90P | 1: 180P | 2: 360P | 3: 720P
type TPreviewResolution = 0 | 1 | 2 | 3;
兼容:v0.1.5+
会中/会外切换麦克风、摄像头、扬声器设备
xyRTC.switchDevice(type: IDeviceType, devId: string): void;
type IDeviceType = "camera" | "microphone" | "speaker";
获取一类媒体设备列表
参数:
提示
type参数在v1.0.2+版本由必选参数变为可选参数,不传type将获取全部设备类型的设备列表
xyRTC.getDeviceList(type?: DeviceTypeKey): Promise<IDeviceList | IDeviceItem[]>
enum DeviceTypeKey {
camera = "camera",
microphone = "microphone",
speaker = "speaker",
}
interface IDeviceList {
camera: IDeviceItem[],
microphone: IDeviceItem[],
speaker: IDeviceItem[],
}
interface IDeviceItem {
// 设备ID
devId: string;
// 设备名称
devName: string;
// 是否是当前使用的设备
isSelected: boolean;
}
兼容:v0.2.0+
参数:
xyRTC.enableListnerTest(enable: boolean): void;
获取本地麦克风声音能量,此方法用于麦克风检测时,验证麦克风是否可用
兼容:v0.2.0+
xyRTC.getMicPeakMeter(): number;
获取当前扬声器峰值
兼容:v0.2.0+
xyRTC.getSpeakerPeakMeter(): number;
开始音频检测, 播放 wav 格式音频文件
兼容:v0.2.0+
参数:
xyRTC.startPlayWavFile(wavfile: string, loopTimes: number): void;
停止音频检测
兼容:v0.2.0+
xyRTC.stopPlayWavfile(): void;
设置扬声器音量
兼容:v0.2.0+
参数:
xyRTC.setSpeakerVolume(volume: number): void;
获取扬声器当前音量
兼容:v0.2.0+
xyRTC.getSpeakerVolume(): number;
获取会议中媒体和网络的统计信息。建议 3-5 秒获取一次;
兼容:1. v0.2.0+;2. v1.0.0+支持encrypt字段;
xyRTC.getStatistics(): IStatistics;
interface IStatistics {
people: IAVSessionStatistics; // 与会人媒体统计信息
content: IAVSessionStatistics; // 共享内容媒体统计信息
network: INetworkStatistics; // 网络状况统计
encrypt: string; // 会议室加密方式
}
interface IAVSessionStatistics{
audioRxInfo: IAudioStatistics[]; // 下行音频统计数据
audioTxInfo: IAudioStatistics[]; // 上行音频统计数据
videoRxInfo: IVideoStatistics[]; // 下行视频统计数据
videoTxInfo: IVideoStatistics[]; // 上行视频统计数据
}
interface INetworkStatistics{
rtt: number; // 往返时间 ms
rxDetectBw: number; // 下行带宽 kbps
rxJitter: number; // 下行抖动 ms
rxLost: number; // 下行丢包率
txDetectBw: number; // 上行带宽 kbps
txJitter: number; // 上行抖动 ms
txLost: number; // 上行丢包率
}
interface IAudioStatistics{
codecType: string; // 编码类型
displayName: string; // 显示名称
actBw: number; // 实际带宽
}
interface IVideoStatistics {
codecType: string; // 编码类型
displayName: string; // 显示名称
actBw: number; // 实际带宽
frameRate: number; // 帧率
resolution: string; // 分辨率
}
开始共享桌面内容
兼容:v0.x ~ v1.x
参数:
xyRTC.startSendContent(withDesktopAudio: boolean): void;
开始共享桌面内容,支持外接屏幕、区域共享、共享采集声音配置;
兼容:v3.10.1+
xyRTC.startSendContent(params: ISendContentParams);
/**
* 开始共享参数
*
* @property {ContentStreamMode} contentStreamMode content流模式
* @property {ContentCaptureType} contentCaptureType content采集类型
* @property {IContentInfo} contentInfo content采集类型
*/
interface ISendContentParams {
contentStreamMode: ContentStreamMode;
contentCaptureType: ContentCaptureType;
contentInfo: IContentInfo;
}
/**
* 共享流模式
*
* @param NONE 无
* @param AUDIO 音频
* @param VIDEO 视频
* @param BOTH 音视频
*/
enum ContentStreamMode {
NONE = 0, // 无
AUDIO = 1 << 0,
VIDEO = 1 << 1,
BOTH = AUDIO | VIDEO,
}
/**
* 共享content采集类型
*
* @param SCREEN 屏幕
* @param APP APP
* @param ONLINE 网络视频源
* @param MEDIA_FILE 媒体文件
* @param CAMERA 本地摄像头
* @param INVALID 不可用
*/
enum ContentCaptureType {
SCREEN,
APP,
ONLINE,
MEDIA_FILE,
CAMERA,
INVALID,
}
/**
* 采集content配置
*
* @property {string} source content唯一标识 对于屏幕共享是monitorName, 对于网络资源和媒体文件共享是url,对于本地摄像头共享是deviceId, 其它情况是空
* @property {number} viewId window句柄,适用App共享, 其它情况是0
* @property {boolean} withAudio 是否共享屏幕声音 适用于屏幕共享和App共享
* @property {IRegion} region 区域范围 适用于屏幕共享中的部分区域共享
* @property {boolean} localContentPreview 本地content预览 适用于屏幕共享
* @property {boolean} enableFluentMode 是否开启流畅模式,资源消耗较低
* @property {boolean} bEnableAnnotation 允许远端批注
*/
interface IContentInfo {
source: string;
viewId?: number;
withAudio?: boolean;
region?: IRegion;
localContentPreview?: boolean;
enableFluentMode?: boolean;
bEnableAnnotation?: boolean; // v3.10.3+
};
/**
* 区域坐标范围
*
* @property {number} x the X-coordinate of the top-left point of region
* @property {number} y the Y-coordinate of the top-left point of region
* @property {number} w width of region
* @property {number} h height of region
*/
interface IRegion {
x: number;
y: number;
w: number;
h: number;
};
区域共享更新区域范围
兼容:v3.10.1+
/**
* 区域共享后更新区域范围
*
* @param {IRegion} region 区域范围
* @returns
*/
xyRTC.updateContentCaptureRegion( region: IRegion);
/**
* 区域坐标范围
*
* @property {number} x the X-coordinate of the top-left point of region
* @property {number} y the Y-coordinate of the top-left point of region
* @property {number} w width of region
* @property {number} h height of region
*/
interface IRegion {
x: number;
y: number;
w: number;
h: number;
};
暂停采集content
兼容:v3.10.1+
/**
* 暂停content采集
*/
xyRTC.pauseContentCapture();
恢复采集content
兼容:v3.10.1+
/**
* 恢复content采集
*/
xyRTC.resumeContentCapture()
获取显示器列表
兼容:v3.10.1+
/**
* 获取显示器列表
*
* @returns {string[]} monitorName
*/
xyRTC.getMonitorList():string[]
获取显示器列表,包含monitorName和位置信息
兼容:v3.10.3+
/**
* 获取显示器列表
*
* @returns {IMonitorInfo[]}
*/
xyRTC.getMonitorInfos(): IMonitorInfo[]
/**
* 显示器列表,包含位置信息
*/
export interface IMonitorInfo{
monitorName: string;
rect: IRegion;
}
/**
* 区域坐标范围
*
* @property {number} x the X-coordinate of the top-left point of region
* @property {number} y the Y-coordinate of the top-left point of region
* @property {number} w width of region
* @property {number} h height of region
*/
export interface IRegion {
x: number;
y: number;
w: number;
h: number;
};
获取显示器缩略图
兼容:v3.10.1+
/**
* 获取屏幕缩略图
*
* @param {string} monitorName 屏幕标识
*/
xyRTC.getMonitorThumbnail(monitorName: string): IMonitorThumbnail
/**
* 显示器缩略图
*
* @property {string} monitorName 显示器唯一标识
*/
interface IMonitorThumbnail extends IContentThumbnail {
monitorName: string;
}
/**
* 共享缩略图数据
*
* @property {boolean} hasData 是否有 buffer 数据
* @property {number} width 缩略图宽度
* @property {number} height 缩略图高度
* @property {ArrayBuffer} buffer 缩略图 argb 数据
*/
interface IContentThumbnail {
hasData: boolean;
width: number;
height: number;
buffer: ArrayBuffer;
};
获取 app 列表
兼容:v3.10.1+
/**
* 获取 app 列表
*/
xyRTC.getAppList(): IApp[]
/**
* App 应用信息
*
* @property {number} appId appId
* @property {string} appName app 名称
* @property {number} hwnd app 窗口
*/
interface IApp {
appId: number;
appName: string;
hwnd: number;
}
获取 app 缩略图数据
兼容:v3.10.1+
/**
* 获取 app 缩略图数据
*
* @param {number} hwnd app 窗口ID
*/
xyRTC.getAppThumbnail(hwnd: number): IAppThumbnail
/**
* App 缩略图
*
* @property {number} hwnd app 窗口ID
*/
interface IAppThumbnail extends IContentThumbnail {
hwnd: number;
}
/**
* 共享缩略图数据
*
* @property {boolean} hasData 是否有 buffer 数据
* @property {number} width 缩略图宽度
* @property {number} height 缩略图高度
* @property {ArrayBuffer} buffer 缩略图 argb 数据
*/
interface IContentThumbnail {
hasData: boolean;
width: number;
height: number;
buffer: ArrayBuffer;
};
获取 App icon 图标数据
兼容:v3.10.1+
/**
* 获取 App icon 图标数据
*
* @param {number} hwnd app 窗口句柄
*/
xyRTC.getAppIcon(hwnd: number): IAppIcon
/**
* App icon
*/
type IAppIcon = IAppThumbnail;
结束共享 content
xyRTC.stopSendContent(): void;
设置虚拟背景模式
兼容:v3.10.2+
/**
* 设置虚拟背景模式
*
* @param { VirtualBgMode } mode 虚拟背景模式
*/
xyRTC.setVirtualBgMode(mode: VirtualBgMode): void;
/**
* 设置虚拟背景模式
*
* @param NONE 无效果
* @param BG_BLUR 背景虚化
* @param BG_IMAGE 自定义图片
*/
enum VirtualBgMode {
NONE,
BG_BLUR,
BG_IMAGE,
}
设置虚拟背景图片
兼容:v3.10.2+
/**
* 设置虚拟背景图片
*
* @param { string } imgPath 虚拟背景图片的文件路径
*/
xyRTC.setVirtualBgImage(imgPath: string): void;
需要与setVirtualBgMode配合使用
// 设置虚拟背景图片模式
xyRTC.setVirtualBgMode(VirtualBgMode.BG_IMAGE);
// 设置背景图片
xyRTC.setVirtualBgImage("C:\\xxx.png");
提示
仅支持 jpg 和 png 格式的图片,设置虚拟背景图片时,会校验图片路径是否存在和文件类型是否支持,校验不通过时,该API会返回对应的错误码(XYSDK:963006、XYSDK:963007)对象。
设置美颜效果
兼容:v3.10.2+
/**
* 设置美颜效果
*
* @param { VideoBeautyStyle } style 美颜类型
* @param { number } level 美颜等级,值在 0-100 之间
*/
xyRTC.setVideoBeautyEffect(style: VideoBeautyStyle, level: number): void;
/**
* 美颜类型
*
* @param NONE 无效果
* @param SMOOTH 磨皮
* @param WHITEN 美白
* @param BLUSH 红润
*/
enum VideoBeautyStyle {
NONE,
SMOOTH,
WHITEN,
BLUSH,
}
设置滤镜效果
兼容:v3.10.2+
/**
* 设置滤镜效果
*
* @param { VideoFilterStyle } style 滤镜类型
* @param { number } level 滤镜等级,值在 0-100 之间
*/
xyRTC.setVideoFilterEffect(style: VideoFilterStyle, level: number): void;
/**
* 滤镜类型
*
* @param NONE 无效果
* @param CONCISE 简洁
* @param NATURAL 自然
* @param EXQUISITE 精致
* @param PEACEFUL 宁静
* @param SOFT 柔和
* @param LIGHT_LUXURY 轻奢
* @param YOUTH 青春
* @param RAIN 雨后
* @param CAMPUS 校园
* @param WARMTH 热情
* @param REFRESHING 清新
* @param GALAXY 银河
* @param PURE 清澈
* @param DAWN 清晨
* @param DREAM 梦幻
* @param HIGHLIGHT 高光
* @param ELEGANT 典雅
* @param NOSTALGIA 怀旧
* @param DARK 暗调
* @param RETRO 老电影
*/
enum VideoFilterStyle {
NONE,
CONCISE,
NATURAL,
EXQUISITE,
PEACEFUL,
SOFT,
LIGHT_LUXURY,
YOUTH,
RAIN,
CAMPUS,
WARMTH,
REFRESHING,
GALAXY,
PURE,
DAWN,
DREAM,
HIGHLIGHT,
ELEGANT,
NOSTALGIA,
DARK,
RETRO,
}
兼容:v0.3.0+
广播本地电子铭牌到远端: 开启后接收端可以收到广播出去的人脸信息;
例如: 终端A开启了广播本地电子铭牌, B终端请求了A的画面, 且A在B上的布局画面符合显示条件(例:A在大画面), 那么终端B就可以去显示A的铭牌信息;
参数:
/**
* 是否广播本地电子铭牌
*
* @param { boolean } enable
*
*/
xyRTC.broadcastEletronicBadge(enable = true): void;
兼容:v0.3.0+
是否开启人脸识别模式
参数:
/**
* 是否显示远端人脸信息
*
* @param { TFaceType } faceType Detect:扫描模式 EletronicBadge:电子铭牌
* @param { boolean } enable 是否开启
*/
xyRTC.enableFaceDetectMode(
faceType: TFaceType = "EletronicBadge",
enable = true
): void;
type TFaceType = "Detect" | "EletronicBadge";
获取多个人脸信息详情
兼容:v0.3.0 ~ v1.x
参数:
/**
* 获取人脸信息详情
*
* @param { number[] } faceIds
*
*/
xyRTC.getFaceInfo(faceId: number[]): void;
兼容:v0.3.1+
开启云端录制
在调用此方法之前,监听'RecordingStateChanged'事件,判断是否有权限进行录制。
xyRTC.startCloudRecord():void;
兼容:v0.3.1+
停止云端录制
xyRTC.stopCloudRecord():void;
检测是否支持 webgl 渲染
xyRTC.isSupportWebGL(): boolean;
设置日志等级
参数:
xyRTC.setLogLevel(level: ILevel): void;
type ILevel = "INFO" | "DEBUG" | "WARNING" | "ERROR" | "NONE";
// INFO: 所有信息
// DEBUG: 调试信息
// WARNING: 警告信息
// ERROR: 错误信息
// NONE: 禁止输出
会前开启Audio Dump开关,开启之后,日志目录下会产生aelogging文件夹,可帮助定位回声等问题。
xyRTC.enableAudioDump(): void;
上报日志到云端;
兼容:v1.0.0+
参数:
xyRTC.logUpload(comments: string): void;
签到方法,签到完成后,通过签到事件获取结果;
兼容:v1.0.2+
参数:
xyRTC.signIn(url: string, questionnaireId: string): void;
当远端存在硬件终端时,可以遥控硬件摄像头;
当前摄像头所支持的指令集:
兼容:v1.0.2+
参数:
xyRTC.farEndHardwareControl(callUri: string, command: SDKFECCCommand, angle: number): void;
/**
* 遥控摄像头指令
*/
enum SDKFECCCommand {
FECC_TURN_LEFT, /* 连续左转 */
FECC_STEP_LEFT, /* 向左步进 */
FECC_TURN_RIGHT, /* 连续右转 */
FECC_STEP_RIGHT, /* 向右步进 */
FECC_TURN_STOP, /* 水平转动停止。停止 FECC_TURN_ */
TILT_CAMERA_TURN_UP, /* 向上抬起 */
TILT_CAMERA_STEP_UP,
TILT_CAMERA_TURN_DOWN, /* 向下低头 */
TILT_CAMERA_STEP_DOWN,
TILT_CAMERA_TURN_STOP,
FECC_ZOOM_IN, /* 放大 */
FECC_ZOOM_OUT, /* 缩小 */
FECC_STEP_ZOOM_IN,
FECC_STEP_ZOOM_OUT,
FECC_ZOOM_TURN_STOP,
MOVE_LEFT_TURN,
MOVE_LEFT_STEP,
MOVE_RIGHT_TURN,
MOVE_RIGHT_STEP,
MOVE_UP_TURN,
MOVE_UP_STEP,
MOVE_DOWN_TURN,
MOVE_DOWN_STEP,
MOVE_STOP,
FECC_UNKNOWN
};
重新计算Layout布局数据, 只适用于自动布局
触发机制:当页面窗口变化/Container Dom大小变化时,可主动调用此方法更新Layout信息
建议:需配置autoResizeLayout为false关闭内部的事件,避免重复计算;
兼容:v1.0.2+
xyRTC.updateLayoutSize():void
获取当前正在使用的设备
兼容:v1.0.2+
参数:
xyRTC.getCurrentDevice(type?: DeviceTypeKey): Promise<ICurrentDevice | string>;
enum DeviceTypeKey {
camera = "camera",
microphone = "microphone",
speaker = "speaker",
}
interface ICurrentDevice {
camera: string,
microphone: string,
speaker: string,
}
开始采集麦克风
兼容:v3.10.1+
/**
* 开始采集麦克风
*/
xyRTC.startAudioCapture();
结束麦克风采集
兼容:v3.10.1+
/**
* 结束采集麦克风
*/
xyRTC.stopAudioCapture();
检查是否支持通话字幕,检查结果需在SupportAiCaptionResult事件中监听;
兼容:v1.0.3
注意
v3.10.1暂时不支持通话字幕相关功能,后续版本会支持;
xyRTC.checkAiCaptionSupport():Promise<void>
通话字幕切换语言功能;设置完成后,会通过AiCaptionInfoChanged事件实时返回通话字幕数据;
兼容:v1.0.3
参数:
注意
v3.10.1暂时不支持通话字幕相关功能,后续版本会支持;
xyRTC.setCaptionLanguage(language: LanguageType): Promise<void>
/**
* 通话字幕语言类型
*
* @param NONE 0 - 关闭字幕
* @param CHINESE 1 简体中文
* @param ENGLISH 2 英语
*/
enum LanguageType {
NONE,
CHINESE,
ENGLISH,
}
开始批注;
兼容:v3.10.3+
xyRTC.startAnnotation():void
结束批注;
兼容:v3.10.3+
xyRTC.stopAnnotation():void
清空批注;
兼容:v3.10.3+
xyRTC.cleanAnnotation():void
发送批注线数据,content接受者标注时用到
兼容:v3.10.3+
xyRTC.stopAnnotation(line: ILine):void
/**
* 标注线 发送
*
* @property {number} weight 宽度
* @property {string} color 颜色 Like "#121212ff" RGBA
* @property {string} calluri 表示发给谁,
* @property {string} uuid 线uuid, 发送者(content接受者)发送后,会回调uuid
* @property {boolean} ended 是否线结束, 默认true
* @property {boolean} getAllLines 默认false
* @property {IPoint[]} points 点数组
*/
export interface ILine{
weight: number;
color: string;
calluri?: string;
uuid?: string;
ended?: boolean;
getAllLines?: boolean;
points: IPoint[];
}
返回登录状态
xyRTC.on('LoginState', (e: ILoginState) => {});
interface ILoginState {
state: string; // Logined | Logining | logouting | Logouted
error: number;
info?: ILoingInfo;
}
interface ILoingInfo {
callUri: string;
displayName: string;
userId: number;
deviceId: number;
extUserId: string; // 兼容:0.1.5+
email: string; // 兼容:v1.0.2+
peerNumber: string; // 兼容:v1.0.2+
}
在已登录的情况下这个回调接口上报网络连接状况。未登录的情况下不上报。
如果 App 层收到 OnConnectState('Not_Connect'), App 层应该禁止用户除了挂断外的其他操作。 如果在 40 秒内恢复网络连接, 通话继续进行,否则 App 层会收到 OnCallState(state==disconnected) 消息
如果 App 层收到 OnConnectState('Not_Connect'), App 层应该禁止用户发起呼叫操作。
xyRTC.on('ConnectState', (e: IConnectState) => {});
type IConnectState = 'Not_Connect' | 'Connected';
会议呼叫状态
xyRTC.on('CallState', (e: ICallState) => {});
type ICallState = {
// Connected:会议呼叫成功
// Connecting:会议正在连接
// Disconnected:会议挂断完成
// Disconnecting:挂断会议进行中
state: string;
error: number;
reason: string;
// 详见状态/错误码
code: string;
};
// error解释说明:
// 1: 无效的extId;
// 2: 网络错误;
// 3: 服务错误(无法访问服务器)
// 4: 没有登录
// 5: 内部状态错误
// 6: 会议密码错误
// 7: 无效的会议号
// 8: 会议异常断开
参会者列表数据,通过请流后触发;
xyRTC.on("VideoStreams", (e: IRoster[]) => ());
interface IRoster {
// 用户名
displayName: string;
// 是否是content
isContent: boolean;
// 画面状态
// 1: 视频关闭
// 2: 视频请求中
// 3: 网络质量差
// 4: 没有编解码
// 5: 画面正常播放中
// 6: PSTN电话入会
// 7: 仅音频模式
// 8: 画面异常
state: number;
// 资源id
sourceId: string;
// audio状态
audioMute: boolean;
// 用户calluri id信息,不唯一
callUri: string;
// 兼容v0.1.5+
extUserId: string;
// 兼容v0.2.6+
// 用户唯一id
id: string;
// 兼容v0.3.0+
// 是否是语音激励的画面
activeSpeaker: boolean;
// 遥控硬件摄像头能力 兼容v1.0.2+
feccOri?: number;
}
Content状态;
xyRTC.on("ContentState", (e: ShareContentState) => ());
/**
* 内容共享状态
*/
enum ShareContentState {
IDLE, // 空闲状态
SENDING, // 正在发送
RECEIVING, // 正在接受 v3.10.1+
NO_BAND_WIDTH, // 带宽不足 v3.10.1+
ERROR, // 共享错误 v3.10.1+
EXCEED_MAX_SHARE_CONTENT_COUNT // 共享路数超过最大限制 v3.10.1+
};
auto 布局时,需要响应此数据,设置布局容器的大小
xyRTC.on("ScreenInfo", (e: IScreenInfo) => ());
type IScreenInfo = {
layoutWidth: number,
layoutHeight: number,
};
会议参会信息变化事件 v0.2.0 版本开始,participantCount
将包含本地 Local 数据,即现在推送的数量会比之前的多一个,请注意兼容;
xyRTC.on("ConfInfoChanged", (e: IConfInfo) => ());
type IConfInfo = {
// content数量
contentPartCount: number;
// 会议成员数量
participantCount: number;
// 主会场url
chairManUrl: string;
// 所有在会的人(包含content only以及类终端),v0.2.0+支持
visibleEpCount: number;
};
会控主持人回调;
xyRTC.on("ConfHostChanged", (e: IConfHost) => ());
export interface IConfHost {
// 会议id
meetingId: string;
// 是否主持人
isHost: boolean;
// 是否会议
isOwner: boolean; // v1.0.4
}
Local 声音大小回调
xyRTC.on('MicEnergyReported', (e: number) => {});
会控消息
xyRTC.on("ConfControl", (e: IConfControl) => ());
interface IConfControl {
// 主会场callerUri
chirmanUri: stirng;
// 会控web url地址
confMgmtUri: string;
// 以下需要兼容:v0.2.0+
// on(mute speaker)|off(unmute speaker)|keep(do nothing)
muteSpk: string;
// mute|unmute|forcemute
muteMic: string;
// 是否强制静音
disableMute: boolean;
// 是否不能录制
disableRecord: boolean;
// 是否不能分享
disableContent: boolean;
// 支持会控改名 v1.0.2+ 兼容
rename: string;
// 禁止批注 v3.10.3+ 兼容
disableAnnotation: boolean;
}
兼容:v0.1.5+
账号被踢、过期失效消息
xyRTC.on("KickOut", (errorCode: 4000 | 4001 | 4003) => ());
const errorCodeMap = {
4000: "多个重复长连接建立",
4001: "用户在另一台设备登录",
4003: "登录过期",
};
兼容:v0.1.5+
设备变动监听回调,返回变动设备的类型,业务层基于类型重新获取设备列表数据。
xyRTC.on("MediaDeviceEvent", (type: IDeviceType) => ());
type IDeviceType = "camera" | "microphone" | "speaker";
兼容:v0.2.0+
监听错误信息
xyRTC.on("SDKError", (e: ISDKError) => ());
// 0: 正常
// 1: 无效APPKEY
// 2: 网络错误
// 3: 服务错误(无法访问服务器)
// 4: 没有登录
// 5: 内部状态错误
// 6: 会议密码错误
// 7: 无效云会议号
// 8: 会议异常断开(具体错误细节需要看:CallState->disconnectReason)
type ISDKError = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8;
兼容:v0.2.0+
本地网络状况上报,回调频率根据入会终端期望带宽和DBA(动态带宽调整)探测带宽的比例计算,计算的Level不同会上报,同时也跟终端网络的稳定性有关;
xyRTC.on("NetworkIndicatorLevel", (e: INetworkIndicatorLevel) => ());
// 一共4档:1、2、3、4 分别为:差、中、良、优
type INetworkIndicatorLevel = 1 | 2 | 3 | 4;
兼容:v0.1.15+
是否存在啸叫,建议当收到啸叫时,用户可降低声音或关闭麦克风结束啸叫;
xyRTC.on('HowlingDetected', (e: number) => {});
兼容:v0.2.0+
上报 MicMute 状态
xyRTC.on('MicMuted', (e: number) => {});
兼容:v0.2.0+
接收会控字幕消息,具体用法参见示例程序组件。
xyRTC.on('SubTitle', (e: ISubTitle) => {});
interface ISubTitle {
action: string;
content: string;
location: string;
fontSize: string;
backgroundAlpha: string;
backgroundRGB: string;
fontRGB: string;
scrollSpeed: string;
fontFamily: string;
scroll: boolean;
}
兼容:v0.2.0+
参会者出入会提醒;
xyRTC.on('InOutReminder', (e: IInOutReminder) => {});
interface IInOutReminder {
// 用户名
displayName: string;
// 出入会动作
action: string;
// userid
extUserId: string;
}
兼容:v0.2.0+
本地麦克风状态,当会议状态或者操作影响到麦克风状态时,会推送此事件上层更新麦克风状态;
xyRTC.on('AudioStatusChanged', (e: { muteMic: 'mute' | 'unmute' })): void;
兼容:v0.2.0+
会议状态数据上报
xyRTC.on('VideoStatusChanged', (e: videoStatus)): void;
// 0: 正常
// 1: 本地网络质量不佳
// 2,3,4,5: 网络质量不佳
typ videoStatus = 0 | 1 | 2 | 3 | 4 | 5;
人脸信息回调
兼容:v0.3.0 ~ v1.x
xyRTC.on('AIFaceRecv', (e: IAIFaceRecv) => {});
/**
* 人脸信息
*
* @property { boolean } isLocal 是否是自己
* @property { string } calluri 设备id
* @property { string } participantId 参会者id
* @property { number } type 0:人脸识别 1:人脸跟踪 2:电子铭牌
* @property { number } seq
* @property { IFacePosition[] } positionArr 人脸位置信息
*/
interface IAIFaceRecv {
isLocal: boolean;
calluri: string;
participantId: number;
type: number;
seq: number;
positionArr: IFacePosition[];
}
/**
* 人脸位置信息
*
* @property { number } faceId 人脸的ID
* @property { number } left 检测人脸的左侧距离
* @property { number } right 检测人脸的右侧距离
* @property { number } top 检测人脸的顶部距离
* @property { number } bottom 检测人脸的底部距离
*
*/
interface IFacePosition {
faceId: number;
left: number;
right: number;
top: number;
bottom: number;
}
人脸信息回调
兼容:v3.10.1+
xyRTC.on('AIFaceRecv', (e: IAIFaceRecv) => {});
/**
* 人脸信息
*
* @property { boolean } isLocal 是否是自己
* @property { string } calluri 设备id
* @property { string } participantId 参会者id
* @property { number } type 0:人脸识别 1:人脸跟踪 2:电子铭牌
* @property { number } seq
* @property { IFacePosition[] } positionArr 人脸位置信息
*/
interface IAIFaceRecv {
isLocal: boolean;
calluri: string;
participantId: number;
type: number;
seq: number;
faceInfoArr: IAIFaceInfo[];
}
/**
* 人脸对应信息
*
* @property { string } userId 人脸对应用户ID
* @property { string } userName 用户名称
* @property { string } userNickName
* @property { number } userAge 用户年龄
* @property { string } userIdentifyCard
* @property { string } userTitle 用户企业名称
* @property { string } userPhone 用户手机号
* @property { number } userStatus
*/
interface IAIFaceInfo {
userId: string;
userName: string;
userNickName: string;
userAge: number;
userIdentifyCard: string;
userTitle: string;
userPhone: string;
userStatus: number;
position: IFacePosition;
}
/**
* 人脸位置信息
*
* @property { number } faceId 人脸的ID
* @property { number } left 检测人脸的左侧距离
* @property { number } right 检测人脸的右侧距离
* @property { number } top 检测人脸的顶部距离
* @property { number } bottom 检测人脸的底部距离
*
*/
interface IFacePosition {
faceId: number;
left: number;
right: number;
top: number;
bottom: number;
}
兼容:v0.3.0 ~ v1.x
getFaceInfo 回调,人脸信息详情
注意
v3.10.1已移除此事件
xyRTC.on('AIFaceInfo', (e: IAIFaceInfo[]): void;
/**
* 人脸对应信息
*
* @property { string } userId 人脸对应用户ID
* @property { string } userName 用户名称
* @property { string } userNickName
* @property { number } userAge 用户年龄
* @property { string } userIdentifyCard
* @property { string } userTitle 用户企业名称
* @property { string } userPhone 用户手机号
* @property { number } userStatus
*/
interface IAIFaceInfo {
userId: string;
userName: string;
userNickName: string;
userAge: number;
userIdentifyCard: string;
userTitle: string;
userPhone: string;
userStatus: number;
}
兼容:v0.3.0+
双击某个参会者进行全屏显示事件,当有画面变动时,会推送此事件;
// 当id为空时,代表设备退出全屏展示;
xyRTC.on('ForceFullScreen', (id: string) => {})
兼容:v0.3.0+
响应会控关闭摄像头事件,业务上接收到此事件,建议关闭本地摄像头;
xyRTC.on('MeetingMuteQuery', (e: {meetingId: string, key: string}) => {})
云端录制回调,包含录制权限、存储空间、开启录制和停止录制状态
兼容:v0.3.1 ~ v1.x
xyRTC.on('RecordingStateChanged', (e: IRecordStateChange) => {})
enum SDKRecordingState
{
RECORDING_STATE_IDLE, // 空闲 录制完成
RECORDING_STATE_STARTING, // 开启录制中
RECORDING_STATE_ACTING, // 正在录制中
RECORDING_STATE_STOPING, // 停止录制中
RECORDING_STATE_INACT // 暂未使用 暂停录制相关,暂时用不到
};
interface IRecordStateChange{
recordState: SDKRecordingState; // 录制状态
isRecorded: boolean; // 是否录制
reason:string; // 录制错误码, 详见错误码文档
message:string // 录制错误码对应信息
}
云端录制回调,包含录制权限、存储空间、开启录制和停止录制状态
兼容:v3.10.1+
xyRTC.on('RecordingStateChanged', (e: IRecordStateChange) => {})
interface IRecordStateChange {
// recordState 更新
recordState: RecordStatus;
reason: string;
message: string;
}
/**
* 云端录制状态
*
* @param IDLE 本地录制未开始或录制结束
* @param ACTING 本地录制进行中
* @param PAUSE_BY_OTHERS 录制被暂停 这里有两种情况 1. 本地正在录制中,被会控暂停 2. 其他人正在录制中,被会控暂停录制
* @param IDLE_BY_OTHERS 录制结束 两种情况 1. 本地正在录制中或者暂停中,被会控结束录制 2. 其他人录制结束
* @param ACTING_BY_OTHERS 录制进行中 两种情况 1. 本地录制被暂停后又被恢复录制 2. 其他人录制进行中
* @param DISABLE 录制功能被禁用,无权限
*/
enum RecordStatus {
IDLE,
ACTING,
PAUSE_BY_OTHERS,
IDLE_BY_OTHERS,
ACTING_BY_OTHERS,
DISABLE,
}
兼容:v0.3.1 ~ v1.x
会中远端录制状态回调
注意
v3.10.1+ 已移除此事件监听
xyRTC.on('RecordStatusNotification', (e: IRecordStatusNotification) => {})
interface IRecordStatusNotification{
isStart: number; // 远端是否开启了录制
uri: string; // 录制发起者名称
status:string; // 录制状态
}
兼容:v1.0.0+
自动布局下,当布局模型切换后,回调最终结果数据和信息;
xyRTC.on('TemplateModelChanged', (e: TemplateModel) => {});
/**
* SPEAKER:演讲者模式,大画面会优先显示Content内容、语音激励的设备画面;
* GALLERY:宫格模式,所有人员都按照统一的大小显示排列;
* MULTI_PIC_CONTENT_HIGH_PRIORITY:Content始终放到大窗口;
* MULTI_PIC_ACTIVE_HIGH_PRIORITY:Content始终放置到小窗口;
* TWO_PIC_PIP:共享视图,大窗口是Content,小窗口叠加到大窗口右下角;
* CONTENT_ONLY:只展示Content大画面;
* TWO_PIC_SYMMETRIC:仅共享+演讲者布局画面;
*/
enum TemplateModel {
"SPEAKER" = "SPEAKER",
"GALLERY" = "GALLERY",
"MULTI_PIC_CONTENT_HIGH_PRIORITY" = "MULTI_PIC_CONTENT_HIGH_PRIORITY",
"MULTI_PIC_ACTIVE_HIGH_PRIORITY" = "MULTI_PIC_ACTIVE_HIGH_PRIORITY",
"TWO_PIC_PIP" = "TWO_PIC_PIP",
"CONTENT_ONLY" = "CONTENT_ONLY",
"TWO_PIC_SYMMETRIC" = "TWO_PIC_SYMMETRIC",
}
兼容:v1.0.0+
自动布局下,翻页详情回调事件;
xyRTC.on('PageInfo', (e: IPageInfo) => {});
/**
* 布局分页详细信息
*
* @property { number } currentPage 当前所在页 0<=currentPage<=totalPage
* @property { number } maxSize 每页显示最大画面数量
* @property { number } totalPage 总页数
*/
interface IPageInfo {
currentPage: number;
maxSize: number;
totalPage: number;
}
兼容:v1.0.0+
会议室详情信息事件;
xyRTC.on('ConferenceInfo', (e: IConferenceInfo) => {});
/**
* 云会议室相关信息
*
* @property { string? } meetingNumber 云会议室号码
* @property { string? } numberType 云会议室类型
* @property { string? } displayName 云会议室名称
*/
interface IConferenceInfo {
meetingNumber?: string;
numberType?: string;
displayName?: string;
}
兼容:v1.0.0+
会控上报等候室状态事件;
xyRTC.on('OnHold', (e: IOnHoldInfo) => {});
/**
* 等候室相关信息
*
* @property { boolean? } isOnhold 是否是等候室
* @property { number? } onHoldCount 等候人数
* @property { string? } waitingReason 原因
*/
interface IOnHoldInfo {
isOnhold?: boolean;
onHoldCount?: number;
waitingReason?: string;
}
兼容:v1.0.0+
会控取消举手事件;
xyRTC.on('CONF_HAND_UP_CANCELLED', (e: boolean) => {});
兼容:v1.0.2+
会控互动工具事件;
xyRTC.on('InteractiveToolInfo', (e: IInteractiveToolInfo) => {});
/**
* 会控互动工具相关数据,兼容签到、答题、投票等
*
* @property {ICopywriting} copywriting - 弹窗内容、左侧顶部状态栏内容
* @property {EventType} eventType - 互动事件 start end publish RESULT_CLOSE
* @property {ProcessType} processType - 互动工具业务类型:签到 答题 投票 评价
* @property {string} questionnaireId - 业务id
* @property {boolean} endAuto - 是否自动结束(有倒计时),还是手动结束
* @property {number}} duration - 期限,比如签到剩余时间
* @property {string} webViewUrl - h5页面url
* @property {number} endUtcTime - 结束时间
*/
interface IInteractiveToolInfo {
eventType: EventType;
processType: ProcessType;
endAuto: boolean;
duration: number;
endUtcTime: number;
webViewUrl: string;
questionnaireId: string;
meetingId: string;
business: string;
copywriting: ICopywriting;
}
/**
* 互动工具业务状态:开始 结束 发布结果 关闭结果
*/
enum EventType {
START,
STOP,
PUBLISH,
RESULT_CLOSE
}
/**
* 互动工具业务类型:签到 答题 投票 评估
*/
enum ProcessType {
NONE,
SIGN_IN,
ANSWER,
VOTE,
EVALUATION
}
/**
* 互动工具业务涉及到弹窗和状态栏内容
*
* @property {string} notifyContent - 左上角状态栏文案
* @property {string} notifyLabel - 左上角状态栏按钮内容 比如签到按钮
* @property {string} dialogTitle - 弹窗标题
* @property {string} dialogContent - 弹窗主要内容 黑体字部分
* @property {string} dialogSubContent - 弹窗描述
* @property {string} dialogLabel - 弹窗右下角按钮文案
*/
interface ICopywriting {
notifyContent: string;
notifyLabel: string;
dialogTitle: string;
dialogContent: string;
dialogSubContent: string;
dialogLabel: string;
}
兼容:v1.0.2+
签到结果事件;
xyRTC.current.on('SubmitSignatureInfosResult', (e: ISignInfo) => {});
/**
* 签到结果
*
* @property {number} code - 签到结果 0 成功 其它 失败
* @property {string} status - 签到状态
*/
interface ISignInfo {
code: number;
status: string;
}
兼容:v1.0.2+
设备列表更新事件
xyRTC.on('Device', (deviceList: Partial<IDeviceList>) => {});
interface IDeviceList {
camera: IDeviceItem[],
microphone: IDeviceItem[],
speaker: IDeviceItem[],
}
interface IDeviceItem {
// 设备ID
devId: string;
// 设备名称
devName: string;
// 是否是当前使用的设备
isSelected: boolean;
}
兼容:v1.0.2+
当前正在使用的设备更新事件
xyRTC.on('CurrentDevice', (currentDevice: Partial<ICurrentDevice>) => {});
interface ICurrentDevice {
camera: string,
microphone: string,
speaker: string,
}
是否支持通话字幕事件
兼容:v1.0.3
注意
v3.10.1暂时不支持通话字幕相关功能,后续版本会支持;
xyRTC.on('SupportAiCaptionResult', (e: boolean)=>{});
通话字幕内容事件
兼容:v1.0.3
注意
v3.10.1暂时不支持通话字幕相关功能,后续版本会支持;
xyRTC.on('AiCaptionInfoChanged', (e: IAiCaptionInfo) => {});
/**
* 通话字幕内容
*
* @property { number } pid 当前说话的终端
* @property { string } src 原文
* @property { string } target 译文
* @property { number } seTime 发送时间
* @property { number } startTime 开始时间
* @property { number } endTime 结束时间
* @property { boolean } isEnd 一句话是否结束
* @property { boolean } isActive 活跃标志,收三路,同时只有一路active
* @property { string } url 终端calluri
* @property { string } dn 显示名称
* @property { string } meetingId 会议号
* @property { string } srcLang 原语言,zh表示中文,en表示英文
* @property { string } targetLang 译文语言,zh表示中文,en表示英文
*/
interface IAiCaptionInfo {
src: string;
target: string;
srcLang: string;
targetLang: string;
dn: string;
url: string;
meetingId: string;
isEnd: boolean;
isActive: boolean;
seTime: number;
endTime: number;
startTime: number;
pid: number;
}
获取会控H5链接,需要调用getConfMgmtUrl注册;
兼容:v3.10.1+
// 会控H5链接
xyRTC.on('HostMeetingUrl',(e: {pc:string, mobile:string, members: string})=>{});
监听App共享采集状态;
兼容:v3.10.1+
// App 共享采集状态
xyRTC.on('AppWindowCaptureState', (e: IAppWindowCaptureState) => {});
/**
* App共享采集状态
*
* @property {boolean} isClosed 应用是否被关闭
* @property {boolean} isOccluded 应用是否被遮挡
* @property {boolean} isPaused 应用采集是否已暂停,应用最小化或者被遮挡可能会自动暂停
*/
interface IAppWindowCaptureState {
isClosed: boolean;
isOccluded: boolean;
isPaused: boolean;
}
监听批注清除;
兼容:v3.10.3+
// 监听content接收者清除线条
xyRTC.on('AnnotationClean', () => {
});
监听content接收者发送的线条
兼容:v3.10.3+
// 监听content接收者发送的线条
xyRTC.on('AnnotationReceiveLine', (line: IReceiveLine) => {
})
/**
* 接收发送的线
*
* @property {number} sequece 线的序列号
* @property {number} weight 宽度
* @property {string} color 颜色 Like "#121212ff" RGBA
* @property {string} sourceCallUri 线目标发送设备calluri
* @property {string} targetCallUri 线的原始发出设备calluri
* @property {string} uuid 线uuid, 发送者(content接受者)发送后,会回调uuid
* @property {boolean} ended 是否线结束, 默认true
* @property {IPoint[]} points 点数组
*/
export interface IReceiveLine{
sequece: number;
weight: number;
color: string;
sourceCallUri: string;
targetCallUri: string;
uuid: string;
points: IPoint[];
ended: boolean;
}