trtc-electron-sdk 13.1.709-beta.1 → 13.4.800-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -51,7 +51,19 @@ class VideoRender {
51
51
  return;
52
52
  }
53
53
  this.pixelFormat = format;
54
- this.pixelLength = this.pixelFormat === trtc_define_1.TRTCVideoPixelFormat.TRTCVideoPixelFormat_I420 ? 1.5 : 4;
54
+ const newLength = this.pixelFormat === trtc_define_1.TRTCVideoPixelFormat.TRTCVideoPixelFormat_I420 ? 1.5 : 4;
55
+ if (this.pixelLength !== newLength) {
56
+ this.pixelLength = newLength;
57
+ this.videoBuffer.pixelFormat = this.pixelFormat;
58
+ this.videoBuffer.buffer = null;
59
+ this.videoBuffer.buffer = (0, util_1.allocBuffer)(this.videoBuffer.width * this.videoBuffer.height * this.pixelLength);
60
+ this.videoBuffer.id = (0, util_1.generateUniqueId)();
61
+ }
62
+ // 像素格式变更后重建渲染器,确保渲染器与数据格式匹配
63
+ if (this.videoRender !== null) {
64
+ this.destroyRender();
65
+ this.createRender();
66
+ }
55
67
  }
56
68
  setUserId(userId) {
57
69
  this.videoBuffer.userId = userId;
@@ -85,7 +97,9 @@ class VideoRender {
85
97
  this.videoBuffer.buffer = null;
86
98
  this.videoBuffer.width = width;
87
99
  this.videoBuffer.height = height;
100
+ this.videoBuffer.pixelFormat = this.pixelFormat;
88
101
  this.videoBuffer.buffer = (0, util_1.allocBuffer)(this.videoBuffer.width * this.videoBuffer.height * this.pixelLength);
102
+ this.videoBuffer.id = (0, util_1.generateUniqueId)();
89
103
  }
90
104
  }
91
105
  }
@@ -106,7 +106,12 @@ class VideoRenderer {
106
106
  codedHeight: frameData.height,
107
107
  timestamp: frameData.timestamp,
108
108
  });
109
- yield this.writer.write(vf);
109
+ try {
110
+ yield this.writer.write(vf);
111
+ }
112
+ finally {
113
+ vf.close();
114
+ }
110
115
  }
