UNPKG

@rongcloud/plugin-rtc

Version:

@rongcloud/plugin-rtc

2,174 lines (2,138 loc) 158 kB
import * as _rongcloud_engine from '@rongcloud/engine'; import { EventEmitter, BasicLogger, INaviInfo, RTCPluginContext, Codec, IPromiseResult, ErrorCode, KVString, IRuntime, IAsyncRes, RCConnectionStatus, ConversationType, ISendMsgOptions, IReceivedMessage, LogL, EnableLogL, RTCMode as RTCMode$1, IPluginGenerator } from '@rongcloud/engine'; /** * 错误码,与移动端对齐 * @description * 1. `51000 - 51999` 为 Android 专用段 * 2. `52000 - 52999` 为 iOS 专用段 * 3. `53000 - 53199` 为 Web RTC 专用段 * 4. `53200 - 53499` 为 Web Call 专用段 * 5. `53500 - 53999` 为 Web 保留段 * 6. 1004 jwt token 过期 */ declare enum RCRTCCode { /** 成功 */ SUCCESS = 10000, /** PB 错误 */ PB_ERROR = 40001, /** IM 服务未连接 */ SIGNAL_DISCONNECTED = 50000, /** 参数错误 */ PARAMS_ERROR = 50001, /** 加入房间错误,重复加入 RTC 房间内 */ REPERT_JOIN_ROOM = 50002, /** 当前不在房间内 */ NOT_IN_ROOM = 50003, /** MediaServer 未开启 */ SERVICE_INVALID = 50004, /** RTC Token 无效 */ RTC_TOKEN_INVALID = 50006, /** 后台未开通语音识别服务 */ ASR_NOT_AVAILABLE = 50034, /** 此房间未开启语音识别服务 */ ASR_NOT_START = 50035, /** 底层信令调用错误 */ SIGNAL_ERROR = 53001, /** 创建 Offer 失败 */ CREATE_OFFER_FAILED = 53003, /** 网络请求失败 */ REQUEST_FAILED = 53004, /** MCU 地址不可为空 */ MCU_SERVER_NOT_FOUND = 53005, /** 直播订阅失败,当前存在已订阅资源 */ BROADCAST_SUB_LIST_NOT_EMPTY = 53007, /** 房间已被销毁,需重新加入房间获取 Room 实例 */ ROOM_HAS_BEEN_DESTROYED = 53008, /** 没有可用的音视频服务器地址 */ NOT_OPEN_VIDEO_AUDIO_SERVER = 53009, /** 获取用户媒体资源流失败 */ GET_USER_MEDIA_FAILED = 53010, /** 获取屏幕共享流失败 */ GET_DISPLAY_MEDIA_FAILED = 53011, /** 权限问题导致获取媒体流被拒绝 */ BROWSER_PERMISSION_DENIED = 53012, /** 创建自定义流失败 */ CREATE_CUSTOM_TRACK_FAILED = 53013, /** 无效的 TAG 定义 */ INVALID_TAGS = 53014, /** IM 连接无效,无法识别当前登录的用户身份 */ INVALID_USER_ID = 53015, /** 创建文件流失败 */ CREATE_FILE_TRACK_FAILED = 53016, /** 无效的 File 实例 */ INVALID_FILE_INSTANCE = 53017, /** setRemoteDescription failed */ SET_REMOTE_DESCRIPTION_FAILED = 53018, /** 浏览器不支持此方法 */ BROWSER_NOT_SUPPORT = 53019, /** 媒体流无法播放,可能是远端流未订阅或本地流已销毁 */ TRACK_NOT_READY = 53020, /** 视频流播放需时需传参 HTMLVideoElement 作为显示组件 */ VIDEO_TRACK_MISS_MEDIA_ELEMENT = 53021, /** 媒体流播放失败 */ TRACK_PLAY_ERROR = 53022, /** 观众加入直播房间信令错误 */ SIGNAL_AUDIENCE_JOIN_ROOM_FAILED = 53023, /** 直播房间切换身份错误 */ SIGNAL_ROOM_CHANGE_IDENTITY_FAILED = 53024, /** 公有云 SDK 包不允许使用私有云环境 */ PACKAGE_ENVIRONMENT_ERROR = 53025, /** 单个用户发布资源超过限制 ( MediaServer 限制最多 10 个 track ) */ PUBLISH_TRACK_LIMIT_EXCEEDED = 53026, /** 房间内无主播推 CDN */ CDN_RESOURCE_IS_EMPTY = 53027, /** 加入 RTC 房间 joinTYype 为 1 时,当前有其他端在房间时的应答码 */ SIGNAL_JOIN_RTC_ROOM_REFUSED = 53028, /** 设置音频输出设备时,无权限使用请求的设备 */ NO_PERMISSION_TO_USE_REQUESTED_DEVICE = 53029, /** 方法在 PK 房间上不可用 */ THE_FUNCTION_IS_DISABLED_IN_PKROOM = 53030, /** 资源没有全部发成功 */ SOME_TRACKS_PUBLISH_FAILED = 53031, /** electron 中 mac 系统暂不支持屏幕共享采集声音 */ MAC_IN_ELECTRON_NOT_SUPPORT_SCREEN_SHARE_WITH_AUDIO = 53032, /** JWT token 解析超时,需要刷新 navi 重新获取 */ JWT_TIME_OUT = 1004, /** 获取媒体资源时,无系统权限 */ SYSTEM_PERMISSION_DENIED = 53033, /** 发布时无有效资源,如 track 已被销毁 */ PUBLISH_TRACKS_IS_INVALID = 53034, /** * @deprecated * 流状态为 ended */ TRACK_READYSTATE_IS_ENDED = 53035, /** * 应用 3A 降噪必须在 publish 之前 */ APPLY_3A_NOISE_WORKLET_BEFORE_PUBLISH = 53036, /** 加载 3A 降噪模块失败 */ LOAD_3A_MODULE_FAILED = 53037 } /** * 媒体资源类型 */ declare enum RCMediaType { /** * 音频流 */ AUDIO_ONLY = 0, /** * 视频流 */ VIDEO_ONLY = 1, /** * 音视频混合流,只在 web 端存在混合流的情况 */ AUDIO_VIDEO = 2 } declare enum RCFrameRate { FPS_10 = "FPS_10", FPS_15 = "FPS_15", FPS_24 = "FPS_24", FPS_30 = "FPS_30" } declare enum RCResolution { W176_H132 = "W176_H132", W176_H144 = "W176_H144", W180_H180 = "W180_H180", W240_H180 = "W240_H180", W240_H240 = "W240_H240", W256_H144 = "W256_H144", W320_H180 = "W320_H180", W320_H240 = "W320_H240", W360_H360 = "W360_H360", W480_H360 = "W480_H360", W480_H480 = "W480_H480", W640_H360 = "W640_H360", W640_H480 = "W640_H480", W720_H480 = "W720_H480", W848_H480 = "W848_H480", W960_H720 = "W960_H720", W1280_H720 = "W1280_H720", W1920_H1080 = "W1920_H1080", W144_H176 = "W144_H176", W144_H256 = "W144_H256", W180_H240 = "W180_H240", W180_H320 = "W180_H320", W240_H320 = "W240_H320", W360_H480 = "W360_H480", W360_H640 = "W360_H640", W480_H640 = "W480_H640", W480_H720 = "W480_H720", W480_H848 = "W480_H848", W720_H1280 = "W720_H1280", W720_H960 = "W720_H960", W1080_H1920 = "W1080_H1920" } /** * 流状态 */ declare enum TrackState { /** * 不可用 */ DISABLE = 0, /** * 可用 */ ENABLE = 1 } declare abstract class RCTrack extends EventEmitter { protected _logger: BasicLogger; private readonly _tag; private readonly _userId; protected readonly _kind: 'audio' | 'video'; private readonly _isLocalTrack; private readonly _roomId?; protected _localMuted: boolean; protected _remoteMuted: boolean; protected readonly _id: string; protected readonly _streamId: string; protected _msTrack?: MediaStreamTrack; private _msStream; protected readonly DataTrackId: string; constructor(_logger: BasicLogger, _tag: string, _userId: string, _kind: 'audio' | 'video', _isLocalTrack: boolean, _roomId?: string | undefined); /** * 获取音视轨所属的 streamId,streamId 相同的音轨和视轨可认为属于统一道流 * @returns */ getStreamId(): string; getTrackId(): string; /** * 当 isMCUTrack 为 true 时,返回空字符串 */ getUserId(): string; /** * @private */ __innerGetMediaStreamTrack(): MediaStreamTrack | undefined; /** * 它返回 MediaStreamTrack 对象。 * @returns 表示媒体源的 MediaStreamTrack 对象。 */ get streamTrack(): (MediaStreamTrack | undefined); /** * 获取数据标识 * @returns */ getTag(): string; isLocalTrack(): boolean; isVideoTrack(): boolean; isAudioTrack(): boolean; /** * 查询流数据是否已可进行播放 * @returns */ isReady(): boolean; /** * @private * @param track */ __innerSetMediaStreamTrack(track: MediaStreamTrack | undefined): void; protected _setLocalMuted(bool: boolean): Promise<RCRTCCode>; /** * 禁用 */ mute(): Promise<RCRTCCode>; /** * 启用 */ unmute(): Promise<RCRTCCode>; /** * 本端是否已禁用该轨道数据 */ isLocalMuted(): boolean; /** * 是否为 MCU track */ isMCUTrack(): boolean; /** * 发布者是否已禁用该轨道数据,在 RCLocalTrack 实例中,则其值始终等于 `isLocalMuted()` */ isOwnerMuted(): boolean; protected _element?: HTMLMediaElement; private _validateVolume; /** * 播放前检测 */ private _validatePlayOptions; /** * 设置播放属性 */ private _setPlayAttrs; /** * 播放 * @param element 用于承载媒体流的元素标签,音频流可传空 * @param volume 有效值为 0-100 */ play(element?: HTMLVideoElement, options?: { volume?: number; audioDeviceId?: string; }): Promise<{ code: RCRTCCode; }>; /** * @private */ __innerDestroy(): void; /** * 释放内存中的 video、audio 标签 * @private */ __releaseMediaElement(): void; /** * 它检查元素是否是视频节点 * @param {any} element - 您要检查的元素是否为视频元素。 * @returns 一个布尔值。 */ private _validateVideoNodeName; } declare enum RCAudioBitrate { /** * 标清音质 */ Speech = "Speech", /** * 音乐音质 */ Music = "Music", /** * 音乐高清音质 */ MusicHigh = "MusicHigh" } declare enum RCVideoBitrate { /** * Bitrate { max: 150, min: 80 } */ LEVEL0 = "LEVEL0", /** * Bitrate { max: 280, min: 120 } */ LEVEL1 = "LEVEL1", /** * Bitrate { max: 650, min: 150 } */ LEVEL2 = "LEVEL2", /** * Bitrate { max: 1000, min: 200 } */ LEVEL3 = "LEVEL3", /** * Bitrate { max: 2200, min: 250 } */ LEVEL4 = "LEVEL4", /** * Bitrate { max: 4000, min: 400 } */ LEVEL5 = "LEVEL5" } declare abstract class RCLocalTrack extends RCTrack { /** * 本地流结束事件通知 * @description * 该事件为 MediaStreamTrack 实例的 'ended' 事件触发 */ static EVENT_LOCAL_TRACK_END: string; /** * @private * muted 状态变更通知常量定义 */ static __INNER_EVENT_MUTED_CHANGE__: string; /** * @private * 本地流已销毁 */ static __INNER_EVENT_DESTROY__: string; /** * track 是否被销毁 */ private _isDestroyed; constructor(logger: BasicLogger, tag: string, userId: string, kind: 'audio' | 'video', track: MediaStreamTrack); protected _onTrackEnded(): void; /** * @override 重写 RCTrack 父类方法 * @param bool */ _setLocalMuted(bool: boolean): Promise<RCRTCCode>; private _isPublished; /** * @private */ __innerSetPublished(bool: boolean): void; /** * 检测本地资源是否已发布 */ isPublished(): boolean; /** * 销毁本地流 */ destroy(isNeedUnpublish?: boolean): void; /** * 判断 track 是否被销毁 */ isDestroyed(): boolean; private _bitrateInfo?; /** * 为本地流设定上行码率,仅视频流有效,音频默认 15 kbps,不支持修改 * @description 当 `max` 或 `min` 值为 `0` 时,取动态码率计算结果 * @param max 最大码率 * @param min 最小码率 * @param start 起始码率 */ setBitrate(max?: number, min?: number, start?: number): void; /** * 获取码率配置,当未指定码率时,将取得动态码率计算值 * @returns */ getBitrate(): IRCTrackBitrate; getSettings(): ReturnType<MediaStreamTrack['getSettings']> | undefined; } declare class RCLocalAudioTrack extends RCLocalTrack { constructor(logger: BasicLogger, tag: string, userId: string, track: MediaStreamTrack); /** * 它设置推荐的音频码率。 * @param {RCAudioBitrate} audio - RCA音频比特率 */ setRecommendBitrate(audio: RCAudioBitrate): void; /** * 它设置视频的比特率。 * @param {number} max - 客户端将使用的最大比特率。 * @param {number[]} args - [分钟,开始] */ setBitrate(max: number, ...args: number[]): void; } declare class RCLocalVideoTrack extends RCLocalTrack { private _isTiny; constructor(logger: BasicLogger, tag: string, userId: string, track: MediaStreamTrack, _isTiny?: boolean); /** * @private * @returns */ __isTiny(): boolean; getStreamId(): string; getTrackId(): string; /** * 它设置推荐的音频码率 * @param {RCVideoBitrate} video - RC视频比特率 */ setRecommendBitrate(video: RCVideoBitrate): void; /** * 它设置视频的比特率。 * @param {number} max - 视频可以编码的最大比特率。 * @param {number[]} args - [最大、最小、开始] */ setBitrate(max: number, ...args: number[]): void; } declare abstract class RCLocalFileTrack extends RCLocalTrack { /** * 自定义文件流的播放宿主原生,该类型流所持有的 MediaStreamTrack 实例是由该宿主元素 `captureStream` 获取 */ protected _resource: HTMLVideoElement; private static readonly _mapping; /** * 建立 trackId 与宿主播放元素的映射关系 * @param trackId * @param video */ private static _innerSetMapping; private static _innerRemoveMapping; constructor(logger: BasicLogger, tag: string, userId: string, kind: 'audio' | 'video', track: MediaStreamTrack, /** * 自定义文件流的播放宿主原生,该类型流所持有的 MediaStreamTrack 实例是由该宿主元素 `captureStream` 获取 */ _resource: HTMLVideoElement); destroy(): void; } declare class RCLocalFileVideoTrack extends RCLocalFileTrack { constructor(logger: BasicLogger, tag: string, userId: string, track: MediaStreamTrack, element: HTMLVideoElement); } declare class RCLocalFileAudioTrack extends RCLocalFileTrack { constructor(logger: BasicLogger, tag: string, userId: string, track: MediaStreamTrack, element: HTMLVideoElement); _setLocalMuted(bool: boolean): Promise<RCRTCCode>; play(): Promise<{ code: RCRTCCode; }>; } declare class RCMicphoneAudioTrack extends RCLocalAudioTrack { private _originTrack; /** * 应用 3A 降噪模块对麦克风音频流进行处理 */ apply3ANoiseWorklet(): Promise<{ code: RCRTCCode; }>; /** * @private * @param track */ __innerSetMediaStreamTrack(track: MediaStreamTrack | undefined): void; replaceInnerTrack(track: MediaStreamTrack): void; } declare class RCCameraVideoTrack extends RCLocalVideoTrack { constructor(logger: BasicLogger, tag: string, userId: string, track: MediaStreamTrack, isTiny?: boolean); replaceInnerTrack(track: RCCameraVideoTrack): void; } declare class RCScreenVideoTrack extends RCLocalVideoTrack { protected _onTrackEnded(): void; } declare class RCScreenAudioTrack extends RCLocalAudioTrack { protected _onTrackEnded(): void; } declare abstract class RCRemoteTrack extends RCTrack { constructor(logger: BasicLogger, tag: string, userId: string, kind: 'audio' | 'video', roomId?: string); /** * 根据房间数据更新状态 * @param value * @private */ __innerSetRemoteMuted(bool: boolean): void; private _isSubscribed; /** * @param bool * @private */ __innerSetSubscribed(bool: boolean): void; /** * 查看是否已订阅了该远端资源 * @returns */ isSubscribed(): boolean; } declare class RCRemoteAudioTrack extends RCRemoteTrack { constructor(logger: BasicLogger, tag: string, userId: string, roomId?: string); protected _setLocalMuted(bool: boolean): Promise<RCRTCCode>; /** * 获取播放时指定的输出音量。若当前未播放,则返回 0。 * 注意:该音量为对媒体输出设备设定的输出音量,与当前音频内容的 audioLevel 是不同概念。 * @since - v5.6.12 */ getVolume(): number; } declare class RCRemoteVideoTrack extends RCRemoteTrack { constructor(logger: BasicLogger, tag: string, userId: string, roomId?: string); private _isSubTiny; /** * @private * @param bool */ __innerSetIsTinyTrack(bool: boolean): void; /** * 是否订阅的小流 */ isSubTiny(): boolean; } /** * 资源大小流标识枚举 */ declare enum RCStreamType { /** * 普通流(大流) */ NORMAL = 1, /** * 小流 */ TINY = 2 } interface IStatParser { /** * 取消发布后,需把 _latestPacketsSent 中 key 为 resourceId 存储的数据清除掉 */ clearLatestpacketsSent(resourceIds: string[]): void; /** * 取消订阅后,需把 _latestPacketsRecv 中 key 为 resourceId 存储的数据清除掉 */ clearLatestPacketsRecv(resourceIds: string[]): void; parseRTCStatsReport(reports: RTCStatsReport): { [key: string]: any; }; formatRCRTCStateReport(stats: { [key: string]: any; }): IInnerRCRTCStateReport; } declare enum RCInnerCDNPushMode { AUTOMATIC = 0, MANUAL = 1 } declare enum RCInnerCDNBroadcast { SPREAD = 0, NO_SPREAD = -1 } /** * 音视频模式 */ declare enum RTCMode { /** * 普通音视频模式 */ RTC = 0, /** * 直播模式 */ LIVE = 2, /** * 跨应用多人房间 */ CROSS_MUTI = 7, /** * SIP 呼叫 * @private */ SIP = 4, /** * 内部 Callplus 呼叫类型,请勿使用 * @private */ CALL = 5 } /** * ASR 状态枚举 */ declare enum RCRTCASRStatus { /** * 无效值 */ VOID = "0", /** * 打开 */ OPEN = "2", /** * 关闭 */ CLOSE = "1" } /** * 与 MediaServer 交互所需的 Request Header 信息 */ interface IRTCReqHeader { /** * RTC Token * @todo 有效期问题处理 */ Token: string; /** * 房间 Id */ RoomId: string; /** * 用户 Id */ UserId: string; /** * 仅在直播模式下需要 */ RoomType?: RTCMode; /** * 开发者的 AppKey */ 'App-Key': string; /** * signal 会话 session id */ 'Session-Id'?: string; /** * peerConnection Id */ 'Peer-Connection-Id'?: string; /** * client-session-id 标识一个端用户进入房间后的唯一标识 */ 'Client-Session-Id'?: string; } interface IMCUReqHeaders { 'App-Key': string; Token: string; RoomId: string; UserId: string; SessionId: string; } /** * exchange 接口中 pushOtherRooms 字段接口 */ interface IPushOtherRooms { /** * 房间 Id */ roomId: string; /** * 是否默认合流 */ autoMix: boolean; /** * 房间 Id 对应的 SessionId */ sessionId: string; } /** * exchange 接口的请求体结构 */ interface IExchangeReqBody { /** * local description */ sdp: IOfferInfo; /** * 订阅列表 */ subscribeList: { /** * 流资源 uri */ uri: string; /** * 大小流订阅,`1` 为大流,`2` 为小流,默认使用大流 */ simulcast: RCStreamType; /** * 分辨率信息 */ resolution: string; }[]; /** * 透传参数,一般用于传递参数给其他服务,如 MCU/Record 等,MediaServer 仅透传不处理 * @example `{"resolutionInfo":[{"trackId":"021ad6e8-a50c-479c-96c8-5f3f09d2352d","simulcast":1,"resolution":"640x480"}]}` */ extend: string; /** * 跨房间连麦时其他房间的推流信息 */ pushOtherRooms?: IPushOtherRooms[]; /** * server 根据网络动态切换大小流开关,默认为 `false` */ switchstream: boolean; /** * 是否支持 ipv6 */ ipType: number; /** * asr 开关状态 */ asr_status: RCRTCASRStatus; } interface ILiveUrls { /** * MCU 服务地址,直播模式中用于向 MCU 服务提交 CDN 及合流配置 */ configUrl: string; /** * 观众端订阅地址,由业务层分发 */ liveUrl: string; /** * 自动推 CDN 模式下,发布资源后返回的 CDN 信息 */ pull_url?: string; } interface IRTCResponse { /** * 请求响应码,只有在 resultCode 值为 `10000` 时才为正常响应 */ resultCode: RCRTCCode; /** * 与 resultCode 相应的可读性文字信息 */ message: string; /** * 客户端发送的 Request-Id */ 'Request-Id': string; } interface IExchangeResSubscribeItem { mediaType: RCMediaType.AUDIO_ONLY | RCMediaType.VIDEO_ONLY; msid: string; userId: string; simulcast?: RCStreamType; } /** * /exchange 响应结果 */ interface IExchangeResponse extends IRTCResponse { /** * 数据中心地址,当存在此值时,后续所有请求发送到该地址。该地址不携带协议头,故需要补全 `https://` 协议头 */ clusterId: string; /** * 发布的资源列表 */ publishList: IResource[]; /** * @deprecated 目前并未使用,服务器返回值为 '' */ roomId: ''; /** * 远端 SDP 数据 */ sdp: { type: 'answer'; sdp: string; }; /** * 直播模式推流数据,仅在直播模式有值 */ urls?: ILiveUrls; /** * 跨房间连麦响应数据 */ otherRoomsRes?: { [roomId: string]: ILiveUrls; }; /** * 直播 mcu 资源 * 主播发布为具体资源,会议模式为空数组 */ mcuPublishList?: IResource[]; /** * 订阅成功的资源 */ subscribedList?: IExchangeResSubscribeItem[]; } interface IBroadcastSubReqBody { /** * 客户端 offer */ sdp: { type: 'offer'; sdp: string; }; /** * 直播信息 */ liveUrl?: string; /** * 订阅的资源类型,默认为 `RCMediaType.AUDIO_VIDEO` */ mediaType?: RCMediaType; /** * 订阅大/小流,默认订阅大流 */ simulcast?: RCStreamType; /** * 允许 server 根据网络状况动态切换大小流,默认为 false */ switchstream: boolean; /** * 订阅列表 */ subscribeList?: { /** * 流资源 uri */ uri: string; /** * 大小流订阅,`1` 为大流,`2` 为小流,默认使用大流 */ simulcast: RCStreamType; /** * 分辨率信息 */ resolution: string; }[]; /** * 是否采用新版本模式,加入房间 */ newVersionFlag?: boolean; } interface IBroadcastSubRespBody extends IRTCResponse { /** * 已订阅的资源列表 */ subscribedList: IResource[]; /** * 远端 SDP */ sdp: { type: 'answer'; sdp: string; }; } /** * 获取 CDN 资源拉流地址请求 headers */ interface ICDNPlayUrlReqHeaders extends IMCUReqHeaders { } /** * 获取 CDN 资源拉流地址响应 */ interface ICDNPlayUrlResponse extends IRTCResponse { data: { fps: number; h: number; 'pull_url': string; w: number; }; } /** * cdn_uris 里面包含的字段 */ interface ICDNUris { /** * 是否扩散 */ broadcast: RCInnerCDNBroadcast; /** * 拉流资源的宽度 */ w?: number; /** * 拉流资源的高度 */ h?: number; /** * 帧率 */ fps?: number; /** * 获取拉流地址的 url */ url: string; /** * 开启、停用 CDN */ enableInnerCDN?: boolean; /** * 推送模式,手动 or 自动 */ 'push_mode': RCInnerCDNPushMode; 'pull_safe': boolean; } declare enum RCRTCAISwitchType { OPEN = 1, CLOSE = 0 } /** * 设置 RTC 人员 inner、outer 数据 */ interface IRTCUserData { [key: string]: string; } interface IRtcTokenData { rtcToken: string; } /** * 加入 RTC 房间的用户信息 */ interface IRTCJoinedInfo { /** * 设备 ID */ deviceId: string; /** * RTC 房间 ID */ roomId: string; /** * 加入的时间戳 */ joinTime: number; } interface IRTCRoomInfo { roomId: string; roomData: unknown[]; userCount: number; list: unknown[]; } interface IServerRTCRoomEntry { key: string; value: string; status: number; timestamp: number; uid: string; } interface IRTCUsers { users: { [userId: string]: { /** * 发布的资源数据,是一个 JSON 字符串,解析后为发布的资源列表 */ uris?: string; /** * 加房间的身份标识,保存主房间 roomId */ extra?: string; }; }; } interface IJoinRTCRoomData extends IRTCUsers { token: string; sessionId: string; roomInfo: { key: string; value: string; }[]; kvEntries: IServerRTCRoomEntry[]; offlineKickTime: number; codeFormat?: string; roomCreateTime?: number; userJoinTime?: number; version: number; } interface IReqRoomPKOptions { /** * 当前房间 ID */ roomId: string; /** * 被邀请房间 ID */ invitedRoomId: string; /** * 被邀请用户 ID */ invitedUserId: string; /** * 本次邀请超时时间 */ inviteTimeout: number; /** * 本次邀请额外信息 */ inviteInfo: string; /** * 本次邀请唯一 ID */ inviteSessionId: string; } interface ICancelRoomPKOptions { /** * 当前房间 ID */ roomId: string; /** * 被邀请房间 ID */ invitedRoomId: string; /** * 被邀请用户 ID */ invitedUserId: string; /** * 本次邀请额外信息 */ inviteInfo: string; /** * 本次邀请唯一 ID */ inviteSessionId: string; } interface IResRoomPKOptions { /** * 当前房间 ID */ roomId: string; /** * 邀请者 ID */ inviteUserId: string; /** * 邀请者房间 ID */ inviteRoomId: string; /** * 邀请的 session ID */ inviteSessionId: string; /** * 需要转发的信息 */ content: string; /** * 同意邀请时要设置的 key, 放在room级别的k和v,新加入房间的能拉取到 */ key: string; /** * 同意邀请时要设置的 value, 放在room级别的k和v,新加入房间的能拉取到 */ value: string; /** * 是否同意邀请 */ agree: boolean; } interface IEndRoomPKOptions { /** * 当前房间 ID */ roomId: string; /** * 需要结束的连麦房间 ID */ endRoomId: string; /** * 需要结束连麦的 sessionID */ sessionId: string; /** * 结束连麦的信息 */ content: string; /** * 需要删除连麦的信息的 keys */ keys: string[]; } interface IRTCNaviInfo extends INaviInfo { /** * jwt token */ jwt?: string; /** * http3 上报域名 */ logServer?: string; /** * 数据中心 */ dc?: string; /** * openGzip 开启标识,默认是false,开启使用true */ openGzip?: boolean; /** * AI 开关是否打开,1: 打开,0: 关闭 */ rtcAISwitch?: RCRTCAISwitchType; } declare enum RCRTCOperateSummarizationType { OPEN = "2", CLOSE = "1" } declare abstract class ReadableStore { protected readonly _logger: BasicLogger; readonly clientSessionId: string; readonly appkey: string; readonly roomId: string; readonly crtUserId: string; readonly roomMode: RTCMode; readonly isUpgrade?: boolean | undefined; readonly isMainRoom?: boolean | undefined; /** * 房间资源数据 */ protected _roomResources: RoomData; /** * 远端 track */ protected _remoteTracks: { [trackId: string]: RCRemoteAudioTrack | RCRemoteVideoTrack; }; /** * 已订阅参数 */ protected _subscribedList: ISubscribeAttr[]; protected _collectSubscribeList: ISubscribeAttr[]; /** * 与 MediaServer 交互需要的 token 信息 */ protected _token: string; /** * 每次加入房间后都会改变 */ protected _sessionId: string; /** * cdn_uris 信令扩散数据 */ protected _CDNUris: ICDNUris | null; protected _CDNEnable: boolean; protected _destroyed: boolean; /** * 存储 ssrc-trackId 的 map */ protected _trackIdSSRCMap: Map<number, string>; protected _roomStatusVersion: number; protected _supportNtf: boolean; /** * asr 的打开状态 */ protected _asrStatus: RCRTCASRStatus; /** * asr 是否被启用 */ protected _asrEnable: boolean; /** * asr 输入语言,用于精准识别语音 */ protected _srcLanguage: string; /** * asr sei uris 信息 */ protected _asrSeiUris: { [userId: string]: IPublishedResource[]; }; /** * 是否开启实时翻译 */ protected _isStartRealTranslate: boolean; /** * 翻译目标语言 */ protected _translationLang: string; /** * 会议纪要开关状态、任务ID */ protected _summarizationStatusData: ISummarizationStatusData | null; /** * 语音识别中本地用户的昵称 */ protected _nickName: string; constructor(_logger: BasicLogger, clientSessionId: string, appkey: string, roomId: string, crtUserId: string, roomMode: RTCMode, isUpgrade?: boolean | undefined, isMainRoom?: boolean | undefined); getResourcesByUserId(userId: string): IPublishedResource[] | undefined; getRemoteTrack(trackId: string): RCRemoteAudioTrack | RCRemoteVideoTrack | undefined; getRemoteTracksByUserId(userId: string): (RCRemoteAudioTrack | RCRemoteVideoTrack)[]; getRemoteTracks(): { [trackId: string]: RCRemoteAudioTrack | RCRemoteVideoTrack; }; getSessionId(): string; getAllUserIds(): string[]; getRemoteUserIds(): string[]; getSubscribedList(): ISubscribeAttr[]; getCollectSubscribeList(): ISubscribeAttr[]; getPublishedResourceByTrackId(trackId: string): IPublishedResource | undefined; getToken(): string; getCDNEnable(): boolean; getCDNUris(): ICDNUris | null; getRoomStatusVersion(): number; getTrackIdBySSRC(ssrc: number): string | undefined; getRTCRequestHeader(): IRTCReqHeader; getSupportNtf(): boolean; getASRIsAvailable(): boolean; getASRStatus(): RCRTCASRStatus; getASREnable(): boolean; getSrcLanguage(): string; getASRSeiUris(): IPublishedResource[]; getIsStartRealTranslate(): boolean; getTranslationLang(): string; getSummarizationStatusData(): ISummarizationStatusData | null; getNickName(): string; } declare class Store extends ReadableStore { /** * 更新房间内 ssrc-trackId 的 map */ private _updateTrackIdSSRCMap; setTrackIdSSRCMap(ssrc: number, trackId: string): void; private _initRemoteTracks; initWithRoomData(data: IJoinRTCRoomData, traceId: string): void; assignRoomData(data: RoomData): void; setResourcesByUserId(userId: string, arr: IPublishedResource[]): void; removeRemoteTrack(trackId: string): void; removeResourcesByUserId(userId: string): void; addRemoteTrack(track: RCRemoteAudioTrack | RCRemoteVideoTrack): void; removeRemoteTracks(): void; setCDNEnabel(bool: boolean): void; setCDNUris(uris: ICDNUris | null): void; resetSubscribedList(subscribeList: ISubscribeAttr[]): void; resetCollectSubscribeList(collectSubscribeList: ISubscribeAttr[]): void; setRoomStatusVersion(version: number): void; setASRStatus(status: RCRTCASRStatus): void; setASREnable(enable: boolean): void; setSrcLanguage(srcLanguage: string): void; setASRSeiUris(uris: IPublishedResource[]): void; addSeiRemoteTrack(uris: IPublishedResource[]): void; removeSeiRemoteTrack(): void; setIsStartRealTranslate(isStart: boolean): void; setTranslationLang(lang: string): void; setSummarizationStatusData(summarizationStatusData: { taskId?: string; status: RCRTCOperateSummarizationType; }): void; setNickName(nickName: string): void; } /** * 多端登录时,加入房间时的踢人策略 */ declare enum RTCJoinType { /** * 踢出已存在于房间的设备,以便于当前设备加入房间 */ KICK = 0, /** * 保持已存在于房间的设备,拒绝当前设备加入房间 */ REFUSE = 1 } declare enum RTCApiType { ROOM = 1, PERSON = 2 } declare enum RTCIdentityChangeType { AnchorToViewer = 1, ViewerToAnchor = 2 } declare const keymaps: { readonly RtcInput: readonly ["roomType", "broadcastType", "extraInnerData", "needSysChatroom", "identityChangeType", "joinType", "innerDatas", "outerDatas", "supportNtf"]; readonly RtcOutput: readonly ["version"]; readonly RtcUserListOutput: readonly ["users", "token", "sessionId", "roomInfo", "version"]; readonly SetUserStatusInput: readonly ["status"]; readonly RtcSetDataInput: readonly ["interior", "target", "key", "value", "objectName", "content"]; readonly RtcUserSetDataInput: readonly ["valueInfo", "objectName", "content"]; readonly RtcDataInput: readonly ["interior", "target", "key", "objectName", "content"]; readonly RtcSetOutDataInput: readonly ["target", "valueInfo", "objectName", "content"]; readonly MCFollowInput: readonly ["state"]; readonly RtcTokenOutput: readonly ["rtcToken"]; readonly RtcQryOutput: readonly ["outInfo"]; readonly RtcQryUserOutDataInput: readonly ["userId"]; readonly RtcUserOutDataOutput: readonly ["user"]; readonly RtcQueryListInput: readonly ["order"]; readonly RtcRoomInfoOutput: readonly ["roomId", "roomData", "userCount", "list"]; readonly RtcValueInfo: readonly ["key", "value"]; readonly RtcKeyDeleteInput: readonly ["key"]; readonly RtcNotifyMsg: readonly ["type", "time", "roomId"]; readonly RtcPullKV: readonly ["timestamp", "roomId"]; readonly RtcKVOutput: readonly ["entries", "bFullUpdate", "syncTime"]; readonly RtcQueryUserJoinedInput: readonly ["userId"]; readonly RtcQueryUserJoinedOutput: readonly ["info"]; readonly RtcInviteInput: readonly ["invitedUserId", "timeoutTime", "invitedRoomId", "inviteInfo", "inviteSessionId"]; readonly RtcCancelInviteInput: readonly ["invitedUserId", "invitedRoomId", "inviteInfo", "inviteSessionId"]; readonly RtcInviteAnswerInput: readonly ["inviteUserId", "answerCode", "inviteRoomId", "inviteSessionId", "content", "key", "value"]; readonly RtcEndInviteInput: readonly ["inviteRoomId", "inviteSessionId", "inviteContent", "inviteRoomKeys"]; readonly RtcRoomStatusInput: readonly ["version"]; readonly RtcRoomStatusOutput: readonly ["bFullStatus", "version", "usersData", "roomStatus"]; readonly RtcReportSDKInput: readonly ["sdkInfo"]; readonly RCRTCPBPolaris: readonly ["type", "appKey", "sessionId", "roomId", "roomCreateTime", "userId", "userRole", "joinTime", "signalDataCenter", "r1Info", "r2Info", "r3Info", "r4Info"]; readonly RCRTCPBR1Info: readonly ["joinTime", "rtcVersion", "imVersion", "platform", "device", "os", "browserName", "browserVersion"]; readonly RCRTCPBR2Info: readonly ["joinTime", "sendTime", "rtcActionType", "rtcActionStatus", "trackId"]; readonly RCRTCPBR3Info: readonly ["info"]; readonly RCRTCPBR4Info: readonly ["info"]; readonly RCRTCPBStatusInfo: readonly ["joinTime", "receiveTime", "totalBitRate", "appCPUUsage", "systemCPUUsage", "systemCPUFrequency", "networkStatus", "googleRTTNetwork", "ipAddress", "useReceiveBroadBand", "useSendBroadBand", "packetLossCount", "streams"]; readonly RCRTCPBStreamInfo: readonly ["trackId", "codeName", "volume", "samplingRate", "bitRate", "packetLossRate", "frameRate", "resolution", "blockTime", "jitterData", "nAckCount", "pliCount", "googleRTTTotalTime", "isReceiveFirstFrameRate", "codeType", "isEnabled"]; readonly AsrTextMsg: readonly ["bms", "t", "isEnd", "msgId", "lang"]; readonly AsrResTextMsg: readonly ["type", "uid", "asr"]; }; declare type RTCKeyMaps = typeof keymaps; /** * 自定义上报北极星数据响应 code */ declare enum RCSendCode { NOT_REPORT = -1, REPORT_SUCCESS = 10000, REPORT_FAIL = 0, PB_ERROR = 40001 } declare class RTCContext { private context; logger: BasicLogger; private codec; roomCreateTime: number | undefined; userJoinTime: number | undefined; constructor(context: RTCPluginContext, logger: BasicLogger, codec: Codec<RTCKeyMaps>); joinRTCRoom(roomId: string, mode: RTCMode, broadcastType?: number, joinType?: RTCJoinType, innerUserDatas?: IRTCUserData, outerUserDatas?: IRTCUserData, supportNtf?: boolean): IPromiseResult<IJoinRTCRoomData>; quitRTCRoom(roomId: string): Promise<ErrorCode>; getRTCRoomInfo(roomId: string): IPromiseResult<IRTCRoomInfo>; /** * 移动端用来获取副房间资源 */ getRTCUserInfoList(roomId: string): IPromiseResult<IRTCUsers>; getRTCUserInfo(roomId: string): IPromiseResult<unknown>; removeRTCUserInfo(roomId: string, keys: string[]): Promise<ErrorCode>; setRTCData(roomId: string, key: string, value: string, isInner: boolean, apiType: RTCApiType, message?: { name: string; content: string; }): Promise<ErrorCode>; /** * 全量订阅资源修改 * @param roomId 房间 Id * @param message 向前兼容的消息内容 * @param valueInfo 全量资源数据 * @param objectName 全量 URI 消息名 */ setRTCTotalRes(roomId: string, messageList: { name: string; content: string; }[], valueInfo: string, objectName: string, mcuValInfo?: string, cdnValInfo?: string): Promise<ErrorCode>; setRTCCDNUris(roomId: string, objectName: string, CDNUris: string): Promise<ErrorCode>; getRTCData(roomId: string, keys: string[], isInner: boolean, apiType: RTCApiType): IPromiseResult<KVString>; removeRTCData(roomId: string, keys: string[], isInner: boolean, apiType: RTCApiType, message?: { name: string; content: string; }): Promise<ErrorCode>; setRTCOutData(roomId: string, rtcData: unknown, type: number, message: unknown): Promise<ErrorCode>; getRTCOutData(roomId: string, userIds: string[]): IPromiseResult<unknown>; getRTCToken(roomId: string, mode: number, broadcastType?: number): IPromiseResult<IRtcTokenData>; setRTCState(roomId: string, report: string): Promise<ErrorCode>; /** * 通过 http 方式上报 rtc state */ setRTCStateByHttp(logServer: string, runtime: IRuntime, report: IRCRTCReportData, reportType: string): Promise<RCSendCode | RCRTCCode>; getRTCUserList(roomId: string): IPromiseResult<IRTCUsers>; joinLivingRoomAsAudience(roomId: string, mode: RTCMode, broadcastType?: number): Promise<IAsyncRes<{ token: string; kvEntries: IServerRTCRoomEntry[]; }>>; quitLivingRoomAsAudience(roomId: string): Promise<ErrorCode>; rtcIdentityChange(roomId: string, changeType: RTCIdentityChangeType, broadcastType?: number): Promise<IAsyncRes<IJoinRTCRoomData>>; requestRoomPK(options: IReqRoomPKOptions): Promise<ErrorCode>; cancelRoomPK(options: ICancelRoomPKOptions): Promise<ErrorCode>; responseRoomPK(options: IResRoomPKOptions): Promise<ErrorCode>; endRoomPK(options: IEndRoomPKOptions): Promise<ErrorCode>; getRTCJoinedUserInfo(userId: string): Promise<IAsyncRes<IRTCJoinedInfo[]>>; pullRTCRoomEntry(roomId: string): Promise<IAsyncRes<IChrmKVPullData>>; /** * 通知拉取房间数据 * @param roomId 房间 id * @param version 本地最大得房间数据版本号 */ pullRTCRoomStatus(roomId: string, version: number): Promise<{ code: ErrorCode; data?: IPullRTCRoomStatus; }>; decodeRtcNotify(buffer: Uint8Array): { time: number; type: any; roomId: any; }; getCurrentId(): string; getNaviInfo(): IRTCNaviInfo | null; getConnectionStatus(): RCConnectionStatus; getAppkey(): string; /** web 端发 rtcPing */ webRtcPing(roomId: string, roomMode: RTCMode, broadcastType?: number): Promise<{ code: ErrorCode; data?: { version: number; }; }>; /** * 协议栈 rtcping 依赖 imlib 编解码数据 * web 单独走 imlib 提供的 rtcSignaling 方法,减少对 imlib 的依赖 */ rtcPing(roomId: string, roomMode: RTCMode, broadcastType?: number): Promise<_rongcloud_engine.RCResult<any>> | Promise<{ code: ErrorCode; data?: { version: number; } | undefined; }>; sendMessage(conversationType: ConversationType, targetId: string, options: ISendMsgOptions): IPromiseResult<IReceivedMessage>; registerRTCSignalListener(listener?: ((buffer: Uint8Array) => void) | undefined): void; registerConnectionStateChangeListener(listener: (status: RCConnectionStatus, code: ErrorCode) => void): void; registerDisconnectListener(listener: () => void): void; registerDestroyListener(listener: () => void): void; registerMessageListener(listener: (message: IReceivedMessage) => boolean): void; getCoreVersion(): string; getPluginContext(): RTCPluginContext; reportSDKInfo(versionInfo: { [name: string]: string; }): void; decodeAsrText(buffer: Uint8Array, seiData: number[]): (RCRTCASRContent | RCRTCRealtimeTranslationContent)[]; } declare type ISdpSemantics = 'plan-b' | 'unified-plan'; interface IOfferInfo { type: 'offer'; sdp: string; semantics: ISdpSemantics; } declare type OutboundVideoInfo = { trackId: string; simulcast: RCStreamType; resolution: string; }; declare enum RCInnerCDNPullKind { RTMP = "rtmp", FLV = "flv", HLS = "hls" } declare enum RCInnerCDNPullIsHttps { NOT_HTTPS = 0, HTTPS = 1 } declare enum RCKickReason { /** * Server 主动踢(掉 Server API 踢出) */ SERVER_KICK = 1, /** * 其他设备加入房间后,本端被踢 */ OTHER_KICK = 2, /** * im 断开连接 */ IM_DISCONNECTED = 3, /** * im 退出登录 */ IM_LOGOUT = 4, /** * 用户在其他设备连接 im,被挤下线 */ OTHER_CLIENT_IM_CONNECTED = 5 } declare enum RCRTCPingResult { SUCCESS = "Success", FAIL = "Fail" } /** * 直播角色 */ declare enum RCRTCLiveRole { /** * 主播降级 */ ANCHOR = 1, /** * 观众升级 */ AUDIENCE = 2 } /** * 通知拉取到的房间增量数据列表中每一项数据的动作 */ declare enum PullRoomStatusEvent { /** * 人员加入 */ JOIN = 0, /** * 人员离开 */ LEAVE = 1, /** * 人员离线 */ OFFLINE = 2, /** * 资源变动 */ RESOURCECHANGE = 3 } declare type RCEncryptFunction = (data: Uint8Array) => Uint8Array; interface IRCEncryptorHooks { /** * @since 5.7.3 * 加密回调,用于接收待加密的音频二进制数据的 Uint8Array 类型数组 */ decodeAudio: RCEncryptFunction; /** * @since 5.7.3 * 加密回调,用于接收待加密的视频二进制数据的 Uint8Array 类型数组 */ decodeVideo: RCEncryptFunction; /** * @since 5.7.3 * 解密回调,用于接收待解密的音频二进制数据的 Uint8Array 类型数组 */ encodeAudio: RCEncryptFunction; /** * @since 5.7.3 * 解密回调,用于接收待解密的视频二进制数据的 Uint8Array 类型数组 */ encodeVideo: RCEncryptFunction; } declare enum RCRTCGenerateSummarizationFormat { /** * 输出 MarkDown 格式 */ MARK_DOWN = 0, /** * 输出 JSON 格式 */ JSON = 1 } interface IRCTrackBitrate { /** * 最大码率 */ max: number; /** * 最小码率 */ min: number; /** * 上行起始码率 */ start?: number; } /** * MediaServer 返回的媒体资源数据 */ interface IResource { /** * 媒体类型 */ mediaType: RCMediaType.AUDIO_ONLY | RCMediaType.VIDEO_ONLY; /** * MediaStream Id,基本为 `userId` 与 `tag` 以 `_` 拼接而来。该值无法直接作为资源的唯一性标识属性, * 需与 mediaType 拼接使用 */ msid: string; /** * MediaServer 返回的资源地址 * @example 举例如下: * `{"clusterId":"rtc-data-bdcbj.ronghub.com:80","serverId":"172.28.76.215:40080","resourceId":"13111111111_5vls_web_RongCloudRTC_1","connectionId":"AAYxMDAzNjgAFDEzMTExMTExMTExXzV2bHNfd2ViAAMzMzMA","ssrc":1716229921,"serviceProvider":"bdc","userTimestamp":1604994044706}` */ uri: string; /** * 资源特征,simulcast 代表这道流支持大小流 */ simulcast: number; } /** * 向房间内发布的媒体数据 */ interface IPublishedResource extends IResource { /** * 资源禁用/启用标识,用于向 signal 同步本端资源状态,1 为启用,0 为禁用 */ state: 0 | 1; /** * 资源标识,同标识的资源将视作同道流,标识不可重复 */ tag: string; } interface ISubscribeAttr { /** * 要订阅的音视轨数据 Id */ track: RCRemoteTrack; /** * 订阅小流,默认为 `false` */ subTiny?: boolean; } /** * 视频配置 */ interface IVideoProfile { /** * 视频帧率 */ frameRate: RCFrameRate; /** * 视频分辨率 */ resolution: RCResolution; } /** * 屏幕共享流配置 */ interface IScreenVideoProfile extends IVideoProfile { /** * Electron 平台下通过 `desktopCapturer.getSources` 获取到的 sourceId, * 不传 chromeMediaSourceId 时默认共享桌面,传入时共享指定窗口。 * @see `https://www.electronjs.org/docs/api/desktop-capturer` */ chromeMediaSourceId?: string; } /** * 待发布资源数据 */ interface IPublishAttrs { /** * 待发布的轨道数据 */ track: RCLocalTrack; /** * 是否同时发布小流 */ pubTiny?: boolean | IVideoProfile; } /** * peerConnection 抛出给用户的 track 字段 */ interface IRCTrackStat { /** * stat id */ id?: string; /** * 资源 Id */ trackId: string; /** * 资源类型 */ kind: 'audio' | 'video'; /** * 丢包率,有效值 `0` - `1` */ packetsLostRate: number | null; /** * 是否是远端资源 */ remoteResource: boolean; /** * 音量 */ audioLevel?: number | null; /** * 视频高度 */ frameHeight?: number | null; /** * 视频宽度 */ frameWidth?: number | null; /** * 视频帧率 */ frameRate?: number | null; /** * 码率 */ bitrate: number; /** * 网络抖动,单位 ms * @description 下行数据中,同道流中只有一个 track 会有值,另一轨道数据值为 `0` */ jitter: number | null; /** * 往返时延 */ rtt?: number | null; } /** * peerConnection 抛出给用户的 iceCandidatePair 字段 */ interface IRCCandidatePairStat { /** * 本端 IP */ IP: string; /** * 本地 UDP 端口 */ port: number; /** * 本地网络类型 */ networkType: string | null; /** * 远端 IP */ remoteIP: string; /** * 远端 UDP 端口 */ remotePort: number; /** * 协议 */ protocol: string; /** * 发送总码率,单位 kbps */ bitrateSend: number; /** * 接收总码率,单位 kbps */ bitrateRecv: number; /** * (Round-Trip-Time)往返时延,单位 ms */ rtt: number | null; /** * 可用上行带宽,单位 bit */ availableOutgoingBitrate: number | null; /** * 可用下行带宽,在无下行资源时,其值为 `0`,单位: `bit` */ availableIncomingBitrate: number | null; } /** * iceCandidatePair 所有字段 * 含 peerConnection 抛出给用户的 iceCandidatePair 字段 * 含 北极星上报 R3、R4 所需的 totalPacketsLost */ interface IInnerIcePair extends IRCCandidatePairStat { /** * 上、下行总丢包率 */ totalPacketsLost?: number; [key: string]: any; } /** * send track 所有字段 * 含 peerConnection 抛出给用户的 track 字段 * 含 北极星上报 R3 track 所需字段 */ interface ISendTrackState extends IRCTrackStat { /** * (Round-Trip-Time)往返时延,单位 ms */ rtt: number | null; /** * 编码方式 */ encoderImplementation: string | null; /** * PLI 请求数 */ pliCount: number; /** * nack 数量 */ nackCount: number; /** * 第一个关键帧是否正常收到 */ googFirsSent: number; /** * 音频采样率 */ samplingRate: number; /** * 接收卡顿(间隔时间, 单位: ms) */ googRenderDelayMs: number; /** * 流状态(0:不可用, 1:可用) */ trackState: TrackState; } /** * receive track 所有字段 * 含 peerConnection 抛出给用户的 track 字段 * 含 北极星上报 R4 track 所需字段 */ interface IRecvTrackState extends IRCTrackStat { /** * 解码方式 */ codecImplementationName: string | null; samplingRate: number; nackCount: number; pliCount: number; rtt: number | null; googFirsReceived: number; googRenderDelayMs: number; trackState: TrackState; } /** * peerConnection stats 解析出来业务所需的所有字段 */ interface IInnerRCRTCStateReport { timestamp: number; iceCandidatePair?: IInnerIcePair; senders: ISendTrackState[]; receivers: IRecvTrackState[]; } /** * 质量数据报告 */ interface IRCRTCStateReport { /** * @deprecated 已废弃 */ pcName?: string; /** * 报告生成时间戳 */ timestamp: number; /** * 对等连接状态数据 */ iceCandidatePair?: IRCCandidatePairStat; /** * 上行状态数据 */ senders: IRCTrackStat[]; /** * 下行状态数据 */ receivers: IRCTrackStat[]; } /** * 合流音源数据 */ interface ILiveAudioState { /** * 用户 id */ userId: string; /** * 资源 trackId */ trackId: string; /** * 音量 0-100 */ audioLevel: number; } /** * http3 北极星上报基础数据 */ interface IRCRTCReportBaseData { /** * 上报数据类型 R1-R4 */ type: string; appKey: string; /** * 房间通话id */ sessionId: string; roomId: string; /** * 房间创建时间 */ roomCreateTime: number; userId: string; userRole: number; joinTime: number; /** * signal 数据中心 * */ signalDataCenter: string; } /** * http3 北极星上报 R1 数据 */ interface IR1Info { /** * 用户加入房间的时间 */ joinTime: number; /** * RTC 版本号 */ rtcVersion: string; /** * IM SDK 版本 */ imVersion: string; /** * 平台(如:Android、iOS、Web) */ platform: string; /** * 设备信息(手机名称+型号) */ device: string; /** * 系统版本(手机系统版本) */ os: string; /** * 浏览器名称, 没有用 -1 表示 */ browserName?: string; /** * 浏览器版本, 没有用 -1 表示 */ browserVersion?: string; /** * 发送数据的时间 */ receiveTime?: number; } /** * http3 北极星上报 R2 数据 */ interface IR2Info { /** * 用户加入房间的时间 */ joinTime: number; /** * 客户端 发布/取消发布 订阅/取消订阅 资源的时间 */ sendTime: number; /** * 发布类型 subscribe : 订阅 publish : 发布 */ rtcActionType: string; /** * 发布状态 begin : 开始 tend : 结束 */ rtcActionStatus: string; trackId: string[]; /** * 发送数据的时间 */ receiveTime?: number; } /** * http3 北极星上报 R3 数据 */ interface IR3R4Info { info: IR3R4CommonInfo; } interface IR3R4CommonInfo { /** * 用户加入房间的时间 */ joinTime?: number; /** * 用户发布数据流的时间(毫秒),暂时由客户端生成,后期如果有问题服务端做兜底处理 */ receiveTime?: number; /** * 总码率 */ totalBitRate?: number; /** * APP CPU占用率 */ appCPUUsage?: number; /** * 系统 CPU占用率 */ systemCPUUsage?: number; /** * 系统CPU频率 (安卓8.0以上) */ systemCPUFrequency?: number; /** * 实时网络状态(2g、3g、4g、wifi) */ networkStatus?: string; /** * Goog rtt 网络延迟 */ googleRTTNetwork?: number; /** * ip地址 */ ipAddress?: string; /** * 可接收带宽(单位: bit) */ useReceiveBroadBand?: string; /** * 可用发送带宽(单位: bit) */ useSendBroadBand?: string; /** * 丢包数 */ packetLossCount?: string; streams?: IR3R4StreamInfo[]; } /** * http3 北极星上报 R3、R4 streamInfo 数据 */ interface IR3R4StreamInfo { trackId: string; /** * 编解码名称 */ codeName?: string; /** * 音频播放音量 */ volume?: string; /** * 音频采样率 */ samplingRate: number; /** * 下行码率 */ bitRate?: number; packetLossRate?: number; /** * 视频接收帧率(单位:fps) */ frameRate?: number; /** * 视频分辨率(格式:640*480) */ resolution?: string; /** * 接收卡顿(间隔时间, 单位: ms) */ blockTime?: number; /** * jitter数据抖动 */ jitterData?: number; /** * nack数量 */ nAckCount?: string; /** * PLI请求数 */ pliCount?: string; /** * googRtt往返时长 */ googleRTTTotalTime?: number; /** * 第一个关键帧是否正常收到 */ isReceiveFirstFrameRate?: number; /** * 编码方式 */ codeType?: string; /** * 当前流的状态是否可用 */ isEnabled?: number; } /** * http3 北极星上报总数据 */ interface IRCRTCReportData extends IRCRTCReportBaseData { r1Info?: IR1Info; r2Info?: IR2Info; r3Info?: IR3R4Info; r4Info?: IR3R4Info; } interface IRCRTCReportListener { /** * RTCPeerConnection 的详细状态数据 * @param report */ onStateReport?(report: IRCRTCStateReport): void; /** * ICE 连接状态变更通知 * @since version 5.1.5 * @param state - 连接状态 * @param _ - 已废弃 */ onICEConnectionStateChange?(state: RTCIceConnectionState, _?: string): void; /** * @deprecated */ onConnectionStateChange?(state: RTCPeerConnectionState, _?: string): void; /** * 上报合流音源数据 */ onReportLiveAudioStates?(data: ILiveAudioState[]): void; } interface IRCRTCTrackEventListener { /** * 订阅的音视频流通道已建立, track 已可以进行播放 * @param track RCRemoteTrack 类实例 */ onTrackReady?(track: RCRemoteTrack): void; } interface IRoomEventListener extends IRCRTCTrackEventListener { /** * 当 RTCPeerConnection 连接被异常关闭时触发,此时需业务层重新加入房间并重新发布、订阅资源。 * 引起连接异常中断的原因包括但不限于:电脑休眠、浏览器页面长期后台运行等 * @since 5.1.5 */ onRTCPeerConnectionCloseByException?(): void; /** * 当本端被剔出房间时触发 * @description 被踢出房间可能是由于服务端超出一定时间未能收到 rtcPing 消息,所以认为己方离线。 * 另一种可能是己方 rtcPing 失败次数超出上限 * @param byServer 当值为 `false` 时,说明本端 rtcPing 超时;当值为 `true` 时,说明本端收到被踢出房间通知 */ onKickOff?(byServer: boolean, state?: RCKickReason, kickExtra?: any): void; /** * 接收到房间信令时回调,用户可通过房间实例的 sendMessage 接口发送信令 * @param name 信令名 * @param content 信令内容 * @param senderUserId 发送者 Id * @param messageUId 消息唯一标识 */ onMessageReceive?(name: string, content: any, senderUserId: string, messageUId: string): void; /** * 房间属性变更回调 * @param name * @param content */ onRoomAttributeChange?(name: string, content?: string): void; /** * 房间用户禁用/启用音频 * @param audioTrack RCRemoteAudioTrack 类实例 */ onAudioMuteC