trtc-electron-sdk 11.3.502-beta.4 → 11.3.502-beta.6

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.
@@ -402,9 +402,9 @@ declare class TRTCLocalMediaTranscoder extends EventEmitter {
402
402
  removeImageSource(path: string): void;
403
403
  /**
404
404
  * 设置本地混流转码视频预览节点
405
- * @param el {HTMLElement | null} - 如果传入的是 HTML 元素,必须是块元素;传入 null 时,会停止视频预览
405
+ * @param view {HTMLElement | null} - 如果传入的是 HTML 元素,必须是块元素;传入 null 时,会停止视频预览
406
406
  */
407
- setMixedVideoRenderView(el: HTMLElement | null): void;
407
+ setMixedVideoRenderView(view: HTMLElement | null): void;
408
408
  private setMixedVideoFrameRenderCallback;
409
409
  private unsetMixedVideoFrameRenderCallback;
410
410
  private setEventCallback;
@@ -516,11 +516,11 @@ class TRTCLocalMediaTranscoder extends events_1.EventEmitter {
516
516
  }
517
517
  /**
518
518
  * 设置本地混流转码视频预览节点
519
- * @param el {HTMLElement | null} - 如果传入的是 HTML 元素,必须是块元素;传入 null 时,会停止视频预览
519
+ * @param view {HTMLElement | null} - 如果传入的是 HTML 元素,必须是块元素;传入 null 时,会停止视频预览
520
520
  */
521
- setMixedVideoRenderView(el) {
522
- if (el && el instanceof HTMLElement) {
523
- if (this.container === el) {
521
+ setMixedVideoRenderView(view) {
522
+ if (view && view instanceof HTMLElement) {
523
+ if (this.container === view) {
524
524
  return; // 重复在同一个 HTML 节点内渲染,不用处理,直接退出
525
525
  }
526
526
  else if (this.renderer) {
@@ -528,13 +528,25 @@ class TRTCLocalMediaTranscoder extends events_1.EventEmitter {
528
528
  this.renderer.destroy();
529
529
  this.renderer = null;
530
530
  // 重新记录渲染的 HTML 节点并创建渲染器
531
- this.container = el;
532
- this.renderer = (0, Renderer_1.createRenderer)(this.pixelFormat, this.container);
531
+ this.container = view;
532
+ this.renderer = (0, Renderer_1.createRenderer)(this.pixelFormat, this.container, {
533
+ type: Renderer_1.RenderType.WebGL,
534
+ onContextLost: () => {
535
+ this.container = view;
536
+ this.renderer = (0, Renderer_1.createRenderer)(this.pixelFormat, this.container, { type: Renderer_1.RenderType.Video });
537
+ },
538
+ });
533
539
  }
534
540
  else {
535
541
  // 第一次设置渲染的 HTML 节点,并创建渲染器,设置渲染回调
536
- this.container = el;
537
- this.renderer = (0, Renderer_1.createRenderer)(this.pixelFormat, this.container);
542
+ this.container = view;
543
+ this.renderer = (0, Renderer_1.createRenderer)(this.pixelFormat, this.container, {
544
+ type: Renderer_1.RenderType.WebGL,
545
+ onContextLost: () => {
546
+ this.container = view;
547
+ this.renderer = (0, Renderer_1.createRenderer)(this.pixelFormat, this.container, { type: Renderer_1.RenderType.Video });
548
+ },
549
+ });
538
550
  this.setMixedVideoFrameRenderCallback();
539
551
  }
540
552
  }
@@ -12,7 +12,11 @@ declare class Canvas3dRenderer implements IRenderer {
12
12
  private i420Width;
13
13
  private i420Height;
14
14
  private i420Rotation;
15
- constructor(pixelFormat: TRTCVideoPixelFormat, view: HTMLElement);
15
+ private onContextLost;
16
+ constructor(pixelFormat: TRTCVideoPixelFormat, view: HTMLElement, options: {
17
+ onContextLost: (() => void) | null;
18
+ });
19
+ private _handleContextLost;
16
20
  private _createCanvas3DRenderer;
17
21
  setContentMode(mode: TRTCVideoFillMode): void;
18
22
  private bind;
@@ -11,9 +11,9 @@ const I420Canvas3DRenderer_1 = __importDefault(require("./I420Canvas3DRenderer")
11
11
  const UP_LIMIT_COUNT = 16;
12
12
  let currentCreatedCount = 0;
13
13
  class Canvas3dRenderer {
14
- constructor(pixelFormat, view) {
15
- this.i420Width = 0;
16
- this.i420Height = 0;
14
+ constructor(pixelFormat, view, options) {
15
+ this.i420Width = 640;
16
+ this.i420Height = 360;
17
17
  this.i420Rotation = 0;
18
18
  if (currentCreatedCount < UP_LIMIT_COUNT) {
19
19
  currentCreatedCount = currentCreatedCount + 1;
@@ -38,8 +38,15 @@ class Canvas3dRenderer {
38
38
  this.canvas = null;
39
39
  this.cacheCanvasOptions = {};
40
40
  this.canvas3DRenderer = null;
41
+ this.onContextLost = options.onContextLost || null;
42
+ this._handleContextLost = this._handleContextLost.bind(this);
41
43
  this.bind(view);
42
44
  }
45
+ _handleContextLost(e) {
46
+ console.warn("trtc: _handleContextLost:", e);
47
+ this.onContextLost && this.onContextLost();
48
+ this.destroy();
49
+ }
43
50
  _createCanvas3DRenderer() {
44
51
  if (this.canvas) {
45
52
  try {
@@ -69,22 +76,28 @@ class Canvas3dRenderer {
69
76
  this.canvas = document.createElement('canvas');
70
77
  this.viewWrapper.appendChild(this.canvas);
71
78
  this.viewContainer.appendChild(this.viewWrapper);
72
- // I420 WebGL 渲染有些特殊,视频宽高发生变化时,需要重新创建 canvas
73
- if (this.pixelFormat === trtc_define_1.TRTCVideoPixelFormat.TRTCVideoPixelFormat_I420) {
74
- // 初始化时,i420Width i420Height 为 0,所以不会创建渲染器
75
- if (this.i420Width || this.i420Height) {
76
- this.canvas.width = this.i420Width;
77
- this.canvas.height = this.i420Height;
79
+ this.canvas.addEventListener("webglcontextlost", this._handleContextLost);
80
+ try {
81
+ // I420 WebGL 渲染有些特殊,视频宽高发生变化时,需要重新创建 canvas
82
+ if (this.pixelFormat === trtc_define_1.TRTCVideoPixelFormat.TRTCVideoPixelFormat_I420) {
83
+ if (this.i420Width || this.i420Height) {
84
+ this.canvas.width = this.i420Width;
85
+ this.canvas.height = this.i420Height;
86
+ this.canvas3DRenderer = this._createCanvas3DRenderer();
87
+ }
88
+ }
89
+ else {
78
90
  this.canvas3DRenderer = this._createCanvas3DRenderer();
79
91
  }
80
92
  }
81
- else {
82
- this.canvas3DRenderer = this._createCanvas3DRenderer();
93
+ catch (e) {
94
+ this.canvas.removeEventListener("webglcontextlost", this._handleContextLost);
95
+ throw e;
83
96
  }
84
97
  }
85
98
  }
86
99
  unbind() {
87
- var _a, _b;
100
+ var _a, _b, _c;
88
101
  (_a = this.canvas3DRenderer) === null || _a === void 0 ? void 0 : _a.destroy();
89
102
  this.canvas3DRenderer = null;
90
103
  if (this.canvas && this.viewWrapper && this.canvas.parentElement === this.viewWrapper) {
@@ -93,12 +106,13 @@ class Canvas3dRenderer {
93
106
  else {
94
107
  console.warn("trtc: Canvas3DRenderer unbind error: remove canvas error", this.canvas, this.viewWrapper);
95
108
  }
109
+ (_b = this.canvas) === null || _b === void 0 ? void 0 : _b.removeEventListener("webglcontextlost", this._handleContextLost);
96
110
  this.canvas = null;
97
111
  if (this.viewWrapper && this.viewContainer && this.viewWrapper.parentElement === this.viewContainer) {
98
112
  this.viewContainer.removeChild(this.viewWrapper);
99
113
  }
100
114
  else {
101
- console.warn("trtc: Canvas3DRenderer unbind error: remove viewWrapper error", this.viewWrapper, this.viewContainer, (_b = this.viewContainer) === null || _b === void 0 ? void 0 : _b.parentElement);
115
+ console.warn("trtc: Canvas3DRenderer unbind error: remove viewWrapper error", this.viewWrapper, this.viewContainer, (_c = this.viewContainer) === null || _c === void 0 ? void 0 : _c.parentElement);
102
116
  }
103
117
  this.viewContainer = null;
104
118
  }
@@ -124,14 +138,21 @@ class Canvas3dRenderer {
124
138
  if (width <= 0 || height <= 0) {
125
139
  throw new Error(`wrong video parameter width:${width} or height:${height}`);
126
140
  }
127
- // I420 WebGL 渲染有些特殊,视频宽高发生变化时,需要重新创建 canvas
128
- if (width !== this.i420Width || height !== this.i420Height || rotation !== this.i420Rotation) {
129
- const tempViewContainer = this.viewContainer;
130
- this.unbind();
131
- this.i420Width = width;
132
- this.i420Height = height;
133
- this.i420Rotation = rotation;
134
- this.bind(tempViewContainer);
141
+ try {
142
+ // I420 WebGL 渲染有些特殊,视频宽高发生变化时,需要重新创建 canvas
143
+ if (width !== this.i420Width || height !== this.i420Height || rotation !== this.i420Rotation) {
144
+ const tempViewContainer = this.viewContainer;
145
+ this.unbind();
146
+ this.i420Width = width;
147
+ this.i420Height = height;
148
+ this.i420Rotation = rotation;
149
+ this.bind(tempViewContainer);
150
+ }
151
+ }
152
+ catch (e) {
153
+ this.onContextLost && this.onContextLost();
154
+ this.destroy();
155
+ throw new Error("re-create WebGL context failed");
135
156
  }
136
157
  if (this.viewWrapper && this.canvas3DRenderer) {
137
158
  this._updateCanvasStyle({
@@ -213,6 +234,7 @@ class Canvas3dRenderer {
213
234
  this.unbind();
214
235
  this.viewWrapper = null;
215
236
  currentCreatedCount--;
237
+ this.onContextLost = null;
216
238
  }
217
239
  }
218
240
  }
@@ -1,5 +1,14 @@
1
1
  import { TRTCVideoPixelFormat } from '../trtc_define';
2
2
  import IRenderer from './IRenderer';
3
- export declare function createRenderer(pixelFormat: TRTCVideoPixelFormat, view: HTMLElement): IRenderer;
3
+ export declare enum RenderType {
4
+ WebGL = "WebGL",
5
+ Canvas2D = "Canvas2D",
6
+ Video = "Video"
7
+ }
8
+ export interface RendererOptions {
9
+ onContextLost?: () => void;
10
+ type?: RenderType;
11
+ }
12
+ export declare function createRenderer(pixelFormat: TRTCVideoPixelFormat, view: HTMLElement, options: RendererOptions): IRenderer;
4
13
  export * from './IRenderer';
5
14
  export * from './types';
@@ -17,17 +17,28 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
17
17
  return (mod && mod.__esModule) ? mod : { "default": mod };
18
18
  };
19
19
  Object.defineProperty(exports, "__esModule", { value: true });
20
- exports.createRenderer = void 0;
20
+ exports.createRenderer = exports.RenderType = void 0;
21
21
  const Canvas3DRenderer_1 = __importDefault(require("./Canvas3DRenderer"));
22
22
  const Canvas2DRenderer_1 = __importDefault(require("./Canvas2DRenderer"));
23
23
  const VideoRenderer_1 = __importDefault(require("./VideoRenderer"));
24
24
  const util_1 = require("./util");
25
25
  const isWebGLSupported = (0, util_1.isSupportWebGL)();
26
- function createRenderer(pixelFormat, view) {
26
+ var RenderType;
27
+ (function (RenderType) {
28
+ RenderType["WebGL"] = "WebGL";
29
+ RenderType["Canvas2D"] = "Canvas2D";
30
+ RenderType["Video"] = "Video";
31
+ })(RenderType = exports.RenderType || (exports.RenderType = {}));
32
+ function createRenderer(pixelFormat, view, options) {
33
+ if (options && !options.type) {
34
+ options.type = RenderType.WebGL;
35
+ }
27
36
  let renderer = null;
28
- if (isWebGLSupported) {
37
+ if (isWebGLSupported && options.type === RenderType.WebGL) {
29
38
  try {
30
- renderer = new Canvas3DRenderer_1.default(pixelFormat, view);
39
+ renderer = new Canvas3DRenderer_1.default(pixelFormat, view, {
40
+ onContextLost: options.onContextLost || null,
41
+ });
31
42
  console.log('trtc: created WebGL render');
32
43
  }
33
44
  catch (err) {
@@ -37,7 +48,8 @@ function createRenderer(pixelFormat, view) {
37
48
  }
38
49
  if (!renderer) {
39
50
  // @ts-ignore
40
- if (window.VideoFrame && window.VideoDecoder) {
51
+ if (window.VideoFrame && window.VideoDecoder
52
+ && (options.type === RenderType.WebGL || options.type === RenderType.Video)) {
41
53
  // Electron 15+ 版本支持 WebCodec API
42
54
  renderer = new VideoRenderer_1.default(pixelFormat, view);
43
55
  console.log('trtc: created Video render');
package/liteav/trtc.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  /// <reference types="node" />
2
2
  import { EventEmitter } from 'events';
3
3
  import { VodPlayer } from './vod_player';
4
- import { AudioMusicParam, Rect, TRTCAppScene, TRTCAudioEffectParam, TRTCAudioQuality, TRTCBeautyStyle, TRTCDeviceState, TRTCDeviceType, TRTCLogLevel, TRTCRenderParams, TRTCRoleType, TRTCSwitchRoomParam, TRTCVideoBufferType, TRTCVideoFillMode, TRTCVideoPixelFormat, TRTCVideoRotation, TRTCVideoStreamType, TRTCWaterMarkSrcType, PluginInfo, TRTCAudioRecordingParams, TRTCScreenCaptureSourceInfo, TRTCScreenCaptureProperty, TRTCSpeedTestParams, TRTCRecordType, TRTCDeviceInfo, TRTCCameraCaptureParams, TRTCImageBuffer, TRTCInitConfig } from './trtc_define';
4
+ import { AudioMusicParam, Rect, TRTCAppScene, TRTCAudioEffectParam, TRTCAudioQuality, TRTCBeautyStyle, TRTCDeviceState, TRTCDeviceType, TRTCLogLevel, TRTCRenderParams, TRTCRoleType, TRTCSwitchRoomParam, TRTCVideoBufferType, TRTCVideoFillMode, TRTCVideoPixelFormat, TRTCVideoRotation, TRTCVideoStreamType, TRTCWaterMarkSrcType, PluginInfo, TRTCAudioRecordingParams, TRTCScreenCaptureSourceInfo, TRTCScreenCaptureProperty, TRTCSpeedTestParams, TRTCRecordType, TRTCDeviceInfo, TRTCCameraCaptureParams, TRTCImageBuffer, TRTCInitConfig, TRTCAudioParallelParams } from './trtc_define';
5
5
  export * from './trtc_define';
6
6
  export * from './trtc_code';
7
7
  export * from './vod_player';
@@ -1208,6 +1208,12 @@ declare class TRTCCloud extends EventEmitter {
1208
1208
  * 如果录制任务在退出房间前尚未通过本接口停止,则退出房间后录音任务会自动被停止。
1209
1209
  */
1210
1210
  stopLocalRecording(): void;
1211
+ /**
1212
+ * 设置远端音频流智能并发播放策略
1213
+ *
1214
+ * @param {TRTCAudioParallelParams} - 指定用户必定能并发播放。
1215
+ */
1216
+ setRemoteAudioParallelParams(param: TRTCAudioParallelParams): void;
1211
1217
  /**
1212
1218
  * 开启本地音频的采集和上行
1213
1219
  *
@@ -2271,6 +2277,7 @@ declare class TRTCCloud extends EventEmitter {
2271
2277
  private _getRendererMap;
2272
2278
  private _onRenderFrame;
2273
2279
  private _onRealRender;
2280
+ private _checkAndDeleteExistingRenderer;
2274
2281
  private _createVideoRenderer;
2275
2282
  private _initRenderer;
2276
2283
  private _destroyRenderer;
package/liteav/trtc.js CHANGED
@@ -2367,6 +2367,28 @@ class TRTCCloud extends events_1.EventEmitter {
2367
2367
  stopLocalRecording() {
2368
2368
  this.rtcCloud.stopLocalRecording();
2369
2369
  }
2370
+ /**
2371
+ * 设置远端音频流智能并发播放策略
2372
+ *
2373
+ * @param {TRTCAudioParallelParams} - 指定用户必定能并发播放。
2374
+ */
2375
+ setRemoteAudioParallelParams(param) {
2376
+ if (param.maxCount < 0) {
2377
+ throw new Error("maxCount must be greater or equal 0");
2378
+ }
2379
+ if (Array.isArray(param.includeUsers) && param.includeUsers.length >= 1) {
2380
+ const includeUsersFilterArray = param.includeUsers.filter(item => {
2381
+ return typeof item === 'string';
2382
+ });
2383
+ this.rtcCloud.setRemoteAudioParallelParams({
2384
+ maxCount: param.maxCount,
2385
+ includeUsers: includeUsersFilterArray
2386
+ });
2387
+ }
2388
+ else {
2389
+ throw new Error('includeUsers must be Array<String> type and not empty');
2390
+ }
2391
+ }
2370
2392
  /////////////////////////////////////////////////////////////////////////////////
2371
2393
  //
2372
2394
  // (四)音频相关接口函数
@@ -4152,12 +4174,30 @@ class TRTCCloud extends events_1.EventEmitter {
4152
4174
  // 创建渲染器时 view 参数传了 null,只推流或者拉流,本地不渲染
4153
4175
  }
4154
4176
  }
4155
- _createVideoRenderer(view, key) {
4177
+ _checkAndDeleteExistingRenderer(view, key) {
4178
+ this.videoRendererMap.forEach((rendererMap, existingKey) => {
4179
+ rendererMap.forEach((renderer, node, map) => {
4180
+ if (node === view && existingKey !== key) {
4181
+ try {
4182
+ console.warn(`trtc: existing video renderer for ${existingKey}, destroy and create for ${key}.`, view);
4183
+ renderer.destroy();
4184
+ map.delete(node);
4185
+ }
4186
+ catch (err) {
4187
+ console.error("trtc: _checkAndDeleteExistingRenderer destroy render error:", err);
4188
+ }
4189
+ }
4190
+ });
4191
+ });
4192
+ }
4193
+ _createVideoRenderer(view, key, options) {
4194
+ // 事先清空一下,避免画面叠加
4156
4195
  if (view.childElementCount > 0) {
4157
4196
  console.warn("trtc: clear HTML element content:", view);
4158
4197
  }
4159
- view.innerHTML = ''; // 事先清空一下,避免画面叠加
4160
- const renderer = (0, Renderer_1.createRenderer)(this.pixelFormat, view);
4198
+ this._checkAndDeleteExistingRenderer(view, key);
4199
+ view.innerHTML = '';
4200
+ const renderer = (0, Renderer_1.createRenderer)(this.pixelFormat, view, options);
4161
4201
  if (key === this.getKey(LOCAL_USER_VIDEO_ID, trtc_define_1.TRTCVideoStreamType.TRTCVideoStreamTypeBig)) {
4162
4202
  renderer.setContentMode(this.localFillMode);
4163
4203
  }
@@ -4170,10 +4210,25 @@ class TRTCCloud extends events_1.EventEmitter {
4170
4210
  return renderer;
4171
4211
  }
4172
4212
  _initRenderer(key, views) {
4213
+ const onContextLost = (key, view) => {
4214
+ const rendererMap = this.videoRendererMap.get(key);
4215
+ if (rendererMap) {
4216
+ const render = this._createVideoRenderer(view, key, { type: Renderer_1.RenderType.Video });
4217
+ rendererMap === null || rendererMap === void 0 ? void 0 : rendererMap.set(view, render);
4218
+ this.videoRendererMap.set(key, rendererMap);
4219
+ }
4220
+ };
4221
+ const validViews = views.filter(view => {
4222
+ const isValid = view && view instanceof HTMLElement;
4223
+ if (!isValid) {
4224
+ console.warn("trtc: create renderer failed due to invalid HTMLElement", view);
4225
+ }
4226
+ return isValid;
4227
+ });
4173
4228
  let rendererMap = this.videoRendererMap.get(key);
4174
4229
  if (rendererMap) {
4175
4230
  rendererMap.forEach((value, innerKey, map) => {
4176
- if (views.indexOf(innerKey) === -1 || !value.isValid(innerKey)) {
4231
+ if (validViews.indexOf(innerKey) === -1 || !value.isValid(innerKey)) {
4177
4232
  try {
4178
4233
  value.destroy();
4179
4234
  map.delete(innerKey);
@@ -4183,17 +4238,27 @@ class TRTCCloud extends events_1.EventEmitter {
4183
4238
  }
4184
4239
  }
4185
4240
  });
4186
- views.forEach((view) => {
4241
+ validViews.forEach((view) => {
4187
4242
  if (!(rendererMap === null || rendererMap === void 0 ? void 0 : rendererMap.has(view))) {
4188
- const renderer = this._createVideoRenderer(view, key);
4243
+ const renderer = this._createVideoRenderer(view, key, {
4244
+ type: Renderer_1.RenderType.WebGL,
4245
+ onContextLost: () => {
4246
+ onContextLost(key, view);
4247
+ },
4248
+ });
4189
4249
  rendererMap === null || rendererMap === void 0 ? void 0 : rendererMap.set(view, renderer);
4190
4250
  }
4191
4251
  });
4192
4252
  }
4193
4253
  else {
4194
4254
  rendererMap = new Map();
4195
- views.forEach((view) => {
4196
- const renderer = this._createVideoRenderer(view, key);
4255
+ validViews.forEach((view) => {
4256
+ const renderer = this._createVideoRenderer(view, key, {
4257
+ type: Renderer_1.RenderType.WebGL,
4258
+ onContextLost: () => {
4259
+ onContextLost(key, view);
4260
+ },
4261
+ });
4197
4262
  rendererMap === null || rendererMap === void 0 ? void 0 : rendererMap.set(view, renderer);
4198
4263
  });
4199
4264
  }
@@ -84,6 +84,12 @@ export declare enum TRTCRecordType {
84
84
  /** 同时录制音频、视频 */
85
85
  TRTCRecordTypeBoth = 2
86
86
  }
87
+ export type TRTCAudioParallelParams = {
88
+ /** 最大并发播放数。默认值:0 */
89
+ maxCount: number;
90
+ /** 指定用户必定能并发播放 */
91
+ includeUsers: Array<string>;
92
+ };
87
93
  export declare enum TRTCAppScene {
88
94
  TRTCAppSceneVideoCall = 0,
89
95
  TRTCAppSceneLIVE = 1,
@@ -338,6 +338,15 @@ var TRTCRecordType;
338
338
  /** 同时录制音频、视频 */
339
339
  TRTCRecordType[TRTCRecordType["TRTCRecordTypeBoth"] = 2] = "TRTCRecordTypeBoth";
340
340
  })(TRTCRecordType = exports.TRTCRecordType || (exports.TRTCRecordType = {}));
341
+ /**
342
+ * 设置远端音频流智能并发播放策略
343
+ *
344
+ * @typedef {Object} TRTCAudioParallelParam
345
+ * @property {Number} maxCount - 最大并发播放数
346
+ * @property {Array<String>} includeUsers - 指定用户必定能并发播放
347
+ *
348
+ */
349
+ const TRTCAudioParallelParams_HACK_JSDOC = null;
341
350
  /////////////////////////////////////////////////////////////////////////////////
342
351
  //
343
352
  // 【(二)网络相关枚举值定义】
@@ -143,7 +143,12 @@ class VodPlayer extends events_1.EventEmitter {
143
143
  this.destroyRender();
144
144
  }
145
145
  view.innerHTML = ''; // 事先清空一下,避免画面叠加
146
- this.renderer = (0, Renderer_1.createRenderer)(trtc_define_1.TRTCVideoPixelFormat.TRTCVideoPixelFormat_I420, view);
146
+ this.renderer = (0, Renderer_1.createRenderer)(trtc_define_1.TRTCVideoPixelFormat.TRTCVideoPixelFormat_I420, view, {
147
+ type: Renderer_1.RenderType.WebGL,
148
+ onContextLost: () => {
149
+ this.renderer = (0, Renderer_1.createRenderer)(trtc_define_1.TRTCVideoPixelFormat.TRTCVideoPixelFormat_I420, view, { type: Renderer_1.RenderType.Video });
150
+ },
151
+ });
147
152
  }
148
153
  destroyRender() {
149
154
  try {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "trtc-electron-sdk",
3
- "version": "11.3.502-beta.4",
3
+ "version": "11.3.502-beta.6",
4
4
  "description": "trtc electron sdk",
5
5
  "main": "./liteav/trtc.js",
6
6
  "types": "./liteav/trtc.d.ts",
@@ -18,6 +18,9 @@
18
18
  "yuv-canvas": "^1.2.6",
19
19
  "hpagent": "^1.2.0"
20
20
  },
21
+ "peerDependencies": {
22
+ "electron": ">=4.0.0"
23
+ },
21
24
  "devDependencies": {
22
25
  "@babel/cli": "^7.11.6",
23
26
  "@babel/core": "^7.11.6",
@@ -37,6 +40,7 @@
37
40
  "scripts": {
38
41
  "download": "node ./scripts/download.js",
39
42
  "install": "npm run download",
43
+ "postinstall": "node ./scripts/postinstall.js",
40
44
  "build": "npm run build:types && npm run build:js && npm run copy:types",
41
45
  "build:types": "rimraf ./types && tsc -p dtsconfig.json",
42
46
  "build:js": "rimraf ./liteav && tsc -p tsconfig.json",
@@ -142,9 +142,6 @@ const main = () => {
142
142
  );
143
143
  signale.success(`copy success! - mac ${anotherArch}`);
144
144
 
145
- // Mac 下完成文件下载后,执行该命令,同步文件到 Electron 目录下
146
- exec(`rsync -a ../../node_modules/trtc-electron-sdk/build/mac-framework/${archType}/ ../../node_modules/electron/dist/Electron.app/Contents/Frameworks`);
147
-
148
145
  rimraf.sync(outputDir);
149
146
  })
150
147
  .catch(err => {
@@ -0,0 +1,46 @@
1
+ const { exec } = require('child_process');
2
+ const path = require('path');
3
+ const fs = require('fs');
4
+ const { arch, platform } = process;
5
+
6
+ let retryCount = 0;
7
+ const retryInterval = 5000; // ms
8
+ const maxRetryCount = 60;
9
+
10
+ function rsync() {
11
+ if (platform === 'darwin') {
12
+ const sourcePath = path.join(__dirname, `../../trtc-electron-sdk/build/mac-framework/${arch}/`);
13
+ const targetPath = path.join(__dirname, '../../electron/dist/Electron.app/Contents/Frameworks');
14
+
15
+ if (targetPath.indexOf("node_modules") === -1) {
16
+ // SDK 本身安装,不用同步动态库,直接退出
17
+ console.warn(`trtc-electron-sdk self install do not need 'rsync'`);
18
+ return;
19
+ }
20
+
21
+ retryCount++;
22
+ if (fs.existsSync(targetPath)) {
23
+ const command = `rsync -a ${sourcePath} ${targetPath}`;
24
+ console.log(command);
25
+ exec(command);
26
+ } else {
27
+ if (retryCount <= maxRetryCount) {
28
+ setTimeout(rsync, retryInterval);
29
+ } else {
30
+ const errorMessage = `
31
+ 'trtc-electron-sdk' 安装失败,请先确认 'Electron' 已安装,再执行 'npm install trtc-electron-sdk' 命令重新安装一次。
32
+ Failed to install trtc-electron-sdk correctly, please make sure that 'Electron' has been installed, then run 'npm install trtc-electron-sdk' command to try again.
33
+
34
+ more detail:
35
+ trtc-electron-sdk postinstall cwd: ${process.cwd()}
36
+ __dirname: ${__dirname}
37
+ sourcePath: ${sourcePath}
38
+ targetPath: ${targetPath}
39
+ `;
40
+ console.error(errorMessage);
41
+ }
42
+ }
43
+ }
44
+ }
45
+
46
+ rsync();