diff --git a/types/trtc-js-sdk/index.d.ts b/types/trtc-js-sdk/index.d.ts new file mode 100644 index 0000000000..03addc358a --- /dev/null +++ b/types/trtc-js-sdk/index.d.ts @@ -0,0 +1,760 @@ +// Type definitions for trtc-js-sdk 4.3 +// Project: https://github.com/tencentyun/TRTCSDK#readme +// Definitions by: yokots +// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped + +export as namespace TRTC; + +// utils types +export type Nullable = T | null; +export type Callback = (event: T) => void; +export type Omit = Pick>; + +/** 提供日志设置方法,包括设置日志输出等级、打开或关闭日志上传。 */ +export namespace Logger { + const LogLevel: LogLevel; + /** 日志输出等级 */ + interface LogLevel { + /** 输出所有日志 */ + TRACE: 0; + /** 输出 DEBUG、INFO、WARN、ERROR 等级日志 */ + DEBUG: 1; + /** 输出 INFO、WARN、ERROR 等级日志 */ + INFO: 2; + /** 输出 WARN、ERROR 等级日志 */ + WARN: 3; + /** 输出 ERROR 等级日志 */ + ERROR: 4; + /** + * 不输出任何日志 + * **注意: 关闭日之后我们将无法帮助您定位线上问题,建议至少保留 WARN 日志等级!** + */ + NONE: 5; + } + + /** + * 设置日志输出等级 + * @example + * ```javascript + * // 输出INFO以上日志等级 + * TRTC.Logger.setLogLevel(TRTC.Logger.LogLevel.INFO); + * ``` + */ + function setLogLevel(level: 0 | 1 | 2 | 3 | 4 | 5 | 6): void; + + /** 打开日志上传 */ + function enableUploadLog(): void; + + /** 关闭日志上传 */ + function disableUploadLog(): void; +} + +/** TRTC Web SDK 版本号 */ +export const VERSION: string; + +/** 检测浏览器是否兼容 TRTC Web SDK */ +export function checkSystemRequirements(): Promise; + +/** 检测浏览器是否支持屏幕分享 */ +export function isScreenShareSupported(): boolean; + +/** + * 返回媒体输入输出设备列表 + * + * 出于安全的考虑,在用户未授权摄像头或麦克风访问权限前,label 及 deviceId 字段可能都是空的。因此建议在用户授权访问后 再调用该接口获取设备详情,比如在 initialize() 后再调用此接口获取设备详情。 + */ +export function getDevices(): Promise; + +/** 返回摄像头设备列表 */ +export function getCameras(): Promise; + +/** 返回麦克风设备列表 */ +export function getMicrophones(): Promise; + +/** 返回扬声器设备列表 */ +export function getSpeakers(): Promise; + +/** + * 创建一个实时音视频通话的客户端对象,在每次会话中仅需要调用一次。 + * + * 通常一个客户端对象跟一个用户 ID(userId) 绑定,同一个页面中可以有多个不同的客户端对象, 每个客户端对象跟不同的用户ID绑定,比如,你可以使用一个客户端对象负责推送本地音视频流和接收 远端流,同时使用另外一个客户端对象负责推送屏幕分享流,但是不接收远端流。 + */ +export function createClient(config: ClientConfig): Client; + +/** + * 创建一个本地流 Stream 对象,本地流 Stream 对象通过 `publish()` 方法发布本地音视频流。 + * + * **注意:** *一个音视频流 Stream 中最多只能包含一个音频 track 和一个视频*track。 + * + * 本地音视频流可以: + * - 从摄像头和麦克风采集获得,适用于一般的音视频通话。 + * - 从屏幕分享源采集获得,适用于进行屏幕分享。 + * - 从开发者通过 audioSource/videoSource 指定的 MediaStreamTrack 获得, 使用这种方式业务层可先对音视频进行前处理,比如,对音频进行混音,或者对视频进行美颜处理,亦或者通过这种方式向远端用户推送一个正在播放的音视频文件。 + * + * @example + * ```javascript + * // 从麦克风和摄像头采集本地音视频流 + * const localStream = TRTC.createStream({ audio: true, video: true }); + * localStream.initialize().catch(error => { + * console.error('failed initialize localStream ' + error); + * }).then(() => { + * console.log('initialize localStream success'); + * // 本地流初始化成功,可通过Client.publish(localStream)发布本地音视频流 + * }); + * ``` + * + * @example + * ```javascript + * // 从屏幕分享源采集,仅采集屏幕分享视频流 + * const localStream = TRTC.createStream({ audio: false, screen: true }); + * + * // 采集麦克风及屏幕分享视频流 + * // const localStream = TRTC.createStream({ audio: true, screen: true }); + * + * localStream.initialize().catch(error => { + * console.error('failed initialize localStream ' + error); + * }).then(() => { + * console.log('initialize localStream success'); + * // 本地流初始化成功,可通过Client.publish(localStream)发布本地音视频流 + * }); + * ``` + * @example + * ```javascript + * // 从外部App指定的音视频源创建本地音视频流 + * navigator.mediaDevices.getUserMedia({ audio: true, video: true }).then(stream => { + * const audioTrack = stream.getAudioTracks()[0]; + * const videoTrack = stream.getVideoTracks()[0]; + * + * // 对audioTrack和videoTrack处理之后, + * + * const localStream = TRTC.createStream({ audioSource: audioTrack, videoSource: videoTrack }); + * localStream.initialize().catch(error => { + * console.error('failed initialize localStream ' + error); + * }).then(() => { + * console.log('initialize localStream success'); + * // 本地流初始化成功,可通过Client.publish(localStream)发布本地音视频流 + * }); + * }); + * ``` + */ +export function createStream(config: StreamConfig): LocalStream; + +export interface RtcError extends Error { + /** 获取错误码, 详细错误码列表参见 [ErrorCode](https://trtc-1252463788.file.myqcloud.com/web/docs/module-ErrorCode.html) */ + getCode(): string; +} + +/** 音视频通话客户端对象 */ +export interface Client { + /** + * 设置代理服务器。该方法适用于企业自己部署代理服务器,如 ngnix+coturn 方案。 + * + * **注意** 该方法需要在 join() 之前调用。 + */ + setProxyServer(url: string): void; + + /** + * 设置 TURN 服务器,该方法配合 setProxyServer() 使用,适用于企业自己部署代理服务器和 TURN 中转。 + * + * **注意** 该方法需要在 join() 之前调用。 + */ + setTurnServer(config: TurnServerConfig): void; + + /** + * 加入一个音视频通话房间。 + * + * 进房代表开始一个音视频通话会话,这时候 SDK 会监听远端用户进房退房情况,若有远端用户进房并且发布流,本地会收到 'stream-added' 事件。 + * + * 进房后用户可以通过 publish() 发布本地流,本地流发布成功后远端用户就会收到相应 'stream-added' 事件通知从而完成一个双向的音视频通话连接。 + */ + join(options: JoinOptions): Promise; + + /** 退出当前音视频通话房间,结束一次音视频通话会话。 */ + leave(): Promise; + + /** + * 发布本地音视频流。 + * - 该方法需要在 join() 进房后调用,一次音视频会话中只能发布一个本地流。若想发布另外一个本地流,可先通过 unpublish() 取消发布当前本地流后再发布新的本地流。 + * - 在发布本地流后,可通过 removeTrack()、addTrack()、 replaceTrack() 来更新本地流中的某个音频或视频流。 + * - 发布本地流后远端会收到 ‘stream-added’ 事件通知。 + */ + publish(stream: LocalStream): Promise; + + /** 取消发布本地流。 取消发布本地流后远端会收到 'stream-removed' 事件通知。 */ + unpublish(stream: LocalStream): Promise; + + /** + * 订阅远端流 + * @param stream 远端流,通过监听 'stream-added' 事件获得。 + * + * @example + * ```javascript + * // 监听远端流订阅成功事件 + * client.on('stream-subscribed', event => { + * const remoteStream = event.stream; + * // 远端流订阅成功,播放远端音视频流 + * remoteStream.play('remote_stream'); + * }); + * // 监听远端流增加事件 + * client.on('stream-added', event => { + * const remoteStream = event.stream; + * // 订阅远端音频和视频流 + * client.subscribe(remoteStream, { audio: true, video: true }); + * + * // 仅订阅音频数据 + * // client.subscribe(remoteStream, { audio: true, video: false }); + * }); + * ``` + */ + subscribe(stream: RemoteStream, options?: { audio?: boolean; video?: boolean }): void; + + /** + * 取消订阅远端流 + * @param stream 远端流,通过监听 'stream-added' 事件获得。 + */ + unsubscribe(stream: RemoteStream): void; + + /** 切换用户角色 */ + switchRole(role: Role): Promise; + + /** 监听客户端对象事件 */ + on(event: K, handler: Callback): void; + + /** 取消事件绑定 */ + off(event: K, handler: Callback): void; + + /** 取消所有事件绑定 */ + off(event: '*'): void; + + /** 获取当前房间内远端用户音视频 mute 状态列表。 */ + getRemoteMutedState(): RemoteMutedState[]; + + /** + * 设置是否默认接收远端流。该方法可在 join() 调用前使用,若在进房后调用,会接收不到后续进房的远端用户音视频流。 + * @param muted 是否默认不接收远端流: true true 默认不接收任何远端流。false 默认接收所有远端流。(默认) + */ + setDefaultMuteRemoteStreams(muted: boolean): void; + + /** 获取当前网络传输状况统计数据, 该方法需要在 `publish()` 后调用 */ + getTransportStats(): Promise; + + /** 获取当前已发布本地流的音频统计数据 */ + getLocalAudioStats(): Promise; + + /** 获取当前已发布本地流的视频统计数据 */ + getLocalVideoStats(): Promise; + + /** 获取当前所有远端流的音频统计数据 */ + getRemoteAudioStats(): Promise; + + /** 获取当前所有远端流的视频统计数据 */ + getRemoteVideoStats(): Promise; +} + +/** 客户端配置项 */ +export interface ClientConfig { + /** 应用的 sdkAppId */ + sdkAppId: number; + /** 用户ID */ + userId: string; + /** 用户签名 */ + userSig: string; + /** + * 应用场景,目前支持以下两种场景: + * - `videoCall` 实时通话模式 + * - `live` 互动直播模式 + */ + mode: 'videoCall' | 'live'; + /** 绑定腾讯云直播 CDN 流 ID,设置之后,您就可以在腾讯云直播 CDN 上通过标准直播方案(FLV|HLS)播放该用户的音视频流。 */ + streamId?: string; + /** 设置云端录制完成后的回调消息中的 "userdefinerecordid" 字段内容,便于您更方便的识别录制回调。 */ + userDefineRecordId?: string; + /** 自动录制时业务自定义ID(32位整型),将在录制完成后通过直播录制回调接口通知业务方 */ + recordId?: number; + /** + * 纯音频推流模式,需要旁路直播和录制时需要带上此参数: + * - 1 表示本次是纯音频推流,不需要录制 MP3 文件 + * - 2 表示本次是纯音频推流,录制文件为 MP3 + */ + pureAudioPushMode?: 1 | 2; +} + +/** 客户端事件 */ +export interface ClientEventMap { + /** 远端流添加事件,当远端用户发布流后会收到该通知。 */ + 'stream-added': RemoteStreamInfo; + /** 远端流移除事件,当远端用户取消发布流后会收到该通知。 */ + 'stream-removed': RemoteStreamInfo; + /** 远端流更新事件,当远端用户添加、移除或更换音视频轨道后会收到该通知。 */ + 'stream-updated': RemoteStreamInfo; + /** 远端流订阅成功事件,调用 subscribe() 成功后会触发该事件。 */ + 'stream-subscribed': RemoteStreamInfo; + /** 信令通道连接状态变化事件 */ + 'connection-state-changed': { + prevState: ConnectionState; + curState: ConnectionState; + }; + /** 远端用户进房通知,只有主动推流的远端用户进房才会收到该通知。 */ + 'peer-join': RemoteUserInfo; + /** 远端用户退房通知,只有主动推流的远端用户退房才会收到该通知。 */ + 'peer-leave': RemoteUserInfo; + /** 远端用户禁用音频通知。 */ + 'mute-audio': RemoteUserInfo; + /** 远端用户禁用视频通知。 */ + 'mute-video': RemoteUserInfo; + /** 远端用户启用音频通知。 */ + 'unmute-audio': RemoteUserInfo; + /** 远端用户启用视频通知。 */ + 'unmute-video': RemoteUserInfo; + /** 用户被踢出房间通知,被踢原因有 */ + 'client-banned': RtcError; + /** 客户端错误事件 */ + error: RtcError; +} + +/** + * Stream 音视频流,一个 Stream 中最多只能同时包含一个音频 track 和一个视频 track。 + * + * Stream 类是本地流 LocalStream 和远端流 RemoteStream 的基类,它包含本地流和远端流通用的方法。 + */ +export interface Stream { + /** + * 播放该音视频流 + * @param elementId HTML
标签ID,该方法内部自动创建的音视频标签将被添加到该容器中。 + * @param options 播放选项 + */ + play(elementId: HTMLDivElement['id'] | HTMLDivElement, options?: PlayOptions): Promise; + + /** 停止播放音视频流,该方法还会将由 `play()` 创建的音视频标签从 HTML 页面中删除。 */ + stop(): void; + + /** + * 恢复播放音视频 + * **注意** 在某些版本浏览器上移动传入 `play()` 的 div 容器可能会导致音视频播放器进入 `PAUSED` 状态,此时 需要调用该接口继续进行播放。 + * @example + * ```javascript + * stream.on('player-state-changed', event => { + * if (event.state === 'PAUSED') { + * // resume audio/video playback + * stream.resume(); + * } + * }); + * ``` + */ + resume(): void; + + /** 关闭音视频流,对于本地流,该方法会关闭摄像头并释放摄像头和麦克风访问权限。 */ + close(): void; + + /** + * 禁用音频轨道 + * - 对于本地流,调用该方法会停止发送音频,远端会触发 `Client.on('mute-audio')` 事件。 + * - 对于远端流,调用该方法会停止播放音频,但是仍然接收音频数据。 + * @returns `true` 禁用音频轨道成功; `false` 禁用音频轨道失败,因为没有音频轨道。 + */ + muteAudio(): boolean; + + /** + * 禁用视频轨道 + * - 对于本地流,调用该方法会停止发送视频,远端会触发 `Client.on('mute-video')` 事件。如果视频是从摄像头采集,此时摄像头灯仍然是亮着的。若想完全禁用视频轨道(即关闭摄像头),可以使用 `removeTrack()` 删除视频轨道然后调用 `MediaStreamTrack.stop()` 关闭视频轨道(关闭摄像头)。 + * - 对于远端流,调用该方法会停止播放视频,但是仍然接收视频数据 + * @returns `true` 禁用视频轨道成功; `false` 禁用视频轨道失败,因为没有视频轨道。 + */ + muteVideo(): boolean; + + /** + * 启用音频轨道 + * - 对于本地流,调用该方法会触发远端 `Client.on('unmute-audio')` 事件。 + * - 音频轨道默认是开启的,若你调用 `muteAudio()` 后可用该方法重新启用音频。 + * @returns `true` 启用音频轨道成功; `false` 启用音频轨道失败,因为没有音频轨道。 + */ + unmuteAudio(): boolean; + + /** + * 启用视频轨道 + * - 对于本地流,调用该方法会触发远端 `Client.on('unmute-video')` 事件。 + * - 视频轨道默认是开启的,若你调用 `muteVideo()` 后可用该方法重新启用视频。 + * @returns `true` 启用视频轨道成功; `false` 启用视频轨道失败,因为没有视频轨道。 + */ + unmuteVideo(): boolean; + + /** 获取 Stream 唯一标识ID */ + getId(): string; + + /** 获取该流所属的用户ID */ + getUserId(): string; + + /** + * 设置声音输出设备 + * @param deviceId 设备标识,通过 `getSpeakers()` 获取 + */ + setAudioOutput(deviceId: string): Promise; + + /** + * 设置音量大小,主要用于调节远端流的音量大小。 + * @param volume 音量大小,取值在 `0.0 (静音) 到 1.0 (最大音量)` 之间。 + */ + setAudioVolume(volume: number): void; + + /** + * 获取当前音量大小,只有当本地流或远端流中有音频数据才有效。 + * @returns 音量大小,返回值在`(0.0, 1.0)`之间,通常认为值大于`0.1`为用户正在说话。 + */ + getAudioLevel(): number; + + /** 是否包含音频轨道 */ + hasAudio(): boolean; + + /** 是否包含视频轨道 */ + hasVideo(): boolean; + + /** 获取音频轨道 */ + getAudioTrack(): Nullable; + + /** 获取视频轨道 */ + getVideoTrack(): Nullable; + + /** + * 获取当前视频帧 + * **注意** 该方法需要在 play() 后调用,并且 Stream 中有视频流才有效 + * @example + * ```javascript + * // 截取当前视频帧 + * const frame = stream.getVideoFrame(); + * if (frame) { + * const img = document.createElement('img'); + * img.src = frame; + * } + * ``` + */ + getVideoFrame(): Nullable; + + /** 监听Stream事件 */ + on(event: K, handler: Callback): void; +} + +export interface LocalStream extends Stream { + /** 初始化本地音视频流对象, 初始化失败的错误信息请参考 [getUserMedia异常](https://developer.mozilla.org/zh-CN/docs/Web/API/MediaDevices/getUserMedia#%E8%AF%AD%E6%B3%95)。 */ + initialize(): Promise; + + /** + * 设置音频 Profile,该方法需要在调用 `initialize()` 之前调用。 + * @param profile 音频 Profile, 默认 `standard` + * - `standard` 采样率:48000,声道:单声道,码率:40kbps + * - `high` 采样率:48000,声道:单声道,码率:128kbps + */ + setAudioProfile(profile: 'standard' | 'high'): void; + + /** + * 设置视频 Profile,该方法需要在调用 `initialize()` 之前调用。 + * @example + * ```javascript + * // 使用预定义Profile设置 + * localStream.setVideoProfile('480p'); + * localStream.initialize().then(() => { + * // local stream was initialized successfully. + * }); + * + * // 使用自定义视频Profile设置 + * localStream.setVideoProfile({ + * width: 360, // 视频宽度 + * height: 360, // 视频高度 + * frameRate: 10, // 帧率 + * bitrate: 400 // 比特率 kbps + * }); + * localStream.initialize().then(() => { + * // local stream was initialized successfully. + * }); + * ``` + */ + setVideoProfile(profile: VideoProfileString | Profile): void; + + /** 设置屏幕分享 Profile,该方法需要在调用 `initialize()` 之前调用。 */ + setScreenProfile(profile: ScreenProfileString | Profile): void; + + /** + * 设置视频内容提示,主要用于提升在不同场景下的视频编码质量。该方法需要在调用 `initialize()` 成功之后调用。 + * @param hint 内容提示,参考 [MediaStreamTrack.contentHint](https://www.w3.org/TR/mst-content-hint/) + * - `motion`:本地流视频内容为从摄像头采集的内容、电影或者视频游戏等。 + * - `detail`:本地视频内容为 ppt、带有文本内容、绘画或艺术线条的网页。一般屏幕分享默认使用这个提示。 + * - `text`:本地视频内容主要是含有文本的 ppt 或网页等。 + */ + setVideoContentHint(hint: 'motion' | 'detail' | 'text'): void; + + /** + * 切换本地流的媒体输入设备,该方法仅适用于从摄像头和麦克风采集音视频的本地流。 + * + * 若该本地流已经被发布,该方法会自动更新发往远端的音视频流,此时,远端会收到 `Client.on('stream-updated')` 事件通知。 + * @param type 媒体类型 + * - `audio` 音频 + * - `video` 视频 + * @param deviceId 设备标识 + * - 摄像头设备标识通过 getCameras() 获取。在移动设备上,可以通过设置 deviceId 为 'user' 和 'environment' 来切换前置和后置摄像头。 + * - 麦克风设备标识通过 getMicrophones() 获取。 + */ + switchDevice(type: 'audio' | 'video', deviceId: string): Promise; + + /** + * 添加音频或视频轨道 + * + * 调用该方法将音频或视频轨道添加到本地流,若该本地流已经被发布,则会自动更新发往远端的音视频流,此时远端会收到 `Client.on('stream-updated')` 事件通知。 + * + * 新的音视频轨道可以通过 `createStream()` | `getAudioTrack()` | `getVideoTrack()` 获取, + * 或者直接通过 [getUserMedia()](https://developer.mozilla.org/zh-CN/docs/Web/API/MediaDevices/getUserMedia)、 + * [captureStream()](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/captureStream) 获取。 + * + * **注意** + * - 一个 Stream 对象中最多只能同时包含一路音频轨道和一路视频轨道。如果你想要更换同类型的轨道,请使用 `replaceTrack()`。 + * - 在增加视频轨道时,要求视频分辨率跟 `setVideoProfile()` 设置保持一致,否则会抛出异常。 + * + * @example + * ```javascript + * const localStream = TRTC.createStream({ userId, audio: true, video: false }); + * localStream.initialize().then(() => { + * // 分布本地流(只有从麦克风采集的音频流) + * client.publish(localStream); + * }); + * + * // ... + * + * // 开启视频通话 + * const videoStream = TRTC.createStream({ userId, audio: false, video: true }); + * videoStream.initialize().then(() => { + * const videoTrack = videoStream.getVideoTrack(); + * // 将从摄像头采集的视频轨道插入当前已发布的本地流对象LocalStream + * localStream.addTrack(videoTrack).then(() => { + * // 视频通话开启成功,远端流将会收到‘stream-updated’通知 + * }); + * }); + * ``` + */ + addTrack(track: MediaStreamTrack): Promise; + + /** + * 移除视频轨道 + * + * 调用该方法会移除本地流中的视频轨道,若本地流已经被发布,则会自动更新发往远端的视频流,此时远端会收到 `Client.on('stream-updated')` 事件通知。 + * + * **注意** + * - 一个已经发布的Stream对象中至少要有一个媒体轨道,如果你想完全删除本地流中的音视频轨道,请直接通过 `unpublish()` 取消发布, 然后再通过 `close()` 关闭本地流。 + * - 目前尚不支持移除音频轨道,若想禁用音频,可通过调用 `muteAudio()` 实现。 + * + * @example + * ```javascript + * // 关闭视频通话示例,对应addTrack接口的开启视频通话示例 + * const videoTrack = localStream.getVideoTrack(); + * if (videoTrack) { + * localStream.removeTrack(videoTrack).then(() => { + * // 关闭视频通话成功,停止videoTrack并释放摄像头资源 + * videoTrack.stop(); + * }); + * } + * ``` + */ + removeTrack(track: MediaStreamTrack): Promise; + + /** + * 更换音频或视频轨道 + * + * 调用该方法更换本地流中的同类型轨道,若本地流已经被发布,该方法会自动更新发往远端的音视频流,此时远端会收到 `Client.on('stream-updated')` 事件通知。 + * + * 新的音视频轨道可以通过 `createStream()` | `getAudioTrack()` | `getVideoTrack()` 获取, + * 或者直接通过 [getUserMedia()](https://developer.mozilla.org/zh-CN/docs/Web/API/MediaDevices/getUserMedia)、 + * [captureStream()](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/captureStream) 获取。 + * + * **注意** + * - 如果需要更换媒体输入设备,推荐使用 `switchDevice()`。 + * - 在更换视频轨道时,要求视频分辨率跟 `setVideoProfile()` 设置保持一致,否则会抛出异常。 + * - 支持 Chrome 65+、Safari 浏览器。 + */ + replaceTrack(track: MediaStreamTrack): Promise; +} + +export interface RemoteStream extends Stream { + /** + * 获取远端流类型,主要用于判断一个远端流是主音视频流还是辅路视频流,辅路视频流通常是一个屏幕分享流。 + * @returns 远端流类型 + * - `main` 主音视频流 + * - `auxiliary` 辅助视频流,通常是一个屏幕分享流 + */ + getType(): 'main' | 'auxiliary'; +} + +export interface StreamConfig { + /** 是否从麦克风采集音频 */ + audio: boolean; + /** 是否从摄像头采集视频 */ + video: boolean; + /** 音频源 */ + audioSource?: MediaStreamTrack; + /** 视频源 */ + videoSource?: MediaStreamTrack; + /** 麦克风设备 deviceId,通过 getMicrophones() 获取 */ + microphoneId?: string; + /** 摄像头设备 deviceId,通过 getCameras() 获取 */ + cameraId?: string; + /** + * 在移动设备上,可通过该参数选择使用前置或后置摄像头: + * - `user`:前置摄像头 + * - `environment`:后置摄像头 + * + * **注意** 请勿同时使用 cameraId 和 facingMode 参数。 + */ + facingMode?: 'user' | 'environment'; + /** 是否采集屏幕分享流 */ + screen?: boolean; + /** 视频显示是否为镜像,默认为 true。建议在使用前置摄像头时开启,使用后置摄像头时关闭。镜像设置不适用于屏幕分享。 */ + mirror?: boolean; +} + +export interface StreamEventMap { + /** Audio/Video Player 状态变化事件 App 可根据状态变化来更新 UI,比如,通过监听 video player 状态变化来关闭或打开遮板。 */ + 'player-state-changed': { + type: string; + state: 'PLAYING' | 'PAUSED' | 'STOPPED'; + }; + /** 本地屏幕分享停止事件通知,仅对本地屏幕分享流有效。 */ + 'screen-sharing-stopped': undefined; +} + +export interface TurnServerConfig extends Omit { + /** TURN 服务器 url */ + url: string; +} + +/** + * 用户角色,仅在 `live` 模式下有意义,目前支持两种角色: + * - `anchor` 主播 + * - `audience` 观众 + * + * **注意** 互动直播 live 模式下的观众角色没有发布本地流的权限,只有收看远端流的权限。如果观众想要连麦跟主播互动, 请先通过 switchRole() 切换角色到主播 anchor 后再发布本地流。 + */ +export type Role = 'anchor' | 'audience'; + +export interface JoinOptions { + /** 房间号 */ + roomId: number; + /** 用户角色 */ + role?: Role; + /** + * @deprecated 进房钥匙,若需要权限控制请携带该参数,因某些局限性目前已不建议使用该参数。 + */ + privateMapKey?: string; +} + +export interface RemoteMutedState { + /** 远端用户ID */ + userId: string; + /** 是否有视频 */ + hasAudio: boolean; + /** 是否有音频 */ + hasVideo: boolean; + /** 是否静音 */ + audioMuted: boolean; + /** 是否关闭摄像头 */ + videoMuted: boolean; +} + +export interface TransportStats { + /** SDK 到腾讯视频云的 RTT (Round-Trip Time),单位 ms */ + rtt: number; +} + +export interface VideoStats { + /** 视频宽度 */ + framesWidth: number; + /** 视频高度 */ + framesHeight: number; +} + +export interface SentMediaStats { + /** 已发送字节数 */ + bytesSent: number; + /** 已发送包数 */ + packetsSent: number; +} + +/** 本地流音频统计数据 */ +export type LocalAudioStats = SentMediaStats; + +/** 本地流视频统计数据 */ +export interface LocalVideoStats extends SentMediaStats, VideoStats { + /** 已编码帧数 */ + framesEncoded: number; + /** 已发送帧数 */ + framesSent: number; +} + +export interface ReceivedMediaStats { + /** 已接收字节数 */ + bytesReceived: number; + /** 已接收包数 */ + packetsReceived: number; + /** 丢包数 */ + packetsLost: number; +} + +/** 远端流音频统计数据 */ +export type RemoteAudioStats = ReceivedMediaStats; + +/** 远端流视频统计数据 */ +export interface RemoteVideoStats extends ReceivedMediaStats, VideoStats { + /** 已解码帧数 */ + framesDecoded: number; +} + +export interface LocalAudioStatsMap { + [userId: string]: LocalAudioStats; +} + +export interface LocalVideoStatsMap { + [userId: string]: LocalVideoStats; +} + +export interface RemoteAudioStatsMap { + [userId: string]: RemoteAudioStats; +} + +export interface RemoteVideoStatsMap { + [userId: string]: RemoteVideoStats; +} + +export interface RemoteStreamInfo { + stream: RemoteStream; +} + +export interface RemoteUserInfo { + userId: string; +} + +/** + * 信令链接状态 + * - `DISCONNECTED`: 连接断开 + * - `CONNECTING`: 正在连接中 + * - `RECONNECTING`: 自动重连中 + * - `CONNECTED`: 已连接 + */ +export type ConnectionState = 'DISCONNECTED' | 'CONNECTING' | 'RECONNECTING' | 'CONNECTED'; + +/** 播放选项 */ +export interface PlayOptions { + /** 视频画面显示模式,参考 [CSS object-fit 属性](https://developer.mozilla.org/zh-CN/docs/Web/CSS/object-fit) */ + objectFit: 'contain' | 'cover' | 'fill' | 'none' | 'scale-down'; + /** 是否需要 mute 声音,对于本地流通常需要 mute 声音以防止播放从麦克风采集回来的声音。 */ + muted: boolean; +} + +export interface Profile { + /** 视频宽度 */ + width: number; + /** 视频高度 */ + height: number; + /** 帧率 */ + frameRate: number; + /** 比特率 kbs */ + bitrate: number; +} + +export type VideoProfileString = '120p' | '180p' | '240p' | '360p' | '480p' | '720p' | '1080p' | '1440p' | '4K'; + +export type ScreenProfileString = '480p' | '480p_2' | '720p' | '720p_2' | '1080p' | '1080p_2'; diff --git a/types/trtc-js-sdk/trtc-js-sdk-tests.ts b/types/trtc-js-sdk/trtc-js-sdk-tests.ts new file mode 100644 index 0000000000..cd4d92e2f7 --- /dev/null +++ b/types/trtc-js-sdk/trtc-js-sdk-tests.ts @@ -0,0 +1,29 @@ +TRTC.Logger.setLogLevel(TRTC.Logger.LogLevel.INFO); + +TRTC.getDevices().then(devices => { + devices.forEach(device => { + console.log(device.deviceId, device.kind); + }); +}); + +const client = TRTC.createClient({ + sdkAppId: 123, + userId: '123', + userSig: 'userSig', + mode: 'live', +}); + +const stream = TRTC.createStream({ + audio: true, + video: true, +}); + +stream.initialize().then(() => { + client.publish(stream); +}); + +client.on('stream-subscribed', ({ stream }) => { + stream.play('element-id'); +}); + +client.off('*'); diff --git a/types/trtc-js-sdk/tsconfig.json b/types/trtc-js-sdk/tsconfig.json new file mode 100644 index 0000000000..94f7f42b01 --- /dev/null +++ b/types/trtc-js-sdk/tsconfig.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "module": "commonjs", + "lib": [ + "dom", + "es6" + ], + "noImplicitAny": true, + "noImplicitThis": true, + "strictFunctionTypes": true, + "strictNullChecks": true, + "baseUrl": "../", + "typeRoots": [ + "../" + ], + "types": [], + "noEmit": true, + "forceConsistentCasingInFileNames": true, + "esModuleInterop": true + }, + "files": [ + "index.d.ts", + "trtc-js-sdk-tests.ts" + ] +} diff --git a/types/trtc-js-sdk/tslint.json b/types/trtc-js-sdk/tslint.json new file mode 100644 index 0000000000..3db14f85ea --- /dev/null +++ b/types/trtc-js-sdk/tslint.json @@ -0,0 +1 @@ +{ "extends": "dtslint/dt.json" }