从v3.8+版本开始,小程序SDK整体重写,功能更加强大和灵活,支持UI模式和无UI模式集成到项目;
此篇文档将整体介绍SDK APIs内容(包含无UI模式、UI模式);
微信开发者工具不支持推/拉流,如需要查看视频画面,请使用真机调试;
小鱼小程序SDK主模块,用于获取XYClient
实例、版本信息和检测微信兼容;
方法 | 描述 | 版本 |
创建 | ||
version | 【静态属性】获取小鱼小程序SDK版本 | |
检测微信小程序是否支持小程序SDK |
音视频通话客户端对象 XTClient
通过 createClient() 创建,代表一次音视频会话,一个 XTClient
对象代表一个本地客户端,一般一次入会只需要创建一个 XTClient
对象即可;
方法 | 描述 | 版本 |
配置SDK功能开关 | ||
设置页面实例 | ||
on | 监听事件 | |
off | 取消监听事件 | |
offAll | 取消所有监听事件 |
方法 | 描述 | 版本 |
login | Token登录 | |
SDK企业登录 |
方法 | 描述 | 版本 |
发起呼叫 |
方法 | 描述 | 版本 |
【无UI模式】自定义布局更新模版 | ||
【无UI模式】live-pusher推流 | ||
【无UI模式】手动播放Layout中的远端画面 | ||
【无UI模式】live-pusher停止推流 | ||
【无UI模式】处理live-pusher状态变化事件 | ||
【无UI模式】处理live-pusher网络状态数据 | ||
【无UI模式】处理live-pusher渲染错误事件 | ||
【无UI模式】处理live-pusher播放音量大小数据 | ||
【无UI模式】处理live-player播放状态变化事件 | ||
【无UI模式】处理live-player网络状态数据 | ||
【无UI模式】处理live-player播放音量大小数据 | ||
设置某个画面全屏 |
方法 | 描述 | 版本 |
muteAudio | 麦克风静音,静音后,远端将听不到本地端声音 | |
取消麦克风静音,取消后,远端可以听到本地端声音 | ||
关闭摄像头 | ||
开启摄像头 | ||
切换摄像头方向 |
方法 | 描述 | 版本 |
举手发言操作 | ||
取消举手操作 | ||
onMute | 结束发言操作 | |
hangup | 挂断会议 |
方法 | 描述 | 版本 |
设置日志/调试日志开关 | ||
设置日志存储方式 | ||
小鱼日志-设置日志服务器地址 | ||
小鱼日志-上传日志 |
方法 | 描述 | 版本 |
设置Client配置参数 | ||
切换布局模型 | ||
设置服务域名 | ||
PDF转图片 | ||
发送自定义消息给其他参会者 | ||
订阅查看更多参会者数据 | 3.9.0+ | |
指定画面屏幕截图 | 3.9.1+ | |
UI模式下,支持Content缩放配置 | 3.9.1+ |
type事件 | 描述 | 兼容 | 备注 |
加入会议成功消息 | v3.8+ | ||
退会消息 | v3.8+ | ||
麦克风和摄像头授权错误事件 | v3.8+ | ||
麦克风实时状态消息事件 | v3.8+ | ||
UI模式下,点击当前画面的参会者和事件信息 | v3.8+ | ||
UI模式下,双击当前画面的参会者和事件信息 | v3.8+ | ||
UI模式下,长按当前画面的参会者和事件信息 | v3.8+ | ||
内存告警消息 | v3.8+ | ||
roster | 会议参会者的详细数据,包含本地数据 | - | |
layout | 参会成员 Layout 列表数据 | - | |
接收到会议控制消息 | - | ||
组件 live-pusher 内部推流事件数据 | - | ||
组件 live-player 拉流事件数据 | - | ||
已废弃,建议使用networkLevel事件 上行网络质量等级 | - | ||
当前共享content的参会者信息 | - | ||
onHold | 被移入等候室状态消息,开发者收到此消息后,不再展示画面内容 | - | |
参会者网络质量数据 | - | ||
当前讲话人信息 | - | ||
接收自定义消息 | v3.8+ | ||
远端参会者视频无流状态上报 | v3.8+ | ||
监听远端参会者网络质量等级 | v3.8.6+ | ||
监听本地端网络质量等级,用于给本地提示和通知远端 | v3.8.6+ | ||
meetingInfo | 会议相关信息 | v3.9.0 | |
获取所有参会者成员信息,用于信息展示 | v3.9.0 |
创建XYClient
实例,用于对外提供方法和事件数据;
兼容:v3.8+
createClient()创建了一个单例对象XYClient
,在多个小程序页面之间共享一个实例,可以重复调用获取最新的实例;
import XYRTC from '@xylink/xy-mp-sdk';
/**
* Client配置参数
*
* @property { string } server - 非必填 服务地址, IP/域名 + 端口,如: wxrtc.xylink.com
* @property { string } appId - 非必填 SDK企业ID,通过小鱼易连企业管理平台创建
* @property { string } extId - 非必填 SDK应用ID,通过小鱼易连企业管理平台创建
* @property { string } layoutMode - 非必填 | AUTO | 布局模式,可选:AUTO | CUSTOM
* @property { string } logServer - 非必填 logServer服务地址,默认不需要配置
* @property { { offset?: number[]; } } container - 非必填 | {} | 配置layout container容器节点和偏移量
* @property { number[] } container.offset - 非必填 | [] | 配置[left, top, width, height]的偏移量,自动布局适用
* @property { boolean } report - 非必填 | false | 是否上报会议质量,默认不上报
* @property { boolean } screenOn - 非必填 | true | 是否常亮,默认常亮
* @property { number } logType - 非必填 | 0 | 日志类型, 默认微信日志
*/
interface ClientConfig {
server?: string;
appId?: string;
extId?: string;
layoutMode?: LayoutMode;
logServer?: string;
container?: {
offset?: number[];
};
screenOn?: boolean;
report?: boolean;
logType?: LogType;
}
/**
* 布局模式
*
* @enum
* @param AUTO auto 自动布局,布局内容由sdk内部实现
* @param CUSTOM custom 自定义布局,第三方根据自己业务实现
*/
export enum LayoutMode {
AUTO = 'auto',
CUSTOM = 'custom'
}
/**
* 日志类型
*
* @enum
* @param DEFAULT 0 - 微信日志
* @param CUSTOM 1 - 小鱼日志
*/
enum LogType {
DEFAULT,
CUSTOM
}
const XYClient = XYRTC.createClient(config?: ClientConfig);
检测微信版本是否支持小程序SDK,从v3.8版本开始,小程序SDK最低兼容到微信:v8.0.8版本;
兼容:v3.8+
import XYRTC from '@xylink/xy-mp-sdk';
/**
* 检测微信版本是否支持xy-mp-sdk;
*
* @returns {boolean} isSupport - 是否支持
*/
XYRTC.checkSupportMp(): boolean
修改服务域名,需要在登录之前进行设置,默认是线上环境,如果没有特殊的需求,不需要执行此方法;
兼容:v3.8+
/**
* 修改服务域名
* 默认server: wxrtc.xylink.com
*
* @param { string } server - 服务域名
*/
XYClient.setServer(server: string): void
SDK功能控制开关
兼容:v3.9+
XYClient.setFeatureConfig(config: FeatureConfig): void;
/**
* SDK功能控制开关,用于内部是否启用某些功能的运行
*
* @property { boolean } enableMeetingInvite 是否启用查询小鱼会议邀请链接信息,默认不启用,设置为false;
* @property { boolean } enableLayoutAvatar 是否启用获取参会者头像,默认不启用,设置为false;
*/
interface FeatureConfig {
enableMeetingInvite?: boolean;
enableLayoutAvatar?: boolean;
}
小程序SDK v3.8+版本之后,强烈建议使用SDK提供的第三方企业账号登录(loginExternalAccount)方式对接SDK登录操作,无需第三方服务参与,集成更加简单高效;
Token登录接口,如何生成 Token?参见 小程序-服务端;
XYClient.login(token: string, cb?: (response: Object) => {}): Promise<IResponse>;
SDK第三方企业账号登录,推荐使用此方式进行SDK账号登录;
兼容:v1.0.76+
XYClient.loginExternalAccount(params: LoginExternalAccountParams): Promise<StatusInfo>;
/**
* 登录参数
*
* @property { string } extUserId - 第三方UserId,规则:数字、字母、\_-, 且长度不能超过 50字符
* @property { string } displayName - 登录用户名
*/
interface LoginExternalAccountParams {
extUserId: string;
displayName: string;
}
/**
* 登录结果信息
*
* @property { string } key - 错误码
* @property { string } message - 消息提示
* @property { IUserInfo } data - 登录用户信息
*/
interface StatusInfo {
key: string;
data: UserInfo | null;
message: string;
}
/**
* 用户信息
*
* @property { string } appId - 应用ID
* @property { string } callNumber - 用户呼叫号码ID
* @property { string } deviceSN - 设置SN
* @property { string } displayName - 登录用户名
* @property { string } enterpriseId - 登陆企业ID
* @property { string } securityKey - 安全码
* @property { string } userId - 用户ID
*/
interface UserInfo {
appId: string;
callNumber: string;
deviceSN: string;
displayName: string;
enterpriseId: string;
securityKey: string;
userId: number;
}
发起会议呼叫,呼叫成功状态由connected事件上报通知;
兼容:v3.8+
XYClient.makeCall(params: MakeCallParams): Promise<IResponse>;
/**
* 呼叫参数
*
*
* @property {string} string - 云会议室号
* @property {string} password - 云会议室入会密码, 默认填写为""
* @property {string} displayName - 入会名称
* @property {boolean} isAudioMute - 关闭音频入会
* @property {boolean} isVideoMute - 关闭视频入会
* @property {CameraPosition} cameraPosition - 前置或后置摄像头, 可选值:front,back
*/
interface MakeCallParams {
number: string;
password?: string;
displayName?: string;
isAudioMute?: boolean;
isVideoMute?: boolean;
cameraPosition?: CameraPosition;
}
/**
* 前置或后置摄像头
*
* @property FRONT front - 前置
* @property BACK back - 后置
*/
enum CameraPosition {
FRONT = 'front',
BACK = 'back'
}
/**
* 返回结果
*
* @param { string } key - 错误码
* @param { any } data - 数据
* @param { string } message - 结果消息
*/
interface IResponse {
key: string;
data: any;
message: string;
}
【无UI模式】设置页面实例;
createClient之后,立即调用此方式设置当前page的上下文,避免在调用实例方法的时候会出现无法获取的情况;
兼容:v3.8+
/**
* 设置页面实例
*
* @param { * } ctx - 当前页面示例
*/
XYClient.setPageInstance(ctx): void
设置Client配置参数;
兼容:v3.8+
/**
* 设置Client配置参数
*
* @param {ClientConfig} config - 配置参数
*/
XYClient.setConfig(config: ClientConfig): void;
/**
* Client配置参数
*
* @property { string } server - 非必填 服务地址, IP/域名 + 端口,如: wxrtc.xylink.com
* @property { string } appId - 非必填 SDK企业ID,通过小鱼易连企业管理平台创建
* @property { string } extId - 非必填 SDK应用ID,通过小鱼易连企业管理平台创建
* @property { string } layoutMode - 非必填 | AUTO | 布局模式,可选:AUTO | CUSTOM
* @property { string } logServer - 非必填 logServer服务地址,默认不需要配置
* @property { { offset?: number[]; } } container - 非必填 | {} | 配置layout container容器节点和偏移量
* @property { number[] } container.offset - 非必填 | [] | 配置[left, top, width, height]的偏移量,自动布局适用
* @property { boolean } report - 非必填 | false | 是否上报会议质量,默认不上报
* @property { boolean } screenOn - 非必填 | true | 是否常亮,默认常亮
* @property { number } logType - 非必填 | 0 | 日志类型, 默认微信LogManager
*/
interface ClientConfig {
server?: string;
appId?: string;
extId?: string;
layoutMode?: LayoutMode;
logServer?: string;
container?: {
offset?: number[];
};
screenOn?: boolean;
report?: boolean;
logType?: LogType;
}
设置日志输入开关/日志写入文件开关;
兼容:v3.8+
/**
* 设置是否进行内部事件的console和写入logger文件
*
* @param { boolean } isConsole - 默认是false,禁止向控制台打印调试信息
* @param { boolean } isLogger - 默认是true,开启日志文件写入
*/
XYClient.setDebug(isConsole: boolean, isLogger: boolean): void
设置布局模型;
兼容:v3.8+
/**
* setConfig
*
* @param { LayoutMode } mode 布局模式: auto/custom 默认:auto
*/
XYClient.setLayoutMode(mode?: LayoutMode): void;
/**
* 布局模式
*
* @enum
* @param AUTO auto 自动布局,布局内容由sdk内部实现
* @param CUSTOM custom 自定义布局,第三方根据自己业务实现
*/
enum LayoutMode {
AUTO = 'auto',
CUSTOM = 'custom'
}
麦克风静音,静音后,远端将听不到本地端声音
XYClient.muteAudio():void
取消麦克风静音,取消后,远端可以听到本地端声音
XYClient.unmuteAudio(): void
关闭摄像头
参数:
/**
* 关闭摄像头
*
* @property { number } reason - 可选项,默认是0,填写关闭视频原因,0-7数值
* 枚举按顺序分别代表:
* MuteByUser:用户自行关闭视频
* MuteByBWLimit:带宽太低,媒体自动关闭
* MuteByNoInput:没有输入设备
* MuteByConfMgmt:通过会控关闭
* MuteByDeviceDetection:设备检测关闭
* MuteByPhoneCall:电话接入,自动关闭
* MuteBySync:未知
* MuteByAppInBg:应用切后台
*/
XYClient.muteVideo(reason?: number): void
开启摄像头
XYClient.unmuteVideo():void
举手发言操作;
兼容:v3.8+
/**
* 举手发言 操作
*
* @returns { Promise<boolean> } 是否举手
*/
XYClient.onHandUp(): Promise<boolean>
取消举手操作;
兼容:v3.8+
/**
* 取消举手 操作
*
* @returns { Promise<boolean> } 是否举手
*/
XYClient.onHandDown(): Promise<boolean>
结束发言操作;
兼容:v3.8+
/**
* 结束发言 操作
*
* @returns { Promise<boolean> } 是否举手
*/
XYClient.onMute(): Promise<boolean>;
切换前置/后置摄像头;
兼容:v3.8+
/**
* 切换前置/后置摄像头
*
*/
XYClient.switchCamera(): Promise<'front' | 'back'>;
挂断当前通话,建议挂断会议时主动调用;
兼容:v3.8+
/**
* 退出会议
*
*/
XYClient.hangup(): void
绑定监听事件
兼容:v3.8+
XYClient.on(keyName: string, listenerFunction: () => {}): void
解除绑定监听事件
兼容:v3.8+
XYClient.off(keyName: string): void
解除所有绑定监听事件
兼容:v3.8+
XYClient.offAll(): void
发送自定义消息;远端通过监听:customMessageRecv事件获取自定义消息;
兼容:v1.0.76+
XYClient.sendCustomMessage(config: ICustomMessageConfig): void;
/**
* 用户自定义消息
*
* @property { number } toPid - 消息的接收方pid,0表示广播消息、非0表示单点消息;
* @property { string } data - 消息内容,可以被JSON序列化的字符串;因业务数据可能会传输图片,需要进行base64编码,消息最大长度限制:1MB
*/
interface ICustomMessageConfig {
toPid: number;
data: string;
}
兼容:v1.0.76+
PDF转图片;
状态码:
XYClient.convertPDF(config: CovertPDFConfig) => Promise<IResponse>);
/**
* PDF信息
*
* @param { string } pdfURL - pdf地址
* @param { string } pdfMD5 - pdfMD5值
* @param { string } compressLevel - 转图片时压缩比例,0-100,表示压缩等级百分比,传100就是不压缩,传1就是压缩为1%,默认是60
*/
interface CovertPDFConfig {
pdfURL: string;
pdfMD5: string;
// v3.8.6+支持
compressLevel?: number;
}
/**
* 回调结果
* @property { string } code - 状态码
* @property { string } message - 消息
* @property { null | string[] } data - 返回转换图片结果
*/
interface IResponse {
key: string;
message: string;
data: null | string[];
}
【无UI模式】启动本地推流;
兼容:v3.8+
需在live-pusher设置推流地址成功后,进行调用
/**
* 手动播放Layout中所有的远端画面
*
*/
XYClient.startLivePusher(successCB, failCB): void
【无UI模式】停止本地推流;
兼容:v3.8+
/**
* 停止推流
*
*/
XYClient.stopPushLive(): void
【无UI模式】手动播放Layout中所有的远端画面
兼容:v3.8+
小程序退到后台,再次进入前台,为了避免自动播放失败情况,可在进入前台时调用此方法避免画面未播放成功
/**
* 手动播放Layout中所有的远端画面
*
*/
XYClient.startLivePlayer(): void
【无UI模式】处理live-pusher状态变化事件
兼容:v3.8+
live-pusher bindstatechange回调事件中调用此方法
/**
* 处理live-pusher状态变化事件
*
* @param {eventhandle} e
*/
XYClient.pusherEventHandler(e): void
【无UI模式】处理live-pusher网络状态数据
兼容:v3.8+
live-pusher bindnetstatus回调事件中调用此方法
/**
* 处理live-pusher网络状态数据
*
* @param {eventhandle} e
*/
XYClient.pusherNetStatusHandler(e): void
【无UI模式】处理live-pusher渲染错误事件
兼容:v3.8+
live-pusher binderror回调事件中调用此方法
/**
* 处理live-pusher渲染错误事件
*
* @param {eventhandle} e
*/
XYClient.pusherErrorHandler(e): void
【无UI模式】处理live-pusher播放音量大小数据
兼容:v3.8+
live-pusher binderror回调事件中调用此方法
/**
* 处理live-pusher播放音量大小数据
*
* @param {eventhandle} e
*/
XYClient.pusherAudioVolumeNotify(e): void
【无UI模式】处理live-player播放状态变化事件
兼容:v3.8+
live-player bindstatechange回调事件中调用此方法
/**
* 处理live-player播放状态变化事件
*
* @param {eventhandle} e
*/
XYClient.playerEventHandler(e): void
【无UI模式】处理live-player网络状态数据
兼容:v3.8+
live-player bindnetstatus回调事件中调用此方法
/**
* 处理live-player网络状态数据
*
* @param {eventhandle} e
*/
XYClient.playNetStatusHandler(e): void
【无UI模式】处理live-player播放音量大小数据
兼容:v3.8+
live-player bindaudiovolumenotify回调事件中调用此方法
/**
* 处理live-player播放音量大小数据
*
* @param {eventhandle} e
*/
XYClient.playAudioVolumeNotify(e): void
【无UI模式】自定义布局更新模板
兼容:v3.8+
/**
* [custom]自定义布局更新模板
*
*/
XYClient.updateTemplate(template: CustomTemplateInfo):void;
/**
* 自定义布局模版信息
*
* @property { string } callNumber - 必填,参会者的呼叫号码,此数据可以从 Roster List 数据中获取
* @property { number|string[] } position - 必填,参会者位置和大小信息 [left, top, width, height], 如果指定数字,则默认单位是vw, vh;如果指定string, 则用户自定义样式单位
* @property { string } name - 必填,参会者名称,此数据可以从 Roster List 数据中获取
* @property { QualityType } quality -必填,参会者名称,指定参会者画面清晰度,建议将大屏画面设置为 high,小屏画面设置为 normal,content 设置为 hd;
* @property { boolean } isContent - 当前位置是否是 Content 共享内容
* @property { string } style - 自定义样式
*/
interface CustomTemplateInfo {
callNumber: string;
position: number[];
name: string;
quality: QualityType;
isContent?: boolean;
style?: string;
}
/**
* 参会者画面清晰度, 建议将大屏画面设置为 high,小屏画面设置为 normal,content 设置为 hd;
*/
enum QualityType {
NORMAL = 'normal',
HIGH = 'high',
HD = 'hd'
}
【无UI模式】设置某个画面全屏
兼容:v3.8+
/**
* 设置某个画面全屏
*
* @param {LayoutInfo} item 全屏Layout对象
*/
XYClient.handleFullScreen(item: LayoutInfo): void;
interface ILayout{
id: string;
}
设置日志存储方式,支持微信日志和小鱼日志存储方式;
兼容:v3.9.0+
/**
* 设置日志类型,默认微信小程序日志存储方式
* 0:微信日志,当日志上传成功后,可以在小程序账号所对应的微信公众平台系统中的用户反馈中下载对应的日志文件
* 1:小鱼日志,目前最大可存30M,可通过uploadLog方法上传到小鱼平台
*
* @param { LogType } type 0:微信日志,1:小鱼自定义日志 默认值:0
*/
XYClient.setLogType(type:LogType):void;
/**
* 日志类型
*
* @enum
* @param DEFAULT 0 - 微信日志
* @param CUSTOM 1 - 小鱼日志
*
*/
enum LogType {
DEFAULT,
CUSTOM
}
小鱼日志-设置日志服务地址
兼容:v3.9.0+
/**
* 设置日志服务地址,仅支持小鱼自定义日志上传
*
* @param { string } server 日志地址 eg:xxx.xxx.xxx:port 不需要提供协议头,只需要提供完整的域名+端口
*/
XYClient.setLogServer(server:string):void;
小鱼日志-上传日志
兼容:v3.9.0+
/**
* 上传日志,仅支持小鱼自定义日志上传
*
* @param { UploadLogContent } Obj
* @property { string } Obj.account 上传账号
* @property { string } Obj.comments 上传时备注信息
* @returns { Promise<Object> } 上传结果
*/
XYClient.uploadLog(obj?: UploadLogContent):void;
/**
* 上传日志内容
*
* @property { string } comments - 内容
* @property { string } account - 账号
*/
export interface UploadLogContent {
comments?: string;
account?: string;
}
订阅查看更多参会者数据,订阅后,会通过bulkRoster事件回调参会者变化数据;
兼容:v3.9.0+
XYClient.subscribeBulkRoster(): Promise<boolean>
指定画面屏幕截图;
兼容:v3.9.1+
XYClient.getSnapshot(params: SnapshotParams):Promise<SnapshotResult>;
/**
* 截图参数
*
* @property { string } id - LayoutID 参会者唯一ID
* @property { 'raw' | 'compressed' } quality - 默认值:raw; raw:原图;compressed:压缩图
* @property { 'stream' | 'view' } sourceType - 默认值:view; stream:截取视频源;view:截取渲染后的画面
*/
interface SnapshotParams {
id: string;
quality?: 'raw' | 'compressed';
sourceType?: 'stream' | 'view';
}
/**
* 截图结果
*
* @property { string } tempImagePath - 图片文件的临时路径 (本地路径)
* @property { string } width - 图片的宽度
* @property { string } height - 图片的高度
*/
interface SnapshotResult {
tempImagePath: string;
width: string;
height: string;
}
UI组件模式下-Content缩放配置
兼容:v3.9.1+
/**
* 对Content画面进行缩放配置
*
* @param { Object } config - 配置参数
* @property { Boolean } enablePinchToZoom - 是否可以双指手动缩放
* @property { 1 | 2 | 3 } scale - 可选参数,放大倍数,[1,3]
*/
xylinkRoom.setViewZoom({ enablePinchToZoom, scale });
包含SDK事件的使用方式和事件详细解释;
无UI模式下,通过XYClient监听roomEvent事件获取所有事件内容:
XYClient.on('roomEvent', (e: any) => {
const { type, detail } = e;
// 详细type见事件列表
})
UI组件模式下,组件通过 bindonRoomEvent 返回内部roomEvent事件;
在wxml文件中引用组件,并绑定事件函数:
<xylink-room ... bindonRoomEvent="onRoomEvent" />
处理事件函数:
// js中定义接收函数
onRoomEvent(event) {
const { type, detail } = event.detail;
// 详细type见事件列表
}
加入会议成功消息;
兼容:v3.8+
// 解构消息体
const { detail: ConnectedInfo } = event.detail;
/**
* 加入会议成功消息
*
* @property {string} meetingId - 会议ID
* @property {string} callUri - 设备ID
* @property {string} conferenceNumber - 会议号
* @property {number} rtmpMode 会议模式,0:trtc模式 1:rtmp自建模式
* @property {number} callIndex - 会议序号
* @property {number} automute - 是否自动静音、强制静音
* @property {number} userId - 用户ID
* @property {number} roomid - 房间ID
*/
export interface ConnectedInfo {
meetingId: string;
callUri: string;
conferenceNumber: string;
callIndex: number;
rtmpMode: number;
automute: 'mute' | 'forcemute' | '';
roomid: number;
userId?: string;
}
退会消息,收到此消息后,需要进行退出会议操作;
兼容:v3.8+
const { detail: IDisconnected } = event.detail;
/**
* 退会信息
*
* @property { string } code - 错误码
* @property { any } data - 详情
* @property { string } message - 如果存在message,则提示信息并退会,否则直接退出会议;
*/
export interface DisconnectedInfo {
code: string;
data: object;
message: string;
}
麦克风和摄像头授权错误事件,UI模式下开发者暂时不需要额外处理此事件,内部会尝试进行重新授权操作,如果最终失败,则进行退会处理;
兼容:v3.8+
// 解构消息体
const { detail: StatusInfo } = event.detail;
/**
* 设备授权错误消息
*
* @property {string} key - 状态码
* @property {any} data - 详情
* @property {string} message - 描述信息
*/
interface StatusInfo {
key: string;
data: any;
message: string;
}
麦克风实时状态消息,建议监听并设置对应的麦克风状态,以避免因会控操作等原因造成的本地麦克风状态不一致问题;
兼容:v3.8+
// 解构消息体
const { detail: boolean } = event.detail;
UI模式下,点击当前画面的参会者和事件信息;之前由event事件提供;
兼容:v3.8+
// 解构消息体
const { detail: IClickEvent } = event.detail;
/**
* 单击/长按事件类型
*
* 此处只需要关注:currentTarget.dataset.item值即可,上报当前画面的参会者信息
*/
interface IClickEvent {
changedTouches: [
{
clientX: number;
clientY: 127.734375;
force: 1;
identifier: 0;
pageX: 367.546875;
pageY: 127.734375;
}
];
currentTarget: {
dataset: {
item: {
deal: boolean;
fit: string;
id: string;
muted: boolean;
playUrl: string;
position: number[];
resolution: number;
roster: {
deviceType: string;
callNumber: string;
pid: number;
userId: string;
displayName: string;
audioTxMute: true;
isActiveSpeaker: boolean;
isContent: boolean;
isOnHold: boolean;
muted: boolean;
videoMuteReason: number;
videoTxMute: boolean;
};
status: string;
style: string;
};
id: string;
offsetLeft: number;
offsetTop: number;
};
};
detail: {
x: number;
y: number;
};
type: string;
}
UI模式下,双击当前画面的参会者和事件信息;之前由event事件提供;
兼容:v3.8+
// 解构消息体
const { detail: IClickEvent } = event.detail;
/**
* 双击事件类型
*
* 此处只需要关注:currentTarget.dataset.item值即可,上报当前画面的参会者信息
*/
interface IClickEvent {
changedTouches: [
{
clientX: number;
clientY: 127.734375;
force: 1;
identifier: 0;
pageX: 367.546875;
pageY: 127.734375;
}
];
currentTarget: {
dataset: {
item: {
deal: boolean;
fit: string;
id: string;
muted: boolean;
playUrl: string;
position: number[];
resolution: number;
roster: {
deviceType: string;
callNumber: string;
pid: number;
userId: string;
displayName: string;
audioTxMute: true;
isActiveSpeaker: boolean;
isContent: boolean;
isOnHold: boolean;
muted: boolean;
videoMuteReason: number;
videoTxMute: boolean;
};
status: string;
style: string;
};
id: string;
offsetLeft: number;
offsetTop: number;
};
};
detail: {
x: number;
y: number;
};
type: string;
}
UI模式下,长按当前画面的参会者和事件信息;之前由event事件提供;
兼容:v3.8+
// 解构消息体
const { detail: IClickEvent } = event.detail;
/**
* 长按事件类型
*
* 此处只需要关注:currentTarget.dataset.item值即可,上报当前画面的参会者信息
*/
interface IClickEvent {
changedTouches: [
{
clientX: number;
clientY: 127.734375;
force: 1;
identifier: 0;
pageX: 367.546875;
pageY: 127.734375;
}
];
currentTarget: {
dataset: {
item: {
deal: boolean;
fit: string;
id: string;
muted: boolean;
playUrl: string;
position: number[];
resolution: number;
roster: {
deviceType: string;
callNumber: string;
pid: number;
userId: string;
displayName: string;
audioTxMute: true;
isActiveSpeaker: boolean;
isContent: boolean;
isOnHold: boolean;
muted: boolean;
videoMuteReason: number;
videoTxMute: boolean;
};
status: string;
style: string;
};
id: string;
offsetLeft: number;
offsetTop: number;
};
};
detail: {
x: number;
y: number;
};
type: string;
}
内存告警消息,之前由event事件上报,开发者收到此事件后,提示用户内存占用过高,可能导致画面卡顿或者小程序被微信杀掉问题;
兼容:v3.8+
// 解构消息体
const { detail: StatusInfo } = event.detail;
/**
* 设备授权错误消息
*
* @property {string} key - XYSDK:980406
* @property {any} data - level 内存告警等级,只有 Android 才有
*/
interface StatusInfo {
key: string;
data: number;
}
会议参会者的详细数据,包含本地数据;
const { detail: RosterObj } = ms.detail;
/**
* roster相关信息
*
* @property { IRoster[] } rosterV - roster信息,目前最多上报20条
* @property { number } contentSenderPid - 共享内容pid
* @property { number } participantsNum - 参会者人数
* @property { number } confNumber - 会议号
*/
interface RosterObj {
rosterV: IRoster[];
contentSenderPid: number;
participantsNum: number;
confNumber: number;
}
/**
* Roster:参会者的基本信息,包含基本信息,设备信息,画面信息等
*
* @property { IDeviceType } deviceType - 设备类型
* @property { string } callNumber - 用户账号
* @property { number } pid - 参会者id
* @property { string } userId - 参会者callUri eg:123456@WECHAT
* @property { string } callUri - 参会者callUri eg:123456@WECHAT
* @property { string} displayName - 参会者名称
* @property { boolean} audioTxMute - 参会者麦克风状态,true:关闭,false:开启
* @property { boolean} videoTxMute - 参会者摄像头状态,true:关闭,false:开启
* @property { number } videoMuteReason - 视频关闭原因
* @property { boolean} isContent - 参会者画面类型,true:是共享内容画面,false:people画面
* @property { boolean} isOnHold - 参会者是否是被呼叫等待状态
* @property { boolean } isLocal - 参会者是否是自己
* @property { number } feccOri - ignore
* @property { number } level - ignore
*/
interface IRoster {
// 参会者设备类型,常见的如下:
// hard:硬件设备、soft:APP设备、desk:PC客户端设备、wechat:小程序设备、webrtc:WebRTC设备
// 323:H323设备、pstngw:电话入会设备、bruce:大鱼设备、tvbox:电视屏设备
deviceType: IDeviceType;
callNumber: string;
pid: number;
userId: string;
callUri: string;
displayName: string;
audioTxMute: boolean;
videoTxMute: boolean;
videoMuteReason: number;
isContent?: boolean;
isOnHold?: boolean;
isLocal?: boolean;
level?: number;
feccOri?: number;
}
参会成员 Layout 列表数据。
此数据包含当前布局模式的参会人员状态、基本信息数据,当会议的状态产生变化时,会重新推送此消息。
参会者头像,需通过setFeatureConfig开启相关功能;
const { detail: LayoutInfo[] } = ms.detail
/**
* 布局对象
*
* @property { string } id - LayoutID = callUr + (isContent? 1:0)
* @property { boolean } isPusher - 是否是本地画面
* @property { IRoster } roster - 参会者基本信息、状态信息,例如:用户名、麦克风/摄像头状态等信息
* @property { number[] } position - 参会者的位置信息
* @property { string } playUrl - 远端参会者的画面拉流地址
* @property { PlayStatus } status - 远端参会者的画面播放状态
* @property { string } style - 参会者的位置样式
* @property { number } resolution - 参会者分辨率
* @property { string } avatar - 参会者头像 v3.9.0+支持
*/
export interface LayoutInfo {
id: string;
isPusher: boolean;
roster: Partial<IRoster>;
position: number[];
style: string;
playUrl?: string;
status?: PlayStatus;
resolution?: number;
avatar?: string;
}
/**
* 远端画面播放状态
*
* @param START start - 可以播放
* @param PULL pull - 请求中
* @param PAUSE pause - 暂停
*/
export enum PlayStatus {
NONE = '',
START = 'start',
PULL = 'pull',
PAUSE = 'pause'
}
接收到会议控制消息
const { detail: MeetingControl } = ms.detail
/**
* 会控信息
*
* @property { string } chairmanUri 主会场calluri
* @property { boolean } disableMute 是否强制静音
* @property { string } muteOperation 音频状态
*/
export interface MeetingControl {
chairmanUri?: string;
muteOperation?: string;
disableMute?: boolean;
}
组件 live-pusher 内部推流事件数据;
const { detail: Object } = ms.detail
组件 live-player 拉流事件数据;
const { detail: Object } = ms.detail
本地端上行网络质量等级
兼容:v1.0.73+
// 网络质量:0:未定义 1:最好 2:好 3:一般 4:差 5:很差 6:不可用
const { detail: 0 | 1 | 2 | 3 | 4 | 5 | 6 } = ms.detail
当前共享content的参会者信息;
const { detail: IRoster } = ms.detail;
/**
* Roster:参会者的基本信息,包含基本信息,设备信息,画面信息等
*
* @property { IDeviceType } deviceType - 设备类型
* @property { string } callNumber - 用户账号
* @property { number } pid - 参会者id
* @property { string } userId - 参会者callUri eg:123456@WECHAT
* @property { string } callUri - 参会者callUri eg:123456@WECHAT
* @property { string} displayName - 参会者名称
* @property { boolean} audioTxMute - 参会者麦克风状态,true:关闭,false:开启
* @property { boolean} videoTxMute - 参会者摄像头状态,true:关闭,false:开启
* @property { number } videoMuteReason - 视频关闭原因
* @property { boolean} isContent - 参会者画面类型,true:是共享内容画面,false:people画面
* @property { boolean} isOnHold - 参会者是否是被呼叫等待状态
* @property { boolean } isLocal - 参会者是否是自己
* @property { number } feccOri - ignore
* @property { number } level - ignore
*/
interface IRoster {
// 参会者设备类型,常见的如下:
// hard:硬件设备、soft:APP设备、desk:PC客户端设备、wechat:小程序设备、webrtc:WebRTC设备
// 323:H323设备、pstngw:电话入会设备、bruce:大鱼设备、tvbox:电视屏设备
deviceType: IDeviceType;
callNumber: string;
pid: number;
userId: string;
callUri: string;
displayName: string;
audioTxMute: boolean;
videoTxMute: boolean;
videoMuteReason: number;
isContent?: boolean;
isOnHold?: boolean;
isLocal?: boolean;
level?: number;
feccOri?: number;
}
被移入等候室状态消息,开发者收到此消息后,不再展示画面内容;
// 解构消息体,true代表开启等候室,false则关闭
const { detail: true | false } = ms.detail;
参会者网络质量数据;
const { detail: NetworkInfo } = ms.detail;
/**
* 网络质量信息
*
* @property {MeetingStatsInfo} info 网络质量详细信息
* @property {string} userId 终端ID
* @property {number} volume 音量
* @property {number} pid 终端ID
*/
type NetworkInfo = Record<
string,
{
info: NetworkInfoItem;
userId: string;
volume: number;
displayName: string;
pid?: number;
}
>;
/**
* 网络质量信息信息
*
* @property {number} videoGOP 当前视频 GOP,也就是每两个关键帧(I帧)间隔时长,单位 s
* @property {number} videoFPS 当前视频帧率
* @property {number} netJitter 网络抖动情况,为 0 时表示没有任何抖动,值越大表明网络抖动越大,网络越不稳定
* @property {number} avRecvInterval 音画同步错位时间(网络),单位 ms,此数值越小,音画同步越好
* @property {number} videoBitrate 当前视频编/码器输出的比特率,单位 kbps
* @property {number} audioBitrate 当前音频编/码器输出的比特率,单位 kbps
* @property {number} videoHeight 视频画面的高度
* @property {number} videoWidth 视频画面的宽度
* @property {number} netSpeed 当前的发送/接收速度
* @property {number} netQualityLevel 网络质量:0:未定义 1:最好 2:好 3:一般 4:差 5:很差 6:不可用
* @property {number} videoCache 缓冲的视频总时长,单位毫秒
* @property {number} audioCache 缓冲的音频总时长,单位毫秒
* @property {number} vSumCacheSize 缓冲的总视频帧数,该数值越大,播放延迟越高
* @property {number} audioCacheThreshold 音频缓冲时长阈值,缓冲超过该阈值后,播放器会开始调控延时
* @property {number} vDecCacheSize 解码器中缓存的视频帧数 (Android 端硬解码时存在)
* @property {NetworkQualityLevel} netWorkLevel 小鱼网络质量等级
*/
interface NetworkInfoItem {
videoGOP: number;
videoFPS: number;
netJitter: number;
avRecvInterval: number;
videoBitrate: number;
audioBitrate: number;
videoHeight: number;
videoWidth: number;
netSpeed: number;
netQualityLevel: number;
videoCache: number;
audioCache: number;
vSumCacheSize: number;
audioCacheThreshold: number;
vDecCacheSize: number;
netWorkLevel?: NetworkQualityLevel;
}
当前讲话人信息;
兼容:v3.8+
const { detail }: IDetail = ms.detail;
interface IDetail {
detail: IActiveSpeaker[];
}
/**
* 当前讲话人信息
*/
interface IActiveSpeaker {
isActiveSpeaker: boolean;
pid: number;
userId: string;
}
接收自定义消息;
兼容:v1.0.76+
const { detail }: IDetail = ms.detail;
interface IDetail {
detail: IReceiveCustomMessage;
}
/**
* 接收到自定义消息
*
* @property { string } type - 消息Type
* @property { number } fromPid - 消息的发送方pid
* @property { number } toPid - 消息的接收方pid,0表示广播消息、非0表示单点消息;
* @property { string } data - 消息内容,可以被JSON序列化的字符串;
*/
interface IReceiveCustomMessage {
type: string;
fromPid: number;
toPid: number;
data: string;
}
远端参会者视频无流状态上报,可通过此事件立即获取远端终端应用中止状态;
const { detail }: IDetail = ms.detail;
interface IDetail {
detail: IReceiveCustomMessage;
}
/**
* 远端参会者应用中止消息(视频无流状态)
*
* @param { string } callUri - 终端号
* @param { boolean } freeze - 是否无流,true代表无流
* @param { number } pid - 用户ID
*/
interface IStreamStatusChanged {
callUri: string;
freeze: boolean;
pid: number;
}
监听远端参会者网络质量等级,5s上报一次
兼容:v3.8.6+
const { detail }: IDetail = ms.detail;
interface IDetail {
detail: NetworkParameter;
}
/**
* 远端参会者网络质量等级
*
* @param { string } fromCallUri - 远端参会者唯一标识ID
* @param { number } fromPid - 远端用户ID
* @param { 1|2|3|4 } networkLevel - 网络等级,1差,2中,3良,4优
*/
interface NetworkParameter {
fromCallUri: string;
fromPid: number;
networkLevel: NetworkQualityLevel
}
/**
* 网络质量信号等级
*
* @param Bad 1 - 非常差
* @param Poor 2 - 差
* @param Good 3 - 一般
* @param Excellent 4 - 很好
*/
enum NetworkQualityLevel {
Bad = 1,
Poor,
Good,
Excellent
}
监听本地端网络质量等级,用于给本地提示和通知远端
兼容:v3.8.6+
const { detail }: IDetail = ms.detail;
interface IDetail {
detail: NetworkQualityLevel;
}
/**
* 网络质量信号等级
*
* @param Bad 1 - 非常差
* @param Poor 2 - 差
* @param Good 3 - 一般
* @param Excellent 4 - 很好
*/
enum NetworkQualityLevel {
Bad = 1,
Poor,
Good,
Excellent
}
会议相关信息,包含会议室信息、会议ID、会议邀请信息等
会议邀请信息,需通过setFeatureConfig开启相关功能;
兼容:v3.9.0+
const { detail }: MeetingInfo = ms.detail;
/**
* 会议室信息
*
* @property { string } callNumber 最终进入的真实会议号
* @property { string } callUrl 呼叫号码真实url
* @property { string } deviceId 号码id
* @property { string } deviceType 号码类型
* @property { string } displayName 云会议号名称
* @property { string } number 呼叫的号码
* @property { string } numberType 会议号类型
* @property { string } meetingId 当前会议ID
* @property { string } password 会议密码
* @property { InviteInfo } inviteInfo 会议邀请信息,入会成功后上报此值 v3.9.0新增
*/
export interface MeetingInfo {
callNumber?: string;
callUrl?: string;
deviceId?: string;
deviceType?: string;
displayName?: string;
number?: string;
numberType?: string;
meetingId?: string;
password?: string;
inviteInfo?: InviteInfo;
}
/**
* 会议分享信息
*
* @property { string } displayName - 会议室名称
* @property { boolean } inEnterprise - 所属会议号是否在企业中
* @property { string } inviteAppUrl - 微信邀请链接
* @property { string } inviteUrl - 云会议室邀请链接
* @property { string } invokSchema - 小鱼客户端Scheme获取地址
* @property { string } linkNumber - 电话入会号码
* @property { string } mobileWebrtcVisibleSetting - 移动端是否显示WebRTC入会
* @property { string } number - 会议号
* @property { string } password - 入会密码
* @property { string } pstnNumber - 电话呼叫号码
* @property { string } shareUrl - 邀请链接详情页地址
* @property { string } userAvatar - 管理员头像
* @property { string } userName - 管理员名称
* @property { string } userProfileId - 用户ID
* @property { string } voiceNumber - 电话呼叫时的会议号
* @property { string } webrtcSetting - PC端是否显示WebRTC入会
* @property { string } webrtcUrl - WebRTC入会地址
*
*/
export interface InviteInfo {
displayName: string;
inEnterprise: boolean;
inviteAppUrl: string;
inviteUrl: string;
invokSchema: string;
linkNumber: string;
mobileWebrtcVisibleSetting: boolean;
number: string;
password: string;
pstnNumber: string;
shareUrl: string;
userAvatar: string;
userName: string;
userProfileId: string;
voiceNumber: string;
webrtcSetting: boolean;
webrtcUrl: string;
}
获取所有参会者成员信息,用于信息展示,
兼容:v3.9.0+
const { detail }: IRoster[] = ms.detail;
/**
* Roster:参会者的基本信息,包含基本信息,设备信息,画面信息等
*
* @property { IDeviceType } deviceType - 设备类型
* @property { string } callNumber - 用户账号
* @property { number } pid - 参会者id
* @property { string } userId - 参会者callUri eg:123456@WECHAT
* @property { string } callUri - 参会者callUri eg:123456@WECHAT
* @property { string} displayName - 参会者名称
* @property { boolean} audioTxMute - 参会者麦克风状态,true:关闭,false:开启
* @property { boolean} videoTxMute - 参会者摄像头状态,true:关闭,false:开启
* @property { number } videoMuteReason - 视频关闭原因
* @property { boolean} isContent - 参会者画面类型,true:是共享内容画面,false:people画面
* @property { boolean} isOnHold - 参会者是否是被呼叫等待状态
* @property { boolean } isLocal - 参会者是否是自己
* @property { number } feccOri - ignore
* @property { number } level - roster排序级别
*/
export interface IRoster {
deviceType: IDeviceType;
callNumber: string;
pid: number;
userId: string;
callUri: string;
displayName: string;
audioTxMute: boolean;
videoTxMute: boolean;
videoMuteReason: number;
isContent?: boolean;
isOnHold?: boolean;
isLocal?: boolean;
level?: number;
feccOri?: number;
}