UNPKG

@rongcloud/plugin-wechat-rtc

Version:

@rongcloud/plugin-wechat-rtc

2,067 lines (2,037 loc) 56.6 kB
/* * RCRTC - v5.4.0 * CommitId - 103afdd6e3b3ddcb859f48414541cb0a54c45266 * Tue Jul 29 2025 14:45:21 GMT+0800 (China Standard Time) * ©2020 RongCloud, Inc. All rights reserved. */ import * as _rongcloud_engine from '@rongcloud/engine'; import { EventEmitter, ILogger, RTCMode as RTCMode$1, IRuntime, INaviInfo, BasicLogger, RTCPluginContext, Codec, IPromiseResult, ErrorCode, KVString, IAsyncRes, RCConnectionStatus, ConversationType, ISendMsgOptions, IReceivedMessage, RTCJoinType as RTCJoinType$1, LogLevel, EnableLogL, 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 保留段 */ declare enum RCRTCCode { /** 成功 */ SUCCESS = 10000, /** 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, /** 权限问题导致获取媒体流被拒绝 */ 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, /** 无效的媒体类型 */ INVALID_MEDIATYPE = 53028, /** 加入 RTC 房间 joinTYype 为 1 时,当前有其他端在房间时的应答码 */ SIGNAL_JOIN_RTC_ROOM_REFUSED = 53029 } /** * 媒体资源类型 */ declare enum RCMediaType { /** * 音频流 */ AUDIO_ONLY = 0, /** * 视频流 */ VIDEO_ONLY = 1, /** * 音视频混合流,只在 web 端存在混合流的情况 */ AUDIO_VIDEO = 2 } declare enum RCCommandKind { UNKNOWN = "UNKNOWN", ChangeEnableCommand = "ChangeEnableCommand", JoinRTCRoomCommand = "JoinRTCRoomCommand", RemoteUserCommand = "RemoteUserCommand", UnsubCommand = "UnsubCommand", PubCommand = "PubCommand", ReconnectCommand = "ReconnectCommand", UnpubCommand = "UnpubCommand", SubscribeCommand = "SubscribeCommand", RemoteResourceCommand = "RemoteResourceCommand", PullRTCRoomStatusCommand = "PullRTCRoomStatusCommand" } /** * 发布端推流、订阅端拉流的画面方向 */ declare enum ORIENTATION { /** * 竖直 */ VERTICAL = "vertical", /** * 水平 */ HORIZONTAL = "horizontal" } /** * 发布端推流画面的宽高比 */ declare enum ASPECT { /** * 3/4 */ THREEDIVIDEFOUR = 0.75, /** * 9/16 */ NINEDIVIDESIXTEEN = 0.5625 } /** * 发布端推流时本地预览画面是否镜像 */ declare enum LOCALMIRROR { /** * 前置摄像头镜像,后置摄像头不镜像 */ AUTO = "auto", /** * 前后置摄像头均镜像 */ ENABLE = "enable", /** * 前后置摄像头均不镜像 */ DISABLE = "disable" } /** * 发布端推流音频混响类型 */ declare enum AUDIOREVERBTYPE { /** * 关闭 */ CLOSE = 0, /** * KTV */ KTV = 1, /** * 小房间 */ LITTLEROOM = 2, /** * 大会堂 */ GREATHALL = 3, /** * 低沉 */ LOW = 4, /** * 洪亮 */ LOUD = 5, /** * 金属声 */ METALLIC = 6, /** * 磁性 */ MAGNETIC = 7 } /** * 发布端推流美颜类型 */ declare enum BEAUTYSTYLE { /** * 光滑 */ SMOOTH = "smooth", /** * 自然 */ NATURE = "nature" } /** * 发布端推流色彩滤镜 */ declare enum FILTER { /** * 标准 */ STANDARD = "standard", /** * 粉嫩 */ PINK = "pink", /** * 怀旧 */ NOSTALGIA = "nostalgia", /** * 蓝调 */ BLUES = "blues", /** * 浪漫 */ ROMANTIC = "romantic", /** * 清凉 */ COOL = "cool", /** * 清新 */ FRESHER = "fresher", /** * 日系 */ SOLOR = "solor", /** * 唯美 */ AESTHETICISM = "aestheticism", /** * 美白 */ WHITENING = "whitening", /** * 樱红 */ CERISERED = "cerisered" } /** * 发布端推流画面填充模式 */ declare enum OBJECTFIT { /** * 填充 */ CONTAIN = "contain", /** * 裁剪 */ FILLCROP = "fillCrop" } /** * 订阅端是否发送完整的 referrer */ declare enum REFERRERPOLICY { /** * 发送完成的 referrer */ ORIGIN = "origin", /** * 不发送 */ NOREFERRER = "no-referrer" } /** * 订阅资源,播放远端声音的输出方式 */ declare enum RCAudioOutputDevice { /** * 扬声器 */ SPEAKER = "speaker", /** * 听筒 */ EAR = "ear" } /** * 发布端推流的音量类型 */ declare enum RCAudioVolumeType { /** * 自动 */ AUTO = "auto", /** * 媒体音量 */ MEDIA = "media", /** * 通话音量 */ VOICECALL = "voicecall" } /** * 摄像头前置或后置 */ declare enum RCDevicePosition { /** * 前置 */ FRONT = "front", /** * 后置 */ BACK = "back" } declare enum RCKickReason { /** * Server 主动踢(掉 Server API 踢出) */ SERVER_KICK = 1, /** * 其他设备登陆后,本端被踢 */ OTHER_KICK = 2 } declare enum RCResourceState { /** * 资源可用 */ enable = 1, /** * 资源不可用 */ disable = 0 } interface IRemoteStreamEventListener { /** * stream 有音频的情况下,增加视频发布 */ onVideoPublish(): void; /** * stream 有视频的情况下,增加音频发布 */ onAudioPublish(): void; /** * 仅视频取消发布,音频未取消发布 */ onVideoUnpublish(): void; /** * 仅音频取消发布,视频未取消发布 */ onAudioUnpublish(): void; } declare class RCRemoteStream extends EventEmitter { private readonly _logger; private readonly _userId; private readonly _tag; private _mediaType; private _ownerDisableVideo; private _ownerMuteAudio; private _isSubscribed; private _listener; private _rtmpUrl?; constructor(_logger: ILogger, _userId: string, _tag: string, _mediaType: RCMediaType); /** * @deprecated(v5.2.0)该方法已废弃,请通过监听房间 `onAudioMuteChange` 与 `onVideoMuteChange` 事件替代 */ registerStreamEventListener(listener: IRemoteStreamEventListener): void; /** * 调整 stream 的 mediaType 值 * @param mediaType 媒体类型 * @private */ __innerSetMediaType(mediaType: RCMediaType): void; private _callListener; /** * 给 stream 赋值 rtmpUrl,设置拉流地址 * @param rtmpUrl 拉流地址 * @private */ __innerSetRtmpUrl(rtmpUrl: string): void; /** * 设置音频资源是否被发布者禁用 * @param enable 为 true 时,代表被禁用 * @returns boolean 是否发生变更 * @private */ __innerSetOwnerMuteAudio(status: boolean): boolean; /** * 设置视频资源是否被发布者禁用 * @param enable 为 true 时,代表被禁用 * @returns boolean 是否发生变更 * @private */ __innerSetOwnerDisableVideo(status: boolean): boolean; /** * @private */ __innerSetIsSubscribed(isSub: boolean): void; /** * 获取音频资源是否被发布者禁用 * @returns boolean */ isOwnerMuteAudio(): boolean; /** * 获取视频资源是否被发布者禁用 * @returns boolean */ isOwnerDisableVideo(): boolean; /** * stream 是否被订阅 * @returns boolean */ isSubscribed(): boolean; /** * stream 中是否有视频资源 * @returns boolean */ hasVideo(): boolean; /** * stream 中是否有音频资源 * @returns boolean */ hasAudio(): boolean; /** * 获取 stream 的拉流地址 * @returns 返回拉流地址 */ getRTMPUrl(): string | undefined; /** * 获取 stream 的资源名称 * @returns 返回资源名称 */ getTag(): string; /** * 获取 stream 的发布者 * @returns 资源发布者用户 Id */ getUserId(): string; /** * 获取 stream 的 Id,由“资源发布者的用户名_资源名”组成 * @returns 返回 stream Id */ getMsid(): string; /** * 获取 stream 里面的资源类型 * @returns 返回媒体类型 */ getMediaType(): RCMediaType; /** * 本端静音 */ mute(): void; /** * 本端取消静音 */ unmute(): void; /** * 该接口已废弃,请使用 `room.setAudioOutputDevice(mode)` 替代 * @param mode 包含扬声器或听筒 * @deprecated 仅 iOS 设备下有效;部分 Android 设备因小程序底层 live-pusher 实现存在 Bug,调用无效。 */ setAudioOutputDevice(mode: RCAudioOutputDevice): void; } /** * RTC api ----> live-pusher、live-player 属性变化或调用 api */ interface ICoreContextEventListener { /** * 设置 livePusher 的推流 url * @param url */ setPusherUrl?(url: string): void; /** * 显示推流组件 live-pusher */ showComponent?(): void; /** * 预览 */ startPreview?(): void; /** * 停止预览 */ stopPreview?(): void; /** * 打开摄像头 */ openCamera?(): void; /** * 关闭摄像头 */ closeCamera?(): void; /** * 切换前后置摄像头 */ switchCamera?(): void; /** * 打开麦克风 */ openMicphone?(): void; /** * 关闭麦克风 */ closeMicphone?(): void; /** * 设置 liveplayer 观看 src * @param src */ setPlayerSrc?(msId: string, src: string): void; /** * 使 liveplayer 静音 */ mute?(msId: string): void; /** * 取消 liveplayer 静音 */ unmute?(msId: string): void; /** * 指定 liveplayer 的声音输出设备 * @param mode 扬声器或听筒 */ setSoundMode?(mode: RCAudioOutputDevice): void; } /** * 小程序推流网络数据 */ interface ILivePusherNetStatus { /** * 当前视频编/码器输出的比特率,单位 kbps */ videoBitrate: number; /** * 当前音频编/码器输出的比特率,单位 kbps */ audioBitrate: number; /** * 当前视频帧率 */ videoFPS: number; /** * 当前视频 GOP,也就是每两个关键帧(I帧)间隔时长,单位 s */ videoGOP: number; /** * 当前的发送/接收速度 */ netSpeed: number; /** * 网络抖动情况,抖动越大,网络越不稳定 */ netJitter: number; /** * 网络质量:0:未定义 1:最好 2:好 3:一般 4:差 5:很差 6:不可用 */ netQualityLevel: number; /** * 视频画面的宽度 */ videoWidth: number; /** * 视频画面的高度 */ videoHeight: number; /** * 主播端堆积的视频帧数 */ videoCache: number; /** * 主播端堆积的音频帧数 */ audioCache: number; } /** * 小程序拉流网络数据 */ interface ILivePlayerNetStatus extends ILivePusherNetStatus { /** * 解码器中缓存的视频帧数 (Android 端硬解码时存在) */ vDecCacheSize: number; /** * 缓冲的总视频帧数,该数值越大,播放延迟越高 */ vSumCacheSize: number; /** * 音画同步错位时间(播放),单位 ms,此数值越小,音画同步越好 */ avPlayInterval: number; /** * 音画同步错位时间(网络),单位 ms,此数值越小,音画同步越好 */ avRecvInterval: number; /** * 音频缓冲时长阈值,缓冲超过该阈值后,播放器会开始调控延时 */ audioCacheThreshold: number; } /** * 小程序上下行网络数据 */ interface IResourceNetStatus { /** * 上行网络数据 */ sender?: ILivePusherNetStatus; /** * 下行网络数据 */ receiver?: { [msid: string]: ILivePlayerNetStatus; }; } /** * 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 代表这道流支持大小流 * @description 此参数存疑,MediaServer 似乎并未下发此字段,Web 端暂不启用 * @deprecated */ features?: ['simulcast'] | []; /** * 小程序发布的资源携带 rtmp 播放地址 */ rtmpUri?: string; } /** * 向房间内发布的媒体数据 */ interface IPublishedResource extends IResource { /** * 资源禁用/启用标识,用于向 signal 同步本端资源状态,1 为启用,0 为禁用 */ state: RCResourceState; /** * 资源标识,同标识的资源将视作同道流,标识不可重复 */ tag: string; } /** * 房间资源数据 */ type RoomData = { [userId: string]: IPublishedResource[]; }; /** * 房间资源、状态回调 */ interface IRoomEventListener { /** * 当本端被剔出房间时触发 * @description 被踢出房间可能是由于服务端超出一定时间未能收到 rtcPing 消息,所以认为己方离线。 * 另一种可能是己方 rtcPing 失败次数超出上限 * @param byServer 当值为 `false` 时,说明本端 rtcPing 超时;当值为 `true` 时,说明本端收到被踢出房间通知 */ onKickOff?(byServer: boolean, state?: RCKickReason): 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; /** * 房间用户禁用/启用音频 */ onAudioMuteChange?(stream: RCRemoteStream): void; /** * 房间用户禁用/启用视频 */ onVideoMuteChange?(stream: RCRemoteStream): void; /** * 房间内用户发布资源 */ onStreamPublish?(streams: RCRemoteStream[]): void; /** * 房间用户取消发布资源 */ onStreamUnpublish?(streams: RCRemoteStream[]): void; /** * 人员加入 * @param userIds 加入的人员 id 列表 */ onUserJoin?(userIds: string[]): void; /** * 人员退出 * @param userIds */ onUserLeave?(userIds: string[]): void; } /** * 订阅参数 */ interface ISubParams { /** * 订阅的远端流 */ stream: RCRemoteStream; /** * 是否订阅小流,默认订阅小流 */ subTiny?: boolean; } /** * 音视频模式 */ declare enum RTCMode { /** * 普通音视频模式 */ RTC = 0, /** * 直播模式 */ LIVE = 2, /** * 跨应用多人房间 */ CROSS_MUTI = 7, /** * SIP 呼叫 * @private */ SIP = 4, /** * 内部 Callplus 呼叫类型,请勿使用 * @private */ CALL = 5 } /** * 资源大小流标识枚举 */ declare enum RCStreamType { /** * 普通流(大流) */ NORMAL = 1, /** * 小流 */ TINY = 2 } /** * 和 mediaServer 交互时的 requestHeader */ interface IRTCReqHeader { /** * 开发者的 AppKey */ 'App-Key': string; /** * 用户 Id */ UserId: string; /** * RTC Token,放房间时 signal 返回 */ Token: string; /** * 房间 Id */ RoomId: string; /** * 普通音视频模式或直播模式,仅在直播模式下需要 */ RoomType?: RTCMode$1; } /** * exchange 请求的发布字段 */ interface IExchangePub { /** * 资源 msid,为 userId_tag */ msid: string; /** * 媒体类型,音频或视频 */ mediaType: RCMediaType; /** * 视频分辨率 */ resolution?: string; } /** * exchange 请求的订阅字段 */ interface IExchangeSub { /** * 资源 URI */ uri: string; /** * 资源大小流,为空时服务默认为小流 */ simulcast?: RCStreamType; } /** * 发布、订阅的请求体 */ interface IExchangeReqBody { /** * 本地发布的资源列表 */ rtmp: IExchangePub[]; /** * 要订阅的资源列表 */ subscribeList: IExchangeSub[]; } /** * 发布、订阅响应结构 */ interface IExchangeResponse { /** * 服务返回的状态码 */ resultCode: RCRTCCode; /** * mediaServer 返回的发布资源数据 */ publishList: { /** * 媒体类型 */ mediaType: RCMediaType.AUDIO_ONLY | RCMediaType.VIDEO_ONLY; /** * 资源 stream id,userId_tag */ msid: string; /** * mediaServer 流资源 uri * "{\"private_cluster_id\":\"rtc-media-ucbj2-pri.ronghub.com\",\"clusterId\":\"rtc-media-ucbj2.ronghub.com:80\",\"serverId\":\"10.100.100.35:40080\",\"resourceId\":\"11_RongCloudRTC_0\",\"connectionId\":\"AAY2NjM0NjMAAjExAAhtaW5pMDIzNAA=\",\"ssrc\":1200299529,\"serviceProvider\":\"ucloud\",\"userTimestamp\":1650597058583,\"isLiveStream\":false,\"liveType\":0}" */ uri: string; }[]; /** * 小程序服务返回的发布资源数据 * 小程序中发布资源,实际推入 rtmpPublishList - uri 内的 rtmp 地址 */ rtmpPublishList: { /** * 媒体类型 */ mediaType: RCMediaType.AUDIO_ONLY | RCMediaType.VIDEO_ONLY; /** * 资源 stream id,userId_tag */ msid: string; /** * 发布资源推流 rtmp 地址 * "rtmp://rtc-mini-rtmp-ucbj2.ronghub.com/wechat?token=mGWeZkdJmMgKQgdZuuIs5_Ht2l5OnK4nidcKke568y_rJOFy9-21Ym-2AiV_Ow55-48gdlojo23oQ2ZlbqGhuGL3sGUmgpTk_y1bANUV8Io/hxFsncMZo5IR3a5vvqciNQ" */ uri: string; }[]; /** * 小程序服务返回的订阅资源数据 * 小程序中订阅的资源,实际通过 rtmpSubscribeList - uri 内的 rtmp 地址拉流 */ rtmpSubscribeList: { /** * 媒体类型 */ mediaType: RCMediaType.AUDIO_ONLY | RCMediaType.VIDEO_ONLY; /** * 资源 stream id,userId_tag */ msid: string; /** * 订阅资源的拉流 rtmp 地址 * "rtmp://rtc-mini-rtmp-ucbj2.ronghub.com/wechat?token=mGWeZkdJmMgKQgdZuuIs5_Ht2l5OnK4nidcKke568y_rJOFy9-21Ym-2AiV_Ow55-48gdlojo23oQ2ZlbqGhuGL3sGUmgpTk_y1bANUV8Io/hxFsncMZo5IR3a5vvqciNQ" */ uri: string; }[]; } declare class IReadableStore { protected _appkey: string; protected _crtRoomId: string; protected _crtUserId: string; /** * 房间内资源数据,对象 key 为 userId,value 为本人发布的资源 */ protected _roomResource: RoomData; /** * 订阅成功的参数列表 */ protected _subscribeParams: ISubParams[]; /** * 房间是否被销毁状态 */ protected _roomIsDestroyed: boolean; /** * 所有远端 RCRemoteStream,包含订阅和未订阅的 RCRemoteStream * key 为 msId,value 为 RCRemoteStream */ protected _remoteStreams: { [msId: string]: RCRemoteStream; }; /** * 当前用户发布的参数 */ protected _publishParams: { tag: string; mediaType: RCMediaType; } | null; /** * 加房间返回的 token */ protected _crtRoomToken: string; /** * 当前会话 id */ protected _crtSeesionId: string; /** * 当前房间是否发布过视频 */ protected _isPubVideo: boolean; /** * 当前房间是否发布过音频 */ protected _isPubAudio: boolean; /** * 当前房间发布的资源类型 */ protected _pubMediaType: RCMediaType; /** * 当前房间是否打开摄像头 */ protected _isOpenCamera: boolean; /** * 当前房间是否打开麦克风 */ protected _isOpenMic: boolean; protected _roomStatusVersion: number; protected _supportNtf: boolean; constructor(_appkey: string, _crtRoomId: string, _crtUserId: string); /** * 获取房间内所有资源数据 * @returns */ getRoomResource(): RoomData; /** * 获取房间内某个人发布的资源数据 * @param userId 用户 Id * @returns */ getResourceByUserId(userId: string): IPublishedResource[]; /** * 根据 userId_tag_mediaType 获取对应的 uri 数据 * @param userId 用户 Id * @param tag 资源名称 * @param mediaType 资源类型,音频或视频 * @returns */ getUriByResourceId(userId: string, tag: string, mediaType: RCMediaType): string; /** * 获取发布资源的参数 * @returns */ getPublishParams(): { tag: string; mediaType: RCMediaType; } | null; /** * 获取订阅资源的参数 * @returns */ getSubscribedParams(): ISubParams[]; /** * 获取订阅的 RCRemoteStream * @returns */ getSubscribeStreams(): { [msId: string]: RCRemoteStream; }; /** * 获取所有远端 RCRemoteStream * @returns */ getRemoteStreams(): { [msId: string]: RCRemoteStream; }; getRemoteStream(msid: string): RCRemoteStream | undefined; getAllUserIds(): string[]; /** * 获取远端所有人员 * @returns */ getRemoteUserIds(crtUserId: string): string[]; /** * 获取某个用户发布的所有 RCRemoteStream * @param userId 用户 Id * @returns */ getRemoteStreamByUserId(userId: string): RCRemoteStream[]; /** * 获取房间 token */ getCrtRoomToken(): string; /** * 获取当前会话 id */ getCrtSessionId(): string; /** * 获取当前房间 roomId */ getRoomId(): string; get mode(): RTCMode; /** * 获取当前房间是否发布过视频 */ getIsPubVideo(): boolean; /** * 获取当前房间是否发布过音频 */ getIsPubAudio(): boolean; /** * 获取当前房间发布的资源类型 */ getPubMediaType(): RCMediaType; /** * 获取当前用户 Id */ getCrtUserId(): string; getHttpHeaders(): IRTCReqHeader; getRoomStatusVersion(): number; getSupportNtf(): boolean; } declare class Store extends IReadableStore { /** * 设置房间内的所有资源 * @param resource 房间内所有资源数据 */ setRoomResource(resource: RoomData): void; assignRoomData(data: RoomData): void; /** * 主动发布、取消发布、改变资源状态, * 或收到有人员加入时(房间内人员数据依赖 _roomResource 的key 值) * 设置这个人对应的资源数据 * @param userId 用户 Id * @param resource 用户资源数据 */ setResourcesByUserId(userId: string, resource: IPublishedResource[]): void; /** * 收到某个人退出房间,需删除房间内这个人的资源数据 * @param userId 用户 Id */ deleteResourceByUserId(userId: string): void; /** * 收到某个人的某条资源被取消发布或状态被变更时,更新他的某条资源数据 * @param userId 用户 Id * @param index 用户资源的索引 * @param resource 为 null 时,代表删除 */ updateResourceByUserId(userId: string, index: number, resource: IPublishedResource | null): void; /** * 发布、取消发布后设置发布参数 * @param tag 为空时代表被取消发布 * @param mediaType 资源类型 */ setPublishParams(tag?: string, mediaType?: RCMediaType): void; /** * 订阅完成后,设置已订阅参数 * @param subParams 已订阅参数 */ setSubscribeParams(subParams: ISubParams[]): void; addSubscribeParams(subParams: ISubParams[]): void; /** * 取消订阅后,删除取消订阅的参数 * @param unsubStreams 取消订阅的参数 */ deleteSubscribeParams(unsubStreams: RCRemoteStream[]): void; /** * 订阅资源,更新 stream 的 rtmpUrl 之后 * 或收到远端发布资源时,设置远端 stream * @param msId stream Id * @param stream */ setRemoteStream(msId: string, stream: RCRemoteStream): void; /** * 收到远端取消发布资源时,更新远端 stream * @param streams stream 列表 */ deleteRemoteStreams(streams: RCRemoteStream[]): void; /** * 收到有人离开房间时,删除这个人对应的远端 stream * @param userId 用户 Id */ deleteRemoteStreamByUserId(userId: string): void; /** * 设置房间 token */ setCrtRoomToken(roomToken: string): void; /** * 设置当前会话 id */ setCrtSessionId(sessionId: string): void; /** * 设置当前房间是否发布过视频 */ setIsPubVideo(isPubVideo: boolean): void; /** * 设置当前房间是否发布过音频 */ setIsPubAudio(isPubAudio: boolean): void; /** * 设置当前房间发布的资源类型 */ setPubMediaType(mediaType: RCMediaType): void; setRoomStatusVersion(version: number): void; } declare class RCMediaService { /** * 运行时环境 */ private readonly _runtime; private readonly _logger; /** * 小程序和 mediaServer 交互地址,只有一个数据中心 */ private readonly _msUrl; /** * 请求超时时间,默认为 5s */ private readonly _timeout; /** * 发送请求需要的 requestHeader */ private readonly _store; constructor( /** * 运行时环境 */ _runtime: IRuntime, _logger: ILogger, /** * 小程序和 mediaServer 交互地址,只有一个数据中心 */ _msUrl: string, /** * 请求超时时间,默认为 5s */ _timeout: number, /** * 发送请求需要的 requestHeader */ _store: IReadableStore); private _request; /** * 发布、订阅时和 mediaServer 交互,获取发布、订阅的 rtmp 地址 * @param body * @returns */ exchange(body: IExchangeReqBody): Promise<{ code: RCRTCCode; data?: IExchangeResponse | undefined; }>; /** * 退出房间,终止和 mediaServer 的交互 * @param headers * @returns */ exit(): Promise<{ code: RCRTCCode; data?: IExchangeResponse | undefined; }>; } /** * 多端登录时,加入房间时的踢人策略 */ declare enum RTCJoinType { /** * 踢出已存在于房间的设备,以便于当前设备加入房间 */ KICK = 0, /** * 保持已存在于房间的设备,拒绝当前设备加入房间 */ REFUSE = 1, /** * 两个设备共存,但发布的资源会相互覆盖,以最后发布的为准 */ COEXIST = 2 } declare enum RTCApiType { ROOM = 1, PERSON = 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"]; }; type RTCKeyMaps = typeof keymaps; /** * 通知拉取到的房间增量数据列表中每一项数据的动作 */ declare enum PullRoomStatusEvent { /** * 人员加入 */ JOIN = 0, /** * 人员离开 */ LEAVE = 1, /** * 人员离线 */ OFFLINE = 2, /** * 资源变动 */ RESOURCECHANGE = 3 } /** * 设置 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 IRTCNaviInfo extends INaviInfo { /** * jwt token */ jwt?: string; /** * http3 上报域名 */ logServer?: string; /** * 数据中心 */ dc?: string; /** * openGzip 开启标识,默认是false,开启使用true */ openGzip?: boolean; } /** * 通知拉取到的房间增量数据 */ interface IRoomStatus { /** * 用户 id */ userId: string; /** * 本次变更的动作类型 */ event: PullRoomStatusEvent; /** * 本次变更的版本号 */ time: number; /** * 用户变更的资源,event 为人员加入或资源变动时有值 * key 包含 uris、cdn_uris、mcu_uris * value 为字符串数组 */ userData: { key: string; value: string; }[]; /** * 切换角色,0 代表非切换身份发生的加入、退出房间行为 */ switchRoleType: 0; /** * 额外的信息 */ extra: string; } /** * 通知拉取到的房间全量数据 */ interface IPullRTCRoomUsersData { /** * 用户 id */ userId: string; /** * 房间内所有资源数据 * key 包含 uris、cdn_uris、mcu_uris * value 为字符串数组 */ userData: { key: string; value: string; }[]; } /** * 通知拉取到的房间数据 */ interface IPullRTCRoomStatus { /** * 是否是全量数据 */ bFullStatus: boolean; /** * 当前房间的最大版本号 */ version: number; /** * 如果是全量数据,usersData 不为空,给的是房间全部的人以及发布的资源 */ usersData: IPullRTCRoomUsersData[]; /** * 房间增量数据 */ roomStatus: IRoomStatus[]; } 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>; 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>; 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>; getRTCToken(roomId: string, mode: number, broadcastType?: number): IPromiseResult<IRtcTokenData>; setRTCState(roomId: string, report: string): Promise<ErrorCode>; getRTCUserList(roomId: string): IPromiseResult<IRTCUsers>; getRTCJoinedUserInfo(userId: string): Promise<IAsyncRes<IRTCJoinedInfo[]>>; /** * 通知拉取房间数据 * @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<{ 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; } /** * 命令执行上下文 */ declare class CommandExecuteContext extends EventEmitter { /** * 日志工具 */ readonly logger: ILogger; /** * IM 信令上下文 */ readonly context: RTCContext; /** * 运行时 */ readonly runtime: IRuntime; /** * 内存只读模块 */ readonly store: Store; /** * RTC Service 请求工具 */ readonly service: RCMediaService; constructor( /** * 日志工具 */ logger: ILogger, /** * IM 信令上下文 */ context: RTCContext, /** * 运行时 */ runtime: IRuntime, /** * 内存只读模块 */ store: Store, /** * RTC Service 请求工具 */ service: RCMediaService); } declare enum CommandPriority { LOW = 0, NORMAL = 1, HIGH = 2 } type ICommandResult<R = void> = { code: number; data?: R; }; /** * 命令基类 * @typeParams R - 返回值类型声明 * @typeParams T - 命令执行上下文类型 * @typeParams S - 内存数据缓存模块 */ declare abstract class BaseCommand<R = void, T = CommandExecuteContext, S = Store> { /** * 事务执行函数 * @param context - 事务执行上下文 * @param store - 内存读写模块 * @param invoker - 任务队列 */ abstract execute(context: T, store: S, invoker: BaseInvoker<T, S>): Promise<ICommandResult<R>>; /** * 获取指令优先级,必要时可 override 此函数 */ get priority(): CommandPriority; /** * 它返回命令的种类。 * @returns 命令的种类。 */ abstract get kind(): RCCommandKind; } /** * @typeParams T - 事务执行上下文类型 * @typeParams S - 内存读写模块类型 */ declare class BaseInvoker<T, S> { protected readonly _logger: ILogger; /** * 内存数据管理实例 */ protected readonly _context: T; /** * 内存读写模块 */ protected readonly _store: S; /** * 命令终止时返回的错误码定义 */ private abortCode; constructor(_logger: ILogger, /** * 内存数据管理实例 */ _context: T, /** * 内存读写模块 */ _store: S, /** * 命令终止时返回的错误码定义 */ abortCode: RCRTCCode); private _queue; private _busy; private _next; private _execute; push<R>(command: BaseCommand<R, T, S>): Promise<ICommandResult<R>>; private _isDestroyed; isDestroyed(): boolean; destroy(): void; } /** * 房间任务队列管理 */ declare class Invoker extends BaseInvoker<CommandExecuteContext, Store> { constructor(context: CommandExecuteContext, store: Store); get store(): IReadableStore; } declare class RCRTCRoom extends EventEmitter { protected readonly _context: RTCContext; protected readonly _logger: ILogger; private readonly _runtime; protected readonly _initOptions: IRCRTCInitOptions; protected readonly _roomId: string; private _isOpenCamera; private _isOpenMic; private _mediaServer; private _resourceListener; private _store; protected readonly _invoker: Invoker; protected _commandCtx: CommandExecuteContext; /** * 房间保活 rtcPing */ private readonly _pinger; constructor(_context: RTCContext, _logger: ILogger, _runtime: IRuntime, _initOptions: IRCRTCInitOptions, _roomId: string); /** * 拉取房间数据 * @param roomId 房间 id */ private _startPullRTCRoomStatus; private _handlePingResult; /** * @private */ __innerInitialize(joinType?: RTCJoinType$1): Promise<RCRTCCode>; protected _callAppListener(eventType: keyof IRoomEventListener, ...attrs: any[]): void; private _bindRoomEvent; private _operateDeviceByMediaType; private _onStreamPublish; private _onStreamUnpublish; private _onAudioMuteChange; private _onVideoMuteChange; private _onUserJoin; private _onUserLeave; private _kickOff; /** * @private */ __parseInnerMessage(message: IReceivedMessage): void; /** * 注册房间事件 * @param listener 房间人员、资源变动监听 */ registerRoomEventListener(listener: IRoomEventListener | null): void; /** * 业务层注册的上下行数据上报事件 */ private _reportListener; /** * 注册小程序网络状态和资源数据事件 * @param listener 小程序网络状态和资源数据监听 */ registerReportListener(listenerEvent: ((data: IResourceNetStatus) => void) | null): void; /** * 上报给业务层的上下行数据 */ private _netStatusData; /** * 接收推流组件上报的网络数据 * @param data 推流组件的网络数据 */ private _pusherNetStatusListener; /** * 接收拉流组件上报的网络数据 * @param msid 拉流组件 id,即 stream 的 msid * @param data 拉流组件的网络数据 */ private _playerNetStatusListener; /** * 注册本端麦克风采集的音量通知 */ onLocalAudioLevelChange(listenerEvent: ((volume: number) => void) | null): void; /** * 注册远端订阅资源的音量通知 */ onRemoteAudioLevelChange(listenerEvent: ((msid: string, volume: number) => void) | null): void; /** * 开启视频预览 */ startPreview(): void; /** * 关闭视频预览 */ stopPreview(): void; /** * 开启摄像头 * 未发布视频时,该方法仅打开摄像头硬件设备 * 发布过视频时,打开摄像头硬件设备后,修改视频资源状态为可用,订阅端可以看到发布的视频 */ openCamera(): Promise<{ code: RCRTCCode; }>; /** * 关闭摄像头 * 未发布视频时,该方法仅关闭摄像头硬件设备 * 发布过视频时,关闭摄像头硬件设备后,修改视频资源状态为不可用,订阅端看到发布的视频为黑屏 */ closeCamera(): Promise<{ code: RCRTCCode; }>; /** * 切换前后置摄像头 */ switchCamera(): void; /** * 开启麦克风 * 未发布音频时,该方法仅打开麦克风硬件设备 * 发布过视频时,打开麦克风硬件设备后,修改音频资源状态为可用,订阅端可以听到发布的声音 */ openMicphone(): Promise<{ code: RCRTCCode; }>; /** * 关闭麦克风 * 未发布音频时,该方法仅关闭麦克风硬件设备 * 发布过视频时,关闭麦克风硬件设备后,修改音频资源状态为不可用,订阅端听不到发布的声音 */ closeMicphone(): Promise<{ code: RCRTCCode; }>; /** * 发布资源 * @param tag 资源标识,可不传,默认为 RongCloudRTC * @param mediaType 资源类型,代表发布音频、视频或音视频,可不传,默认为 RCMediaType.AUDIO_VIDEO * @returns 发布资源状态码 */ publishStream(tag?: string, mediaType?: RCMediaType): Promise<{ code: RCRTCCode; }>; /** * 取消发布 * @returns 取消发布的状态码 */ unpublishStream(): Promise<{ code: RCRTCCode; }>; /** * 订阅资源 * @param subParams 订阅参数列表 * * ISubParams.stream 从房间数据或房间发布资源事件监听中拿到的 RCRemoteStream 对象 * * ISubParams.subTiny 是否订阅小流,可不传,默认为小流,boolean 类型,true 代表订阅小流 * @returns 订阅的状态码 */ subscribe(subParams: ISubParams[] | RCRemoteStream[]): Promise<{ code: RCRTCCode; }>; /** * 取消订阅 * @param streams 一组远端 stream 对象 * @returns 取消订阅的状态码 */ unsubscribe(streams: RCRemoteStream[]): Promise<{ code: RCRTCCode; }>; /** * 取消订阅时,需更新下行网络数据 * @param streams 取消订阅的资源列表 */ private _deleteReceiverNetStatus; private _deleteSerderNetStatus; /** * @private * im 重新连接之后的处理 */ __onReconnected(): void; /** * 离开房间 * @private */ __leaveHandle(quitRoom: boolean): Promise<void>; /** * 摄像头是否开启 */ isCameraOpen(): boolean; /** * 麦克风是否开启 */ isMicphoneOpen(): boolean; /** * 房间是否被销毁 */ isDestroyed(): boolean; /** * 获取房间 Id * @returns 返回房间 Id */ getRoomId(): string; getSessionId(): string; /** * 获取当前用户 * @returns 返回当前用户 Id */ getCrtUserId(): string; /** * 获取房间内其他人员 */ getRemoteUserIds(): string[]; /** * 获取远端发布的所有资源列表 streams */ getRemoteStreams(): RCRemoteStream[]; /** * 根据 userId 获取此用户在房间内发布的资源列表 * @param userId 远端用户 Id */ getRemoteStreamsByUserId(userId: string): RCRemoteStream[]; /** * 向房间内发消息 * @param name 消息名称 * @param content 消息内容 */ sendMessage(name: string, content: any): Promise<{ code: RCRTCCode; }>; /** * 设置房间属性 * @param key 属性名 * @param value 属性值 * @param message 是否在设置属性的时候携带消息内容,传空则不往房间中发送消息 * @param isInner RTC 业务内部使用参数,用户忽略 */ setRoomAttribute(key: string, value: string, message?: { name: string; content: any; }, isInner?: boolean): Promise<{ code: RCRTCCode; }>; /** * 删除房间属性 * @param keys 待删除的属性名数组 * @param message 是否在删除属性的时候携带消息内容,传空则不往房间中发送消息 * @param isInner RTC 业务内部使用参数,用户忽略 */ deleteRoomAttributes(keys: string[], message: { name: string; content: any; }, isInner?: boolean): Promise<{ code: RCRTCCode; }>; /** * 获取房间属性 * @param keys 要查询的属性名数组,当数组长度为空时,取所有已设置的 kv 值 * @param isInner RTC 业务内部使用参数,用户忽略 */ getRoomAttributes(keys?: string[], isInner?: boolean): Promise<{ code: RCRTCCode; data?: undefined; } | { code: RCRTCCode; data: _rongcloud_engine.KVString | undefined; }>; /** * 切换声音输出设备,房间内所有远端流的音频输出设备将被切换 * @param mode * @deprecated 仅 iOS 设备下有效;部分 Android 设备因小程序底层 live-pusher 实现存在 Bug,调用无效。 */ setAudioOutputDevice(mode: RCAudioOutputDevice): void; /** * 获取当前的声音输出设备配置 * @returns */ getAudioOutputDevice(): RCAudioOutputDevice; } /** * 加房间返回的 data 数据接口 */ interface IJoinRTCRoomResp { /** * 当前加入的房间实例 */ room: RCRTCRoom; /** * 房间内的其他人员用户 Id 列表 */ userIds: string[]; /** * 房间内其他人发布的所有资源 */ streams: RCRemoteStream[]; } interface IRCRTCInitOptions { /** * @deprecated */ logLevel?: LogLevel; /** * 输出日志等级,生产环境默认使用 WARN,开发环境默认为 DEBUG * @description * * 4 - DEBUG * * 3 - INFO * * 2 - WARN * * 1 - ERROR */ logOutputLevel?: EnableLogL; /** * @deprecated */ logStdout?: (level: LogLevel, content: string) => void; /** * 与 MediaServer 的 http 请求超时时间,单位为毫秒,默认值为 `5000`,有效值 `5000-30000`。 * 优先级:用户配置 > 导航配置 > 默认时间。 */ timeout?: number; /** * 房间 Ping 间隔时长,默认 `10000` ms,有效值 `3000`-`10000` */ pingGap?: number; /** * MediaServer 地址,私有云环境需指定 */ mediaServer?: string; } declare class RCRTCClient { private readonly _context; private readonly _logger; private readonly _runtime; private readonly _options; private _crtRoom; constructor(_context: RTCContext, _logger: ILogger, _runtime: IRuntime, _options: IRCRTCInitOptions); private _onIMStatusChange; private _onIMDisconnect; private _onIMUninit; private _handleMessage; /** * 加入 RTC 房间 * @param roomId 房间 Id * @param _ 参数已废弃 * @param joinType 加入房间时的多端处理方式: * - RTCJoinType.KICK:踢出其他端 * - RTCJoinType.REFUSE:拒绝当前端加入 * - RTCJoinType.COEXIST: 多端共存,但发布资源时,以最后发布端为准,资源会相互覆盖 */ joinRTCRoom(roomId: string, _: any, joinType?: RTCJoinType$1): Promise<{ code: RCRTCCode; data?: IJoinRTCRoomResp; }>; /** * 离开房间 * @param room 加入房间返回的房间实例 */ leaveRoom(room: RCRTCRoom): Promise<void>; } declare class Context<T> { private _listeners; addEventListener(listener: T): void; dispatch(eventType: keyof T, ...attrs: any[]): void; } /** * 负责 RTCLIb 数据到 rc-liveplayer 和 rc-livepusher 流向 */ declare class RCCoreContext extends Context<ICoreContextEventListener> { private _soundMode; setSoundMode(mode: RCAudioOutputDevice): void; getSoundMode(): RCAudioOutputDevice; } /** * 负责 rc-livepusher 事件数据到 RTCLib 的流向 */ declare class RCPusherContext extends EventEmitter { setNetStatusListener(listenerEvent: ((data: ILivePusherNetStatus) => void) | null): void; setLocalAudioLevelListener(listenerEvent: ((volume: number) => void) | null): void; } /** * 负责 rc-liveplayer 事件数据到 RTCLib 流向 */ declare class RCPlayerContext extends EventEmitter { setNetStatusListener(listenerEvent: ((id: string, data: ILivePlayerNetStatus) => void) | null): void; setRemoteAudioLevelListener(listenerEvent: ((id: string, volume: number) => void) | null): void; } declare const getCoreContext: () => RCCoreContext; declare const getPusherContext: () => RCPusherContext; declare const getPlayerContext: () => RCPlayerContext; declare global { var coreContext: RCCoreContext; var pusherContext: RCPusherContext; var playerContext: RCPlayerContext; } /** * RTC 插件生成器 * @public */ declare const installer: IPluginGenerator<RCRTCClient, IRCRTCInitOptions>; export { ASPECT, AUDIOREVERBTYPE, BEAUTYSTYLE, FILTER, IJoinRTCRoomResp, ILivePlayerNetStatus, ILivePusherNetStatus, IRCRTCInitOptions, IRemoteStreamEventListener, IResourceNetStatus, IRoomEventListener, ISubParams, LOCALMIRROR, OBJECTFIT, ORIENTATION, RCAudioOutputDevice, RCAudioVolumeType, RCDevicePosition, RCKickReason, RCMediaType, RCRTCClient, RCRTCCode, RCRTCRoom, RCRemoteStream, REFERRERPOLICY, getCoreContext as __innerGetCoreContext__, getPlayerContext as __innerGetPlayerContext__, getPusherContext as __innerGetPusherContext__, installer };