@rongcloud/plugin-rtc
Version:
@rongcloud/plugin-rtc
2,510 lines (2,477 loc) • 144 kB
TypeScript
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