trtc-electron-sdk 13.3.800-alpha.3 → 13.3.800-alpha.4

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.
@@ -25,28 +25,28 @@ export interface YUVFormat {
25
25
  displayHeight?: number;
26
26
  }
27
27
  /**
28
- * Represents underlying image data for a single luma or chroma plane.
29
- * Cannot be interpreted without the format data from a frame buffer.
30
- * @typedef {Object} YUVPlane
31
- * @property {Uint8Array} bytes - typed array containing image data bytes
32
- * @property {number} stride - byte distance between rows in data
33
- */
28
+ * Represents underlying image data for a single luma or chroma plane.
29
+ * Cannot be interpreted without the format data from a frame buffer.
30
+ * @typedef {Object} YUVPlane
31
+ * @property {Uint8Array} bytes - typed array containing image data bytes
32
+ * @property {number} stride - byte distance between rows in data
33
+ */
34
34
  export interface YUVPlane {
35
35
  bytes: Uint8Array;
36
36
  stride: number;
37
37
  }
38
38
  /**
39
- * Represents a YUV image frame buffer, with enough format information
40
- * to interpret the data usefully. Buffer objects use generic objects
41
- * under the hood and can be transferred between worker threads using
42
- * the structured clone algorithm.
43
- *
44
- * @typedef {Object} YUVFrame
45
- * @property {YUVFormat} format
46
- * @property {YUVPlane} y
47
- * @property {YUVPlane} u
48
- * @property {YUVPlane} v
49
- */
39
+ * Represents a YUV image frame buffer, with enough format information
40
+ * to interpret the data usefully. Buffer objects use generic objects
41
+ * under the hood and can be transferred between worker threads using
42
+ * the structured clone algorithm.
43
+ *
44
+ * @typedef {Object} YUVFrame
45
+ * @property {YUVFormat} format
46
+ * @property {YUVPlane} y
47
+ * @property {YUVPlane} u
48
+ * @property {YUVPlane} v
49
+ */
50
50
  export interface YUVFrame {
51
51
  format: YUVFormat;
52
52
  y: YUVPlane;
@@ -166,12 +166,12 @@ var YUVBuffer = {
166
166
  stride = stride || this.suitableStride(width);
167
167
  this.validateDimension(stride);
168
168
  if (stride < width) {
169
- throw "Invalid input stride for YUV plane; must be larger than width";
169
+ throw 'Invalid input stride for YUV plane; must be larger than width';
170
170
  }
171
171
  size = stride * height;
172
172
  if (source) {
173
173
  if (source.length - offset < size) {
174
- throw "Invalid input buffer for YUV plane; must be large enough for stride times height";
174
+ throw 'Invalid input buffer for YUV plane; must be large enough for stride times height';
175
175
  }
176
176
  bytes = source; // source.slice(offset, offset + size);
177
177
  }
package/liteav/index.d.ts CHANGED
@@ -1,7 +1,6 @@
1
1
  export * from './trtc_define';
2
2
  export * from './trtc_code';
3
3
  export * from './vod_player';
4
- export { VodPlayerEvents, VodPlayerEventMap, IVodPlayer } from './types';
5
4
  export * from './extensions/DeviceManager';
6
5
  export * from './extensions/AudioEffectManager';
7
6
  export * from './extensions/MediaMixingManager';
package/liteav/index.js CHANGED
@@ -13,12 +13,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
13
13
  return (mod && mod.__esModule) ? mod : { "default": mod };
14
14
  };
15
15
  Object.defineProperty(exports, "__esModule", { value: true });
16
- exports.VodPlayerEvents = void 0;
17
16
  __exportStar(require("./trtc_define"), exports);
18
17
  __exportStar(require("./trtc_code"), exports);
19
18
  __exportStar(require("./vod_player"), exports);
20
- var types_1 = require("./types");
21
- Object.defineProperty(exports, "VodPlayerEvents", { enumerable: true, get: function () { return types_1.VodPlayerEvents; } });
22
19
  __exportStar(require("./extensions/DeviceManager"), exports);
23
20
  __exportStar(require("./extensions/AudioEffectManager"), exports);
24
21
  __exportStar(require("./extensions/MediaMixingManager"), exports);
package/liteav/trtc.d.ts CHANGED
@@ -545,8 +545,8 @@ declare class TRTCCloud extends EventEmitter implements ITRTCCloud {
545
545
  * 当房间中的某个用户使用 [sendSEIMsg()]{@link TRTCCloud#sendSEIMsg} 发送数据时,房间中的其它用户可以通过 onRecvSEIMsg 接口接收数据。
546
546
  *
547
547
  * @event TRTCCallback#onRecvSEIMsg
548
- * @param {String} userId - 用户标识
549
- * @param {String} message - 数据
548
+ * @param {String} userId - 用户标识
549
+ * @param {ArrayBuffer} message - 原始字节(二进制安全)。文本数据可用 TextDecoder 解码。
550
550
  */
551
551
  private handleOnRecvSEIMsg;
552
552
  /**
@@ -2423,11 +2423,13 @@ declare class TRTCCloud extends EventEmitter implements ITRTCCloud {
2423
2423
  * - 若指定多次发送(repeatCount>1),则数据会被带在后续的连续 repeatCount 个视频帧中发送出去,同样会导致视频码率增大。
2424
2424
  * - 如果 repeatCount>1,多次发送,接收消息 onRecvSEIMsg 回调也可能会收到多次相同的消息,需要去重。
2425
2425
  *
2426
- * @param {String} msg - 待发送的数据,最大支持1kb(1000字节)的数据大小
2426
+ * @param {ArrayBuffer | ArrayBufferView} msg - 待发送的原始字节数据,最大支持 1KB(1000 字节)。
2427
+ * 必须为 ArrayBuffer / Uint8Array / Buffer 等二进制类型,以便与其它平台(Android / iOS / 原生 C++)二进制互通。
2428
+ * 如需发送文本,请调用方先用 `new TextEncoder().encode(text)` 编码成字节。
2427
2429
  * @param {Number} repeatCount - 发送数据次数
2428
2430
  * @return {Boolean} true:消息已通过限制,等待后续视频帧发送;false:消息被限制发送
2429
2431
  */
2430
- sendSEIMsg(msg: string, repeatCount: number): boolean;
2432
+ sendSEIMsg(msg: ArrayBuffer | ArrayBufferView, repeatCount: number): boolean;
2431
2433
  /**
2432
2434
  * 废弃接口: 启动播放背景音乐
2433
2435
  *
package/liteav/trtc.js CHANGED
@@ -29,8 +29,9 @@ const yuv_buffer_1 = __importDefault(require("./Renderer/yuv-buffer"));
29
29
  // @ts-ignore
30
30
  const YCbCr_1 = __importDefault(require("yuv-canvas/src/YCbCr"));
31
31
  const LocalMediaTranscoder_1 = __importDefault(require("./LocalMediaTranscoder"));
32
- const trtc_define_1 = require("./trtc_define");
33
32
  const utils_1 = require("./utils");
33
+ const trtc_define_1 = require("./trtc_define");
34
+ const utils_2 = require("./utils");
34
35
  const validate_util_1 = require("./validate-util");
35
36
  const logger_1 = __importStar(require("./logger"));
36
37
  const LocalVideoRenderController_1 = __importDefault(require("./VideoRenderControl/LocalVideoRenderController"));
@@ -1177,11 +1178,13 @@ class TRTCCloud extends events_1.EventEmitter {
1177
1178
  * 当房间中的某个用户使用 [sendSEIMsg()]{@link TRTCCloud#sendSEIMsg} 发送数据时,房间中的其它用户可以通过 onRecvSEIMsg 接口接收数据。
1178
1179
  *
1179
1180
  * @event TRTCCallback#onRecvSEIMsg
1180
- * @param {String} userId - 用户标识
1181
- * @param {String} message - 数据
1181
+ * @param {String} userId - 用户标识
1182
+ * @param {ArrayBuffer} message - 原始字节(二进制安全)。文本数据可用 TextDecoder 解码。
1182
1183
  */
1183
1184
  handleOnRecvSEIMsg(userId, message) {
1184
- this.fire('onRecvSEIMsg', userId, message);
1185
+ // 复制为独立 ArrayBuffer,避免底层存储被复用导致数据错乱
1186
+ const ab = (0, utils_1.toIndependentArrayBuffer)(message);
1187
+ this.fire('onRecvSEIMsg', userId, ab);
1185
1188
  }
1186
1189
  /////////////////////////////////////////////////////////////////////////////////
1187
1190
  //
@@ -4142,12 +4145,15 @@ class TRTCCloud extends events_1.EventEmitter {
4142
4145
  * - 若指定多次发送(repeatCount>1),则数据会被带在后续的连续 repeatCount 个视频帧中发送出去,同样会导致视频码率增大。
4143
4146
  * - 如果 repeatCount>1,多次发送,接收消息 onRecvSEIMsg 回调也可能会收到多次相同的消息,需要去重。
4144
4147
  *
4145
- * @param {String} msg - 待发送的数据,最大支持1kb(1000字节)的数据大小
4148
+ * @param {ArrayBuffer | ArrayBufferView} msg - 待发送的原始字节数据,最大支持 1KB(1000 字节)。
4149
+ * 必须为 ArrayBuffer / Uint8Array / Buffer 等二进制类型,以便与其它平台(Android / iOS / 原生 C++)二进制互通。
4150
+ * 如需发送文本,请调用方先用 `new TextEncoder().encode(text)` 编码成字节。
4146
4151
  * @param {Number} repeatCount - 发送数据次数
4147
4152
  * @return {Boolean} true:消息已通过限制,等待后续视频帧发送;false:消息被限制发送
4148
4153
  */
4149
4154
  sendSEIMsg(msg, repeatCount) {
4150
- return this.rtcCloud.sendSEIMsg(msg, repeatCount);
4155
+ const payload = (0, utils_1.normalizeSEIPayload)(msg);
4156
+ return this.rtcCloud.sendSEIMsg(payload, repeatCount);
4151
4157
  }
4152
4158
  /////////////////////////////////////////////////////////////////////////////////
4153
4159
  //
@@ -5351,7 +5357,7 @@ class TRTCCloud extends events_1.EventEmitter {
5351
5357
  return rgbaData;
5352
5358
  }
5353
5359
  _isMacPlatform() {
5354
- return (0, utils_1.isMacOS)();
5360
+ return (0, utils_2.isMacOS)();
5355
5361
  }
5356
5362
  _setRemoteVideoBuffer(userId, streamType) {
5357
5363
  const videoBufferInfo = new trtc_define_1.VideoBufferInfo({
@@ -1125,3 +1125,85 @@ export interface TRTCInitConfig {
1125
1125
  };
1126
1126
  isIPCMode?: boolean;
1127
1127
  }
1128
+ /**
1129
+ * @namespace TRTCVodPlayerEvent
1130
+ * @description 点播播放器(VOD Player)事件
1131
+ */
1132
+ export declare enum TRTCVodPlayerEvent {
1133
+ /**
1134
+ * @description 多媒体文件开始播放事件
1135
+ *
1136
+ * @event TRTCVodPlayerEvent#onVodPlayerStarted
1137
+ * @param {Number} msLength 多媒体文件总长度,单位毫秒
1138
+ */
1139
+ onVodPlayerStarted = "onVodPlayerStarted",
1140
+ /**
1141
+ * @description 播放器就绪事件
1142
+ *
1143
+ * 调用 `preload()` 完成后触发,或 `switchSource()` 切换成功后触发。
1144
+ *
1145
+ * @event TRTCVodPlayerEvent#onVodPlayerLoaded
1146
+ * @param {Number} durationMs 视频总时长,单位毫秒
1147
+ * @param {Number} width 视频宽度(像素),纯音频文件时为 0
1148
+ * @param {Number} height 视频高度(像素),纯音频文件时为 0
1149
+ */
1150
+ onVodPlayerLoaded = "onVodPlayerLoaded",
1151
+ /**
1152
+ * @description 多媒体文件播放进度改变事件
1153
+ *
1154
+ * @event TRTCVodPlayerEvent#onVodPlayerProgress
1155
+ * @param {Number} msPos 多媒体文件当前播放进度,单位毫秒
1156
+ */
1157
+ onVodPlayerProgress = "onVodPlayerProgress",
1158
+ /**
1159
+ * @description 多媒体文件播放暂停事件
1160
+ *
1161
+ * @event TRTCVodPlayerEvent#onVodPlayerPaused
1162
+ */
1163
+ onVodPlayerPaused = "onVodPlayerPaused",
1164
+ /**
1165
+ * @description 多媒体文件播放恢复事件
1166
+ *
1167
+ * @event TRTCVodPlayerEvent#onVodPlayerResumed
1168
+ */
1169
+ onVodPlayerResumed = "onVodPlayerResumed",
1170
+ /**
1171
+ * @description 多媒体文件播放停止事件
1172
+ *
1173
+ * @event TRTCVodPlayerEvent#onVodPlayerStopped
1174
+ * @param {Number} reason 停止原因
1175
+ * - 0:用户主动停止;
1176
+ * - 1:文件播放完;
1177
+ * - 2:视频断流。
1178
+ */
1179
+ onVodPlayerStopped = "onVodPlayerStopped",
1180
+ /**
1181
+ * @description 多媒体文件播放出错事件
1182
+ *
1183
+ * @event TRTCVodPlayerEvent#onVodPlayerError
1184
+ * @param {Number} error 错误码
1185
+ * - -6001:未知错误;
1186
+ * - -6002:通用错误;
1187
+ * - -6003:解封装失败;
1188
+ * - -6005:解封装超时;
1189
+ * - -6006:视频解码错误;
1190
+ * - -6007:音频解码错误;
1191
+ * - -6009:视频渲染错误。
1192
+ */
1193
+ onVodPlayerError = "onVodPlayerError"
1194
+ }
1195
+ /**
1196
+ * 点播播放器事件监听器类型定义
1197
+ *
1198
+ * key 为 {@link TRTCVodPlayerEvent},value 为该事件回调接收的参数元组。
1199
+ * 用于在 TS 层实现事件名到回调参数的精确类型映射,避免 any 滥用。
1200
+ */
1201
+ export interface TRTCVodPlayerEventMap {
1202
+ [TRTCVodPlayerEvent.onVodPlayerStarted]: [msLength: number];
1203
+ [TRTCVodPlayerEvent.onVodPlayerLoaded]: [durationMs: number, width: number, height: number];
1204
+ [TRTCVodPlayerEvent.onVodPlayerProgress]: [msPos: number];
1205
+ [TRTCVodPlayerEvent.onVodPlayerPaused]: [];
1206
+ [TRTCVodPlayerEvent.onVodPlayerResumed]: [];
1207
+ [TRTCVodPlayerEvent.onVodPlayerStopped]: [reason: number];
1208
+ [TRTCVodPlayerEvent.onVodPlayerError]: [error: number];
1209
+ }
@@ -7,7 +7,7 @@
7
7
  */
8
8
  Object.defineProperty(exports, "__esModule", { value: true });
9
9
  exports.TRTCTranscodingConfig = exports.TRTCPluginType = exports.TRTCVoiceChangerType = exports.TRTCVoiceReverbType = exports.TRTCPublishMode = exports.TRTCAudioRecordingContent = exports.TRTCMixInputType = exports.TRTCTranscodingConfigMode = exports.TRTCMixUser = exports.Rect = exports.TRTCSpeedTestResult = exports.TRTCSpeedTestParams = exports.TRTCVolumeInfo = exports.TRTCQualityInfo = exports.TRTCNetworkQosParam = exports.TRTCRenderParams = exports.TRTCVideoEncParam = exports.TRTCParams = exports.TRTCWaterMarkSrcType = exports.TRTCVideoEncodeComplexity = exports.TRTCVideoColorSpace = exports.TRTCVideoColorRange = exports.TRTCCameraCaptureMode = exports.TRTCDeviceType = exports.TRTCDeviceState = exports.TRTCLogLevel = exports.TRTCAudioFrame = exports.TRTCVideoFrame = exports.TRTCDeviceInfo = exports.TRTCScreenCaptureProperty = exports.TRTCScreenCaptureSourceInfo = exports.TRTCImageBuffer = exports.TRTCAudioQuality = exports.TRTCScreenCaptureSourceType = exports.TRTCAudioFrameFormat = exports.TRTCVideoQosPreference = exports.TRTCQosControlMode = exports.TRTCRoleType = exports.TRTCAppScene = exports.TRTCRecordType = exports.TRTCVideoMirrorType = exports.TRTCVideoBufferType = exports.TRTCVideoPixelFormat = exports.TRTCBeautyStyle = exports.TRTCVideoRotation = exports.TRTCVideoFillMode = exports.TRTCQuality = exports.TRTCVideoStreamType = exports.TRTCVideoResolutionMode = exports.TRTCVideoResolution = void 0;
10
- exports.VideoBufferInfo = exports.TRTCSwitchRoomParam = exports.AudioMusicParam = exports.TRTCStatistics = exports.TRTCRemoteStatistics = exports.TRTCLocalStatistics = exports.TRTCAudioEffectParam = exports.TRTCAudioRecordingParams = exports.TRTCPublishCDNParam = void 0;
10
+ exports.TRTCVodPlayerEvent = exports.VideoBufferInfo = exports.TRTCSwitchRoomParam = exports.AudioMusicParam = exports.TRTCStatistics = exports.TRTCRemoteStatistics = exports.TRTCLocalStatistics = exports.TRTCAudioEffectParam = exports.TRTCAudioRecordingParams = exports.TRTCPublishCDNParam = void 0;
11
11
  const util_1 = require("./Renderer/util");
12
12
  /////////////////////////////////////////////////////////////////////////////////
13
13
  //
@@ -2032,3 +2032,76 @@ class VideoBufferInfo {
2032
2032
  }
2033
2033
  }
2034
2034
  exports.VideoBufferInfo = VideoBufferInfo;
2035
+ /////////////////////////////////////////////////////////////////////////////////
2036
+ //
2037
+ // TRTCVodPlayer 相关类型定义
2038
+ //
2039
+ /////////////////////////////////////////////////////////////////////////////////
2040
+ /**
2041
+ * @namespace TRTCVodPlayerEvent
2042
+ * @description 点播播放器(VOD Player)事件
2043
+ */
2044
+ var TRTCVodPlayerEvent;
2045
+ (function (TRTCVodPlayerEvent) {
2046
+ /**
2047
+ * @description 多媒体文件开始播放事件
2048
+ *
2049
+ * @event TRTCVodPlayerEvent#onVodPlayerStarted
2050
+ * @param {Number} msLength 多媒体文件总长度,单位毫秒
2051
+ */
2052
+ TRTCVodPlayerEvent["onVodPlayerStarted"] = "onVodPlayerStarted";
2053
+ /**
2054
+ * @description 播放器就绪事件
2055
+ *
2056
+ * 调用 `preload()` 完成后触发,或 `switchSource()` 切换成功后触发。
2057
+ *
2058
+ * @event TRTCVodPlayerEvent#onVodPlayerLoaded
2059
+ * @param {Number} durationMs 视频总时长,单位毫秒
2060
+ * @param {Number} width 视频宽度(像素),纯音频文件时为 0
2061
+ * @param {Number} height 视频高度(像素),纯音频文件时为 0
2062
+ */
2063
+ TRTCVodPlayerEvent["onVodPlayerLoaded"] = "onVodPlayerLoaded";
2064
+ /**
2065
+ * @description 多媒体文件播放进度改变事件
2066
+ *
2067
+ * @event TRTCVodPlayerEvent#onVodPlayerProgress
2068
+ * @param {Number} msPos 多媒体文件当前播放进度,单位毫秒
2069
+ */
2070
+ TRTCVodPlayerEvent["onVodPlayerProgress"] = "onVodPlayerProgress";
2071
+ /**
2072
+ * @description 多媒体文件播放暂停事件
2073
+ *
2074
+ * @event TRTCVodPlayerEvent#onVodPlayerPaused
2075
+ */
2076
+ TRTCVodPlayerEvent["onVodPlayerPaused"] = "onVodPlayerPaused";
2077
+ /**
2078
+ * @description 多媒体文件播放恢复事件
2079
+ *
2080
+ * @event TRTCVodPlayerEvent#onVodPlayerResumed
2081
+ */
2082
+ TRTCVodPlayerEvent["onVodPlayerResumed"] = "onVodPlayerResumed";
2083
+ /**
2084
+ * @description 多媒体文件播放停止事件
2085
+ *
2086
+ * @event TRTCVodPlayerEvent#onVodPlayerStopped
2087
+ * @param {Number} reason 停止原因
2088
+ * - 0:用户主动停止;
2089
+ * - 1:文件播放完;
2090
+ * - 2:视频断流。
2091
+ */
2092
+ TRTCVodPlayerEvent["onVodPlayerStopped"] = "onVodPlayerStopped";
2093
+ /**
2094
+ * @description 多媒体文件播放出错事件
2095
+ *
2096
+ * @event TRTCVodPlayerEvent#onVodPlayerError
2097
+ * @param {Number} error 错误码
2098
+ * - -6001:未知错误;
2099
+ * - -6002:通用错误;
2100
+ * - -6003:解封装失败;
2101
+ * - -6005:解封装超时;
2102
+ * - -6006:视频解码错误;
2103
+ * - -6007:音频解码错误;
2104
+ * - -6009:视频渲染错误。
2105
+ */
2106
+ TRTCVodPlayerEvent["onVodPlayerError"] = "onVodPlayerError";
2107
+ })(TRTCVodPlayerEvent = exports.TRTCVodPlayerEvent || (exports.TRTCVodPlayerEvent = {}));
package/liteav/types.d.ts CHANGED
@@ -1,30 +1,12 @@
1
1
  import TRTCMediaMixingManager, { TRTCMediaMixingService } from './extensions/MediaMixingManager';
2
- import { AudioMusicParam, Rect, TRTCAppScene, TRTCAudioQuality, TRTCBeautyStyle, TRTCDeviceType, TRTCLogLevel, TRTCAudioFrame, TRTCVideoFillMode, TRTCVideoRotation, TRTCVideoStreamType, TRTCWaterMarkSrcType, TRTCPluginType, TRTCPluginInfo, TRTCVideoProcessPluginOptions, TRTCMediaEncryptDecryptPluginOptions, TRTCAudioRecordingParams, TRTCScreenCaptureSourceInfo, TRTCScreenCaptureProperty, TRTCSpeedTestParams, TRTCRecordType, TRTCDeviceInfo, TRTCCameraCaptureParams, TRTCImageBuffer, TRTCInitConfig, TRTCAudioParallelParams, TRTCVoiceReverbType, TRTCVoiceChangerType, TRTCMusicPlayObserver, TRTCAudioFrameCallback, TRTCAudioProcessPluginOptions, TRTCPublishTarget, TRTCStreamEncoderParam, TRTCStreamMixingConfig, TRTCRenderParams, TRTCRoleType, TRTCSwitchRoomParam, TRTCVideoFrame, TRTCVideoPixelFormat, TRTCVideoBufferType } from './trtc_define';
2
+ import { AudioMusicParam, Rect, TRTCAppScene, TRTCAudioQuality, TRTCBeautyStyle, TRTCDeviceType, TRTCLogLevel, TRTCAudioFrame, TRTCVideoFillMode, TRTCVideoRotation, TRTCVideoStreamType, TRTCWaterMarkSrcType, TRTCPluginType, TRTCPluginInfo, TRTCVideoProcessPluginOptions, TRTCMediaEncryptDecryptPluginOptions, TRTCAudioRecordingParams, TRTCScreenCaptureSourceInfo, TRTCScreenCaptureProperty, TRTCSpeedTestParams, TRTCRecordType, TRTCDeviceInfo, TRTCCameraCaptureParams, TRTCImageBuffer, TRTCInitConfig, TRTCAudioParallelParams, TRTCVoiceReverbType, TRTCVoiceChangerType, TRTCMusicPlayObserver, TRTCAudioFrameCallback, TRTCAudioProcessPluginOptions, TRTCPublishTarget, TRTCStreamEncoderParam, TRTCStreamMixingConfig, TRTCRenderParams, TRTCRoleType, TRTCSwitchRoomParam, TRTCVideoFrame, TRTCVideoPixelFormat, TRTCVideoBufferType, TRTCVodPlayerEventMap } from './trtc_define';
3
3
  export interface TRTCVideoRenderCallback {
4
4
  onRenderVideoFrame(userId: string, streamType: TRTCVideoStreamType, frame: TRTCVideoFrame): void;
5
5
  }
6
- export declare enum VodPlayerEvents {
7
- onVodPlayerStarted = "onVodPlayerStarted",
8
- onVodPlayerLoaded = "onVodPlayerLoaded",
9
- onVodPlayerProgress = "onVodPlayerProgress",
10
- onVodPlayerPaused = "onVodPlayerPaused",
11
- onVodPlayerResumed = "onVodPlayerResumed",
12
- onVodPlayerStopped = "onVodPlayerStopped",
13
- onVodPlayerError = "onVodPlayerError"
14
- }
15
- export interface VodPlayerEventMap {
16
- [VodPlayerEvents.onVodPlayerStarted]: [msLength: number];
17
- [VodPlayerEvents.onVodPlayerLoaded]: [durationMs: number, width: number, height: number];
18
- [VodPlayerEvents.onVodPlayerProgress]: [msPos: number];
19
- [VodPlayerEvents.onVodPlayerPaused]: [];
20
- [VodPlayerEvents.onVodPlayerResumed]: [];
21
- [VodPlayerEvents.onVodPlayerStopped]: [reason: number];
22
- [VodPlayerEvents.onVodPlayerError]: [error: number];
23
- }
24
6
  export interface IVodPlayer {
25
- on<K extends keyof VodPlayerEventMap>(event: K, listener: (...args: VodPlayerEventMap[K]) => void): this;
7
+ on<K extends keyof TRTCVodPlayerEventMap>(event: K, listener: (...args: TRTCVodPlayerEventMap[K]) => void): this;
26
8
  on(event: string | symbol, listener: (...args: any[]) => void): this;
27
- off<K extends keyof VodPlayerEventMap>(event: K, listener: (...args: VodPlayerEventMap[K]) => void): this;
9
+ off<K extends keyof TRTCVodPlayerEventMap>(event: K, listener: (...args: TRTCVodPlayerEventMap[K]) => void): this;
28
10
  off(event: string | symbol, listener: (...args: any[]) => void): this;
29
11
  setView(view: HTMLElement | null): void;
30
12
  setRenderRotation(rotation: TRTCVideoRotation): void;
@@ -46,7 +28,6 @@ export interface IVodPlayer {
46
28
  publishAudio(): void;
47
29
  unpublishVideo(): void;
48
30
  unpublishAudio(): void;
49
- destroy(): void;
50
31
  }
51
32
  export interface ITRTCCloud {
52
33
  createSubCloud(config?: TRTCInitConfig): ITRTCCloud | null;
@@ -150,7 +131,7 @@ export interface ITRTCCloud {
150
131
  generateCustomPTS(): number;
151
132
  setAudioFrameCallback(callback: TRTCAudioFrameCallback): void;
152
133
  sendCustomCmdMsg(cmdId: number, msg: string, reliable: boolean, ordered: boolean): boolean;
153
- sendSEIMsg(msg: string, repeatCount: number): boolean;
134
+ sendSEIMsg(msg: ArrayBuffer | ArrayBufferView, repeatCount: number): boolean;
154
135
  startSystemAudioLoopback(path?: string | null): void;
155
136
  stopSystemAudioLoopback(): void;
156
137
  setSystemAudioLoopbackVolume(volume: number): void;
package/liteav/types.js CHANGED
@@ -1,13 +1,2 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.VodPlayerEvents = void 0;
4
- var VodPlayerEvents;
5
- (function (VodPlayerEvents) {
6
- VodPlayerEvents["onVodPlayerStarted"] = "onVodPlayerStarted";
7
- VodPlayerEvents["onVodPlayerLoaded"] = "onVodPlayerLoaded";
8
- VodPlayerEvents["onVodPlayerProgress"] = "onVodPlayerProgress";
9
- VodPlayerEvents["onVodPlayerPaused"] = "onVodPlayerPaused";
10
- VodPlayerEvents["onVodPlayerResumed"] = "onVodPlayerResumed";
11
- VodPlayerEvents["onVodPlayerStopped"] = "onVodPlayerStopped";
12
- VodPlayerEvents["onVodPlayerError"] = "onVodPlayerError";
13
- })(VodPlayerEvents = exports.VodPlayerEvents || (exports.VodPlayerEvents = {}));
package/liteav/utils.d.ts CHANGED
@@ -39,3 +39,23 @@ export declare function getOS(): string;
39
39
  export declare function isMacOS(): boolean;
40
40
  export declare function isWindows(): boolean;
41
41
  export declare function isLinux(): boolean;
42
+ /**
43
+ * 把 sendSEIMsg 的 JS 入参(ArrayBuffer / TypedArray / DataView 等)规范化为 Uint8Array。
44
+ *
45
+ * - 字符串入参不再支持,由调用方自行 `TextEncoder().encode(...)` 后传入;
46
+ * - 对 TypedArray / DataView 视图保留原始 byteOffset / byteLength,不会把整段底层
47
+ * ArrayBuffer 当成数据;
48
+ * - 类型不匹配时抛 `TypeError`,与 Native 层的报错文案保持一致。
49
+ */
50
+ export declare function normalizeSEIPayload(input: ArrayBuffer | ArrayBufferView): Uint8Array;
51
+ /**
52
+ * 把 native 回调里收到的二进制对象(Uint8Array / Buffer / ArrayBuffer)统一转成
53
+ * 一个 **独立的** ArrayBuffer,对外暴露给业务层。
54
+ *
55
+ * 为什么要"独立":
56
+ * - Node Buffer / TypedArray 的 `.buffer` 是 native 复用的存储区,可能被后续事件
57
+ * 覆写;直接 fire 出去会出现"业务层拿到的 message 跟下一帧消息字节错乱"。
58
+ * - 这里通过 `new ArrayBuffer + Uint8Array.set` 显式拷贝,避免 `slice() as ArrayBuffer`
59
+ * 的不严谨断言(slice 返回类型为 `ArrayBufferLike`,可能是 SharedArrayBuffer)。
60
+ */
61
+ export declare function toIndependentArrayBuffer(message: Uint8Array | ArrayBuffer): ArrayBuffer;
package/liteav/utils.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.isLinux = exports.isWindows = exports.isMacOS = exports.getOS = exports.throttle = exports.debounce = exports.convertUint8ArrayToNumber = exports.safelyParse = exports.isNullOrUndefined = exports.isUndefined = exports.isNull = void 0;
3
+ exports.toIndependentArrayBuffer = exports.normalizeSEIPayload = exports.isLinux = exports.isWindows = exports.isMacOS = exports.getOS = exports.throttle = exports.debounce = exports.convertUint8ArrayToNumber = exports.safelyParse = exports.isNullOrUndefined = exports.isUndefined = exports.isNull = void 0;
4
4
  function isNull(val) {
5
5
  return val === null;
6
6
  }
@@ -167,3 +167,49 @@ function isLinux() {
167
167
  return getOS() === 'linux';
168
168
  }
169
169
  exports.isLinux = isLinux;
170
+ // ─── SEI 二进制收发编解码 ───────────────────────────────────────────
171
+ //
172
+ // 供中文/英文两版 TRTCCloud 共用,避免在 trtc.ts / trtc_en.ts 维护两份
173
+ // 完全一致的本地化逻辑。
174
+ /**
175
+ * 把 sendSEIMsg 的 JS 入参(ArrayBuffer / TypedArray / DataView 等)规范化为 Uint8Array。
176
+ *
177
+ * - 字符串入参不再支持,由调用方自行 `TextEncoder().encode(...)` 后传入;
178
+ * - 对 TypedArray / DataView 视图保留原始 byteOffset / byteLength,不会把整段底层
179
+ * ArrayBuffer 当成数据;
180
+ * - 类型不匹配时抛 `TypeError`,与 Native 层的报错文案保持一致。
181
+ */
182
+ function normalizeSEIPayload(input) {
183
+ if (input instanceof ArrayBuffer) {
184
+ return new Uint8Array(input);
185
+ }
186
+ if (ArrayBuffer.isView(input)) {
187
+ return new Uint8Array(input.buffer, input.byteOffset, input.byteLength);
188
+ }
189
+ throw new TypeError('sendSEIMsg: msg must be ArrayBuffer, TypedArray or Buffer');
190
+ }
191
+ exports.normalizeSEIPayload = normalizeSEIPayload;
192
+ /**
193
+ * 把 native 回调里收到的二进制对象(Uint8Array / Buffer / ArrayBuffer)统一转成
194
+ * 一个 **独立的** ArrayBuffer,对外暴露给业务层。
195
+ *
196
+ * 为什么要"独立":
197
+ * - Node Buffer / TypedArray 的 `.buffer` 是 native 复用的存储区,可能被后续事件
198
+ * 覆写;直接 fire 出去会出现"业务层拿到的 message 跟下一帧消息字节错乱"。
199
+ * - 这里通过 `new ArrayBuffer + Uint8Array.set` 显式拷贝,避免 `slice() as ArrayBuffer`
200
+ * 的不严谨断言(slice 返回类型为 `ArrayBufferLike`,可能是 SharedArrayBuffer)。
201
+ */
202
+ function toIndependentArrayBuffer(message) {
203
+ if (message instanceof ArrayBuffer) {
204
+ // 收到的就是裸 ArrayBuffer 时也做一次拷贝,统一上层语义:
205
+ // "事件回调里拿到的 message 永远是一份独立内存"。
206
+ const copy = new ArrayBuffer(message.byteLength);
207
+ new Uint8Array(copy).set(new Uint8Array(message));
208
+ return copy;
209
+ }
210
+ // Uint8Array / Buffer 共用的视图分支。
211
+ const copy = new ArrayBuffer(message.byteLength);
212
+ new Uint8Array(copy).set(message);
213
+ return copy;
214
+ }
215
+ exports.toIndependentArrayBuffer = toIndependentArrayBuffer;
@@ -1,5 +1,5 @@
1
- import { TRTCVideoRotation, TRTCVideoFillMode } from './trtc_define';
2
- import { IVodPlayer, VodPlayerEventMap } from './types';
1
+ import { TRTCVideoRotation, TRTCVideoFillMode, TRTCVodPlayerEventMap } from './trtc_define';
2
+ import { IVodPlayer } from './types';
3
3
  /**
4
4
  *
5
5
  * 腾讯云点播播放器
@@ -7,25 +7,23 @@ import { IVodPlayer, VodPlayerEventMap } from './types';
7
7
  * 用于播放本地或在线的音视频文件,支持视频渲染、音量控制、
8
8
  * 进度控制、TRTC 推流等功能。
9
9
  *
10
- * @version v13.4.800
10
+ * @version v13.3.800
11
11
  *
12
12
  * @example
13
- * import { VodPlayer, VodPlayerEvents } from 'trtc-electron-sdk';
13
+ * import { TRTCVodPlayer, TRTCVodPlayerEvent } from 'trtc-electron-sdk';
14
14
  *
15
- * const player = VodPlayer.createVodPlayer('/path/to/video.mp4', false);
16
- * player.on(VodPlayerEvents.onVodPlayerStarted, (msLength) => {
15
+ * const player = TRTCVodPlayer.createVodPlayer('/path/to/video.mp4', false);
16
+ * player.on(TRTCVodPlayerEvent.onVodPlayerStarted, (msLength) => {
17
17
  * console.log('播放开始,总时长:', msLength);
18
18
  * });
19
19
  * player.setView(document.getElementById('video-container')!);
20
20
  * player.start();
21
21
  *
22
22
  * // 使用完毕后销毁
23
- * VodPlayer.releaseVodPlayer(player);
23
+ * TRTCVodPlayer.releaseVodPlayer(player);
24
24
  */
25
- export declare class VodPlayer implements IVodPlayer {
26
- /** `_dataRenderCallback` 中允许连续重置 video buffer 的最大次数,超过后退化为周期日志 */
25
+ export declare class TRTCVodPlayer implements IVodPlayer {
27
26
  private static readonly MAX_BUFFER_RETRY;
28
- /** 重试上限达到后,每隔多少帧打一次 warn 日志(按 30fps 估算 ≈ 2 秒一次) */
29
27
  private static readonly BUFFER_RETRY_LOG_INTERVAL;
30
28
  private nativeVodPlayer;
31
29
  private videoRender;
@@ -33,48 +31,41 @@ export declare class VodPlayer implements IVodPlayer {
33
31
  private isStarted;
34
32
  private isDestroyed;
35
33
  private isRenderPrepared;
36
- /** 数据回调中连续 setVideoBuffer 失败次数(用于 _dataRenderCallback 退避策略) */
37
34
  private _setBufferRetryCount;
38
35
  private logger;
39
36
  private eventEmitter;
40
37
  /**
41
- * 创建 VodPlayer 实例
38
+ * 创建 TRTCVodPlayer 实例
42
39
  *
43
40
  * @param mediaFilePath - 媒体文件路径(本地绝对路径或在线 URL),必填且必须是非空字符串
44
41
  * @param repeat - 是否循环播放,默认 false
45
- * @returns VodPlayer 实例
42
+ * @returns TRTCVodPlayer 实例
46
43
  *
47
44
  * @throws {TypeError} 当 `mediaFilePath` 不是非空字符串时抛出
48
45
  */
49
- static createVodPlayer(mediaFilePath: string, repeat?: boolean): VodPlayer;
46
+ static createVodPlayer(mediaFilePath: string, repeat?: boolean): TRTCVodPlayer;
50
47
  /**
51
- * 销毁 VodPlayer 实例,释放相关资源
48
+ * 销毁 TRTCVodPlayer 实例,释放相关资源
52
49
  *
53
- * @param player - 待销毁的 VodPlayer 实例
50
+ * @param player - 待销毁的 TRTCVodPlayer 实例
54
51
  */
55
- static releaseVodPlayer(player: VodPlayer): void;
52
+ static releaseVodPlayer(player: TRTCVodPlayer): void;
56
53
  private constructor();
57
54
  /**
58
- * 销毁播放器,释放所有资源
59
- *
60
- * 包括:停止播放、销毁渲染器、移除所有事件监听
61
- */
62
- destroy(): void;
63
- /**
64
- * 监听 VodPlayer 事件
55
+ * 监听 TRTCVodPlayer 事件
65
56
  *
66
- * @param event - 事件名称,参考 {@link VodPlayerEvents}
57
+ * @param event - 事件名称,参考 {@link TRTCVodPlayerEvent}
67
58
  * @param listener - 事件回调函数,参数类型根据事件自动推导
68
59
  */
69
- on<K extends keyof VodPlayerEventMap>(event: K, listener: (...args: VodPlayerEventMap[K]) => void): this;
60
+ on<K extends keyof TRTCVodPlayerEventMap>(event: K, listener: (...args: TRTCVodPlayerEventMap[K]) => void): this;
70
61
  on(event: string | symbol, listener: (...args: any[]) => void): this;
71
62
  /**
72
- * 取消监听 VodPlayer 事件
63
+ * 取消监听 TRTCVodPlayer 事件
73
64
  *
74
65
  * @param event - 事件名称
75
66
  * @param listener - 事件回调函数
76
67
  */
77
- off<K extends keyof VodPlayerEventMap>(event: K, listener: (...args: VodPlayerEventMap[K]) => void): this;
68
+ off<K extends keyof TRTCVodPlayerEventMap>(event: K, listener: (...args: TRTCVodPlayerEventMap[K]) => void): this;
78
69
  off(event: string | symbol, listener: (...args: any[]) => void): this;
79
70
  /**
80
71
  * 设置视频渲染的 DOM 容器
@@ -88,12 +79,12 @@ export declare class VodPlayer implements IVodPlayer {
88
79
  /**
89
80
  * 预加载多媒体文件
90
81
  *
91
- * 预加载完成后会触发 {@link VodPlayerEvents.onVodPlayerLoaded} 事件,事件参数携带
82
+ * 预加载完成后会触发 {@link TRTCVodPlayerEvent.onVodPlayerLoaded} 事件,事件参数携带
92
83
  * 媒体信息(时长、宽高);同时 C++ 层会产生首帧并推送到 JS 层的视频渲染管线,
93
84
  * 在 view 上展示首帧画面。
94
85
  *
95
86
  * @example
96
- * player.on(VodPlayerEvents.onVodPlayerLoaded, (durationMs, width, height) => {
87
+ * player.on(TRTCVodPlayerEvent.onVodPlayerLoaded, (durationMs, width, height) => {
97
88
  * console.log('预加载完成:', durationMs, width, height);
98
89
  * player.start();
99
90
  * });
@@ -144,7 +135,7 @@ export declare class VodPlayer implements IVodPlayer {
144
135
  * 无缝切换当前播放的媒体文件
145
136
  *
146
137
  * 在后台预加载新的媒体源,待新源就绪后无缝切换,避免切换时出现黑屏。
147
- * 切换成功后触发 {@link VodPlayerEvents.onVodPlayerLoaded} 事件,携带新文件的媒体信息。
138
+ * 切换成功后触发 {@link TRTCVodPlayerEvent.onVodPlayerLoaded} 事件,携带新文件的媒体信息。
148
139
  *
149
140
  * @param newMediaFile - 新的媒体文件路径或 URL
150
141
  *
@@ -233,6 +224,17 @@ export declare class VodPlayer implements IVodPlayer {
233
224
  * 停止向已关联的 TRTC 实例推送音频流
234
225
  */
235
226
  unpublishAudio(): void;
227
+ /**
228
+ * @private
229
+ * 销毁播放器,释放所有资源
230
+ *
231
+ * 包括:解绑事件监听、停止播放、销毁渲染器、清理 native 回调。
232
+ *
233
+ * 注意:调用本方法后不再向业务方派发任何事件。即便 `stop()` 内部会异步触发
234
+ * `onVodPlayerStopped`,该事件也不会送达,因为监听器已在第一步被清空。
235
+ * 这是 `releaseVodPlayer` 的自然语义(资源释放后不再产生副作用)。
236
+ */
237
+ private _destroy;
236
238
  /**
237
239
  * @private
238
240
  * 将点播播放器关联到 TRTC 实例(用于辅助流推流,绑定后音频播放由 TRTC 接管)
@@ -244,7 +246,8 @@ export declare class VodPlayer implements IVodPlayer {
244
246
  */
245
247
  private detachTRTC;
246
248
  /**
247
- * 类型安全地发射事件,参数类型由 `VodPlayerEventMap` 推导。
249
+ * @private
250
+ * 类型安全地发射事件,参数类型由 `TRTCVodPlayerEventMap` 推导。
248
251
  * 通过 `setImmediate` 让 emit 异步化,避免在 N-API 回调栈中触发用户代码。
249
252
  */
250
253
  private fire;
@@ -1,11 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.VodPlayer = void 0;
3
+ exports.TRTCVodPlayer = void 0;
4
4
  const events_1 = require("events");
5
5
  const trtc_define_1 = require("./trtc_define");
6
6
  const video_render_1 = require("./Live/video-render");
7
7
  const logger_1 = require("./logger");
8
- const types_1 = require("./types");
9
8
  const NodeTRTCEngine = require('../build/Release/trtc_electron_sdk.node');
10
9
  /**
11
10
  *
@@ -14,25 +13,25 @@ const NodeTRTCEngine = require('../build/Release/trtc_electron_sdk.node');
14
13
  * 用于播放本地或在线的音视频文件,支持视频渲染、音量控制、
15
14
  * 进度控制、TRTC 推流等功能。
16
15
  *
17
- * @version v13.4.800
16
+ * @version v13.3.800
18
17
  *
19
18
  * @example
20
- * import { VodPlayer, VodPlayerEvents } from 'trtc-electron-sdk';
19
+ * import { TRTCVodPlayer, TRTCVodPlayerEvent } from 'trtc-electron-sdk';
21
20
  *
22
- * const player = VodPlayer.createVodPlayer('/path/to/video.mp4', false);
23
- * player.on(VodPlayerEvents.onVodPlayerStarted, (msLength) => {
21
+ * const player = TRTCVodPlayer.createVodPlayer('/path/to/video.mp4', false);
22
+ * player.on(TRTCVodPlayerEvent.onVodPlayerStarted, (msLength) => {
24
23
  * console.log('播放开始,总时长:', msLength);
25
24
  * });
26
25
  * player.setView(document.getElementById('video-container')!);
27
26
  * player.start();
28
27
  *
29
28
  * // 使用完毕后销毁
30
- * VodPlayer.releaseVodPlayer(player);
29
+ * TRTCVodPlayer.releaseVodPlayer(player);
31
30
  */
32
- class VodPlayer {
31
+ class TRTCVodPlayer {
33
32
  // ─── 构造函数 ───────────────────────────────────────────────
34
33
  constructor(mediaFilePath, repeat = false) {
35
- this.logger = new logger_1.Logger('VodPlayer');
34
+ this.logger = new logger_1.Logger('TRTCVodPlayer');
36
35
  this.eventEmitter = new events_1.EventEmitter();
37
36
  this._dataRenderCallback = this._dataRenderCallback.bind(this);
38
37
  this.nativeVodPlayer = new NodeTRTCEngine.NodeVodPlayer(mediaFilePath, repeat);
@@ -47,54 +46,44 @@ class VodPlayer {
47
46
  }
48
47
  // ─── 静态工厂方法 ───────────────────────────────────────────
49
48
  /**
50
- * 创建 VodPlayer 实例
49
+ * 创建 TRTCVodPlayer 实例
51
50
  *
52
51
  * @param mediaFilePath - 媒体文件路径(本地绝对路径或在线 URL),必填且必须是非空字符串
53
52
  * @param repeat - 是否循环播放,默认 false
54
- * @returns VodPlayer 实例
53
+ * @returns TRTCVodPlayer 实例
55
54
  *
56
55
  * @throws {TypeError} 当 `mediaFilePath` 不是非空字符串时抛出
57
56
  */
58
57
  static createVodPlayer(mediaFilePath, repeat = false) {
59
58
  if (typeof mediaFilePath !== 'string' || mediaFilePath.length === 0) {
60
- // 空串或非字符串透传到 C++ createTXVodPlayer 行为未定义,提前抛错让调用方立刻发现
61
- throw new TypeError(`VodPlayer.createVodPlayer: mediaFilePath must be a non-empty string, got: ${JSON.stringify(mediaFilePath)}`);
59
+ throw new TypeError(`TRTCVodPlayer.createVodPlayer: mediaFilePath must be a non-empty string, got: ${JSON.stringify(mediaFilePath)}`);
62
60
  }
63
- return new VodPlayer(mediaFilePath, repeat);
61
+ return new TRTCVodPlayer(mediaFilePath, repeat);
64
62
  }
65
63
  /**
66
- * 销毁 VodPlayer 实例,释放相关资源
64
+ * 销毁 TRTCVodPlayer 实例,释放相关资源
67
65
  *
68
- * @param player - 待销毁的 VodPlayer 实例
66
+ * @param player - 待销毁的 TRTCVodPlayer 实例
69
67
  */
70
68
  static releaseVodPlayer(player) {
71
- player.destroy();
69
+ player._destroy();
72
70
  }
73
- // ─── 公开方法 ───────────────────────────────────────────────
74
71
  /**
75
- * 销毁播放器,释放所有资源
72
+ * 监听 TRTCVodPlayer 事件
76
73
  *
77
- * 包括:停止播放、销毁渲染器、移除所有事件监听
74
+ * @param {TRTCVodPlayerEvent} event - 事件名称
75
+ * @param {Function} listener - 事件回调函数,参数随事件类型不同而不同
78
76
  */
79
- destroy() {
80
- var _a, _b;
81
- if (this.isDestroyed) {
82
- this.logger.warn('destroy: player already destroyed');
83
- return;
84
- }
85
- this.logger.info('destroy');
86
- this.stop();
87
- this.isDestroyed = true;
88
- this._destroyVideoRender();
89
- (_a = this.nativeVodPlayer) === null || _a === void 0 ? void 0 : _a.setEventCallback(null);
90
- (_b = this.nativeVodPlayer) === null || _b === void 0 ? void 0 : _b.setDataCallback(null);
91
- this.nativeVodPlayer = null;
92
- this.eventEmitter.removeAllListeners();
93
- }
94
77
  on(event, listener) {
95
78
  this.eventEmitter.on(event, listener);
96
79
  return this;
97
80
  }
81
+ /**
82
+ * 取消监听 TRTCVodPlayer 事件
83
+ *
84
+ * @param {TRTCVodPlayerEvent} event - 事件名称
85
+ * @param {Function} listener - 事件回调函数,必须与 on 时传入的为同一引用
86
+ */
98
87
  off(event, listener) {
99
88
  this.eventEmitter.off(event, listener);
100
89
  return this;
@@ -126,12 +115,12 @@ class VodPlayer {
126
115
  /**
127
116
  * 预加载多媒体文件
128
117
  *
129
- * 预加载完成后会触发 {@link VodPlayerEvents.onVodPlayerLoaded} 事件,事件参数携带
118
+ * 预加载完成后会触发 {@link TRTCVodPlayerEvent.onVodPlayerLoaded} 事件,事件参数携带
130
119
  * 媒体信息(时长、宽高);同时 C++ 层会产生首帧并推送到 JS 层的视频渲染管线,
131
120
  * 在 view 上展示首帧画面。
132
121
  *
133
122
  * @example
134
- * player.on(VodPlayerEvents.onVodPlayerLoaded, (durationMs, width, height) => {
123
+ * player.on(TRTCVodPlayerEvent.onVodPlayerLoaded, (durationMs, width, height) => {
135
124
  * console.log('预加载完成:', durationMs, width, height);
136
125
  * player.start();
137
126
  * });
@@ -262,7 +251,7 @@ class VodPlayer {
262
251
  * 无缝切换当前播放的媒体文件
263
252
  *
264
253
  * 在后台预加载新的媒体源,待新源就绪后无缝切换,避免切换时出现黑屏。
265
- * 切换成功后触发 {@link VodPlayerEvents.onVodPlayerLoaded} 事件,携带新文件的媒体信息。
254
+ * 切换成功后触发 {@link TRTCVodPlayerEvent.onVodPlayerLoaded} 事件,携带新文件的媒体信息。
266
255
  *
267
256
  * @param newMediaFile - 新的媒体文件路径或 URL
268
257
  *
@@ -465,6 +454,33 @@ class VodPlayer {
465
454
  (_a = this.nativeVodPlayer) === null || _a === void 0 ? void 0 : _a.unpublishAudio();
466
455
  }
467
456
  // ─── 内部方法 ───────────────────────────────────────────────
457
+ /**
458
+ * @private
459
+ * 销毁播放器,释放所有资源
460
+ *
461
+ * 包括:解绑事件监听、停止播放、销毁渲染器、清理 native 回调。
462
+ *
463
+ * 注意:调用本方法后不再向业务方派发任何事件。即便 `stop()` 内部会异步触发
464
+ * `onVodPlayerStopped`,该事件也不会送达,因为监听器已在第一步被清空。
465
+ * 这是 `releaseVodPlayer` 的自然语义(资源释放后不再产生副作用)。
466
+ */
467
+ _destroy() {
468
+ var _a, _b;
469
+ if (this.isDestroyed) {
470
+ this.logger.warn('destroy: player already destroyed');
471
+ return;
472
+ }
473
+ this.logger.info('destroy');
474
+ // 先清监听器,确保后续 stop 流程里通过 setImmediate 排队的事件(如 onVodPlayerStopped)
475
+ // 不会再回到业务方。此时 isDestroyed 尚为 false,后续 stop/detachTRTC 仍能正常走完。
476
+ this.eventEmitter.removeAllListeners();
477
+ this.stop();
478
+ this.isDestroyed = true;
479
+ this._destroyVideoRender();
480
+ (_a = this.nativeVodPlayer) === null || _a === void 0 ? void 0 : _a.setEventCallback(null);
481
+ (_b = this.nativeVodPlayer) === null || _b === void 0 ? void 0 : _b.setDataCallback(null);
482
+ this.nativeVodPlayer = null;
483
+ }
468
484
  /**
469
485
  * @private
470
486
  * 将点播播放器关联到 TRTC 实例(用于辅助流推流,绑定后音频播放由 TRTC 接管)
@@ -492,7 +508,8 @@ class VodPlayer {
492
508
  (_a = this.nativeVodPlayer) === null || _a === void 0 ? void 0 : _a.detachTRTC();
493
509
  }
494
510
  /**
495
- * 类型安全地发射事件,参数类型由 `VodPlayerEventMap` 推导。
511
+ * @private
512
+ * 类型安全地发射事件,参数类型由 `TRTCVodPlayerEventMap` 推导。
496
513
  * 通过 `setImmediate` 让 emit 异步化,避免在 N-API 回调栈中触发用户代码。
497
514
  */
498
515
  fire(event, ...args) {
@@ -569,11 +586,11 @@ class VodPlayer {
569
586
  // 但若底层持续失败(例如尺寸一直对不上),不能每帧都重置 buffer——30fps 下每秒会触发 30 次
570
587
  // 跨 N-API 调用,引发明显性能抖动。这里加重试上限:前 N 次正常重置,超过后退避到周期性日志。
571
588
  this._setBufferRetryCount += 1;
572
- if (this._setBufferRetryCount <= VodPlayer.MAX_BUFFER_RETRY) {
573
- this.logger.info(`_dataRenderCallback: renderVideoData returned false (retry ${this._setBufferRetryCount}/${VodPlayer.MAX_BUFFER_RETRY}), re-setting video buffer`);
589
+ if (this._setBufferRetryCount <= TRTCVodPlayer.MAX_BUFFER_RETRY) {
590
+ this.logger.info(`_dataRenderCallback: renderVideoData returned false (retry ${this._setBufferRetryCount}/${TRTCVodPlayer.MAX_BUFFER_RETRY}), re-setting video buffer`);
574
591
  this._setVideoRenderBuffer();
575
592
  }
576
- else if (this._setBufferRetryCount % VodPlayer.BUFFER_RETRY_LOG_INTERVAL === 0) {
593
+ else if (this._setBufferRetryCount % TRTCVodPlayer.BUFFER_RETRY_LOG_INTERVAL === 0) {
577
594
  this.logger.warn(`_dataRenderCallback: renderVideoData keeps failing for ${this._setBufferRetryCount} frames, giving up frame`);
578
595
  }
579
596
  }
@@ -581,28 +598,28 @@ class VodPlayer {
581
598
  var _a;
582
599
  (_a = this.nativeVodPlayer) === null || _a === void 0 ? void 0 : _a.setEventCallback((args) => {
583
600
  switch (args[0]) {
584
- case types_1.VodPlayerEvents.onVodPlayerStarted:
585
- this.fire(types_1.VodPlayerEvents.onVodPlayerStarted, args[1].msLength);
601
+ case trtc_define_1.TRTCVodPlayerEvent.onVodPlayerStarted:
602
+ this.fire(trtc_define_1.TRTCVodPlayerEvent.onVodPlayerStarted, args[1].msLength);
586
603
  break;
587
- case types_1.VodPlayerEvents.onVodPlayerLoaded: {
604
+ case trtc_define_1.TRTCVodPlayerEvent.onVodPlayerLoaded: {
588
605
  const data = args[1];
589
- this.fire(types_1.VodPlayerEvents.onVodPlayerLoaded, data.durationMs, data.width, data.height);
606
+ this.fire(trtc_define_1.TRTCVodPlayerEvent.onVodPlayerLoaded, data.durationMs, data.width, data.height);
590
607
  break;
591
608
  }
592
- case types_1.VodPlayerEvents.onVodPlayerProgress:
593
- this.fire(types_1.VodPlayerEvents.onVodPlayerProgress, args[1].msPos);
609
+ case trtc_define_1.TRTCVodPlayerEvent.onVodPlayerProgress:
610
+ this.fire(trtc_define_1.TRTCVodPlayerEvent.onVodPlayerProgress, args[1].msPos);
594
611
  break;
595
- case types_1.VodPlayerEvents.onVodPlayerPaused:
596
- this.fire(types_1.VodPlayerEvents.onVodPlayerPaused);
612
+ case trtc_define_1.TRTCVodPlayerEvent.onVodPlayerPaused:
613
+ this.fire(trtc_define_1.TRTCVodPlayerEvent.onVodPlayerPaused);
597
614
  break;
598
- case types_1.VodPlayerEvents.onVodPlayerResumed:
599
- this.fire(types_1.VodPlayerEvents.onVodPlayerResumed);
615
+ case trtc_define_1.TRTCVodPlayerEvent.onVodPlayerResumed:
616
+ this.fire(trtc_define_1.TRTCVodPlayerEvent.onVodPlayerResumed);
600
617
  break;
601
- case types_1.VodPlayerEvents.onVodPlayerStopped:
602
- this.fire(types_1.VodPlayerEvents.onVodPlayerStopped, args[1].reason);
618
+ case trtc_define_1.TRTCVodPlayerEvent.onVodPlayerStopped:
619
+ this.fire(trtc_define_1.TRTCVodPlayerEvent.onVodPlayerStopped, args[1].reason);
603
620
  break;
604
- case types_1.VodPlayerEvents.onVodPlayerError:
605
- this.fire(types_1.VodPlayerEvents.onVodPlayerError, args[1].error);
621
+ case trtc_define_1.TRTCVodPlayerEvent.onVodPlayerError:
622
+ this.fire(trtc_define_1.TRTCVodPlayerEvent.onVodPlayerError, args[1].error);
606
623
  break;
607
624
  default: {
608
625
  const exhaustiveCheck = args[0];
@@ -613,8 +630,6 @@ class VodPlayer {
613
630
  });
614
631
  }
615
632
  }
616
- exports.VodPlayer = VodPlayer;
617
- /** `_dataRenderCallback` 中允许连续重置 video buffer 的最大次数,超过后退化为周期日志 */
618
- VodPlayer.MAX_BUFFER_RETRY = 3;
619
- /** 重试上限达到后,每隔多少帧打一次 warn 日志(按 30fps 估算 ≈ 2 秒一次) */
620
- VodPlayer.BUFFER_RETRY_LOG_INTERVAL = 60;
633
+ exports.TRTCVodPlayer = TRTCVodPlayer;
634
+ TRTCVodPlayer.MAX_BUFFER_RETRY = 3;
635
+ TRTCVodPlayer.BUFFER_RETRY_LOG_INTERVAL = 60;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "trtc-electron-sdk",
3
- "version": "13.3.800-alpha.3",
3
+ "version": "13.3.800-alpha.4",
4
4
  "description": "trtc electron sdk",
5
5
  "main": "./liteav/index.js",
6
6
  "types": "./liteav/index.d.ts",