UNPKG

@rongcloud/plugin-rtc

Version:

@rongcloud/plugin-rtc

2,510 lines (2,477 loc) 144 kB
import { EventEmitter, BasicLogger, INaviInfo, LogL, EnableLogL, RTCPluginContext, Codec, IPromiseResult, ErrorCode, KVString, IRuntime, IAsyncRes, RCConnectionStatus, ConversationType, ISendMsgOptions, IReceivedMessage, 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, /** 底层信令调用错误 */ 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(): 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; } 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; } declare class RCCameraVideoTrack extends RCLocalVideoTrack { } 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 } /** * 与 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; } 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; } /** * 设置 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; } 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; 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; } 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; } 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; } 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 类实例 */ onAudioMuteChange?(audioTrack: RCRemoteAudioTrack): void; /** * 房间用户禁用/启用视频 * @param videoTrack RCRemoteVideoTrack 类实例对象 */ onVideoMuteChange?(videoTrack: RCRemoteVideoTrack): void; /** * 房间内用户发布资源 * @param tracks 新发布的音轨与视轨数据列表,包含新发布的 RCRemoteAudioTrack 与 RCRemoteVideoTrack 实例 */ onTrackPublish?(tracks: RCRemoteTrack[]): void; /** * 房间用户取消发布资源 * @param tracks 被取消发布的音轨与视轨数据列表 * @description 当资源被取消发布时,SDK 内部会取消对相关资源的订阅,业务层仅需处理 UI 业务 */ onTrackUnpublish?(tracks: RCRemoteTrack[]): void; /** * 人员加入 * @param userIds 加入的人员 id 列表 */ onUserJoin?(userIds: string[]): void; /** * 人员正常退出 * @param userIds */ onUserLeave?(userIds: string[]): void; /** * 人员离线退出 */ onUserOffline?(userIds: string[]): void; /** * 主播开启、停止推 CDN 状态通知 */ onCDNEnableChange?(enable: boolean): void; /** * RTC 每次 Ping 的结果 * @since version: 5.1.5 */ onPing?(result: RCRTCPingResult): void; /** * 主播和观众切换身份通知 */ onSwitchRole?(userId: string, role: RCRTCLiveRole): void; } /** * RTCClient 初始化配置 * @public */ interface IRCRTCInitOptions { /** * 自定义 MediaServer Url,公有云用户无需关注 * @description * 1. 仅当 `location.hostname` 为 `localhost` 时,`http` 协议地址有效,否则必须使用 `https` 协议地址 * 2. 当该值有效时,将不再从 IMLib 导航数据中获取 mediaServer 地址 */ mediaServer?: string; /** * 输出日志等级,生产环境默认使用 WARN,开发环境默认为 DEBUG * @description * * 4 - DEBUG * * 3 - INFO * * 2 - WARN * * 1 - ERROR */ logLevel?: LogL.ERROR | LogL.WARN | LogL.INFO | LogL.DEBUG; /** * (已废弃) * @deprecated 5.6.1 */ logStdout?: (logLevel: EnableLogL, content: string) => void; /** * 与 MediaServer 的 http 请求超时时间,单位为毫秒,默认值为 `5000`,有效值 `5000-30000`。 * 优先级:用户配置 > 导航配置 > 默认时间。 */ timeout?: number; /** * 房间 Ping 间隔时长,默认 `10000` ms,有效值 `3000`-`10000` */ pingGap?: number; /** * 目前该参数仅在 Chrome 浏览器 72 - 92 之间版本有效,其他浏览器或版本将优先尝试使用 `unified-plan`, * 在不支持 `unified-plan` 的情况下使用 `plan-b` 协议。 */ sdpSemantics?: ISdpSemantics; /** * 观众拉内置 CDN 资源的直播拉流协议,默认为 RCInnerCDNPullKind.FLV */ pullInnerCDNProtocol?: RCInnerCDNPullKind; /** * 观众拉内置 CDN 资源时是否使用 https,默认为 RCInnerCDNPullIsHttps.HTTPS */ pullInnerCDNUseHttps?: RCInnerCDNPullIsHttps; /** * 3A 模块资源路径配置 * @description 建议将资源下载到业务代码工程中,以静态资源形式与页面共同部署,以避免受同源策略或用户网络防火墙策略限制,导致资源获取失败。 * * wasmUrl 资源下载地址 `https://cdn.ronghub.com/plugin-rtc/wasm/5.0.0-alpha.2/AudioProcessing.wasm` * * scriptUrl 资源下载默认使用 `https://cdn.ronghub.com/plugin-rtc/wasm/5.0.0-alpha.2/process-worklet.js` */ AAAWorklet?: { wasmUrl: string; scriptUrl: string; }; /** * @deprecated */ audio?: any; /** * 加密机创建参数 */ encryptor?: IRCEncryptorHooks; } interface ICameraVideoProfile extends IVideoProfile { cameraId?: string; faceMode?: 'user' | 'environment'; } interface IMicphoneAudioProfile { /** * 指定采录的 AudioInputDevice */ micphoneId?: string; /** * 音频采样率 */ sampleRate?: number; /** * 噪声抑制开关,未配置时以浏览器默认行为为准 */ noiseSuppression?: boolean; /** * 回声消除开关,未配置时以浏览器默认行为为准 */ echoCancellation?: boolean; /** * 自动增益开关,未配置时以浏览器默认行为为准 */ autoGainControl?: boolean; } interface ICreateLocalTrackOptions { /** * 剔除音轨 */ withoutAudio?: boolean; /** * 剔除视轨 */ withoutVideo?: boolean; } /** * 音量上报监听器 */ interface IAudioLevelChangeHandler { (audioLevelReportList: { track: RCLocalAudioTrack | RCRemoteAudioTrack; audioLevel: number; }[]): void; } /** * 房间资源数据 */ declare type RoomData = { [userId: string]: IPublishedResource[]; }; /** * RCRTCMessageType.KICK content */ interface IRCRTCKickContent { users: { userId: string; type: RCKickReason; kickExtra?: any; }[]; } interface IPKInfo { [roomId: string]: { inviteSessionId: string; inviterRoomId: string; inviterUserId: string; inviterUserAutoMix?: boolean; inviteeRoomId: string; inviteeUserAutoMix?: boolean; }; } /** * 业务层发起连麦、响应连麦可选参数定义 */ interface IReqResPKOptions { autoMix?: boolean; extra?: string; } interface IPKInviterBaseInfo { /** * 邀请者房间 ID */ inviterRoomId: string; /** * 邀请者用户 ID */ inviterUserId: string; } interface IPKInviteeBaseInfo { /** * 被邀请者房间 ID */ inviteeRoomId: string; /** * 被邀请者用户 ID */ inviteeUserId: string; } /** * 业务层监听收到连麦邀请、取消连麦的字段 */ interface IPKInviteInfo extends IPKInviterBaseInfo { /** * 邀请额外信息 */ extra?: string; } /** * 业务层监听收到连麦应答的字段 */ interface IPKInviteAnswerInfo extends IPKInviterBaseInfo, IPKInviteeBaseInfo { /** * 是否同意邀请 */ agree: boolean; /** * 响应额外信息 */ extra?: string; } /** * 业务层监听收到连麦结束的字段 */ interface IPKEndInfo { /** * 发起结束的房间 ID */ endRoomId: string; /** * 发起结束的用户 ID */ endUserId: string; } /** * 观众加房间返回给客户的 CDN 信息 */ interface IJoinResCDNInfo { resolution?: RCResolution; fps?: RCFrameRate; CDNEnable?: boolean; } interface IPubSuccessRes { code: RCRTCCode; liveUrl?: string; failedTracks?: { code: RCRTCCode; tracks: RCLocalTrack[]; }[]; } interface IChrmKVPullData { kvEntries: IServerRTCRoomEntry[]; isFullUpdate?: boolean; syncTime?: number; } /** * 通知拉取到的房间数据 */ interface IPullRTCRoomStatus { /** * 是否是全量数据 */ bFullStatus: boolean; /** * 当前房间的最大版本号 */ version: number; /** * 如果是全量数据,usersData 不为空,给的是房间全部的人以及发布的资源 */ usersData: IPullRTCRoomUsersData[]; /** * 房间增量数据 */ roomStatus: IRoomStatus[]; } /** * 通知拉取到的房间增量数据 */ interface IRoomStatus { /** * 用户 id */ userId: string; /** * 本次变更的动作类型 */ event: PullRoomStatusEvent; /** * 本次变更的版本号 */ time: number; /** * 用户变更的资源,event 为人员加入或资源变动时有值 * key 包含 uris、cdn_uris、mcu_uris * value 为字符串数组 */ userData: { key: string; value: string; }[]; /** * 切换角色,0 代表非切换身份发生的加入、退出房间行为 */ switchRoleType: RCRTCLiveRole | 0; /** * 额外的信息 */ extra: string; } /** * 通知拉取到的房间全量数据 */ interface IPullRTCRoomUsersData { /** * 用户 id */ userId: string; /** * 房间内所有资源数据 * key 包含 uris、cdn_uris、mcu_uris * value 为字符串数组 */ userData: { key: string; value: string; }[]; } /** * 直播布局模式定义 */ declare enum MixLayoutMode { /** * 自定义布局 */ CUSTOMIZE = 1, /** * 悬浮布局(默认) */ SUSPENSION = 2, /** * 自适应布局 */ ADAPTATION = 3 } /** * 合流布局对视频的填充模式 */ declare enum MixVideoRenderMode { /** * 裁剪(默认) */ CROP = 1, /** * 不裁剪 */ WHOLE = 2 } declare enum RCInnerCDNModel { OPEN = 1, STOP = 2 } declare enum RCMixInputFilterMode { /** 全合流,后续加入房间的用户会自动合流 */ AUDIO_VIDEO_ALL = 0, /** 全不合流,后续加入本房间的用户 */ AUDIO_VIDEO_NO = 1, /** 音频全订阅, 视频全不订阅 */ AUDIO_ALL_VIDEO_NO = 2, /** 视频全订阅, 音频全不订阅 */ AUDIO_NO_VIDEO_ALL = 3, /** * 根据设置的音频合流列表和视频合流列表合并媒体流 */ AUDIO_VIDEO_INPUT = 4, /** 音频全订阅,视频根据设置的视频合流列表 */ AUDIO_ALL_VIDEO_INPUT = 5, /** 音频全不订阅, 视频根据input里面的视频项订阅 */ AUDIO_NO_VIDEO_INPUT = 6, /** 视频全订阅, 音频根据input里面的音频项订阅 */ AUDIO_INPUT_VIDEO_ALL = 7, /** 视频全不订阅, 音频根据input里面的音频项订阅 */ AUDIO_INPUT_VIDEO_NO = 8, /** 按房间列表订阅音视频(保留当前已经订阅的, 但没在房间列表里的音视频) */ ROOM_AUDIO_VIDEO_APPEND = 9, /** 按房间列表订阅音视频(清理当前已经订阅的, 但没在房间列表里的音视频) */ ROOM_AUDIO_VIDEO_NOT_APPEND = 10, /** 按房间列表订阅音频, 不订阅视频(保留当前已经订阅的, 但没在房间列表里的音频) */ ROOM_AUDIO_APPEND = 11, /** 按房间列表订阅音视, 不订阅视频(清理当前已经订阅的, 但没在房间列表里的音频) */ ROOM_AUDIO_NOT_APPEND = 12, /** 按房间列表订阅视频, 不订阅音频(保留当前已经订阅的, 但没在房间列表里的视频) */ ROOM_VIDEO_APPEND = 13, /** 按房间列表订阅视频, 不订阅音频(清理当前已经订阅的, 但没在房间列表里的视频) */ ROOM_VIDEO_NOT_APPEND = 14 } /** * 合流后的 video 输出编码配置,包含分辨率、帧率、码率配置项 */ interface IMCUOutputVideoAttrs { /** * 视频分辨率宽度 */ width?: number; /** * 视频分辨率高度 */ height?: number; /** * 帧率 */ fps?: number; /** * 码率 */ bitrate?: number; } /** * 合并入 MCU 的音频流 */ interface IMCUInputAudio { user_id: string; stream_id: string; } /** * 自定义布局中的单一视频流布局 */ interface IMCUInputVideoLayout { user_id: string; stream_id: string; x: number; y: number; width: number; height: number; } /** * 图片配置,用于水印、视频流背景图 */ interface IPictureAttrs { /** * 资源下载地址,需包含协议 */ uri: string; /** * 相对于整体画布的起始位置 x 坐标 */ x: number; /** * 相对于整体画布的起始位置 y 坐标 */ y: number; /** * 相对于整体画布的宽(百分比),有效值 `0.0` - `1.0` */ w: number; /** * 相对于整体画布的高(百分比),有效值 `0.0` - `1.0` */ h: number; } /** * 合流后的 Video 输出配置,包含背景图、背景色、大小流编码等配置项 */ interface IMCUOutputVideoConfig { /** * 标准流输出定义 */ normal?: IMCUOutputVideoAttrs; /** * 小流输出定义 */ tiny?: IMCUOutputVideoAttrs; exparams?: { /** * 合流布局时,对视频流的填充方式 */ renderMode: MixVideoRenderMode; }; /** * 背景色,如 `'0xf1a2c3'` */ backgroundColor?: string; /** * 背景图 */ backgroundPicture?: { /** * 填充模式: * 1. 按比例裁剪 * 2. 不裁剪,按比例压缩 */ fillMode: 1 | 2; /** * 资源列表 */ picture: IPictureAttrs[]; }; } /** * 合流后的媒体输出定义 */ interface IMCUOutputConfig { /** * 输出视频配置 */ video: IMCUOutputVideoConfig; /** * 输出音频配置 */ audio?: { /** * 音频码率 */ bitrate: number; }; /** * CDN 推流地址列表 */ cdn?: { /** * 推流地址,如:`'rtmp://xxxx'` */ pushurl: string; }[]; } /** * 合流前的单一视频流水印配置 *【客户端仅提供图片水印设置】 */ interface IMCUSignalScreenWaterMarkConfig { /** * 媒体流的 msid */ streamId: string; picture: IPictureAttrs[]; } interface IMCUWaterMarkConfig { enable: 'on' | 'off'; /** * 合流后的屏幕水印配置 *【客户端暂不提供合流水印设置】 */ /** * 合流前的单人视频流水印配置 */ singleScreen: IMCUSignalScreenWaterMarkConfig[]; } /** * 发布到服务器的 MCU 配置数据 */ interface IMCUConfig { /** * 为向后兼容,当前为常量 1 */ version: 2; /** * 布局模式,在只配置推流 CDN 时,该值不存在 */ mode: MixLayoutMode; /** * 渲染到主位置上的流 Id,当该值为空时,输出到主位置的流按发布时间顺序优先选择最早发布的流 */ host_stream_id?: string; /** * 自定义布局输入定义,只有在 mode 值为 `MixLayoutMode.CUSTOMIZE` 时需传值 */ input?: { video?: IMCUInputVideoLayout[]; audio?: IMCUInputAudio[]; }; /** * 合流后的媒体输出配置 */ output?: IMCUOutputConfig; /** * 水印配置 */ waterMark?: IMCUWaterMarkConfig; /** * MCU 拉流配置,决定 MCU 从 MediaServer 拉流的方式 */ inputFilterMode?: RCMixInputFilterMode; /** * MCU 混入列表中房间内的资源 */ mixRooms?: string[]; } /** * 设置开启、停用内置 CDN 数据 */ interface ISetEnableCDN { version: 2; output: { /** * 手动开启/停用内置 CDN */ inCDNModel: RCInnerCDNModel; }; } /** * 多端登录时,加入房间时的踢人策略 */ declare enum RTCJoinType { /** * 踢出已存在于房间的设备,以便于当前设备加入房间 */ KICK = 0, /** * 保持已存在于房间的设备,拒绝当前设备加入房间 */ REFUSE = 1 } declare enum RTCApiType { ROOM