UNPKG

trtc-electron-sdk

Version:

trtc electron sdk

371 lines (370 loc) 14.1 kB
import { TRTCVideoRotation, TRTCVideoFillMode } from './trtc_define'; import { IVodPlayer } from './types'; /** * @namespace TRTCVodPlayerEvent * @description 点播播放器(VOD Player)事件 */ export declare enum TRTCVodPlayerEvent { /** * @description 多媒体文件开始播放事件 * * @event TRTCVodPlayerEvent#onVodPlayerStarted * @param {Number} msLength 多媒体文件总长度,单位毫秒 */ onVodPlayerStarted = "onVodPlayerStarted", /** * @description 播放器就绪事件 * * 调用 `preload()` 完成后触发,或 `switchSource()` 切换成功后触发。 * * @event TRTCVodPlayerEvent#onVodPlayerLoaded * @param {Number} durationMs 视频总时长,单位毫秒 * @param {Number} width 视频宽度(像素),纯音频文件时为 0 * @param {Number} height 视频高度(像素),纯音频文件时为 0 */ onVodPlayerLoaded = "onVodPlayerLoaded", /** * @description 多媒体文件播放进度改变事件 * * @event TRTCVodPlayerEvent#onVodPlayerProgress * @param {Number} msPos 多媒体文件当前播放进度,单位毫秒 */ onVodPlayerProgress = "onVodPlayerProgress", /** * @description 多媒体文件播放暂停事件 * * @event TRTCVodPlayerEvent#onVodPlayerPaused */ onVodPlayerPaused = "onVodPlayerPaused", /** * @description 多媒体文件播放恢复事件 * * @event TRTCVodPlayerEvent#onVodPlayerResumed */ onVodPlayerResumed = "onVodPlayerResumed", /** * @description 多媒体文件播放停止事件 * * @event TRTCVodPlayerEvent#onVodPlayerStopped * @param {Number} reason 停止原因 * - 0:用户主动停止; * - 1:文件播放完; * - 2:视频断流。 */ onVodPlayerStopped = "onVodPlayerStopped", /** * @description 多媒体文件播放出错事件 * * @event TRTCVodPlayerEvent#onVodPlayerError * @param {Number} error 错误码 * - -6001:未知错误; * - -6002:通用错误; * - -6003:解封装失败; * - -6005:解封装超时; * - -6006:视频解码错误; * - -6007:音频解码错误; * - -6009:视频渲染错误。 */ onVodPlayerError = "onVodPlayerError" } /** * 点播播放器事件监听器类型定义 * * key 为 {@link TRTCVodPlayerEvent},value 为该事件回调接收的参数元组。 * 用于在 TS 层实现事件名到回调参数的精确类型映射,避免 any 滥用。 */ export interface TRTCVodPlayerEventMap { [TRTCVodPlayerEvent.onVodPlayerStarted]: [msLength: number]; [TRTCVodPlayerEvent.onVodPlayerLoaded]: [durationMs: number, width: number, height: number]; [TRTCVodPlayerEvent.onVodPlayerProgress]: [msPos: number]; [TRTCVodPlayerEvent.onVodPlayerPaused]: []; [TRTCVodPlayerEvent.onVodPlayerResumed]: []; [TRTCVodPlayerEvent.onVodPlayerStopped]: [reason: number]; [TRTCVodPlayerEvent.onVodPlayerError]: [error: number]; } /** * * 腾讯云点播播放器 * * 用于播放本地或在线的音视频文件,支持视频渲染、音量控制、 * 进度控制、TRTC 推流等功能。 * * @version v13.3.800 * * @example * import { TRTCVodPlayer, TRTCVodPlayerEvent } from 'trtc-electron-sdk'; * * const player = TRTCVodPlayer.createVodPlayer('/path/to/video.mp4', false); * player.on(TRTCVodPlayerEvent.onVodPlayerStarted, (msLength) => { * console.log('播放开始,总时长:', msLength); * }); * player.setView(document.getElementById('video-container')!); * player.start(); * * // 使用完毕后销毁 * TRTCVodPlayer.releaseVodPlayer(player); */ export declare class TRTCVodPlayer implements IVodPlayer { private static readonly MAX_BUFFER_RETRY; private static readonly BUFFER_RETRY_LOG_INTERVAL; private nativeVodPlayer; private videoRender; private mediaFilePath; private isStarted; private isDestroyed; private isRenderPrepared; private _setBufferRetryCount; private logger; private eventEmitter; /** * 当前 native 构建是否启用了 VOD 播放器。 * * 这是一次性的"构建期能力探测"——`NodeTRTCEngine.NodeVodPlayer` 是 * 加载 .node 时绑定,运行期不会变化,因此结果可在模块加载时缓存为常量。 * * 通过 {@link isSupported} 对外暴露访问入口。 */ private static readonly VOD_SUPPORTED; /** * 判断当前 native 构建是否启用了 VOD 播放器 * * C++ 侧 VOD 模块为条件编译(`TRTC_VOD_PLAYER` 宏),未启用时 `NodeTRTCEngine.NodeVodPlayer` * 不存在。调用方在 {@link createVodPlayer} 前应先用本方法探测,否则会拿到一个 * `Error: [TRTCVodPlayer][ERR_NO_VOD_SUPPORT] ...` 异常。 * * @returns true 表示当前构建支持 VOD;false 表示未启用 */ static isSupported(): boolean; /** * 创建 TRTCVodPlayer 实例 * * @param mediaFilePath - 媒体文件路径(本地绝对路径或在线 URL),必填且必须是非空字符串 * @param repeat - 是否循环播放,默认 false * @returns TRTCVodPlayer 实例 * * @throws {Error} 当前 native 构建未启用 VOD 时抛出,错误信息以 * `[TRTCVodPlayer][ERR_NO_VOD_SUPPORT]` 起始,便于日志聚合与告警 * (请先用 {@link isSupported} 探测) * @throws {TypeError} 当 `mediaFilePath` 不是非空字符串时抛出 */ static createVodPlayer(mediaFilePath: string, repeat?: boolean): TRTCVodPlayer; /** * 销毁 TRTCVodPlayer 实例,释放相关资源 * * @param player - 待销毁的 TRTCVodPlayer 实例 */ static releaseVodPlayer(player: TRTCVodPlayer): void; private constructor(); /** * 监听 TRTCVodPlayer 事件 * * @param event - 事件名称,参考 {@link TRTCVodPlayerEvent} * @param listener - 事件回调函数,参数类型根据事件自动推导 */ on<K extends keyof TRTCVodPlayerEventMap>(event: K, listener: (...args: TRTCVodPlayerEventMap[K]) => void): this; on(event: string | symbol, listener: (...args: any[]) => void): this; /** * 取消监听 TRTCVodPlayer 事件 * * @param event - 事件名称 * @param listener - 事件回调函数 */ off<K extends keyof TRTCVodPlayerEventMap>(event: K, listener: (...args: TRTCVodPlayerEventMap[K]) => void): this; off(event: string | symbol, listener: (...args: any[]) => void): this; /** * 设置视频渲染的 DOM 容器 * * @param view - HTML 元素,用于承载视频画面;传 `null` 时仅解除当前 view 关联, * 播放/渲染管线不受影响(可后续再次 `setView(newDom)` 切换容器)。 * * @note 若调用方需要彻底停止渲染,请使用 {@link stop} 或 {@link destroy}。 */ setView(view: HTMLElement | null): void; /** * 预加载多媒体文件 * * 预加载完成后会触发 {@link TRTCVodPlayerEvent.onVodPlayerLoaded} 事件,事件参数携带 * 媒体信息(时长、宽高);同时 C++ 层会产生首帧并推送到 JS 层的视频渲染管线, * 在 view 上展示首帧画面。 * * @example * player.on(TRTCVodPlayerEvent.onVodPlayerLoaded, (durationMs, width, height) => { * console.log('预加载完成:', durationMs, width, height); * player.start(); * }); * player.preload(); * * @note 可以先调用 preload 再调用 {@link start} 播放,也可以不调用 preload 直接调用 {@link start}。 * @note 若已经调用过 {@link start},再调用 preload 将无效。 */ preload(): void; /** * 开始播放 * * 支持的视频格式:mp4、mkv、mov。 * 支持的音频格式:opus、aac。 * * 重复调用会被忽略。 * * @note 可以先调用 {@link preload} 预加载完成后再调用 start,也可以跳过 preload 直接调用 start。 */ start(): void; /** * 停止播放 */ stop(): void; /** * 暂停播放 * * @note 仅在 {@link start} 之后调用才有效;未播放时调用会被忽略并打 warn 日志。 */ pause(): void; /** * 恢复播放 * * @note 仅在 {@link start} 之后调用才有效;未播放时调用会被忽略并打 warn 日志。 */ resume(): void; /** * 跳转到指定播放位置(seek) * * @param msPos - 目标位置,单位毫秒 * * @note 调用前必须先 {@link preload} 或 {@link start},否则会被忽略并打 warn 日志。 */ seek(msPos: number): void; /** * 切换当前播放的媒体文件 * * 底层实现等价于 `stop + 加载新源`,**切换后是否自动播放取决于切换前的状态**: * - 切换前在播放中:底层会自动 Started 新源,业务方无需再调 {@link start}; * - 切换前在暂停中:底层只 Loaded 新源不自动播放,业务方需在 * {@link TRTCVodPlayerEvent.onVodPlayerLoaded} 之后调 {@link start} 才会播。 * * 切换过程中会按顺序触发: * `onVodPlayerStopped` → `onVodPlayerLoaded`(新源信息) → * `onVodPlayerStarted`(仅"切换前在播放中"路径才会有)。 * * @param newMediaFile - 新的媒体文件路径或 URL * * @note 切换过程中调用 {@link stop} 会取消切换并停止当前播放。 * @note 调用前必须先 {@link preload} 或 {@link start},否则会被忽略并打 warn 日志。 * @note 传入空串会被忽略并打 warn 日志(C++ 层亦有同等保护)。 */ switchSource(newMediaFile: string): void; /** * 获取视频总时长 * * @returns 总时长,单位毫秒;播放器已销毁时返回 0。 * * @note 跨平台口径已统一为 `int64_t`(即使 Windows x64 下底层 `long` 是 32 位, * binding 层也会显式扩到 64 位避免 ~49 天回绕);JS `number` 安全整数上限 2^53, * 业务上点播时长不会触及。 */ getDuration(): number; /** * 获取视频宽度 * * @returns 视频宽度(像素);纯音频文件或播放器已销毁时返回 0 */ getWidth(): number; /** * 获取视频高度 * * @returns 视频高度(像素);纯音频文件或播放器已销毁时返回 0 */ getHeight(): number; /** * 设置画面顺时针旋转角度 * * 仅对窗口渲染模式生效。 * * @param rotation - 旋转角度,参考 {@link TRTCVideoRotation} 枚举, * 支持 TRTCVideoRotation0 / 90 / 180 / 270,默认 TRTCVideoRotation0 */ setRenderRotation(rotation: TRTCVideoRotation): void; /** * 设置画面填充模式 * * 仅对窗口渲染模式生效。 * * @param mode - 填充模式,参考 {@link TRTCVideoFillMode} 枚举: * - Fill:画面填满窗口,可能被拉伸或裁剪 * - Fit:画面按比例适配窗口,可能出现黑边(默认值) */ setFillMode(mode: TRTCVideoFillMode): void; /** * 设置画面镜像 * * @param mirror - 是否镜像 */ setMirror(mirror: boolean): void; /** * 静音 / 取消静音 * * @param mute - 是否静音 */ mute(mute: boolean): void; /** * 设置播放音量 * * @param volume - 音量大小,取值范围 [0, 150],100 为原始音量,默认值 100 */ setVolume(volume: number): void; /** * 向已关联的 TRTC 实例推送视频流 * * @note 推流前播放器需已关联到 TRTC 实例(内部由 {@link start} 自动处理)。 */ publishVideo(): void; /** * 向已关联的 TRTC 实例推送音频流 * * @note 绑定后音频播放由 TRTC 接管。 */ publishAudio(): void; /** * 停止向已关联的 TRTC 实例推送视频流 */ unpublishVideo(): void; /** * 停止向已关联的 TRTC 实例推送音频流 */ unpublishAudio(): void; /** * @private * 销毁播放器,释放所有资源 * * 包括:解绑事件监听、停止播放、销毁渲染器、清理 native 回调。 * * 注意:调用本方法后不再向业务方派发任何事件。即便 `stop()` 内部会异步触发 * `onVodPlayerStopped`,该事件也不会送达,因为监听器已在第一步被清空。 * 这是 `releaseVodPlayer` 的自然语义(资源释放后不再产生副作用)。 */ private _destroy; /** * @private * 将点播播放器关联到 TRTC 实例(用于辅助流推流,绑定后音频播放由 TRTC 接管) */ private attachTRTC; /** * @private * 将点播播放器从 TRTC 实例分离 */ private detachTRTC; /** * @private * 类型安全地发射事件,参数类型由 `TRTCVodPlayerEventMap` 推导。 * 通过 `setImmediate` 让 emit 异步化,避免在 N-API 回调栈中触发用户代码。 */ private fire; private _createVideoRender; private _destroyVideoRender; private _prepareRender; private _teardownRender; private _setVideoRenderBuffer; private _addDataRenderCallback; private _removeDataRenderCallback; private _dataRenderCallback; private _initEventCallback; }