trtc-electron-sdk 13.3.800-alpha.2 → 13.3.801-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.
- package/liteav/Renderer/yuv-buffer.d.ts +17 -17
- package/liteav/Renderer/yuv-buffer.js +2 -2
- package/liteav/index.d.ts +0 -1
- package/liteav/index.js +0 -3
- package/liteav/trtc.d.ts +6 -4
- package/liteav/trtc.js +13 -7
- package/liteav/trtc_define.d.ts +82 -0
- package/liteav/trtc_define.js +74 -1
- package/liteav/types.d.ts +4 -23
- package/liteav/types.js +0 -11
- package/liteav/utils.d.ts +20 -0
- package/liteav/utils.js +47 -1
- package/liteav/vod_player.d.ts +57 -32
- package/liteav/vod_player.js +111 -62
- package/package.json +1 -1
|
@@ -25,28 +25,28 @@ export interface YUVFormat {
|
|
|
25
25
|
displayHeight?: number;
|
|
26
26
|
}
|
|
27
27
|
/**
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
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
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
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
|
|
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
|
|
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}
|
|
549
|
-
* @param {
|
|
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 {
|
|
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:
|
|
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}
|
|
1181
|
-
* @param {
|
|
1181
|
+
* @param {String} userId - 用户标识
|
|
1182
|
+
* @param {ArrayBuffer} message - 原始字节(二进制安全)。文本数据可用 TextDecoder 解码。
|
|
1182
1183
|
*/
|
|
1183
1184
|
handleOnRecvSEIMsg(userId, message) {
|
|
1184
|
-
|
|
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 {
|
|
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
|
-
|
|
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,
|
|
5360
|
+
return (0, utils_2.isMacOS)();
|
|
5355
5361
|
}
|
|
5356
5362
|
_setRemoteVideoBuffer(userId, streamType) {
|
|
5357
5363
|
const videoBufferInfo = new trtc_define_1.VideoBufferInfo({
|
package/liteav/trtc_define.d.ts
CHANGED
|
@@ -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
|
+
}
|
package/liteav/trtc_define.js
CHANGED
|
@@ -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
|
|
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
|
|
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:
|
|
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;
|
package/liteav/vod_player.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { TRTCVideoRotation, TRTCVideoFillMode } from './trtc_define';
|
|
2
|
-
import { IVodPlayer
|
|
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.
|
|
10
|
+
* @version v13.3.800
|
|
11
11
|
*
|
|
12
12
|
* @example
|
|
13
|
-
* import {
|
|
13
|
+
* import { TRTCVodPlayer, TRTCVodPlayerEvent } from 'trtc-electron-sdk';
|
|
14
14
|
*
|
|
15
|
-
* const player =
|
|
16
|
-
* player.on(
|
|
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
|
-
*
|
|
23
|
+
* TRTCVodPlayer.releaseVodPlayer(player);
|
|
24
24
|
*/
|
|
25
|
-
export declare class
|
|
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,63 @@ 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
|
-
*
|
|
38
|
+
* 当前 native 构建是否启用了 VOD 播放器。
|
|
39
|
+
*
|
|
40
|
+
* 这是一次性的"构建期能力探测"——`NodeTRTCEngine.NodeVodPlayer` 是
|
|
41
|
+
* 加载 .node 时绑定,运行期不会变化,因此结果可在模块加载时缓存为常量。
|
|
42
|
+
*
|
|
43
|
+
* 通过 {@link isSupported} 对外暴露访问入口。
|
|
44
|
+
*/
|
|
45
|
+
private static readonly VOD_SUPPORTED;
|
|
46
|
+
/**
|
|
47
|
+
* 判断当前 native 构建是否启用了 VOD 播放器
|
|
48
|
+
*
|
|
49
|
+
* C++ 侧 VOD 模块为条件编译(`TRTC_VOD_PLAYER` 宏),未启用时 `NodeTRTCEngine.NodeVodPlayer`
|
|
50
|
+
* 不存在。调用方在 {@link createVodPlayer} 前应先用本方法探测,否则会拿到一个
|
|
51
|
+
* `Error: [TRTCVodPlayer][ERR_NO_VOD_SUPPORT] ...` 异常。
|
|
52
|
+
*
|
|
53
|
+
* @returns true 表示当前构建支持 VOD;false 表示未启用
|
|
54
|
+
*/
|
|
55
|
+
static isSupported(): boolean;
|
|
56
|
+
/**
|
|
57
|
+
* 创建 TRTCVodPlayer 实例
|
|
42
58
|
*
|
|
43
59
|
* @param mediaFilePath - 媒体文件路径(本地绝对路径或在线 URL),必填且必须是非空字符串
|
|
44
60
|
* @param repeat - 是否循环播放,默认 false
|
|
45
|
-
* @returns
|
|
61
|
+
* @returns TRTCVodPlayer 实例
|
|
46
62
|
*
|
|
63
|
+
* @throws {Error} 当前 native 构建未启用 VOD 时抛出,错误信息以
|
|
64
|
+
* `[TRTCVodPlayer][ERR_NO_VOD_SUPPORT]` 起始,便于日志聚合与告警
|
|
65
|
+
* (请先用 {@link isSupported} 探测)
|
|
47
66
|
* @throws {TypeError} 当 `mediaFilePath` 不是非空字符串时抛出
|
|
48
67
|
*/
|
|
49
|
-
static createVodPlayer(mediaFilePath: string, repeat?: boolean):
|
|
68
|
+
static createVodPlayer(mediaFilePath: string, repeat?: boolean): TRTCVodPlayer;
|
|
50
69
|
/**
|
|
51
|
-
* 销毁
|
|
70
|
+
* 销毁 TRTCVodPlayer 实例,释放相关资源
|
|
52
71
|
*
|
|
53
|
-
* @param player - 待销毁的
|
|
72
|
+
* @param player - 待销毁的 TRTCVodPlayer 实例
|
|
54
73
|
*/
|
|
55
|
-
static releaseVodPlayer(player:
|
|
74
|
+
static releaseVodPlayer(player: TRTCVodPlayer): void;
|
|
56
75
|
private constructor();
|
|
57
76
|
/**
|
|
58
|
-
*
|
|
77
|
+
* 监听 TRTCVodPlayer 事件
|
|
59
78
|
*
|
|
60
|
-
*
|
|
61
|
-
*/
|
|
62
|
-
destroy(): void;
|
|
63
|
-
/**
|
|
64
|
-
* 监听 VodPlayer 事件
|
|
65
|
-
*
|
|
66
|
-
* @param event - 事件名称,参考 {@link VodPlayerEvents}
|
|
79
|
+
* @param event - 事件名称,参考 {@link TRTCVodPlayerEvent}
|
|
67
80
|
* @param listener - 事件回调函数,参数类型根据事件自动推导
|
|
68
81
|
*/
|
|
69
|
-
on<K extends keyof
|
|
82
|
+
on<K extends keyof TRTCVodPlayerEventMap>(event: K, listener: (...args: TRTCVodPlayerEventMap[K]) => void): this;
|
|
70
83
|
on(event: string | symbol, listener: (...args: any[]) => void): this;
|
|
71
84
|
/**
|
|
72
|
-
* 取消监听
|
|
85
|
+
* 取消监听 TRTCVodPlayer 事件
|
|
73
86
|
*
|
|
74
87
|
* @param event - 事件名称
|
|
75
88
|
* @param listener - 事件回调函数
|
|
76
89
|
*/
|
|
77
|
-
off<K extends keyof
|
|
90
|
+
off<K extends keyof TRTCVodPlayerEventMap>(event: K, listener: (...args: TRTCVodPlayerEventMap[K]) => void): this;
|
|
78
91
|
off(event: string | symbol, listener: (...args: any[]) => void): this;
|
|
79
92
|
/**
|
|
80
93
|
* 设置视频渲染的 DOM 容器
|
|
@@ -88,12 +101,12 @@ export declare class VodPlayer implements IVodPlayer {
|
|
|
88
101
|
/**
|
|
89
102
|
* 预加载多媒体文件
|
|
90
103
|
*
|
|
91
|
-
* 预加载完成后会触发 {@link
|
|
104
|
+
* 预加载完成后会触发 {@link TRTCVodPlayerEvent.onVodPlayerLoaded} 事件,事件参数携带
|
|
92
105
|
* 媒体信息(时长、宽高);同时 C++ 层会产生首帧并推送到 JS 层的视频渲染管线,
|
|
93
106
|
* 在 view 上展示首帧画面。
|
|
94
107
|
*
|
|
95
108
|
* @example
|
|
96
|
-
* player.on(
|
|
109
|
+
* player.on(TRTCVodPlayerEvent.onVodPlayerLoaded, (durationMs, width, height) => {
|
|
97
110
|
* console.log('预加载完成:', durationMs, width, height);
|
|
98
111
|
* player.start();
|
|
99
112
|
* });
|
|
@@ -144,7 +157,7 @@ export declare class VodPlayer implements IVodPlayer {
|
|
|
144
157
|
* 无缝切换当前播放的媒体文件
|
|
145
158
|
*
|
|
146
159
|
* 在后台预加载新的媒体源,待新源就绪后无缝切换,避免切换时出现黑屏。
|
|
147
|
-
* 切换成功后触发 {@link
|
|
160
|
+
* 切换成功后触发 {@link TRTCVodPlayerEvent.onVodPlayerLoaded} 事件,携带新文件的媒体信息。
|
|
148
161
|
*
|
|
149
162
|
* @param newMediaFile - 新的媒体文件路径或 URL
|
|
150
163
|
*
|
|
@@ -233,6 +246,17 @@ export declare class VodPlayer implements IVodPlayer {
|
|
|
233
246
|
* 停止向已关联的 TRTC 实例推送音频流
|
|
234
247
|
*/
|
|
235
248
|
unpublishAudio(): void;
|
|
249
|
+
/**
|
|
250
|
+
* @private
|
|
251
|
+
* 销毁播放器,释放所有资源
|
|
252
|
+
*
|
|
253
|
+
* 包括:解绑事件监听、停止播放、销毁渲染器、清理 native 回调。
|
|
254
|
+
*
|
|
255
|
+
* 注意:调用本方法后不再向业务方派发任何事件。即便 `stop()` 内部会异步触发
|
|
256
|
+
* `onVodPlayerStopped`,该事件也不会送达,因为监听器已在第一步被清空。
|
|
257
|
+
* 这是 `releaseVodPlayer` 的自然语义(资源释放后不再产生副作用)。
|
|
258
|
+
*/
|
|
259
|
+
private _destroy;
|
|
236
260
|
/**
|
|
237
261
|
* @private
|
|
238
262
|
* 将点播播放器关联到 TRTC 实例(用于辅助流推流,绑定后音频播放由 TRTC 接管)
|
|
@@ -244,7 +268,8 @@ export declare class VodPlayer implements IVodPlayer {
|
|
|
244
268
|
*/
|
|
245
269
|
private detachTRTC;
|
|
246
270
|
/**
|
|
247
|
-
*
|
|
271
|
+
* @private
|
|
272
|
+
* 类型安全地发射事件,参数类型由 `TRTCVodPlayerEventMap` 推导。
|
|
248
273
|
* 通过 `setImmediate` 让 emit 异步化,避免在 N-API 回调栈中触发用户代码。
|
|
249
274
|
*/
|
|
250
275
|
private fire;
|
package/liteav/vod_player.js
CHANGED
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
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.
|
|
16
|
+
* @version v13.3.800
|
|
18
17
|
*
|
|
19
18
|
* @example
|
|
20
|
-
* import {
|
|
19
|
+
* import { TRTCVodPlayer, TRTCVodPlayerEvent } from 'trtc-electron-sdk';
|
|
21
20
|
*
|
|
22
|
-
* const player =
|
|
23
|
-
* player.on(
|
|
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
|
-
*
|
|
29
|
+
* TRTCVodPlayer.releaseVodPlayer(player);
|
|
31
30
|
*/
|
|
32
|
-
class
|
|
31
|
+
class TRTCVodPlayer {
|
|
33
32
|
// ─── 构造函数 ───────────────────────────────────────────────
|
|
34
33
|
constructor(mediaFilePath, repeat = false) {
|
|
35
|
-
this.logger = new logger_1.Logger('
|
|
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);
|
|
@@ -45,56 +44,70 @@ class VodPlayer {
|
|
|
45
44
|
this._createVideoRender();
|
|
46
45
|
this._initEventCallback();
|
|
47
46
|
}
|
|
48
|
-
// ─── 静态工厂方法 ───────────────────────────────────────────
|
|
49
47
|
/**
|
|
50
|
-
*
|
|
48
|
+
* 判断当前 native 构建是否启用了 VOD 播放器
|
|
49
|
+
*
|
|
50
|
+
* C++ 侧 VOD 模块为条件编译(`TRTC_VOD_PLAYER` 宏),未启用时 `NodeTRTCEngine.NodeVodPlayer`
|
|
51
|
+
* 不存在。调用方在 {@link createVodPlayer} 前应先用本方法探测,否则会拿到一个
|
|
52
|
+
* `Error: [TRTCVodPlayer][ERR_NO_VOD_SUPPORT] ...` 异常。
|
|
53
|
+
*
|
|
54
|
+
* @returns true 表示当前构建支持 VOD;false 表示未启用
|
|
55
|
+
*/
|
|
56
|
+
static isSupported() {
|
|
57
|
+
return TRTCVodPlayer.VOD_SUPPORTED;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* 创建 TRTCVodPlayer 实例
|
|
51
61
|
*
|
|
52
62
|
* @param mediaFilePath - 媒体文件路径(本地绝对路径或在线 URL),必填且必须是非空字符串
|
|
53
63
|
* @param repeat - 是否循环播放,默认 false
|
|
54
|
-
* @returns
|
|
64
|
+
* @returns TRTCVodPlayer 实例
|
|
55
65
|
*
|
|
66
|
+
* @throws {Error} 当前 native 构建未启用 VOD 时抛出,错误信息以
|
|
67
|
+
* `[TRTCVodPlayer][ERR_NO_VOD_SUPPORT]` 起始,便于日志聚合与告警
|
|
68
|
+
* (请先用 {@link isSupported} 探测)
|
|
56
69
|
* @throws {TypeError} 当 `mediaFilePath` 不是非空字符串时抛出
|
|
57
70
|
*/
|
|
58
71
|
static createVodPlayer(mediaFilePath, repeat = false) {
|
|
72
|
+
if (!TRTCVodPlayer.isSupported()) {
|
|
73
|
+
// C++ 层 VOD 模块为条件编译;未启用构建下 NodeTRTCEngine.NodeVodPlayer 为 undefined,
|
|
74
|
+
// 直接 new 会得到 "NodeVodPlayer is not a constructor" 这种内部堆栈。
|
|
75
|
+
// 这里提前抛出业务级错误,明确告知调用方"当前构建不支持 VOD,应先探测再使用"。
|
|
76
|
+
// 错误信息前缀 [TRTCVodPlayer][ERR_NO_VOD_SUPPORT] 是稳定标签,调用方可用于
|
|
77
|
+
// 日志过滤、告警聚合,请勿改动该前缀。
|
|
78
|
+
throw new Error('[TRTCVodPlayer][ERR_NO_VOD_SUPPORT] createVodPlayer: ' +
|
|
79
|
+
'current native build has no VOD support. ' +
|
|
80
|
+
'请先通过 TRTCVodPlayer.isSupported() 探测再调用。');
|
|
81
|
+
}
|
|
59
82
|
if (typeof mediaFilePath !== 'string' || mediaFilePath.length === 0) {
|
|
60
|
-
|
|
61
|
-
throw new TypeError(`VodPlayer.createVodPlayer: mediaFilePath must be a non-empty string, got: ${JSON.stringify(mediaFilePath)}`);
|
|
83
|
+
throw new TypeError(`TRTCVodPlayer.createVodPlayer: mediaFilePath must be a non-empty string, got: ${JSON.stringify(mediaFilePath)}`);
|
|
62
84
|
}
|
|
63
|
-
return new
|
|
85
|
+
return new TRTCVodPlayer(mediaFilePath, repeat);
|
|
64
86
|
}
|
|
65
87
|
/**
|
|
66
|
-
* 销毁
|
|
88
|
+
* 销毁 TRTCVodPlayer 实例,释放相关资源
|
|
67
89
|
*
|
|
68
|
-
* @param player - 待销毁的
|
|
90
|
+
* @param player - 待销毁的 TRTCVodPlayer 实例
|
|
69
91
|
*/
|
|
70
92
|
static releaseVodPlayer(player) {
|
|
71
|
-
player.
|
|
93
|
+
player._destroy();
|
|
72
94
|
}
|
|
73
|
-
// ─── 公开方法 ───────────────────────────────────────────────
|
|
74
95
|
/**
|
|
75
|
-
*
|
|
96
|
+
* 监听 TRTCVodPlayer 事件
|
|
76
97
|
*
|
|
77
|
-
*
|
|
98
|
+
* @param {TRTCVodPlayerEvent} event - 事件名称
|
|
99
|
+
* @param {Function} listener - 事件回调函数,参数随事件类型不同而不同
|
|
78
100
|
*/
|
|
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
101
|
on(event, listener) {
|
|
95
102
|
this.eventEmitter.on(event, listener);
|
|
96
103
|
return this;
|
|
97
104
|
}
|
|
105
|
+
/**
|
|
106
|
+
* 取消监听 TRTCVodPlayer 事件
|
|
107
|
+
*
|
|
108
|
+
* @param {TRTCVodPlayerEvent} event - 事件名称
|
|
109
|
+
* @param {Function} listener - 事件回调函数,必须与 on 时传入的为同一引用
|
|
110
|
+
*/
|
|
98
111
|
off(event, listener) {
|
|
99
112
|
this.eventEmitter.off(event, listener);
|
|
100
113
|
return this;
|
|
@@ -126,12 +139,12 @@ class VodPlayer {
|
|
|
126
139
|
/**
|
|
127
140
|
* 预加载多媒体文件
|
|
128
141
|
*
|
|
129
|
-
* 预加载完成后会触发 {@link
|
|
142
|
+
* 预加载完成后会触发 {@link TRTCVodPlayerEvent.onVodPlayerLoaded} 事件,事件参数携带
|
|
130
143
|
* 媒体信息(时长、宽高);同时 C++ 层会产生首帧并推送到 JS 层的视频渲染管线,
|
|
131
144
|
* 在 view 上展示首帧画面。
|
|
132
145
|
*
|
|
133
146
|
* @example
|
|
134
|
-
* player.on(
|
|
147
|
+
* player.on(TRTCVodPlayerEvent.onVodPlayerLoaded, (durationMs, width, height) => {
|
|
135
148
|
* console.log('预加载完成:', durationMs, width, height);
|
|
136
149
|
* player.start();
|
|
137
150
|
* });
|
|
@@ -262,7 +275,7 @@ class VodPlayer {
|
|
|
262
275
|
* 无缝切换当前播放的媒体文件
|
|
263
276
|
*
|
|
264
277
|
* 在后台预加载新的媒体源,待新源就绪后无缝切换,避免切换时出现黑屏。
|
|
265
|
-
* 切换成功后触发 {@link
|
|
278
|
+
* 切换成功后触发 {@link TRTCVodPlayerEvent.onVodPlayerLoaded} 事件,携带新文件的媒体信息。
|
|
266
279
|
*
|
|
267
280
|
* @param newMediaFile - 新的媒体文件路径或 URL
|
|
268
281
|
*
|
|
@@ -465,6 +478,33 @@ class VodPlayer {
|
|
|
465
478
|
(_a = this.nativeVodPlayer) === null || _a === void 0 ? void 0 : _a.unpublishAudio();
|
|
466
479
|
}
|
|
467
480
|
// ─── 内部方法 ───────────────────────────────────────────────
|
|
481
|
+
/**
|
|
482
|
+
* @private
|
|
483
|
+
* 销毁播放器,释放所有资源
|
|
484
|
+
*
|
|
485
|
+
* 包括:解绑事件监听、停止播放、销毁渲染器、清理 native 回调。
|
|
486
|
+
*
|
|
487
|
+
* 注意:调用本方法后不再向业务方派发任何事件。即便 `stop()` 内部会异步触发
|
|
488
|
+
* `onVodPlayerStopped`,该事件也不会送达,因为监听器已在第一步被清空。
|
|
489
|
+
* 这是 `releaseVodPlayer` 的自然语义(资源释放后不再产生副作用)。
|
|
490
|
+
*/
|
|
491
|
+
_destroy() {
|
|
492
|
+
var _a, _b;
|
|
493
|
+
if (this.isDestroyed) {
|
|
494
|
+
this.logger.warn('destroy: player already destroyed');
|
|
495
|
+
return;
|
|
496
|
+
}
|
|
497
|
+
this.logger.info('destroy');
|
|
498
|
+
// 先清监听器,确保后续 stop 流程里通过 setImmediate 排队的事件(如 onVodPlayerStopped)
|
|
499
|
+
// 不会再回到业务方。此时 isDestroyed 尚为 false,后续 stop/detachTRTC 仍能正常走完。
|
|
500
|
+
this.eventEmitter.removeAllListeners();
|
|
501
|
+
this.stop();
|
|
502
|
+
this.isDestroyed = true;
|
|
503
|
+
this._destroyVideoRender();
|
|
504
|
+
(_a = this.nativeVodPlayer) === null || _a === void 0 ? void 0 : _a.setEventCallback(null);
|
|
505
|
+
(_b = this.nativeVodPlayer) === null || _b === void 0 ? void 0 : _b.setDataCallback(null);
|
|
506
|
+
this.nativeVodPlayer = null;
|
|
507
|
+
}
|
|
468
508
|
/**
|
|
469
509
|
* @private
|
|
470
510
|
* 将点播播放器关联到 TRTC 实例(用于辅助流推流,绑定后音频播放由 TRTC 接管)
|
|
@@ -492,7 +532,8 @@ class VodPlayer {
|
|
|
492
532
|
(_a = this.nativeVodPlayer) === null || _a === void 0 ? void 0 : _a.detachTRTC();
|
|
493
533
|
}
|
|
494
534
|
/**
|
|
495
|
-
*
|
|
535
|
+
* @private
|
|
536
|
+
* 类型安全地发射事件,参数类型由 `TRTCVodPlayerEventMap` 推导。
|
|
496
537
|
* 通过 `setImmediate` 让 emit 异步化,避免在 N-API 回调栈中触发用户代码。
|
|
497
538
|
*/
|
|
498
539
|
fire(event, ...args) {
|
|
@@ -569,11 +610,11 @@ class VodPlayer {
|
|
|
569
610
|
// 但若底层持续失败(例如尺寸一直对不上),不能每帧都重置 buffer——30fps 下每秒会触发 30 次
|
|
570
611
|
// 跨 N-API 调用,引发明显性能抖动。这里加重试上限:前 N 次正常重置,超过后退避到周期性日志。
|
|
571
612
|
this._setBufferRetryCount += 1;
|
|
572
|
-
if (this._setBufferRetryCount <=
|
|
573
|
-
this.logger.info(`_dataRenderCallback: renderVideoData returned false (retry ${this._setBufferRetryCount}/${
|
|
613
|
+
if (this._setBufferRetryCount <= TRTCVodPlayer.MAX_BUFFER_RETRY) {
|
|
614
|
+
this.logger.info(`_dataRenderCallback: renderVideoData returned false (retry ${this._setBufferRetryCount}/${TRTCVodPlayer.MAX_BUFFER_RETRY}), re-setting video buffer`);
|
|
574
615
|
this._setVideoRenderBuffer();
|
|
575
616
|
}
|
|
576
|
-
else if (this._setBufferRetryCount %
|
|
617
|
+
else if (this._setBufferRetryCount % TRTCVodPlayer.BUFFER_RETRY_LOG_INTERVAL === 0) {
|
|
577
618
|
this.logger.warn(`_dataRenderCallback: renderVideoData keeps failing for ${this._setBufferRetryCount} frames, giving up frame`);
|
|
578
619
|
}
|
|
579
620
|
}
|
|
@@ -581,28 +622,28 @@ class VodPlayer {
|
|
|
581
622
|
var _a;
|
|
582
623
|
(_a = this.nativeVodPlayer) === null || _a === void 0 ? void 0 : _a.setEventCallback((args) => {
|
|
583
624
|
switch (args[0]) {
|
|
584
|
-
case
|
|
585
|
-
this.fire(
|
|
625
|
+
case trtc_define_1.TRTCVodPlayerEvent.onVodPlayerStarted:
|
|
626
|
+
this.fire(trtc_define_1.TRTCVodPlayerEvent.onVodPlayerStarted, args[1].msLength);
|
|
586
627
|
break;
|
|
587
|
-
case
|
|
628
|
+
case trtc_define_1.TRTCVodPlayerEvent.onVodPlayerLoaded: {
|
|
588
629
|
const data = args[1];
|
|
589
|
-
this.fire(
|
|
630
|
+
this.fire(trtc_define_1.TRTCVodPlayerEvent.onVodPlayerLoaded, data.durationMs, data.width, data.height);
|
|
590
631
|
break;
|
|
591
632
|
}
|
|
592
|
-
case
|
|
593
|
-
this.fire(
|
|
633
|
+
case trtc_define_1.TRTCVodPlayerEvent.onVodPlayerProgress:
|
|
634
|
+
this.fire(trtc_define_1.TRTCVodPlayerEvent.onVodPlayerProgress, args[1].msPos);
|
|
594
635
|
break;
|
|
595
|
-
case
|
|
596
|
-
this.fire(
|
|
636
|
+
case trtc_define_1.TRTCVodPlayerEvent.onVodPlayerPaused:
|
|
637
|
+
this.fire(trtc_define_1.TRTCVodPlayerEvent.onVodPlayerPaused);
|
|
597
638
|
break;
|
|
598
|
-
case
|
|
599
|
-
this.fire(
|
|
639
|
+
case trtc_define_1.TRTCVodPlayerEvent.onVodPlayerResumed:
|
|
640
|
+
this.fire(trtc_define_1.TRTCVodPlayerEvent.onVodPlayerResumed);
|
|
600
641
|
break;
|
|
601
|
-
case
|
|
602
|
-
this.fire(
|
|
642
|
+
case trtc_define_1.TRTCVodPlayerEvent.onVodPlayerStopped:
|
|
643
|
+
this.fire(trtc_define_1.TRTCVodPlayerEvent.onVodPlayerStopped, args[1].reason);
|
|
603
644
|
break;
|
|
604
|
-
case
|
|
605
|
-
this.fire(
|
|
645
|
+
case trtc_define_1.TRTCVodPlayerEvent.onVodPlayerError:
|
|
646
|
+
this.fire(trtc_define_1.TRTCVodPlayerEvent.onVodPlayerError, args[1].error);
|
|
606
647
|
break;
|
|
607
648
|
default: {
|
|
608
649
|
const exhaustiveCheck = args[0];
|
|
@@ -613,8 +654,16 @@ class VodPlayer {
|
|
|
613
654
|
});
|
|
614
655
|
}
|
|
615
656
|
}
|
|
616
|
-
exports.
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
657
|
+
exports.TRTCVodPlayer = TRTCVodPlayer;
|
|
658
|
+
TRTCVodPlayer.MAX_BUFFER_RETRY = 3;
|
|
659
|
+
TRTCVodPlayer.BUFFER_RETRY_LOG_INTERVAL = 60;
|
|
660
|
+
// ─── 静态工厂方法 ───────────────────────────────────────────
|
|
661
|
+
/**
|
|
662
|
+
* 当前 native 构建是否启用了 VOD 播放器。
|
|
663
|
+
*
|
|
664
|
+
* 这是一次性的"构建期能力探测"——`NodeTRTCEngine.NodeVodPlayer` 是
|
|
665
|
+
* 加载 .node 时绑定,运行期不会变化,因此结果可在模块加载时缓存为常量。
|
|
666
|
+
*
|
|
667
|
+
* 通过 {@link isSupported} 对外暴露访问入口。
|
|
668
|
+
*/
|
|
669
|
+
TRTCVodPlayer.VOD_SUPPORTED = typeof (NodeTRTCEngine === null || NodeTRTCEngine === void 0 ? void 0 : NodeTRTCEngine.NodeVodPlayer) === 'function';
|