111
116
  else {
112
117
  throw new Error('renderer container element is null');
package/liteav/index.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  export * from './trtc_define';
2
2
  export * from './trtc_code';
3
+ export * from './vod_player';
3
4
  export * from './extensions/DeviceManager';
4
5
  export * from './extensions/AudioEffectManager';
5
6
  export * from './extensions/MediaMixingManager';
package/liteav/index.js CHANGED
@@ -15,6 +15,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
15
15
  Object.defineProperty(exports, "__esModule", { value: true });
16
16
  __exportStar(require("./trtc_define"), exports);
17
17
  __exportStar(require("./trtc_code"), exports);
18
+ __exportStar(require("./vod_player"), exports);
18
19
  __exportStar(require("./extensions/DeviceManager"), exports);
19
20
  __exportStar(require("./extensions/AudioEffectManager"), exports);
20
21
  __exportStar(require("./extensions/MediaMixingManager"), exports);
package/liteav/trtc.d.ts CHANGED
@@ -2345,11 +2345,21 @@ declare class TRTCCloud extends EventEmitter implements ITRTCCloud {
2345
2345
  *
2346
2346
  * - 调用 `setLocalVideoRenderCallback(TRTCVideoPixelFormat_Unknown, TRTCVideoBufferType_Unknown, null)` 可停止自定义渲染回调,恢复 SDK 内置渲染。
2347
2347
  * - Electron 平台仅支持回调 `TRTCVideoPixelFormat_I420` 像素格式的视频帧。
2348
+ * @version v13.1.709
2348
2349
  *
2349
2350
  * @param {TRTCVideoPixelFormat} pixelFormat - 指定回调的像素格式
2350
2351
  * @param {TRTCVideoBufferType} bufferType - 指定视频数据结构类型
2351
2352
  * @param {TRTCVideoRenderCallback | null} callback - 自定义渲染回调,传入 null 表示停止自定义渲染
2352
2353
  * @return {number} 0:成功;<0:错误
2354
+ *
2355
+ * @example
2356
+ * import TRTCCloud from 'trtc-electron-sdk';
2357
+ * const trtcCloud = TRTCCloud.getTRTCShareInstance();
2358
+ * trtc.setLocalVideoRenderCallback(TRTCVideoPixelFormat.TRTCVideoPixelFormat_I420, TRTCVideoBufferType.TRTCVideoBufferType_Buffer, {
2359
+ * onRenderVideoFrame(userId, streamType, frame) {
2360
+ * // 处理本地视频帧的回调
2361
+ * }
2362
+ * });
2353
2363
  */
2354
2364
  setLocalVideoRenderCallback(pixelFormat: TRTCVideoPixelFormat, bufferType: TRTCVideoBufferType, callback: TRTCVideoRenderCallback | null): number;
2355
2365
  /**
@@ -2359,12 +2369,22 @@ declare class TRTCCloud extends EventEmitter implements ITRTCCloud {
2359
2369
  *
2360
2370
  * - 调用 `setRemoteVideoRenderCallback(userId, TRTCVideoPixelFormat_Unknown, TRTCVideoBufferType_Unknown, null)` 可停止自定义渲染回调,恢复 SDK 内置渲染。
2361
2371
  * - Electron 平台仅支持回调 `TRTCVideoPixelFormat_I420` 像素格式的视频帧。
2372
+ * @version v13.1.709
2362
2373
  *
2363
2374
  * @param {string} userId - 远端用户标识
2364
2375
  * @param {TRTCVideoPixelFormat} pixelFormat - 指定回调的像素格式
2365
2376
  * @param {TRTCVideoBufferType} bufferType - 指定视频数据结构类型
2366
2377
  * @param {TRTCVideoRenderCallback | null} callback - 自定义渲染回调,传入 null 表示停止自定义渲染
2367
2378
  * @return {number} 0:成功;<0:错误
2379
+ *
2380
+ * @example
2381
+ * import TRTCCloud from 'trtc-electron-sdk';
2382
+ * const trtcCloud = TRTCCloud.getTRTCShareInstance();
2383
+ * trtc.setRemoteVideoRenderCallback('remoteUserId', TRTCVideoPixelFormat.TRTCVideoPixelFormat_I420, TRTCVideoBufferType.TRTCVideoBufferType_Buffer, {
2384
+ * onRenderVideoFrame(userId, streamType, frame) {
2385
+ * // 处理远端视频帧的回调
2386
+ * }
2387
+ * });
2368
2388
  */
2369
2389
  setRemoteVideoRenderCallback(userId: string, pixelFormat: TRTCVideoPixelFormat, bufferType: TRTCVideoBufferType, callback: TRTCVideoRenderCallback | null): number;
2370
2390
  /**
package/liteav/trtc.js CHANGED
@@ -3983,11 +3983,21 @@ class TRTCCloud extends events_1.EventEmitter {
3983
3983
  *
3984
3984
  * - 调用 `setLocalVideoRenderCallback(TRTCVideoPixelFormat_Unknown, TRTCVideoBufferType_Unknown, null)` 可停止自定义渲染回调,恢复 SDK 内置渲染。
3985
3985
  * - Electron 平台仅支持回调 `TRTCVideoPixelFormat_I420` 像素格式的视频帧。
3986
+ * @version v13.1.709
3986
3987
  *
3987
3988
  * @param {TRTCVideoPixelFormat} pixelFormat - 指定回调的像素格式
3988
3989
  * @param {TRTCVideoBufferType} bufferType - 指定视频数据结构类型
3989
3990
  * @param {TRTCVideoRenderCallback | null} callback - 自定义渲染回调,传入 null 表示停止自定义渲染
3990
3991
  * @return {number} 0:成功;<0:错误
3992
+ *
3993
+ * @example
3994
+ * import TRTCCloud from 'trtc-electron-sdk';
3995
+ * const trtcCloud = TRTCCloud.getTRTCShareInstance();
3996
+ * trtc.setLocalVideoRenderCallback(TRTCVideoPixelFormat.TRTCVideoPixelFormat_I420, TRTCVideoBufferType.TRTCVideoBufferType_Buffer, {
3997
+ * onRenderVideoFrame(userId, streamType, frame) {
3998
+ * // 处理本地视频帧的回调
3999
+ * }
4000
+ * });
3991
4001
  */
3992
4002
  setLocalVideoRenderCallback(pixelFormat, bufferType, callback) {
3993
4003
  try {
@@ -4031,12 +4041,22 @@ class TRTCCloud extends events_1.EventEmitter {
4031
4041
  *
4032
4042
  * - 调用 `setRemoteVideoRenderCallback(userId, TRTCVideoPixelFormat_Unknown, TRTCVideoBufferType_Unknown, null)` 可停止自定义渲染回调,恢复 SDK 内置渲染。
4033
4043
  * - Electron 平台仅支持回调 `TRTCVideoPixelFormat_I420` 像素格式的视频帧。
4044
+ * @version v13.1.709
4034
4045
  *
4035
4046
  * @param {string} userId - 远端用户标识
4036
4047
  * @param {TRTCVideoPixelFormat} pixelFormat - 指定回调的像素格式
4037
4048
  * @param {TRTCVideoBufferType} bufferType - 指定视频数据结构类型
4038
4049
  * @param {TRTCVideoRenderCallback | null} callback - 自定义渲染回调,传入 null 表示停止自定义渲染
4039
4050
  * @return {number} 0:成功;<0:错误
4051
+ *
4052
+ * @example
4053
+ * import TRTCCloud from 'trtc-electron-sdk';
4054
+ * const trtcCloud = TRTCCloud.getTRTCShareInstance();
4055
+ * trtc.setRemoteVideoRenderCallback('remoteUserId', TRTCVideoPixelFormat.TRTCVideoPixelFormat_I420, TRTCVideoBufferType.TRTCVideoBufferType_Buffer, {
4056
+ * onRenderVideoFrame(userId, streamType, frame) {
4057
+ * // 处理远端视频帧的回调
4058
+ * }
4059
+ * });
4040
4060
  */
4041
4061
  setRemoteVideoRenderCallback(userId, pixelFormat, bufferType, callback) {
4042
4062
  try {
@@ -0,0 +1,210 @@
1
+ import { TRTCVideoRotation, TRTCVideoFillMode } from './trtc_define';
2
+ /**
3
+ * VodPlayer 播放器事件枚举
4
+ */
5
+ export declare enum VodPlayerEvents {
6
+ /** 播放开始,参数:msLength(总时长,毫秒) */
7
+ onVodPlayerStarted = "onVodPlayerStarted",
8
+ /** 播放进度更新,参数:msPos(当前进度,毫秒) */
9
+ onVodPlayerProgress = "onVodPlayerProgress",
10
+ /** 播放暂停 */
11
+ onVodPlayerPaused = "onVodPlayerPaused",
12
+ /** 播放恢复 */
13
+ onVodPlayerResumed = "onVodPlayerResumed",
14
+ /** 播放停止,参数:reason(0=用户主动停止,1=文件播放完,2=视频断流) */
15
+ onVodPlayerStopped = "onVodPlayerStopped",
16
+ /** 播放错误,参数:error(错误码) */
17
+ onVodPlayerError = "onVodPlayerError"
18
+ }
19
+ /**
20
+ * VodPlayer 事件与回调参数的类型映射
21
+ *
22
+ * 用于 on/off 方法的类型约束,使事件名和回调参数在编译期匹配。
23
+ */
24
+ export interface VodPlayerEventMap {
25
+ [VodPlayerEvents.onVodPlayerStarted]: [msLength: number];
26
+ [VodPlayerEvents.onVodPlayerProgress]: [msPos: number];
27
+ [VodPlayerEvents.onVodPlayerPaused]: [];
28
+ [VodPlayerEvents.onVodPlayerResumed]: [];
29
+ [VodPlayerEvents.onVodPlayerStopped]: [reason: number];
30
+ [VodPlayerEvents.onVodPlayerError]: [error: number];
31
+ }
32
+ /**
33
+ *
34
+ * 腾讯云点播播放器
35
+ *
36
+ * 用于播放本地或在线的音视频文件,支持视频渲染、音量控制、
37
+ * 进度控制、TRTC 推流等功能。
38
+ *
39
+ * @version v13.4.800
40
+ *
41
+ * @example
42
+ * import { VodPlayer, VodPlayerEvents } from 'trtc-electron-sdk';
43
+ *
44
+ * const player = VodPlayer.createVodPlayer('/path/to/video.mp4', false);
45
+ * player.on(VodPlayerEvents.onVodPlayerStarted, (msLength) => {
46
+ * console.log('播放开始,总时长:', msLength);
47
+ * });
48
+ * player.setView(document.getElementById('video-container')!);
49
+ * player.start();
50
+ *
51
+ * // 使用完毕后销毁
52
+ * VodPlayer.releaseVodPlayer(player);
53
+ */
54
+ export declare class VodPlayer {
55
+ private nativeVodPlayer;
56
+ private videoRender;
57
+ private mediaFilePath;
58
+ private repeat;
59
+ private isStarted;
60
+ private isDestroyed;
61
+ private logger;
62
+ private eventEmitter;
63
+ /**
64
+ * 创建 VodPlayer 实例
65
+ *
66
+ * @param mediaFilePath - 媒体文件路径(本地路径或在线 URL)
67
+ * @param repeat - 是否循环播放,默认 false
68
+ * @returns VodPlayer 实例
69
+ */
70
+ static createVodPlayer(mediaFilePath: string, repeat?: boolean): VodPlayer;
71
+ /**
72
+ * 销毁 VodPlayer 实例,释放相关资源
73
+ *
74
+ * @param player - 待销毁的 VodPlayer 实例
75
+ */
76
+ static releaseVodPlayer(player: VodPlayer): void;
77
+ private constructor();
78
+ /**
79
+ * 销毁播放器,释放所有资源
80
+ *
81
+ * 包括:停止播放、销毁渲染器、移除所有事件监听
82
+ */
83
+ destroy(): void;
84
+ /**
85
+ * 监听 VodPlayer 事件
86
+ *
87
+ * @param event - 事件名称,参考 {@link VodPlayerEvents}
88
+ * @param listener - 事件回调函数,参数类型根据事件自动推导
89
+ */
90
+ on<K extends keyof VodPlayerEventMap>(event: K, listener: (...args: VodPlayerEventMap[K]) => void): this;
91
+ on(event: string | symbol, listener: (...args: any[]) => void): this;
92
+ /**
93
+ * 取消监听 VodPlayer 事件
94
+ *
95
+ * @param event - 事件名称
96
+ * @param listener - 事件回调函数
97
+ */
98
+ off<K extends keyof VodPlayerEventMap>(event: K, listener: (...args: VodPlayerEventMap[K]) => void): this;
99
+ off(event: string | symbol, listener: (...args: any[]) => void): this;
100
+ /**
101
+ * 设置视频渲染的 DOM 容器
102
+ *
103
+ * @param view - HTML 元素,用于承载视频画面
104
+ */
105
+ setView(view: HTMLElement | null): void;
106
+ /**
107
+ * 开始播放
108
+ *
109
+ */
110
+ start(): void;
111
+ /**
112
+ * 停止播放
113
+ *
114
+ */
115
+ stop(): void;
116
+ /**
117
+ * 暂停播放
118
+ */
119
+ pause(): void;
120
+ /**
121
+ * 恢复播放
122
+ */
123
+ resume(): void;
124
+ /**
125
+ * 跳转到指定播放位置
126
+ *
127
+ * @param msPos - 目标位置,单位毫秒
128
+ */
129
+ seek(msPos: number): void;
130
+ /**
131
+ * 获取媒体文件总时长
132
+ *
133
+ * @returns 总时长,单位毫秒
134
+ */
135
+ getDuration(): number;
136
+ /**
137
+ * 获取视频宽度
138
+ *
139
+ * @returns 视频宽度(像素)
140
+ */
141
+ getWidth(): number;
142
+ /**
143
+ * 获取视频高度
144
+ *
145
+ * @returns 视频高度(像素)
146
+ */
147
+ getHeight(): number;
148
+ /**
149
+ * 设置画面旋转角度
150
+ *
151
+ * @param rotation - 旋转角度,参考 TRTCVideoRotation 枚举
152
+ */
153
+ setRenderRotation(rotation: TRTCVideoRotation): void;
154
+ /**
155
+ * 设置画面填充模式
156
+ *
157
+ * @param mode - 填充模式,参考 TRTCVideoFillMode 枚举
158
+ */
159
+ setFillMode(mode: TRTCVideoFillMode): void;
160
+ /**
161
+ * 设置画面镜像
162
+ *
163
+ * @param mirror - 是否镜像
164
+ */
165
+ setMirror(mirror: boolean): void;
166
+ /**
167
+ * 静音 / 取消静音
168
+ *
169
+ * @param mute - 是否静音
170
+ */
171
+ mute(mute: boolean): void;
172
+ /**
173
+ * 设置播放音量
174
+ *
175
+ * @param volume - 音量大小,取值范围 0-100
176
+ */
177
+ setVolume(volume: number): void;
178
+ /**
179
+ * 将点播播放器关联到 TRTC 实例(用于推流)
180
+ */
181
+ attachTRTC(): void;
182
+ /**
183
+ * 将点播播放器从 TRTC 实例分离
184
+ */
185
+ detachTRTC(): void;
186
+ /**
187
+ * 开始推送视频流到 TRTC
188
+ */
189
+ publishVideo(): void;
190
+ /**
191
+ * 开始推送音频流到 TRTC
192
+ */
193
+ publishAudio(): void;
194
+ /**
195
+ * 停止推送视频流到 TRTC
196
+ */
197
+ unpublishVideo(): void;
198
+ /**
199
+ * 停止推送音频流到 TRTC
200
+ */
201
+ unpublishAudio(): void;
202
+ private fire;
203
+ private _createVideoRender;
204
+ private _destroyVideoRender;
205
+ private _setVideoRenderBuffer;
206
+ private _addDataRenderCallback;
207
+ private _removeDataRenderCallback;
208
+ private _dataRenderCallback;
209
+ private _initEventCallback;
210
+ }
@@ -0,0 +1,466 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.VodPlayer = exports.VodPlayerEvents = void 0;
4
+ const events_1 = require("events");
5
+ const trtc_define_1 = require("./trtc_define");
6
+ const video_render_1 = require("./Live/video-render");
7
+ const logger_1 = require("./logger");
8
+ const NodeTRTCEngine = require('../build/Release/trtc_electron_sdk.node');
9
+ /**
10
+ * VodPlayer 播放器事件枚举
11
+ */
12
+ var VodPlayerEvents;
13
+ (function (VodPlayerEvents) {
14
+ /** 播放开始,参数:msLength(总时长,毫秒) */
15
+ VodPlayerEvents["onVodPlayerStarted"] = "onVodPlayerStarted";
16
+ /** 播放进度更新,参数:msPos(当前进度,毫秒) */
17
+ VodPlayerEvents["onVodPlayerProgress"] = "onVodPlayerProgress";
18
+ /** 播放暂停 */
19
+ VodPlayerEvents["onVodPlayerPaused"] = "onVodPlayerPaused";
20
+ /** 播放恢复 */
21
+ VodPlayerEvents["onVodPlayerResumed"] = "onVodPlayerResumed";
22
+ /** 播放停止,参数:reason(0=用户主动停止,1=文件播放完,2=视频断流) */
23
+ VodPlayerEvents["onVodPlayerStopped"] = "onVodPlayerStopped";
24
+ /** 播放错误,参数:error(错误码) */
25
+ VodPlayerEvents["onVodPlayerError"] = "onVodPlayerError";
26
+ })(VodPlayerEvents = exports.VodPlayerEvents || (exports.VodPlayerEvents = {}));
27
+ /**
28
+ *
29
+ * 腾讯云点播播放器
30
+ *
31
+ * 用于播放本地或在线的音视频文件,支持视频渲染、音量控制、
32
+ * 进度控制、TRTC 推流等功能。
33
+ *
34
+ * @version v13.4.800
35
+ *
36
+ * @example
37
+ * import { VodPlayer, VodPlayerEvents } from 'trtc-electron-sdk';
38
+ *
39
+ * const player = VodPlayer.createVodPlayer('/path/to/video.mp4', false);
40
+ * player.on(VodPlayerEvents.onVodPlayerStarted, (msLength) => {
41
+ * console.log('播放开始,总时长:', msLength);
42
+ * });
43
+ * player.setView(document.getElementById('video-container')!);
44
+ * player.start();
45
+ *
46
+ * // 使用完毕后销毁
47
+ * VodPlayer.releaseVodPlayer(player);
48
+ */
49
+ class VodPlayer {
50
+ // ─── 构造函数 ───────────────────────────────────────────────
51
+ constructor(mediaFilePath, repeat = false) {
52
+ this.logger = new logger_1.Logger('VodPlayer');
53
+ this.eventEmitter = new events_1.EventEmitter();
54
+ this._dataRenderCallback = this._dataRenderCallback.bind(this);
55
+ this.nativeVodPlayer = new NodeTRTCEngine.NodeVodPlayer(mediaFilePath, repeat);
56
+ this.mediaFilePath = mediaFilePath;
57
+ this.repeat = repeat;
58
+ this.isStarted = false;
59
+ this.isDestroyed = false;
60
+ this.videoRender = null;
61
+ this._createVideoRender();
62
+ this._initEventCallback();
63
+ }
64
+ // ─── 静态工厂方法 ───────────────────────────────────────────
65
+ /**
66
+ * 创建 VodPlayer 实例
67
+ *
68
+ * @param mediaFilePath - 媒体文件路径(本地路径或在线 URL)
69
+ * @param repeat - 是否循环播放,默认 false
70
+ * @returns VodPlayer 实例
71
+ */
72
+ static createVodPlayer(mediaFilePath, repeat = false) {
73
+ return new VodPlayer(mediaFilePath, repeat);
74
+ }
75
+ /**
76
+ * 销毁 VodPlayer 实例,释放相关资源
77
+ *
78
+ * @param player - 待销毁的 VodPlayer 实例
79
+ */
80
+ static releaseVodPlayer(player) {
81
+ player.destroy();
82
+ }
83
+ // ─── 公开方法 ───────────────────────────────────────────────
84
+ /**
85
+ * 销毁播放器,释放所有资源
86
+ *
87
+ * 包括:停止播放、销毁渲染器、移除所有事件监听
88
+ */
89
+ destroy() {
90
+ var _a, _b;
91
+ if (this.isDestroyed) {
92
+ this.logger.warn('destroy: player already destroyed');
93
+ return;
94
+ }
95
+ this.logger.info('destroy');
96
+ this.stop();
97
+ this.isDestroyed = true;
98
+ this._destroyVideoRender();
99
+ (_a = this.nativeVodPlayer) === null || _a === void 0 ? void 0 : _a.setEventCallback(null);
100
+ (_b = this.nativeVodPlayer) === null || _b === void 0 ? void 0 : _b.setDataCallback(null);
101
+ this.nativeVodPlayer = null;
102
+ this.eventEmitter.removeAllListeners();
103
+ }
104
+ on(event, listener) {
105
+ this.eventEmitter.on(event, listener);
106
+ return this;
107
+ }
108
+ off(event, listener) {
109
+ this.eventEmitter.off(event, listener);
110
+ return this;
111
+ }
112
+ /**
113
+ * 设置视频渲染的 DOM 容器
114
+ *
115
+ * @param view - HTML 元素,用于承载视频画面
116
+ */
117
+ setView(view) {
118
+ var _a;
119
+ if (this.isDestroyed) {
120
+ this.logger.warn('setView: player already destroyed');
121
+ return;
122
+ }
123
+ this.logger.info(`setView view: ${view}`);
124
+ (_a = this.videoRender) === null || _a === void 0 ? void 0 : _a.setRenderView(view);
125
+ }
126
+ /**
127
+ * 开始播放
128
+ *
129
+ */
130
+ start() {
131
+ var _a, _b;
132
+ if (this.isDestroyed) {
133
+ this.logger.warn('start: player already destroyed');
134
+ return;
135
+ }
136
+ this.logger.info(`start mediaFile: ${this.mediaFilePath}`);
137
+ if (this.isStarted) {
138
+ this.logger.warn('start: already started, ignored');
139
+ return;
140
+ }
141
+ (_a = this.videoRender) === null || _a === void 0 ? void 0 : _a.createRender();
142
+ this._setVideoRenderBuffer();
143
+ this._addDataRenderCallback();
144
+ (_b = this.nativeVodPlayer) === null || _b === void 0 ? void 0 : _b.start();
145
+ this.isStarted = true;
146
+ }
147
+ /**
148
+ * 停止播放
149
+ *
150
+ */
151
+ stop() {
152
+ var _a, _b;
153
+ if (this.isDestroyed) {
154
+ this.logger.warn('stop: player already destroyed');
155
+ return;
156
+ }
157
+ this.logger.info('stop');
158
+ if (!this.isStarted) {
159
+ return;
160
+ }
161
+ this.isStarted = false;
162
+ (_a = this.nativeVodPlayer) === null || _a === void 0 ? void 0 : _a.stop();
163
+ (_b = this.videoRender) === null || _b === void 0 ? void 0 : _b.destroyRender();
164
+ this._removeDataRenderCallback();
165
+ }
166
+ /**
167
+ * 暂停播放
168
+ */
169
+ pause() {
170
+ var _a;
171
+ if (this.isDestroyed) {
172
+ this.logger.warn('pause: player already destroyed');
173
+ return;
174
+ }
175
+ this.logger.info('pause');
176
+ (_a = this.nativeVodPlayer) === null || _a === void 0 ? void 0 : _a.pause();
177
+ }
178
+ /**
179
+ * 恢复播放
180
+ */
181
+ resume() {
182
+ var _a;
183
+ if (this.isDestroyed) {
184
+ this.logger.warn('resume: player already destroyed');
185
+ return;
186
+ }
187
+ this.logger.info('resume');
188
+ (_a = this.nativeVodPlayer) === null || _a === void 0 ? void 0 : _a.resume();
189
+ }
190
+ /**
191
+ * 跳转到指定播放位置
192
+ *
193
+ * @param msPos - 目标位置,单位毫秒
194
+ */
195
+ seek(msPos) {
196
+ var _a;
197
+ if (this.isDestroyed) {
198
+ this.logger.warn('seek: player already destroyed');
199
+ return;
200
+ }
201
+ this.logger.info(`seek msPos: ${msPos}`);
202
+ (_a = this.nativeVodPlayer) === null || _a === void 0 ? void 0 : _a.seek(msPos);
203
+ }
204
+ /**
205
+ * 获取媒体文件总时长
206
+ *
207
+ * @returns 总时长,单位毫秒
208
+ */
209
+ getDuration() {
210
+ var _a, _b;
211
+ if (this.isDestroyed) {
212
+ this.logger.warn('getDuration: player already destroyed');
213
+ return 0;
214
+ }
215
+ return (_b = (_a = this.nativeVodPlayer) === null || _a === void 0 ? void 0 : _a.getDuration()) !== null && _b !== void 0 ? _b : 0;
216
+ }
217
+ /**
218
+ * 获取视频宽度
219
+ *
220
+ * @returns 视频宽度(像素)
221
+ */
222
+ getWidth() {
223
+ var _a, _b;
224
+ if (this.isDestroyed) {
225
+ this.logger.warn('getWidth: player already destroyed');
226
+ return 0;
227
+ }
228
+ return (_b = (_a = this.nativeVodPlayer) === null || _a === void 0 ? void 0 : _a.getWidth()) !== null && _b !== void 0 ? _b : 0;
229
+ }
230
+ /**
231
+ * 获取视频高度
232
+ *
233
+ * @returns 视频高度(像素)
234
+ */
235
+ getHeight() {
236
+ var _a, _b;
237
+ if (this.isDestroyed) {
238
+ this.logger.warn('getHeight: player already destroyed');
239
+ return 0;
240
+ }
241
+ return (_b = (_a = this.nativeVodPlayer) === null || _a === void 0 ? void 0 : _a.getHeight()) !== null && _b !== void 0 ? _b : 0;
242
+ }
243
+ /**
244
+ * 设置画面旋转角度
245
+ *
246
+ * @param rotation - 旋转角度,参考 TRTCVideoRotation 枚举
247
+ */
248
+ setRenderRotation(rotation) {
249
+ var _a;
250
+ if (this.isDestroyed) {
251
+ this.logger.warn('setRenderRotation: player already destroyed');
252
+ return;
253
+ }
254
+ this.logger.info(`setRenderRotation rotation: ${rotation}`);
255
+ (_a = this.nativeVodPlayer) === null || _a === void 0 ? void 0 : _a.setRenderRotation(rotation);
256
+ }
257
+ /**
258
+ * 设置画面填充模式
259
+ *
260
+ * @param mode - 填充模式,参考 TRTCVideoFillMode 枚举
261
+ */
262
+ setFillMode(mode) {
263
+ var _a, _b;
264
+ if (this.isDestroyed) {
265
+ this.logger.warn('setFillMode: player already destroyed');
266
+ return;
267
+ }
268
+ this.logger.info(`setFillMode mode: ${mode}`);
269
+ (_a = this.videoRender) === null || _a === void 0 ? void 0 : _a.setVideoFillMode(mode);
270
+ (_b = this.nativeVodPlayer) === null || _b === void 0 ? void 0 : _b.setFillMode(mode);
271
+ }
272
+ /**
273
+ * 设置画面镜像
274
+ *
275
+ * @param mirror - 是否镜像
276
+ */
277
+ setMirror(mirror) {
278
+ var _a;
279
+ if (this.isDestroyed) {
280
+ this.logger.warn('setMirror: player already destroyed');
281
+ return;
282
+ }
283
+ this.logger.info(`setMirror mirror: ${mirror}`);
284
+ (_a = this.nativeVodPlayer) === null || _a === void 0 ? void 0 : _a.setMirror(mirror);
285
+ }
286
+ /**
287
+ * 静音 / 取消静音
288
+ *
289
+ * @param mute - 是否静音
290
+ */
291
+ mute(mute) {
292
+ var _a;
293
+ if (this.isDestroyed) {
294
+ this.logger.warn('mute: player already destroyed');
295
+ return;
296
+ }
297
+ this.logger.info(`mute: ${mute}`);
298
+ (_a = this.nativeVodPlayer) === null || _a === void 0 ? void 0 : _a.mute(mute);
299
+ }
300
+ /**
301
+ * 设置播放音量
302
+ *
303
+ * @param volume - 音量大小,取值范围 0-100
304
+ */
305
+ setVolume(volume) {
306
+ var _a;
307
+ if (this.isDestroyed) {
308
+ this.logger.warn('setVolume: player already destroyed');
309
+ return;
310
+ }
311
+ this.logger.info(`setVolume volume: ${volume}`);
312
+ (_a = this.nativeVodPlayer) === null || _a === void 0 ? void 0 : _a.setVolume(volume);
313
+ }
314
+ /**
315
+ * 将点播播放器关联到 TRTC 实例(用于推流)
316
+ */
317
+ attachTRTC() {
318
+ var _a;
319
+ if (this.isDestroyed) {
320
+ this.logger.warn('attachTRTC: player already destroyed');
321
+ return;
322
+ }
323
+ this.logger.info('attachTRTC');
324
+ (_a = this.nativeVodPlayer) === null || _a === void 0 ? void 0 : _a.attachTRTC();
325
+ }
326
+ /**
327
+ * 将点播播放器从 TRTC 实例分离
328
+ */
329
+ detachTRTC() {
330
+ var _a;
331
+ if (this.isDestroyed) {
332
+ this.logger.warn('detachTRTC: player already destroyed');
333
+ return;
334
+ }
335
+ this.logger.info('detachTRTC');
336
+ (_a = this.nativeVodPlayer) === null || _a === void 0 ? void 0 : _a.detachTRTC();
337
+ }
338
+ /**
339
+ * 开始推送视频流到 TRTC
340
+ */
341
+ publishVideo() {
342
+ var _a;
343
+ if (this.isDestroyed) {
344
+ this.logger.warn('publishVideo: player already destroyed');
345
+ return;
346
+ }
347
+ this.logger.info('publishVideo');
348
+ (_a = this.nativeVodPlayer) === null || _a === void 0 ? void 0 : _a.publishVideo();
349
+ }
350
+ /**
351
+ * 开始推送音频流到 TRTC
352
+ */
353
+ publishAudio() {
354
+ var _a;
355
+ if (this.isDestroyed) {
356
+ this.logger.warn('publishAudio: player already destroyed');
357
+ return;
358
+ }
359
+ this.logger.info('publishAudio');
360
+ (_a = this.nativeVodPlayer) === null || _a === void 0 ? void 0 : _a.publishAudio();
361
+ }
362
+ /**
363
+ * 停止推送视频流到 TRTC
364
+ */
365
+ unpublishVideo() {
366
+ var _a;
367
+ if (this.isDestroyed) {
368
+ this.logger.warn('unpublishVideo: player already destroyed');
369
+ return;
370
+ }
371
+ this.logger.info('unpublishVideo');
372
+ (_a = this.nativeVodPlayer) === null || _a === void 0 ? void 0 : _a.unpublishVideo();
373
+ }
374
+ /**
375
+ * 停止推送音频流到 TRTC
376
+ */
377
+ unpublishAudio() {
378
+ var _a;
379
+ if (this.isDestroyed) {
380
+ this.logger.warn('unpublishAudio: player already destroyed');
381
+ return;
382
+ }
383
+ this.logger.info('unpublishAudio');
384
+ (_a = this.nativeVodPlayer) === null || _a === void 0 ? void 0 : _a.unpublishAudio();
385
+ }
386
+ // ─── 内部方法 ───────────────────────────────────────────────
387
+ fire(event, ...args) {
388
+ setImmediate(() => {
389
+ this.eventEmitter.emit(event, ...args);
390
+ });
391
+ }
392
+ _createVideoRender() {
393
+ if (this.videoRender !== null) {
394
+ return;
395
+ }
396
+ this.videoRender = new video_render_1.VideoRender();
397
+ this.videoRender.setVideoPixelFormat(trtc_define_1.TRTCVideoPixelFormat.TRTCVideoPixelFormat_BGRA32);
398
+ }
399
+ _destroyVideoRender() {
400
+ if (this.videoRender) {
401
+ this.videoRender.destroy();
402
+ this.videoRender = null;
403
+ }
404
+ this._removeDataRenderCallback();
405
+ }
406
+ _setVideoRenderBuffer() {
407
+ var _a;
408
+ if (this.videoRender !== null) {
409
+ const videoBuffer = this.videoRender.getVideoBuffer();
410
+ this.logger.info(`_setVideoRenderBuffer: userId=${videoBuffer.userId}, width=${videoBuffer.width}, height=${videoBuffer.height}, bufferId=${videoBuffer.id}, pixelFormat=${videoBuffer.pixelFormat}`);
411
+ (_a = this.nativeVodPlayer) === null || _a === void 0 ? void 0 : _a.setVideoBuffer(videoBuffer.userId || '', videoBuffer.buffer, videoBuffer.streamType, videoBuffer.width, videoBuffer.height, videoBuffer.pixelFormat, videoBuffer.id);
412
+ }
413
+ }
414
+ _addDataRenderCallback() {
415
+ var _a;
416
+ (_a = this.nativeVodPlayer) === null || _a === void 0 ? void 0 : _a.setDataCallback(this._dataRenderCallback);
417
+ }
418
+ _removeDataRenderCallback() {
419
+ var _a;
420
+ (_a = this.nativeVodPlayer) === null || _a === void 0 ? void 0 : _a.setDataCallback(null);
421
+ }
422
+ _dataRenderCallback(args) {
423
+ if (this.videoRender) {
424
+ const [userId, type, width, height, timestamp, rotation, valid, bufferId] = args;
425
+ const result = this.videoRender.renderVideoData(userId, type, width, height, timestamp, rotation, valid, bufferId);
426
+ if (!result) {
427
+ this.logger.info(`_dataRenderCallback: renderVideoData returned false, re-setting video buffer`);
428
+ this._setVideoRenderBuffer();
429
+ }
430
+ }
431
+ else {
432
+ this.logger.warn('_dataRenderCallback: videoRender is null, frame dropped');
433
+ }
434
+ }
435
+ _initEventCallback() {
436
+ var _a;
437
+ (_a = this.nativeVodPlayer) === null || _a === void 0 ? void 0 : _a.setEventCallback((args) => {
438
+ const key = args[0];
439
+ const data = args[1];
440
+ switch (key) {
441
+ case VodPlayerEvents.onVodPlayerStarted:
442
+ this.fire(VodPlayerEvents.onVodPlayerStarted, data.msLength);
443
+ break;
444
+ case VodPlayerEvents.onVodPlayerProgress:
445
+ this.fire(VodPlayerEvents.onVodPlayerProgress, data.msPos);
446
+ break;
447
+ case VodPlayerEvents.onVodPlayerPaused:
448
+ this.fire(VodPlayerEvents.onVodPlayerPaused);
449
+ break;
450
+ case VodPlayerEvents.onVodPlayerResumed:
451
+ this.fire(VodPlayerEvents.onVodPlayerResumed);
452
+ break;
453
+ case VodPlayerEvents.onVodPlayerStopped:
454
+ this.fire(VodPlayerEvents.onVodPlayerStopped, data.reason);
455
+ break;
456
+ case VodPlayerEvents.onVodPlayerError:
457
+ this.fire(VodPlayerEvents.onVodPlayerError, data.error);
458
+ break;
459
+ default:
460
+ this.logger.warn(`unknown vod player event: ${key}`);
461
+ break;
462
+ }
463
+ });
464
+ }
465
+ }
466
+ exports.VodPlayer = VodPlayer;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "trtc-electron-sdk",
3
- "version": "13.1.709-beta.1",
3
+ "version": "13.4.800-alpha.0",
4
4
  "description": "trtc electron sdk",
5
5
  "main": "./liteav/index.js",
6
6
  "types": "./liteav/index.d.ts",