///
declare interface TRTCOptions {
plugins?: Array<{
new (core: Core): IPlugin;
}>;
}
declare interface LocalVideoConfig {
view?: string | HTMLElement | HTMLElement[] | null;
publish?: boolean;
option?: {
cameraId?: string;
useFrontCamera?: boolean;
profile?: keyof typeof videoProfileMap | VideoProfile;
fillMode?: 'contain' | 'cover' | 'fill';
mirror?: boolean;
small?: keyof typeof videoProfileMap | VideoProfile;
qosPreference?: typeof TRTCType.QOS_PREFERENCE_SMOOTH | typeof TRTCType.QOS_PREFERENCE_CLEAR;
videoTrack?: MediaStreamTrack;
};
}
declare interface UpdateLocalVideoConfig extends Partial {
mute?: boolean;
}
declare interface ProxyServer {
websocketProxy?: string;
loggerProxy?: string;
turnServer?: TurnServerOptions | TurnServerOptions[];
iceTransportPolicy?: RTCIceTransportPolicy;
webtransportProxy?: string;
scheduleProxy?: string;
unifiedProxy?: string;
}
declare interface EnterRoomConfig {
sdkAppId: number;
userId: string;
userSig: string;
roomId?: number;
strRoomId?: string;
role?: UserRole;
autoReceiveAudio?: boolean;
autoReceiveVideo?: boolean;
privateMapKey?: string;
businessInfo?: string;
enableAutoPlayDialog?: boolean;
proxy?: ProxyServer | string;
scene?: Scene;
userDefineRecordId?: string;
}
declare interface ScreenShareConfig {
view?: string | HTMLElement | HTMLElement[] | null;
publish?: boolean;
option?: {
profile?: keyof typeof screenProfileMap | VideoProfile;
fillMode?: 'contain' | 'cover' | 'fill';
systemAudio?: boolean;
echoCancellation?: boolean;
autoGainControl?: boolean;
noiseSuppression?: boolean;
audioTrack?: MediaStreamTrack;
videoTrack?: MediaStreamTrack;
qosPreference?: typeof TRTCType.QOS_PREFERENCE_SMOOTH | typeof TRTCType.QOS_PREFERENCE_CLEAR;
};
}
declare interface UpdateScreenShareConfig extends ScreenShareConfig {
option?: {
fillMode?: 'contain' | 'cover' | 'fill';
qosPreference?: typeof TRTCType.QOS_PREFERENCE_SMOOTH | typeof TRTCType.QOS_PREFERENCE_CLEAR;
};
}
declare interface RemoteVideoConfig {
view?: string | HTMLElement | HTMLElement[] | null;
userId: string;
streamType: TRTCStreamType;
option?: {
fillMode?: 'contain' | 'cover' | 'fill';
mirror?: boolean;
small?: boolean;
};
}
declare interface StopRemoteVideoConfig {
userId: string;
streamType?: TRTCStreamType;
}
declare interface LocalAudioConfig {
publish?: boolean;
option?: {
microphoneId?: string;
profile?: keyof typeof audioProfileMap;
audioTrack?: MediaStreamTrack;
captureVolume?: number;
earMonitorVolume?: number;
echoCancellation?: boolean;
autoGainControl?: boolean;
noiseSuppression?: boolean;
};
}
declare interface UpdateLocalAudioConfig extends LocalAudioConfig {
mute?: boolean;
option?: {
microphoneId?: string;
audioTrack?: MediaStreamTrack;
captureVolume?: number;
earMonitorVolume?: number;
echoCancellation?: boolean;
autoGainControl?: boolean;
noiseSuppression?: boolean;
};
}
declare interface RemoteAudioConfig {
userId: string;
option?: {
volume?: number;
};
}
declare interface StopRemoteAudioConfig {
userId: string;
}
declare const enum TRTCStreamType {
Main = "main",
Sub = "sub"
}
declare enum TRTCDeviceType {
Camera = "camera",
Microphone = "microphone",
Speaker = "speaker"
}
declare enum TRTCDeviceAction {
Remove = "remove",
Add = "add",
Active = "active"
}
declare interface RTCErrorParams {
code: number;
extraCode?: number;
functionName?: string;
fnName?: string;
message?: string;
messageParams?: any;
originError?: Error | DOMException;
}
declare interface RTCErrorInterface {
readonly name: string;
readonly code: number;
readonly extraCode?: number;
readonly functionName?: string;
readonly message?: string;
readonly originError?: Error | DOMException;
}
declare interface ErrorMessageParams {
key?: string;
rule?: any;
fnName?: string;
fnParams?: any;
value?: string | number | any;
type?: string;
deviceType?: string;
error?: Error | DOMException | CoreError;
}
/**
* **TRTC 常量**
* @module TYPE
* @example
* // 使用方式:
* TRTC.TYPE.SCENE_LIVE
*/
declare const TRTCType: {
/**
* 直播场景
* @default 'live'
* @memberof module:TYPE
*/
readonly SCENE_LIVE: Scene.LIVE;
/**
* 通话场景
* @default 'rtc'
* @memberof module:TYPE
*/
readonly SCENE_RTC: Scene.RTC;
/**
* 主播角色
* @default 'anchor'
* @memberof module:TYPE
*/
readonly ROLE_ANCHOR: UserRole.ANCHOR;
/**
* 观众角色
* @default 'audience'
* @memberof module:TYPE
*/
readonly ROLE_AUDIENCE: UserRole.AUDIENCE;
/**
* 主流
*
* - TRTC 有主路视频流(主流)和辅路视频流(辅流)
* - 摄像头通过主流发布,屏幕分享通过辅流发布,一个房间内只能有一路辅流。
* - 主路视频流包括:高清大画面和低清小画面两种,默认情况下,{@link TRTC#startRemoteVideo TRTC.startRemoteVideo} 播放的是高清大画面,可以通过 small 参数播放低清小画面,参考:[开启大小流功能](./tutorial-27-advanced-small-stream.html)。
* @default 'main'
* @memberof module:TYPE
*/
readonly STREAM_TYPE_MAIN: TRTCStreamType.Main;
/**
* 辅流
* @default 'sub'
* @memberof module:TYPE
*/
readonly STREAM_TYPE_SUB: TRTCStreamType.Sub;
/**
* 标准音质
* | 音频 Profile | 采样率 | 声道 | 码率 (kbps) |
* | :--- | :--- | :--- | :--- |
* | TRTC.TYPE.AUDIO_PROFILE_STANDARD | 48000 | 单声道| 40 |
* | TRTC.TYPE.AUDIO_PROFILE_HIGH | 48000 | 单声道| 128 |
* | TRTC.TYPE.AUDIO_PROFILE_STANDARD_STEREO | 48000 | 双声道| 64 |
* | TRTC.TYPE.AUDIO_PROFILE_HIGH_STEREO | 48000 | 双声道| 192 |
* @default 'standard'
* @memberof module:TYPE
*/
readonly AUDIO_PROFILE_STANDARD: "standard";
/**
* 标准音质立体声
* | 音频 Profile | 采样率 | 声道 | 码率 (kbps) |
* | :--- | :--- | :--- | :--- |
* | TRTC.TYPE.AUDIO_PROFILE_STANDARD | 48000 | 单声道| 40 |
* | TRTC.TYPE.AUDIO_PROFILE_HIGH | 48000 | 单声道| 128 |
* | TRTC.TYPE.AUDIO_PROFILE_STANDARD_STEREO | 48000 | 双声道| 64 |
* | TRTC.TYPE.AUDIO_PROFILE_HIGH_STEREO | 48000 | 双声道| 192 |
* @default 'standard-stereo'
* @memberof module:TYPE
*/
readonly AUDIO_PROFILE_STANDARD_STEREO: "standard-stereo";
/**
* 高音质
* | 音频 Profile | 采样率 | 声道 | 码率 (kbps) |
* | :--- | :--- | :--- | :--- |
* | TRTC.TYPE.AUDIO_PROFILE_STANDARD | 48000 | 单声道| 40 |
* | TRTC.TYPE.AUDIO_PROFILE_HIGH | 48000 | 单声道| 128 |
* | TRTC.TYPE.AUDIO_PROFILE_STANDARD_STEREO | 48000 | 双声道| 64 |
* | TRTC.TYPE.AUDIO_PROFILE_HIGH_STEREO | 48000 | 双声道| 192 |
* @default 'high'
* @memberof module:TYPE
*/
readonly AUDIO_PROFILE_HIGH: "high";
/**
* 高音质立体声
* | 音频 Profile | 采样率 | 声道 | 码率 (kbps) |
* | :--- | :--- | :--- | :--- |
* | TRTC.TYPE.AUDIO_PROFILE_STANDARD | 48000 | 单声道| 40 |
* | TRTC.TYPE.AUDIO_PROFILE_HIGH | 48000 | 单声道| 128 |
* | TRTC.TYPE.AUDIO_PROFILE_STANDARD_STEREO | 48000 | 双声道| 64 |
* | TRTC.TYPE.AUDIO_PROFILE_HIGH_STEREO | 48000 | 双声道| 192 |
* @default 'high-stereo'
* @memberof module:TYPE
*/
readonly AUDIO_PROFILE_HIGH_STEREO: "high-stereo";
/**
* 弱网时,视频编码策略以流畅度优先,即优先保帧率。
* 摄像头默认流畅度优先,屏幕分享默认清晰度优先。
* @default 'smooth'
* @memberof module:TYPE
*/
readonly QOS_PREFERENCE_SMOOTH: "smooth";
/**
* 弱网时,视频编码策略以清晰度优先,即优先保分辨率。
* 摄像头默认流畅度优先,屏幕分享默认清晰度优先。
* @default 'clear'
* @memberof module:TYPE
*/
readonly QOS_PREFERENCE_CLEAR: "clear";
};
declare interface AudioMixerOptions {
id: string;
url: string;
loop?: boolean;
volume?: number;
}
declare interface UpdateAudioMixerOptions {
id: string;
loop?: boolean;
volume?: number;
seekFrom?: number;
operation?: 'pause' | 'resume' | 'stop';
}
declare interface StopAudioMixerOptions {
id: string;
}
declare interface AIDenoiserOptions {
assetsPath: string;
sdkAppId: number;
userId: string;
userSig: string;
}
declare type PluginStartOptionsMap = {
'AudioMixer': AudioMixerOptions;
'AIDenoiser': AIDenoiserOptions;
'CDNStreaming': CDNStreamingOptions;
'VirtualBackground': VirtualBackgroundOptions;
};
declare type PluginUpdateOptionsMap = {
'AudioMixer': UpdateAudioMixerOptions;
'CDNStreaming': CDNStreamingOptions;
'VirtualBackground': UpdateVirtualBackgroundOptions;
};
declare type PluginStopOptionsMap = {
'AudioMixer': StopAudioMixerOptions;
'AIDenoiser': undefined;
'CDNStreaming': CDNStreamingOptions;
'VirtualBackground': undefined;
};
declare interface TRTCStatistics {
rtt: number;
downLoss: number;
upLoss: number;
bytesSent: number;
bytesReceived: number;
localStatistics: LocalStatistic;
remoteStatistics: RemoteStatistic[];
}
interface LocalStatistic {
audio: {
bitrate: number;
audioLevel: number;
};
video: {
width: number;
height: number;
frameRate: number;
bitrate: number;
videoType: TRTCVideoType;
}[];
}
declare enum TRTCVideoType {
Big = "big",
Small = "small",
Sub = "sub"
}
interface RemoteStatistic {
audio: {
bitrate: number;
audioLevel: number;
};
video: {
width: number;
height: number;
frameRate: number;
bitrate: number;
videoType: TRTCVideoType;
}[];
userId: string;
}
/**
* @typedef TRTCStatistics TRTC 通话统计信息
* @property {number} rtt 从 SDK 与 云端的往返延时(一个网络包经历 “SDK -> 云端 -> SDK” 的总耗时),单位 ms。
* @property {number} upLoss 从 SDK 到云端的上行丢包率,单位 (%)
* @property {number} downLoss 从云端到 SDK 的下行丢包率,单位 (%)
* @property {number} bytesSent 总发送字节数(包含信令数据和音视频数据),单位:字节数(Bytes)。
* @property {number} bytesReceived 总接收字节数(包含信令数据和音视频数据),单位:字节数(Bytes)。
* @property {TRTCLocalStatistics} localStatistics 本地的音视频统计信息
* @property {TRTCRemoteStatistics[]} remoteStatistics 远端的音视频统计信息
*/
/**
* 本地的音视频统计信息
* @typedef TRTCLocalStatistics
* @property {TRTCAudioStatistic} audio 本地音频统计信息
* @property {TRTCVideoStatistic[]} video 本地视频统计信息
*/
/**
* 远端的音视频统计信息
* @typedef TRTCRemoteStatistics
* @property {string} userId 远端用户的 userId
* @property {TRTCAudioStatistic} audio 远端音频统计信息
* @property {TRTCVideoStatistic[]} video 远端视频统计信息
*/
/**
* 音频统计信息
* @typedef TRTCAudioStatistic
* @property {number} bitrate 音频码率,单位:Kbps
* @property {number} audioLevel 音量大小,0 ~ 1 的浮点数。
*/
/** 视频统计信息
* @typedef TRTCVideoStatistic
* @property {number} bitrate 视频码率,单位:Kbps
* @property {number} width 视频宽度
* @property {number} height 视频高度
* @property {number} frameRate 视频帧率
* @property {'big'|'small'|'sub'} videoType 视频类型,大流、小流、辅流。
*/
/**
* **TRTC事件列表**
*
* 通过 {@link TRTC#on trtc.on(TRTC.EVENT.XXX)} 监听指定的事件。您可以通过这些事件实现管理房间用户列表,以及管理用户的流状态,感知网络状态等功能,下面是事件的详细介绍。
* > !
* > - 事件需要在事件触发之前监听,这样才能收到相应的事件通知,因此建议在 trtc 进房前完成事件监听,这样才能确保不会漏掉事件通知。
* @module EVENT
* @example
* // 使用方式:
* trtc.on(TRTC.EVENT.ERROR, () => {});
*/
declare const TRTCEvent: {
/**
* 错误事件,非 API 调用错误,SDK 在运行过程中出现了不可恢复的错误时抛出。
*
* - 错误码(error.code)为:{@link module:ERROR_CODE.OPERATION_FAILED ErrorCode.OPERATION_FAILED}
* - 可能的扩展错误码(error.extraCode):5501, 5502
* @default 'error'
* @memberof module:EVENT
* @see {@link RtcError RtcError}
* @e
* @example
*
* trtc.on(TRTC.EVENT.ERROR, error => {
* console.error('client error observed: ' + error);
* const errorCode = error.code;
* const extraCode = error.extraCode;
* });
*/
readonly ERROR: "error";
/**
* @description 自动播放失败,参考 [自动播放处理建议](https://web.sdk.qcloud.com/trtc/webrtc/v5/doc/zh-cn/tutorial-21-advanced-auto-play-policy.html)
* @default 'autoplay-failed'
* @memberof module:EVENT
* @example
* trtc.on(TRTC.EVENT.AUTOPLAY_FAILED, event => {
* // 引导用户点击页面,当用户点击页面时,SDK 会自动恢复播放。
* // 自 v5.1.3+ 新增 userId 参数,表示哪个用户出现自动播放失败。
* console.log(event.userId);
* });
*/
readonly AUTOPLAY_FAILED: "autoplay-failed";
/**
* 被踢出房间,原因如下:
* - kick: 相同 userId 的用户同时进入同一个房间(以下简称为同名进房),先进入房间的用户会被后进入的用户踢出房间。
* - 同名进房是不允许的行为,可能会导致双方音视频通话异常,业务侧应避免出现这种情况。
* - TRTC 后台不保证观众角色同名进房互踢。即观众角色的用户,使用同 userId 进同一个房间,可能不会收到该事件。
* - banned: 系统管理员通过{@link https://cloud.tencent.com/document/product/647/40496 服务端 API} 将该用户踢出房间。
* - room-disband: 系统管理员通过{@link https://cloud.tencent.com/document/product/647/40496 服务端 API} 解散房间。
* @default 'kicked-out'
* @memberof module:EVENT
* @example
*
* trtc.on(TRTC.EVENT.KICKED_OUT, event => {
* console.log(event.reason)
* });
*/
readonly KICKED_OUT: "kicked-out";
/**
* 远端用户进房事件。
*
* - `live` 模式下,只有主播才有进退房通知,观众没有进退房通知,观众可以收到主播的进退房通知。
* @default 'remote-user-enter'
* @memberof module:EVENT
* @example
*
* trtc.on(TRTC.EVENT.REMOTE_USER_ENTER, event => {
* const userId = event.userId;
* });
*/
readonly REMOTE_USER_ENTER: "remote-user-enter";
/**
* 远端用户退房事件。
*
* - `live` 模式下,只有主播才有进退房通知,观众没有进退房通知,观众可以收到主播的进退房通知。
* @default 'remote-user-exit'
* @memberof module:EVENT
* @example
*
* trtc.on(TRTC.EVENT.REMOTE_USER_EXIT, event => {
* const userId = event.userId;
* });
*/
readonly REMOTE_USER_EXIT: "remote-user-exit";
/**
* 远端用户发布了音频。当远端用户打开麦克风后,您会收到该通知。参考:[开关摄像头、麦克风](./tutorial-15-basic-dynamic-add-video.html)
*
* - 默认情况下,SDK 会自动播放远端音频,您无需调用 API 来播放远端音频。可以监听该事件及 {@link module:EVENT.REMOTE_AUDIO_UNAVAILABLE REMOTE_AUDIO_UNAVAILABLE} 来更新“远端是否开启麦克风”的 UI icon。
* - 需要注意的是:如果用户在进房前没有与页面产生过交互,自动播放音频可能会因为【浏览器的自动播放策略限制】而失败,您需参考[自动播放受限处理建议](./tutorial-21-advanced-auto-play-policy.html)进行处理。
* - 若您不希望 SDK 自动播放音频,您可以在 {@link TRTC#enterRoom trtc.enterRoom()} 时设置 receiveMode = {@link module:TYPE.RECEIVE_MODE_MANUAL TRTC.TYPE.RECEIVE_MODE_MANUAL} 关闭自动播放音频。
* - 监听 {@link module:EVENT.REMOTE_AUDIO_AVAILABLE TRTC.EVENT.REMOTE_AUDIO_AVAILABLE} 事件,记录有远端音频的 userId,在需要播放音频时,调用 {@link TRTC#muteRemoteAudio trtc.muteRemoteAudio(userId, false)} 方法。
* @default 'remote-audio-available'
* @memberof module:EVENT
* @example
* // 在进房前监听
* trtc.on(TRTC.EVENT.REMOTE_AUDIO_AVAILABLE, event => {
* const userId = event.userId;
* });
*/
readonly REMOTE_AUDIO_AVAILABLE: "remote-audio-available";
/**
* 远端停止发布了音频。当远端用户关闭麦克风后,您会收到该通知。
*
* @default 'remote-audio-unavailable'
* @memberof module:EVENT
* @example
* // 在进房前监听
* trtc.on(TRTC.EVENT.REMOTE_AUDIO_UNAVAILABLE, event => {
* const userId = event.userId;
*
* });
*/
readonly REMOTE_AUDIO_UNAVAILABLE: "remote-audio-unavailable";
/**
* 远端用户发布了视频,当远端用户开启摄像头后,您会收到该通知。参考:[开关摄像头、麦克风](./tutorial-15-basic-dynamic-add-video.html)
*
* - 可以监听该事件及 {@link module:EVENT.REMOTE_VIDEO_UNAVAILABLE REMOTE_VIDEO_UNAVAILABLE} 来更新“远端是否开启摄像头”的 UI icon。
* @see {@link module:TYPE.STREAM_TYPE_MAIN STREAM_TYPE_MAIN}
* @see {@link module:TYPE.STREAM_TYPE_SUB STREAM_TYPE_SUB}
* @default 'remote-video-available'
* @memberof module:EVENT
* @example
* // 在进房前监听
* trtc.on(TRTC.EVENT.REMOTE_VIDEO_AVAILABLE, event => {
* const userId = event.userId;
* const streamType = event.streamType;
* trtc.startRemoteVideo({userId, streamType, view});
* });
*/
readonly REMOTE_VIDEO_AVAILABLE: "remote-video-available";
/**
* 远端用户停止发布视频,当远端用户关闭摄像头后,您会收到该通知。
* @default 'remote-video-unavailable'
* @memberof module:EVENT
* @example
* // 在进房前监听
* trtc.on(TRTC.EVENT.REMOTE_VIDEO_UNAVAILABLE, event => {
* const userId = event.userId;
* const streamType = event.streamType;
* // 此时 SDK 会自动停止播放,无需调用 stopRemoteVideo。
* });
*/
readonly REMOTE_VIDEO_UNAVAILABLE: "remote-video-unavailable";
/**
* @description 音量大小事件
* 调用 {@link Client#enableAudioVolumeEvaluation enableAudioVolumeEvaluation} 接口开启音量大小回调后,SDK 会定时抛出该事件,通知每个 userId 的音量大小。
* **Note**
* - 回调中包含本地麦克风音量及远端用户的音量,无论是否有人说话,都会触发该回调。
* - 回调 event.result 会根据音量大小,按大到小进行排序。
* - 当 userId 为空串时,代表本地麦克风音量。
* - volume 取值为0-100的正整数
* @default 'audio-volume'
* @memberof module:EVENT
* @example
* trtc.on(TRTC.EVENT.AUDIO_VOLUME, event => {
* event.result.forEach(({ userId, volume }) => {
* const isMe = userId === ''; // 当 userId 为空串时,代表本地麦克风音量。
* if (isMe) {
* console.log(`my volume: ${volume}`);
* } else {
* console.log(`user: ${userId} volume: ${volume}`);
* }
* })
* });
*
* // 开启音量回调,并设置每 1000ms 触发一次事件
* trtc.enableAudioVolumeEvaluation(1000);
*/
readonly AUDIO_VOLUME: "audio-volume";
/**
* @description 网络质量统计数据事件,进房后开始统计,每两秒触发一次,该数据反映的是您本地的上、下行的网络质量。
* - 上行网络质量(uplinkNetworkQuality)指的是您上传本地流的网络情况(SDK 到腾讯云的上行连接网络质量)
* - 下行网络质量(downlinkNetworkQuality)指的是您下载所有流的平均网络情况(腾讯云到 SDK 的所有下行连接的平均网络质量)
*
* 其枚举值及含义如下表所示:
* | 数值 | 含义 |
* | :--- | :---- |
* | 0 | 网络状况未知,表示当前 client 实例还没有建立上行/下行连接 |
* | 1 | 网络状况极佳 |
* | 2 | 网络状况较好|
* | 3 | 网络状况一般 |
* | 4 | 网络状况差 |
* | 5 | 网络状况极差 |
* | 6 | 网络连接已断开
注意:若下行网络质量为此值,则表示所有下行连接都断开了 |
* - uplinkRTT,uplinkLoss 为上行 RTT(ms) 及上行丢包率。
* - downlinkRTT,downlinkLoss 为所有下行连接的平均 RTT(ms) 及平均丢包率。
*
* **Note**
* - 如果您想知道对方的上下行网络情况,需要把对方的网络质量情况通过 IM 广播出去。
*
* @default 'network-quality'
* @memberof module:EVENT
* @example
* trtc.on(TRTC.EVENT.NETWORK_QUALITY, event => {
* console.log(`network-quality, uplinkNetworkQuality:${event.uplinkNetworkQuality}, downlinkNetworkQuality: ${event.downlinkNetworkQuality}`)
* console.log(`uplink rtt:${event.uplinkRTT} loss:${event.uplinkLoss}`)
* console.log(`downlink rtt:${event.downlinkRTT} loss:${event.downlinkLoss}`)
* })
*/
readonly NETWORK_QUALITY: "network-quality";
/**
* @description SDK 和腾讯云的连接状态变更事件,您可以利用该事件从总体上监听 SDK 与腾讯云的连接状态。
* - 'DISCONNECTED':连接断开
* - 'CONNECTING':正在连接中
* - 'CONNECTED':已连接
*
* 不同状态变更的含义:
*
* - DISCONNECTED -> CONNECTING: 正在尝试建立连接,调用进房接口或者 SDK 自动重连时触发。
* - CONNECTING -> DISCONNECTED: 连接建立失败,当正在连接时调用退房接口中断连接或者经过 SDK 重试后任然连接失败时触发。
* - CONNECTING -> CONNECTED: 连接建立成功,连接成功时触发。
* - CONNECTED -> DISCONNECTED: 连接中断,调用退房接口或者当网络异常导致连接断开时触发。
*
* 处理建议:可以监听该事件,在不同状态显示不同的 UI,提醒用户当前的连接状态。
*
* @default 'connection-state-changed'
* @memberof module:EVENT
* @example
* client.on(TRTC.CONNECTION_STATE_CHANGED, event => {
* const prevState = event.prevState;
* const curState = event.state;
* });
*/
readonly CONNECTION_STATE_CHANGED: "connection-state-changed";
/**
* @description 音频播放状态变更事件
*
* event.userId 当 userId 为空串时,代表本地用户,非空串代表远端用户。
*
* event.state 取值如下:
* - 'PLAYING':开始播放
* - event.reason 为 'playing' 或者 'unmute'。
* - 'PAUSED':暂停播放
* - event.reason 为 'pause' 时,由 \