trtc-electron-sdk 11.4.502-beta.2 → 11.4.502
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/LocalMediaTranscoder/index.js +5 -1
- package/liteav/Renderer/Canvas2DRenderer/index.js +5 -4
- package/liteav/Renderer/Canvas3DRenderer/I420Canvas3DRenderer.js +13 -9
- package/liteav/Renderer/Canvas3DRenderer/RGBACanvas3DRenderer.js +7 -3
- package/liteav/Renderer/Canvas3DRenderer/index.js +10 -9
- package/liteav/Renderer/Canvas3DRenderer/webgl-utils.js +2 -2
- package/liteav/Renderer/VideoRenderer/index.js +5 -4
- package/liteav/Renderer/index.js +5 -4
- package/liteav/logger.d.ts +15 -0
- package/liteav/logger.js +76 -0
- package/liteav/trtc.d.ts +8 -9
- package/liteav/trtc.js +78 -60
- package/liteav/trtc_define.d.ts +7 -5
- package/liteav/trtc_define.js +7 -5
- package/package.json +1 -1
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
2
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
6
|
exports.TRTCLocalMediaTranscodingSourceType = exports.TRTCLocalMediaTranscodingEvents = exports.TRTCLocalMediaTranscodingError = void 0;
|
|
4
7
|
const events_1 = require("events");
|
|
5
8
|
const trtc_define_1 = require("../trtc_define");
|
|
6
9
|
const Renderer_1 = require("../Renderer");
|
|
10
|
+
const logger_1 = __importDefault(require("../logger"));
|
|
7
11
|
/**
|
|
8
12
|
* @description 本地媒体流混流转码错误码
|
|
9
13
|
* @enum {Number}
|
|
@@ -397,7 +401,7 @@ class TRTCLocalMediaTranscoder extends events_1.EventEmitter {
|
|
|
397
401
|
this.container = null;
|
|
398
402
|
}
|
|
399
403
|
catch (error) {
|
|
400
|
-
|
|
404
|
+
logger_1.default.warn('TRTCLocalMediaTranscoder.destroy error', error);
|
|
401
405
|
}
|
|
402
406
|
}
|
|
403
407
|
// 帧率、码率在 JS 层为数值,可能被设置为负数,底层要求为无符号整数,此处做检验并将负值设置为零
|
|
@@ -8,6 +8,7 @@ const yuv_canvas_1 = __importDefault(require("yuv-canvas"));
|
|
|
8
8
|
const yuv_buffer_1 = __importDefault(require("../yuv-buffer"));
|
|
9
9
|
const trtc_define_1 = require("../../trtc_define");
|
|
10
10
|
const util_1 = require("../util");
|
|
11
|
+
const logger_1 = __importDefault(require("../../logger"));
|
|
11
12
|
class Canvas2dRenderer {
|
|
12
13
|
constructor(pixelFormat, view) {
|
|
13
14
|
this.pixelFormat = pixelFormat;
|
|
@@ -46,7 +47,7 @@ class Canvas2dRenderer {
|
|
|
46
47
|
this.viewContainer.removeChild(this.viewWrapper);
|
|
47
48
|
}
|
|
48
49
|
else {
|
|
49
|
-
|
|
50
|
+
logger_1.default.warn("trtc: Canvas2DRenderer unbind error: remove viewWrapper error", this.viewWrapper, this.viewContainer, (_a = this.viewContainer) === null || _a === void 0 ? void 0 : _a.parentElement);
|
|
50
51
|
}
|
|
51
52
|
this.viewContainer = null;
|
|
52
53
|
this.yuv = null;
|
|
@@ -63,7 +64,7 @@ class Canvas2dRenderer {
|
|
|
63
64
|
this._drawFrameBGRA(frameData);
|
|
64
65
|
break;
|
|
65
66
|
default:
|
|
66
|
-
|
|
67
|
+
logger_1.default.warn('Canvas2dRenderer.drawFrame error. Not support video format:', this.pixelFormat);
|
|
67
68
|
}
|
|
68
69
|
}
|
|
69
70
|
_drawFrameI420(frameData) {
|
|
@@ -107,7 +108,7 @@ class Canvas2dRenderer {
|
|
|
107
108
|
}
|
|
108
109
|
}
|
|
109
110
|
catch (err) {
|
|
110
|
-
|
|
111
|
+
logger_1.default.error('Canvas2dRenderer._drawFrameI420 error:', err);
|
|
111
112
|
}
|
|
112
113
|
}
|
|
113
114
|
_drawFrameRGBA(frameData) {
|
|
@@ -151,7 +152,7 @@ class Canvas2dRenderer {
|
|
|
151
152
|
}
|
|
152
153
|
}
|
|
153
154
|
catch (err) {
|
|
154
|
-
|
|
155
|
+
logger_1.default.error('Canvas2dRenderer._drawFrameRGBA error:', err);
|
|
155
156
|
}
|
|
156
157
|
}
|
|
157
158
|
_drawFrameBGRA(frameData) {
|
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
2
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
6
|
// import { createProgramFromSources } from './webgl-utils.js';
|
|
4
7
|
const util_1 = require("../util");
|
|
8
|
+
const logger_1 = __importDefault(require("../../logger"));
|
|
5
9
|
const createProgramFromSources = require('./webgl-utils').createProgramFromSources;
|
|
6
10
|
const vertexShaderSource = 'attribute vec2 a_position;'
|
|
7
11
|
+ 'attribute vec2 a_texCoord;'
|
|
@@ -43,7 +47,7 @@ const createGL = function (canvas) {
|
|
|
43
47
|
|| canvas.getContext("experimental-webgl");
|
|
44
48
|
}
|
|
45
49
|
catch (err) {
|
|
46
|
-
|
|
50
|
+
logger_1.default.warn('createGL error:', err);
|
|
47
51
|
isSuccess = false;
|
|
48
52
|
}
|
|
49
53
|
if (!isSuccess || !gl) {
|
|
@@ -68,10 +72,10 @@ class I420Canvas3DRenderer {
|
|
|
68
72
|
this.glProgram = createProgramFromSources(this.gl, [vertexShaderSource, yuvShaderSource]);
|
|
69
73
|
this.gl.useProgram(this.glProgram);
|
|
70
74
|
this._initTextures();
|
|
71
|
-
|
|
75
|
+
logger_1.default.debug('gl created', this.gl, canvas);
|
|
72
76
|
}
|
|
73
77
|
catch (err) {
|
|
74
|
-
|
|
78
|
+
logger_1.default.warn('I420RenderContextCreator.constructor() failed.', err);
|
|
75
79
|
throw new Error('create WebGL context failed');
|
|
76
80
|
}
|
|
77
81
|
}
|
|
@@ -93,7 +97,7 @@ class I420Canvas3DRenderer {
|
|
|
93
97
|
}
|
|
94
98
|
}
|
|
95
99
|
catch (err) {
|
|
96
|
-
|
|
100
|
+
logger_1.default.warn('I420Canvas3DRenderer.draw error:', err);
|
|
97
101
|
}
|
|
98
102
|
}
|
|
99
103
|
destroy() {
|
|
@@ -103,11 +107,11 @@ class I420Canvas3DRenderer {
|
|
|
103
107
|
if (glExtension) {
|
|
104
108
|
glExtension.loseContext();
|
|
105
109
|
}
|
|
106
|
-
|
|
110
|
+
logger_1.default.debug('I420Canvas3DRenderer isContextLost:', this.gl.isContextLost());
|
|
107
111
|
}
|
|
108
112
|
}
|
|
109
113
|
catch (err) {
|
|
110
|
-
|
|
114
|
+
logger_1.default.warn('I420Canvas3DRenderer.destroy', err);
|
|
111
115
|
}
|
|
112
116
|
this._deleteProgram(this.glProgram);
|
|
113
117
|
this.glProgram = null;
|
|
@@ -234,7 +238,7 @@ class I420Canvas3DRenderer {
|
|
|
234
238
|
if (util_1.config.getDebugMode()) {
|
|
235
239
|
e = this.gl.getError();
|
|
236
240
|
if (e != this.gl.NO_ERROR) {
|
|
237
|
-
|
|
241
|
+
logger_1.default.log('upload y plane ', width, height, yplane.byteLength, ' error', e);
|
|
238
242
|
}
|
|
239
243
|
}
|
|
240
244
|
this.gl.activeTexture(this.gl.TEXTURE1);
|
|
@@ -243,7 +247,7 @@ class I420Canvas3DRenderer {
|
|
|
243
247
|
if (util_1.config.getDebugMode()) {
|
|
244
248
|
e = this.gl.getError();
|
|
245
249
|
if (e != this.gl.NO_ERROR) {
|
|
246
|
-
|
|
250
|
+
logger_1.default.log('upload u plane ', width, height, uplane.byteLength, ' error', e);
|
|
247
251
|
}
|
|
248
252
|
}
|
|
249
253
|
this.gl.activeTexture(this.gl.TEXTURE2);
|
|
@@ -252,7 +256,7 @@ class I420Canvas3DRenderer {
|
|
|
252
256
|
if (util_1.config.getDebugMode()) {
|
|
253
257
|
e = this.gl.getError();
|
|
254
258
|
if (e != this.gl.NO_ERROR) {
|
|
255
|
-
|
|
259
|
+
logger_1.default.log('upload v plane ', width, height, vplane.byteLength, ' error', e);
|
|
256
260
|
}
|
|
257
261
|
}
|
|
258
262
|
}
|
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
2
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const logger_1 = __importDefault(require("../../logger"));
|
|
3
7
|
const vertex = [
|
|
4
8
|
-1, -1, 0,
|
|
5
9
|
1, -1, 0.0,
|
|
@@ -25,7 +29,7 @@ const createGL = function (canvas) {
|
|
|
25
29
|
|| canvas.getContext("experimental-webgl", { alpha: true, premultipliedAlpha: false });
|
|
26
30
|
}
|
|
27
31
|
catch (err) {
|
|
28
|
-
|
|
32
|
+
logger_1.default.warn('createGL error:', err);
|
|
29
33
|
isSuccess = false;
|
|
30
34
|
}
|
|
31
35
|
if (!isSuccess || !gl) {
|
|
@@ -137,7 +141,7 @@ class RGBACanvas3DRenderer {
|
|
|
137
141
|
initTexture(this.gl);
|
|
138
142
|
}
|
|
139
143
|
catch (err) {
|
|
140
|
-
|
|
144
|
+
logger_1.default.warn('RGBARenderContextCreator.create() failed.', err);
|
|
141
145
|
throw new Error('create WebGL context failed');
|
|
142
146
|
}
|
|
143
147
|
}
|
|
@@ -153,7 +157,7 @@ class RGBACanvas3DRenderer {
|
|
|
153
157
|
}
|
|
154
158
|
}
|
|
155
159
|
catch (err) {
|
|
156
|
-
|
|
160
|
+
logger_1.default.warn('RGBACanvas3DRenderer.draw error:', err);
|
|
157
161
|
}
|
|
158
162
|
}
|
|
159
163
|
destroy() {
|
|
@@ -8,6 +8,7 @@ const trtc_define_1 = require("../../trtc_define");
|
|
|
8
8
|
const util_1 = require("../util");
|
|
9
9
|
const RGBACanvas3DRenderer_1 = __importDefault(require("./RGBACanvas3DRenderer"));
|
|
10
10
|
const I420Canvas3DRenderer_1 = __importDefault(require("./I420Canvas3DRenderer"));
|
|
11
|
+
const logger_1 = __importDefault(require("../../logger"));
|
|
11
12
|
const UP_LIMIT_COUNT = 16;
|
|
12
13
|
let currentCreatedCount = 0;
|
|
13
14
|
class Canvas3dRenderer {
|
|
@@ -17,10 +18,10 @@ class Canvas3dRenderer {
|
|
|
17
18
|
this.i420Rotation = 0;
|
|
18
19
|
if (currentCreatedCount < UP_LIMIT_COUNT) {
|
|
19
20
|
currentCreatedCount = currentCreatedCount + 1;
|
|
20
|
-
|
|
21
|
+
logger_1.default.log('currentCreatedCount=', currentCreatedCount);
|
|
21
22
|
}
|
|
22
23
|
else {
|
|
23
|
-
throw new Error('
|
|
24
|
+
throw new Error('WebGL context reach up limit');
|
|
24
25
|
}
|
|
25
26
|
this.pixelFormat = pixelFormat;
|
|
26
27
|
this.viewContainer = view;
|
|
@@ -43,7 +44,7 @@ class Canvas3dRenderer {
|
|
|
43
44
|
this.bind(view);
|
|
44
45
|
}
|
|
45
46
|
_handleContextLost(e) {
|
|
46
|
-
|
|
47
|
+
logger_1.default.warn("_handleContextLost:", e);
|
|
47
48
|
this.onContextLost && this.onContextLost();
|
|
48
49
|
this.destroy();
|
|
49
50
|
}
|
|
@@ -61,7 +62,7 @@ class Canvas3dRenderer {
|
|
|
61
62
|
}
|
|
62
63
|
}
|
|
63
64
|
catch (err) {
|
|
64
|
-
|
|
65
|
+
logger_1.default.warn('create WebGL context failed.', err);
|
|
65
66
|
throw new Error('create and initialize WebGL context failed');
|
|
66
67
|
}
|
|
67
68
|
}
|
|
@@ -104,7 +105,7 @@ class Canvas3dRenderer {
|
|
|
104
105
|
this.viewWrapper.removeChild(this.canvas);
|
|
105
106
|
}
|
|
106
107
|
else {
|
|
107
|
-
|
|
108
|
+
logger_1.default.warn("Canvas3DRenderer unbind error: remove canvas error", this.canvas, this.viewWrapper);
|
|
108
109
|
}
|
|
109
110
|
(_b = this.canvas) === null || _b === void 0 ? void 0 : _b.removeEventListener("webglcontextlost", this._handleContextLost);
|
|
110
111
|
this.canvas = null;
|
|
@@ -112,7 +113,7 @@ class Canvas3dRenderer {
|
|
|
112
113
|
this.viewContainer.removeChild(this.viewWrapper);
|
|
113
114
|
}
|
|
114
115
|
else {
|
|
115
|
-
|
|
116
|
+
logger_1.default.warn("Canvas3DRenderer unbind error: remove viewWrapper error", this.viewWrapper, this.viewContainer, (_c = this.viewContainer) === null || _c === void 0 ? void 0 : _c.parentElement);
|
|
116
117
|
}
|
|
117
118
|
this.viewContainer = null;
|
|
118
119
|
}
|
|
@@ -128,7 +129,7 @@ class Canvas3dRenderer {
|
|
|
128
129
|
this._drawFrameBGRA(frameData);
|
|
129
130
|
break;
|
|
130
131
|
default:
|
|
131
|
-
|
|
132
|
+
logger_1.default.warn('Canvas2dRenderer.drawFrame error. Not support video format:', this.pixelFormat);
|
|
132
133
|
}
|
|
133
134
|
}
|
|
134
135
|
_drawFrameI420(frameData) {
|
|
@@ -172,7 +173,7 @@ class Canvas3dRenderer {
|
|
|
172
173
|
}
|
|
173
174
|
}
|
|
174
175
|
catch (err) {
|
|
175
|
-
|
|
176
|
+
logger_1.default.error('Canvas3dRenderer._drawFrameI420 error:', err);
|
|
176
177
|
}
|
|
177
178
|
}
|
|
178
179
|
_drawFrameRGBA(frameData) {
|
|
@@ -200,7 +201,7 @@ class Canvas3dRenderer {
|
|
|
200
201
|
}
|
|
201
202
|
}
|
|
202
203
|
catch (err) {
|
|
203
|
-
|
|
204
|
+
logger_1.default.error('Canvas3dRenderer._drawFrameRGBA error:', err);
|
|
204
205
|
}
|
|
205
206
|
}
|
|
206
207
|
_drawFrameBGRA(frameData) {
|
|
@@ -51,10 +51,10 @@
|
|
|
51
51
|
function error(msg) {
|
|
52
52
|
if (topWindow.console) {
|
|
53
53
|
if (topWindow.console.error) {
|
|
54
|
-
topWindow.console.error('
|
|
54
|
+
topWindow.console.error('[TRTC]', msg);
|
|
55
55
|
}
|
|
56
56
|
else if (topWindow.console.log) {
|
|
57
|
-
topWindow.console.log('
|
|
57
|
+
topWindow.console.log('[TRTC]', msg);
|
|
58
58
|
}
|
|
59
59
|
}
|
|
60
60
|
}
|
|
@@ -15,6 +15,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
15
15
|
const lodash_isequal_1 = __importDefault(require("lodash.isequal"));
|
|
16
16
|
const trtc_define_1 = require("../../trtc_define");
|
|
17
17
|
const util_1 = require("../util");
|
|
18
|
+
const logger_1 = __importDefault(require("../../logger"));
|
|
18
19
|
class VideoRenderer {
|
|
19
20
|
constructor(pixelFormat, view) {
|
|
20
21
|
this.pixelFormat = pixelFormat;
|
|
@@ -57,7 +58,7 @@ class VideoRenderer {
|
|
|
57
58
|
this.viewContainer.removeChild(this.viewWrapper);
|
|
58
59
|
}
|
|
59
60
|
else {
|
|
60
|
-
|
|
61
|
+
logger_1.default.warn("Canvas3DRenderer unbind error: remove viewWrapper error", this.viewWrapper, this.viewContainer, (_a = this.viewContainer) === null || _a === void 0 ? void 0 : _a.parentElement);
|
|
61
62
|
}
|
|
62
63
|
this.viewContainer = null;
|
|
63
64
|
}
|
|
@@ -73,13 +74,13 @@ class VideoRenderer {
|
|
|
73
74
|
yield this._drawFrameH264(frameData);
|
|
74
75
|
break;
|
|
75
76
|
default:
|
|
76
|
-
|
|
77
|
+
logger_1.default.warn('VideoRenderer.drawFrame error. Not support video format:', this.pixelFormat);
|
|
77
78
|
}
|
|
78
79
|
});
|
|
79
80
|
}
|
|
80
81
|
_drawFrameH264(frameData) {
|
|
81
82
|
// To-do
|
|
82
|
-
|
|
83
|
+
logger_1.default.warn('H264 renderer not supported right now');
|
|
83
84
|
}
|
|
84
85
|
_drawFrameNonH264(frameData) {
|
|
85
86
|
return __awaiter(this, void 0, void 0, function* () {
|
|
@@ -112,7 +113,7 @@ class VideoRenderer {
|
|
|
112
113
|
}
|
|
113
114
|
}
|
|
114
115
|
catch (err) {
|
|
115
|
-
|
|
116
|
+
logger_1.default.error('VideoRenderer._drawFrameH264 error:', err);
|
|
116
117
|
}
|
|
117
118
|
});
|
|
118
119
|
}
|
package/liteav/Renderer/index.js
CHANGED
|
@@ -22,6 +22,7 @@ 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
|
+
const logger_1 = __importDefault(require("../logger"));
|
|
25
26
|
const isWebGLSupported = (0, util_1.isSupportWebGL)();
|
|
26
27
|
var RenderType;
|
|
27
28
|
(function (RenderType) {
|
|
@@ -39,10 +40,10 @@ function createRenderer(pixelFormat, view, options) {
|
|
|
39
40
|
renderer = new Canvas3DRenderer_1.default(pixelFormat, view, {
|
|
40
41
|
onContextLost: options.onContextLost || null,
|
|
41
42
|
});
|
|
42
|
-
|
|
43
|
+
logger_1.default.log('created WebGL render');
|
|
43
44
|
}
|
|
44
45
|
catch (err) {
|
|
45
|
-
|
|
46
|
+
logger_1.default.log('create WebGL renderer error.', err.message);
|
|
46
47
|
renderer = null;
|
|
47
48
|
}
|
|
48
49
|
}
|
|
@@ -52,11 +53,11 @@ function createRenderer(pixelFormat, view, options) {
|
|
|
52
53
|
&& (options.type === RenderType.WebGL || options.type === RenderType.Video)) {
|
|
53
54
|
// Electron 15+ 版本支持 WebCodec API
|
|
54
55
|
renderer = new VideoRenderer_1.default(pixelFormat, view);
|
|
55
|
-
|
|
56
|
+
logger_1.default.log('created Video render');
|
|
56
57
|
}
|
|
57
58
|
else {
|
|
58
59
|
renderer = new Canvas2DRenderer_1.default(pixelFormat, view);
|
|
59
|
-
|
|
60
|
+
logger_1.default.log('created Canvas 2D render');
|
|
60
61
|
}
|
|
61
62
|
}
|
|
62
63
|
return renderer;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { TRTCLogLevel } from './trtc_define';
|
|
2
|
+
declare class Logger {
|
|
3
|
+
private prefix;
|
|
4
|
+
private logLevel;
|
|
5
|
+
constructor(prefix?: string);
|
|
6
|
+
info(...args: any[]): void;
|
|
7
|
+
log(...args: any[]): void;
|
|
8
|
+
warn(...args: any[]): void;
|
|
9
|
+
error(...args: any[]): void;
|
|
10
|
+
debug(...args: any[]): void;
|
|
11
|
+
setLogLevel(logLevel: TRTCLogLevel): void;
|
|
12
|
+
private getTime;
|
|
13
|
+
}
|
|
14
|
+
declare const logger: Logger;
|
|
15
|
+
export default logger;
|
package/liteav/logger.js
ADDED
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const trtc_define_1 = require("./trtc_define");
|
|
4
|
+
class Logger {
|
|
5
|
+
constructor(prefix = 'TRTC') {
|
|
6
|
+
this.prefix = `[${prefix}]`;
|
|
7
|
+
this.logLevel = trtc_define_1.TRTCLogLevel.TRTCLogLevelInfo;
|
|
8
|
+
}
|
|
9
|
+
info(...args) {
|
|
10
|
+
var _a;
|
|
11
|
+
if (this.logLevel <= trtc_define_1.TRTCLogLevel.TRTCLogLevelInfo) {
|
|
12
|
+
const param = Array.from(args);
|
|
13
|
+
(_a = console.info) === null || _a === void 0 ? void 0 : _a.apply(console, [this.getTime(), this.prefix, ...param]);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
log(...args) {
|
|
17
|
+
var _a;
|
|
18
|
+
if (this.logLevel <= trtc_define_1.TRTCLogLevel.TRTCLogLevelInfo) {
|
|
19
|
+
const param = Array.from(args);
|
|
20
|
+
(_a = console.log) === null || _a === void 0 ? void 0 : _a.apply(console, [this.getTime(), this.prefix, ...param]);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
warn(...args) {
|
|
24
|
+
var _a;
|
|
25
|
+
if (this.logLevel <= trtc_define_1.TRTCLogLevel.TRTCLogLevelWarn) {
|
|
26
|
+
const param = Array.from(args);
|
|
27
|
+
(_a = console.warn) === null || _a === void 0 ? void 0 : _a.apply(console, [this.getTime(), this.prefix, ...param]);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
error(...args) {
|
|
31
|
+
var _a;
|
|
32
|
+
if (this.logLevel <= trtc_define_1.TRTCLogLevel.TRTCLogLevelError) {
|
|
33
|
+
const param = Array.from(args);
|
|
34
|
+
(_a = console.error) === null || _a === void 0 ? void 0 : _a.apply(console, [this.getTime(), this.prefix, ...param]);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
debug(...args) {
|
|
38
|
+
var _a;
|
|
39
|
+
if (this.logLevel <= trtc_define_1.TRTCLogLevel.TRTCLogLevelDebug) {
|
|
40
|
+
const param = Array.from(args);
|
|
41
|
+
(_a = console.debug) === null || _a === void 0 ? void 0 : _a.apply(console, [this.getTime(), this.prefix, ...param]);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
setLogLevel(logLevel) {
|
|
45
|
+
if (logLevel === trtc_define_1.TRTCLogLevel.TRTCLogLevelNone) {
|
|
46
|
+
this.logLevel = trtc_define_1.TRTCLogLevel.TRTCLogLevelError;
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
this.logLevel = logLevel || trtc_define_1.TRTCLogLevel.TRTCLogLevelInfo;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
getTime() {
|
|
53
|
+
const date = new Date();
|
|
54
|
+
return `${date.toLocaleTimeString('en-US', {
|
|
55
|
+
hour12: false,
|
|
56
|
+
})}.${padMs(date.getMilliseconds())}`;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
function padMs(ms) {
|
|
60
|
+
const len = ms.toString().length;
|
|
61
|
+
let ret;
|
|
62
|
+
switch (len) {
|
|
63
|
+
case 1:
|
|
64
|
+
ret = `00${ms}`;
|
|
65
|
+
break;
|
|
66
|
+
case 2:
|
|
67
|
+
ret = `0${ms}`;
|
|
68
|
+
break;
|
|
69
|
+
default:
|
|
70
|
+
ret = ms;
|
|
71
|
+
break;
|
|
72
|
+
}
|
|
73
|
+
return ret;
|
|
74
|
+
}
|
|
75
|
+
const logger = new Logger("TRTC");
|
|
76
|
+
exports.default = logger;
|
package/liteav/trtc.d.ts
CHANGED
|
@@ -1311,17 +1311,16 @@ declare class TRTCCloud extends EventEmitter {
|
|
|
1311
1311
|
/**
|
|
1312
1312
|
* 开始录音
|
|
1313
1313
|
*
|
|
1314
|
-
*
|
|
1315
|
-
*
|
|
1316
|
-
* 如果调用 exitRoom 时还在录音,录音会自动停止。
|
|
1317
|
-
*
|
|
1318
|
-
* 注意:录音文件路径需精确到文件名及格式后缀,格式后缀决定录制文件的格式。
|
|
1319
|
-
* 例如:指定路径为 path/to/audio.aac,则会生成一个 AAC 格式的文件。目前支持的格式有 PCM, WAV, AAC
|
|
1314
|
+
* 当您调用该接口后, SDK 会将本地和远端的所有音频(包括本地音频,远端音频,背景音乐和音效等)混合并录制到一个本地文件中。
|
|
1315
|
+
* 该接口在进入房间前后调用均可生效,如果录制任务在退出房间前尚未通过 stopAudioRecording 停止,则退出房间后录制任务会自动被停止。
|
|
1320
1316
|
*
|
|
1321
1317
|
* @param {TRTCAudioRecordingParams} params - 录音参数。
|
|
1322
|
-
* @param {String} params.filePath -
|
|
1323
|
-
*
|
|
1324
|
-
*
|
|
1318
|
+
* @param {String} params.filePath - 录音文件的保存路径(必填)。
|
|
1319
|
+
* - 该路径需精确到文件名及格式后缀,格式后缀用于决定录音文件的格式,目前支持的格式有 PCM、WAV 和 AAC。例如:假如您指定路径为 "mypath/record/audio.aac",代表您希望 SDK 生成一个 AAC 格式的音频录制文件。
|
|
1320
|
+
* - 请您指定一个有读写权限的合法路径,否则录音文件无法生成。
|
|
1321
|
+
* @param {TRTCAudioRecordingContent} params.recordingContent - 音频录制内容类型。
|
|
1322
|
+
* @param {Number} params.maxDurationPerFile - 录制文件分片时长,单位毫秒,最小值10000。默认值为0,表示不分片。
|
|
1323
|
+
* @return {Number} 0:成功;-1:录音已开始;-2:文件或目录创建失败;-3:后缀指定的音频格式不支持;-4:参数错误。
|
|
1325
1324
|
*
|
|
1326
1325
|
* 注意:
|
|
1327
1326
|
* - 在 9.3 之前的版本,params 为 string 代表 录音文件路径(必填), 9.3 以及以后同时支持 string 类型和 TRTCAudioRecordingParams。
|
package/liteav/trtc.js
CHANGED
|
@@ -27,6 +27,7 @@ const YCbCr_1 = __importDefault(require("yuv-canvas/src/YCbCr"));
|
|
|
27
27
|
// import TRTCLocalMediaTranscoder from './LocalMediaTranscoder';
|
|
28
28
|
const trtc_define_1 = require("./trtc_define");
|
|
29
29
|
const validate_util_1 = require("./validate-util");
|
|
30
|
+
const logger_1 = __importDefault(require("./logger"));
|
|
30
31
|
const trtc = require('../build/Release/trtc_electron_sdk.node');
|
|
31
32
|
const pkg = require('../package.json');
|
|
32
33
|
__exportStar(require("./trtc_define"), exports);
|
|
@@ -55,7 +56,7 @@ const genSecFunc = function (instance, key) {
|
|
|
55
56
|
return result;
|
|
56
57
|
}
|
|
57
58
|
catch (err) {
|
|
58
|
-
|
|
59
|
+
logger_1.default.warn(err);
|
|
59
60
|
}
|
|
60
61
|
};
|
|
61
62
|
};
|
|
@@ -111,7 +112,7 @@ const getComponentNO = function () {
|
|
|
111
112
|
}
|
|
112
113
|
}
|
|
113
114
|
catch (error) {
|
|
114
|
-
|
|
115
|
+
logger_1.default.warn('localStorage TRTCElectron parse error.', error);
|
|
115
116
|
}
|
|
116
117
|
}
|
|
117
118
|
}
|
|
@@ -185,7 +186,7 @@ class TRTCCloud extends events_1.EventEmitter {
|
|
|
185
186
|
this.videoProcessBufferType = trtc_define_1.TRTCVideoBufferType.TRTCVideoBufferType_Buffer;
|
|
186
187
|
this.videoProcessPixelFormat = trtc_define_1.TRTCVideoPixelFormat.TRTCVideoPixelFormat_I420;
|
|
187
188
|
this.initEventHandler();
|
|
188
|
-
|
|
189
|
+
logger_1.default.log('constructor pixelFormat:' + this.pixelFormat + '|sdk version:' + pkg.version +
|
|
189
190
|
'|native sdk version:' + this.rtcCloud.getSDKVersion());
|
|
190
191
|
//视频数据回调
|
|
191
192
|
this.imageData = null;
|
|
@@ -280,7 +281,7 @@ class TRTCCloud extends events_1.EventEmitter {
|
|
|
280
281
|
*/
|
|
281
282
|
initEventHandler() {
|
|
282
283
|
this.rtcCloud.onEvent('apierror', (funcName) => {
|
|
283
|
-
|
|
284
|
+
logger_1.default.error(`api ${funcName} failed. this is an error
|
|
284
285
|
thrown by c++ addon layer. it often means sth is
|
|
285
286
|
going wrong with this function call and it refused
|
|
286
287
|
to do what is asked. kindly check your parameter types
|
|
@@ -544,6 +545,7 @@ class TRTCCloud extends events_1.EventEmitter {
|
|
|
544
545
|
* @param {String} errMsg - 错误信息。
|
|
545
546
|
*/
|
|
546
547
|
handleOnSwitchRole(errCode, errMsg) {
|
|
548
|
+
logger_1.default.warn(`onSwitchRole errCode:${errCode} errMsg:${errMsg}`);
|
|
547
549
|
this.fire('onSwitchRole', errCode, errMsg);
|
|
548
550
|
}
|
|
549
551
|
/**
|
|
@@ -629,6 +631,7 @@ class TRTCCloud extends events_1.EventEmitter {
|
|
|
629
631
|
* @param {Number} available - 画面是否开启
|
|
630
632
|
*/
|
|
631
633
|
handleOnUserVideoAvailable(userId, available) {
|
|
634
|
+
logger_1.default.log(`onUserVideoAvailable userId:${userId} available:${available}`);
|
|
632
635
|
if (available == 0) {
|
|
633
636
|
const remoteUserVideoBuffers = remoteVideoBufferMap.get(userId);
|
|
634
637
|
if (remoteUserVideoBuffers) {
|
|
@@ -655,6 +658,7 @@ class TRTCCloud extends events_1.EventEmitter {
|
|
|
655
658
|
* @param {Number} available - 辅路画面是否开启
|
|
656
659
|
*/
|
|
657
660
|
handleOnUserSubStreamAvailable(userId, available) {
|
|
661
|
+
logger_1.default.log(`onUserSubStreamAvailable userId:${userId} available:${available}`);
|
|
658
662
|
if (available == 0) {
|
|
659
663
|
if (screenVideoBufferMap.has(userId)) {
|
|
660
664
|
const targetVideoBuffer = screenVideoBufferMap.get(userId);
|
|
@@ -675,6 +679,7 @@ class TRTCCloud extends events_1.EventEmitter {
|
|
|
675
679
|
* @param {Number} available - 声音是否开启
|
|
676
680
|
*/
|
|
677
681
|
handleOnUserAudioAvailable(userId, available) {
|
|
682
|
+
logger_1.default.log(`onUserAudioAvailable userId:${userId} available:${available}`);
|
|
678
683
|
this.fire('onUserAudioAvailable', userId, available);
|
|
679
684
|
}
|
|
680
685
|
/**
|
|
@@ -692,6 +697,7 @@ class TRTCCloud extends events_1.EventEmitter {
|
|
|
692
697
|
* @param {Number} height - 画面高度
|
|
693
698
|
*/
|
|
694
699
|
handleOnFirstVideoFrame(userId, streamType, width, height) {
|
|
700
|
+
logger_1.default.log(`onFirstVideoFrame userId:${userId} streamType:${streamType} width:${width} height:${height}`);
|
|
695
701
|
if (userId) {
|
|
696
702
|
this._setRemoteVideoBuffer(userId, streamType);
|
|
697
703
|
}
|
|
@@ -704,6 +710,7 @@ class TRTCCloud extends events_1.EventEmitter {
|
|
|
704
710
|
* @param {String} userId - 远程用户 ID。
|
|
705
711
|
*/
|
|
706
712
|
handleOnFirstAudioFrame(userId) {
|
|
713
|
+
logger_1.default.log(`onFirstAudioFrame userId:${userId}`);
|
|
707
714
|
this.fire('onFirstAudioFrame', userId);
|
|
708
715
|
}
|
|
709
716
|
/**
|
|
@@ -716,6 +723,7 @@ class TRTCCloud extends events_1.EventEmitter {
|
|
|
716
723
|
* @param {Number} streamType - - 视频流类型,TRTCVideoStreamTypeBig:主路画面,一般用于摄像头;TRTCVideoStreamTypeSub:辅路画面,一般用于屏幕分享。
|
|
717
724
|
*/
|
|
718
725
|
handleOnSendFirstLocalVideoFrame(streamType) {
|
|
726
|
+
logger_1.default.log(`onSendFirstLocalVideoFrame streamType:${streamType}`);
|
|
719
727
|
this.fire('onSendFirstLocalVideoFrame', streamType);
|
|
720
728
|
}
|
|
721
729
|
/**
|
|
@@ -727,6 +735,7 @@ class TRTCCloud extends events_1.EventEmitter {
|
|
|
727
735
|
* @event TRTCCallback#onSendFirstLocalAudioFrame
|
|
728
736
|
*/
|
|
729
737
|
handleOnSendFirstLocalAudioFrame() {
|
|
738
|
+
logger_1.default.log(`onSendFirstLocalAudioFrame`);
|
|
730
739
|
this.fire('onSendFirstLocalAudioFrame');
|
|
731
740
|
}
|
|
732
741
|
/**
|
|
@@ -1249,7 +1258,7 @@ class TRTCCloud extends events_1.EventEmitter {
|
|
|
1249
1258
|
newDuration = Number(duration);
|
|
1250
1259
|
}
|
|
1251
1260
|
catch (err) {
|
|
1252
|
-
|
|
1261
|
+
logger_1.default.error('onLocalRecording duration convert error.', err);
|
|
1253
1262
|
newDuration = 0;
|
|
1254
1263
|
}
|
|
1255
1264
|
this.fire('onLocalRecording', newDuration, storagePath);
|
|
@@ -1286,7 +1295,7 @@ class TRTCCloud extends events_1.EventEmitter {
|
|
|
1286
1295
|
this.fire('onSystemAudioLoopbackError', errCode);
|
|
1287
1296
|
}
|
|
1288
1297
|
handleVideoSizeChange(userId, streamType, width, height) {
|
|
1289
|
-
|
|
1298
|
+
logger_1.default.debug('handleVideoSizeChange', userId, streamType, width, height);
|
|
1290
1299
|
if (userId && userId !== CAMERA_DEVICE_TEST_ID) {
|
|
1291
1300
|
if (streamType !== trtc_define_1.TRTCVideoStreamType.TRTCVideoStreamTypeSub) {
|
|
1292
1301
|
const remoteUserVideoBuffers = remoteVideoBufferMap.get(userId);
|
|
@@ -1313,7 +1322,7 @@ class TRTCCloud extends events_1.EventEmitter {
|
|
|
1313
1322
|
}
|
|
1314
1323
|
}
|
|
1315
1324
|
else {
|
|
1316
|
-
|
|
1325
|
+
logger_1.default.warn(`handleVideoSizeChange error: ${userId} ${streamType} buffer not exist`);
|
|
1317
1326
|
}
|
|
1318
1327
|
}
|
|
1319
1328
|
else {
|
|
@@ -1330,7 +1339,7 @@ class TRTCCloud extends events_1.EventEmitter {
|
|
|
1330
1339
|
}
|
|
1331
1340
|
}
|
|
1332
1341
|
else {
|
|
1333
|
-
|
|
1342
|
+
logger_1.default.error('remote user screen-share video buffer not exist');
|
|
1334
1343
|
}
|
|
1335
1344
|
}
|
|
1336
1345
|
}
|
|
@@ -1351,7 +1360,7 @@ class TRTCCloud extends events_1.EventEmitter {
|
|
|
1351
1360
|
}
|
|
1352
1361
|
}
|
|
1353
1362
|
else {
|
|
1354
|
-
|
|
1363
|
+
logger_1.default.error('current user screen-share video buffer not exist');
|
|
1355
1364
|
}
|
|
1356
1365
|
}
|
|
1357
1366
|
else {
|
|
@@ -1432,7 +1441,7 @@ class TRTCCloud extends events_1.EventEmitter {
|
|
|
1432
1441
|
this.rtcCloud.enterRoom(params.sdkAppId, params.roomId, params.strRoomId, params.userId, params.userSig, params.privateMapKey, params.businessInfo, params.role, params.userDefineRecordId, params.streamId === '' ? null : params.streamId, scene);
|
|
1433
1442
|
}
|
|
1434
1443
|
else {
|
|
1435
|
-
|
|
1444
|
+
logger_1.default.error('enterRoom, params is not instanceof TRTCParams!');
|
|
1436
1445
|
}
|
|
1437
1446
|
}
|
|
1438
1447
|
/**
|
|
@@ -1628,7 +1637,7 @@ class TRTCCloud extends events_1.EventEmitter {
|
|
|
1628
1637
|
this.rtcCloud.startPublishCDNStream(param.appId, param.bizId, param.url, streamId);
|
|
1629
1638
|
}
|
|
1630
1639
|
else {
|
|
1631
|
-
|
|
1640
|
+
logger_1.default.error('startPublishCDNStream, param is not instanceof TRTCPublishCDNParam!');
|
|
1632
1641
|
}
|
|
1633
1642
|
}
|
|
1634
1643
|
/**
|
|
@@ -1736,7 +1745,7 @@ class TRTCCloud extends events_1.EventEmitter {
|
|
|
1736
1745
|
this.rtcCloud.setMixTranscodingConfig(configMode, config.appId, config.bizId, config.videoWidth, config.videoHeight, config.videoBitrate, config.videoFramerate, config.videoGOP, config.audioSampleRate, config.audioBitrate, config.audioChannels, config.backgroundColor, config.backgroundImage, config.streamId, config.mixUsersArray);
|
|
1737
1746
|
}
|
|
1738
1747
|
else {
|
|
1739
|
-
|
|
1748
|
+
logger_1.default.error('setMixTranscodingConfig, config is not instanceof TRTCTranscodingConfig!');
|
|
1740
1749
|
}
|
|
1741
1750
|
}
|
|
1742
1751
|
/////////////////////////////////////////////////////////////////////////////////
|
|
@@ -1772,6 +1781,7 @@ class TRTCCloud extends events_1.EventEmitter {
|
|
|
1772
1781
|
* - 如果传入 `null` 则不预览摄像头画面,但不影响摄像头采集
|
|
1773
1782
|
*/
|
|
1774
1783
|
startLocalPreview(views) {
|
|
1784
|
+
logger_1.default.log(`startLocalPreview`, views);
|
|
1775
1785
|
if (views !== undefined) {
|
|
1776
1786
|
if (views !== null) {
|
|
1777
1787
|
if (Array.isArray(views)) {
|
|
@@ -1786,13 +1796,14 @@ class TRTCCloud extends events_1.EventEmitter {
|
|
|
1786
1796
|
}
|
|
1787
1797
|
}
|
|
1788
1798
|
else {
|
|
1789
|
-
|
|
1799
|
+
logger_1.default.error('startLocalPreview parameter is undefined, it should be Array<HTMLElement>, HTMLElement or null');
|
|
1790
1800
|
}
|
|
1791
1801
|
}
|
|
1792
1802
|
/**
|
|
1793
1803
|
* 停止本地摄像头采集和预览
|
|
1794
1804
|
*/
|
|
1795
1805
|
stopLocalPreview() {
|
|
1806
|
+
logger_1.default.log(`stopLocalPreview`);
|
|
1796
1807
|
const key = this.getKey(LOCAL_USER_VIDEO_ID, trtc_define_1.TRTCVideoStreamType.TRTCVideoStreamTypeBig);
|
|
1797
1808
|
this._destroyRenderer(key, null);
|
|
1798
1809
|
this.rtcCloud.stopLocalPreview();
|
|
@@ -1814,6 +1825,7 @@ class TRTCCloud extends events_1.EventEmitter {
|
|
|
1814
1825
|
* @param {Array<HTMLElement>|HTMLElement|null} views - 承载预览画面单个的 HTML 块节点或者 HTML 块节点数组,传入 `null` 结束本地摄像头采集视频的预览。
|
|
1815
1826
|
*/
|
|
1816
1827
|
updateLocalView(views) {
|
|
1828
|
+
logger_1.default.log(`updateLocalView`, views);
|
|
1817
1829
|
const key = this.getKey(LOCAL_USER_VIDEO_ID, trtc_define_1.TRTCVideoStreamType.TRTCVideoStreamTypeBig);
|
|
1818
1830
|
if (views !== undefined) {
|
|
1819
1831
|
if (views !== null) {
|
|
@@ -1829,7 +1841,7 @@ class TRTCCloud extends events_1.EventEmitter {
|
|
|
1829
1841
|
}
|
|
1830
1842
|
}
|
|
1831
1843
|
else {
|
|
1832
|
-
|
|
1844
|
+
logger_1.default.error('updateLocalView parameter is undefined, it should be Array<HTMLElement>, HTMLElement or null');
|
|
1833
1845
|
}
|
|
1834
1846
|
}
|
|
1835
1847
|
/**
|
|
@@ -1844,7 +1856,7 @@ class TRTCCloud extends events_1.EventEmitter {
|
|
|
1844
1856
|
this.rtcCloud.setCameraCaptureParam(params.mode, params.width, params.height);
|
|
1845
1857
|
}
|
|
1846
1858
|
else {
|
|
1847
|
-
|
|
1859
|
+
logger_1.default.error('setCameraCaptureParams invalid params:', params);
|
|
1848
1860
|
}
|
|
1849
1861
|
}
|
|
1850
1862
|
/**
|
|
@@ -1922,6 +1934,7 @@ class TRTCCloud extends events_1.EventEmitter {
|
|
|
1922
1934
|
* @param {TRTCVideoStreamType} streamType - 视频流类型
|
|
1923
1935
|
*/
|
|
1924
1936
|
startRemoteView(userId, views, streamType) {
|
|
1937
|
+
logger_1.default.log(`startRemoteView userId:${userId} streamType:${streamType}`, views);
|
|
1925
1938
|
if (views !== undefined) {
|
|
1926
1939
|
if (views !== null) {
|
|
1927
1940
|
if (Array.isArray(views)) {
|
|
@@ -1936,7 +1949,7 @@ class TRTCCloud extends events_1.EventEmitter {
|
|
|
1936
1949
|
}
|
|
1937
1950
|
}
|
|
1938
1951
|
else {
|
|
1939
|
-
|
|
1952
|
+
logger_1.default.error('startRemoteView parameter "views" is undefined, it should be Array<HTMLElement>, HTMLElement or null');
|
|
1940
1953
|
}
|
|
1941
1954
|
}
|
|
1942
1955
|
/**
|
|
@@ -1948,6 +1961,7 @@ class TRTCCloud extends events_1.EventEmitter {
|
|
|
1948
1961
|
* @param {TRTCVideoStreamType} streamType - 视频流类型
|
|
1949
1962
|
*/
|
|
1950
1963
|
stopRemoteView(userId, streamType) {
|
|
1964
|
+
logger_1.default.log(`stopRemoteView userId:${userId} streamType:${streamType}`);
|
|
1951
1965
|
if (streamType === undefined) {
|
|
1952
1966
|
streamType = this.priorRemoteVideoStreamType;
|
|
1953
1967
|
}
|
|
@@ -1991,6 +2005,7 @@ class TRTCCloud extends events_1.EventEmitter {
|
|
|
1991
2005
|
*
|
|
1992
2006
|
*/
|
|
1993
2007
|
updateRemoteView(userId, views, streamType) {
|
|
2008
|
+
logger_1.default.log(`updateRemoteView userId:${userId} streamType:${streamType}`, views);
|
|
1994
2009
|
const rendererStreamType = this._calcRemoteVideoRendererStreamType(streamType);
|
|
1995
2010
|
const key = this.getKey(userId, rendererStreamType);
|
|
1996
2011
|
if (views !== undefined) {
|
|
@@ -2007,7 +2022,7 @@ class TRTCCloud extends events_1.EventEmitter {
|
|
|
2007
2022
|
}
|
|
2008
2023
|
}
|
|
2009
2024
|
else {
|
|
2010
|
-
|
|
2025
|
+
logger_1.default.error('updateRemoteView parameter "views" is undefined, it should be Array<HTMLElement>, HTMLElement or null');
|
|
2011
2026
|
}
|
|
2012
2027
|
}
|
|
2013
2028
|
/**
|
|
@@ -2088,7 +2103,7 @@ class TRTCCloud extends events_1.EventEmitter {
|
|
|
2088
2103
|
this.rtcCloud.setVideoEncoderParam(params.videoResolution, params.resMode, params.videoFps, params.videoBitrate, params.minVideoBitrate, params.enableAdjustRes);
|
|
2089
2104
|
}
|
|
2090
2105
|
else {
|
|
2091
|
-
|
|
2106
|
+
logger_1.default.error('setVideoEncoderParam, params is not instanceof TRTCVideoEncParam!');
|
|
2092
2107
|
}
|
|
2093
2108
|
}
|
|
2094
2109
|
/**
|
|
@@ -2109,7 +2124,7 @@ class TRTCCloud extends events_1.EventEmitter {
|
|
|
2109
2124
|
this.rtcCloud.setNetworkQosParam(params.preference, params.controlMode);
|
|
2110
2125
|
}
|
|
2111
2126
|
else {
|
|
2112
|
-
|
|
2127
|
+
logger_1.default.error('setNetworkQosParam, params is not instanceof TRTCNetworkQosParam!');
|
|
2113
2128
|
}
|
|
2114
2129
|
}
|
|
2115
2130
|
/**
|
|
@@ -2288,7 +2303,7 @@ class TRTCCloud extends events_1.EventEmitter {
|
|
|
2288
2303
|
this.rtcCloud.enableSmallVideoStream(enable, params.videoResolution, params.resMode, params.videoFps, params.videoBitrate, params.minVideoBitrate, params.enableAdjustRes);
|
|
2289
2304
|
}
|
|
2290
2305
|
else {
|
|
2291
|
-
|
|
2306
|
+
logger_1.default.error('enableSmallVideoStream, params is not instanceof TRTCVideoEncParam!');
|
|
2292
2307
|
}
|
|
2293
2308
|
}
|
|
2294
2309
|
/**
|
|
@@ -2516,32 +2531,34 @@ class TRTCCloud extends events_1.EventEmitter {
|
|
|
2516
2531
|
/**
|
|
2517
2532
|
* 开始录音
|
|
2518
2533
|
*
|
|
2519
|
-
*
|
|
2520
|
-
*
|
|
2521
|
-
* 如果调用 exitRoom 时还在录音,录音会自动停止。
|
|
2522
|
-
*
|
|
2523
|
-
* 注意:录音文件路径需精确到文件名及格式后缀,格式后缀决定录制文件的格式。
|
|
2524
|
-
* 例如:指定路径为 path/to/audio.aac,则会生成一个 AAC 格式的文件。目前支持的格式有 PCM, WAV, AAC
|
|
2534
|
+
* 当您调用该接口后, SDK 会将本地和远端的所有音频(包括本地音频,远端音频,背景音乐和音效等)混合并录制到一个本地文件中。
|
|
2535
|
+
* 该接口在进入房间前后调用均可生效,如果录制任务在退出房间前尚未通过 stopAudioRecording 停止,则退出房间后录制任务会自动被停止。
|
|
2525
2536
|
*
|
|
2526
2537
|
* @param {TRTCAudioRecordingParams} params - 录音参数。
|
|
2527
|
-
* @param {String} params.filePath -
|
|
2528
|
-
*
|
|
2529
|
-
*
|
|
2538
|
+
* @param {String} params.filePath - 录音文件的保存路径(必填)。
|
|
2539
|
+
* - 该路径需精确到文件名及格式后缀,格式后缀用于决定录音文件的格式,目前支持的格式有 PCM、WAV 和 AAC。例如:假如您指定路径为 "mypath/record/audio.aac",代表您希望 SDK 生成一个 AAC 格式的音频录制文件。
|
|
2540
|
+
* - 请您指定一个有读写权限的合法路径,否则录音文件无法生成。
|
|
2541
|
+
* @param {TRTCAudioRecordingContent} params.recordingContent - 音频录制内容类型。
|
|
2542
|
+
* @param {Number} params.maxDurationPerFile - 录制文件分片时长,单位毫秒,最小值10000。默认值为0,表示不分片。
|
|
2543
|
+
* @return {Number} 0:成功;-1:录音已开始;-2:文件或目录创建失败;-3:后缀指定的音频格式不支持;-4:参数错误。
|
|
2530
2544
|
*
|
|
2531
2545
|
* 注意:
|
|
2532
2546
|
* - 在 9.3 之前的版本,params 为 string 代表 录音文件路径(必填), 9.3 以及以后同时支持 string 类型和 TRTCAudioRecordingParams。
|
|
2533
2547
|
*/
|
|
2534
2548
|
startAudioRecording(params) {
|
|
2535
|
-
|
|
2536
|
-
|
|
2549
|
+
var _a;
|
|
2550
|
+
if (params instanceof trtc_define_1.TRTCAudioRecordingParams && ((_a = params.filePath) === null || _a === void 0 ? void 0 : _a.length)) {
|
|
2551
|
+
return this.rtcCloud.startAudioRecording(params.filePath, params.recordingContent, params.maxDurationPerFile);
|
|
2537
2552
|
}
|
|
2538
|
-
if (typeof params === 'string') {
|
|
2553
|
+
else if (typeof params === 'string' && params.length) {
|
|
2539
2554
|
const path = params;
|
|
2540
2555
|
const recordParams = new trtc_define_1.TRTCAudioRecordingParams(path);
|
|
2541
|
-
return this.rtcCloud.startAudioRecording(recordParams.filePath, recordParams.recordingContent);
|
|
2556
|
+
return this.rtcCloud.startAudioRecording(recordParams.filePath, recordParams.recordingContent, recordParams.maxDurationPerFile);
|
|
2557
|
+
}
|
|
2558
|
+
else {
|
|
2559
|
+
logger_1.default.error('startAudioRecording, params is not valid');
|
|
2560
|
+
return -4;
|
|
2542
2561
|
}
|
|
2543
|
-
console.error('trtc:startAudioRecording, params is not instanceof TRTCAudioRecordingParams!');
|
|
2544
|
-
return -1;
|
|
2545
2562
|
}
|
|
2546
2563
|
/**
|
|
2547
2564
|
* 停止录音
|
|
@@ -2605,7 +2622,7 @@ class TRTCCloud extends events_1.EventEmitter {
|
|
|
2605
2622
|
}
|
|
2606
2623
|
}
|
|
2607
2624
|
catch (e) {
|
|
2608
|
-
|
|
2625
|
+
logger_1.default.warn('camera device properties parse error.', JSON.stringify(item));
|
|
2609
2626
|
item.deviceProperties = {};
|
|
2610
2627
|
}
|
|
2611
2628
|
});
|
|
@@ -3004,7 +3021,7 @@ class TRTCCloud extends events_1.EventEmitter {
|
|
|
3004
3021
|
return this.rtcCloud.selectScreenCaptureTarget(selSource.type, selSource.sourceId, selSource.sourceName, selSource.isMinimizeWindow, deprecatedCaptureRect.left, deprecatedCaptureRect.top, deprecatedCaptureRect.right, deprecatedCaptureRect.bottom, selProperty.enableCaptureMouse, selProperty.enableHighLight, selProperty.enableHighPerformance, selProperty.highLightColor, selProperty.highLightWidth, selProperty.enableCaptureChildWindow);
|
|
3005
3022
|
}
|
|
3006
3023
|
else {
|
|
3007
|
-
|
|
3024
|
+
logger_1.default.error('selectScreenCaptureTarget, sourceId or sourcename is undefined!');
|
|
3008
3025
|
}
|
|
3009
3026
|
}
|
|
3010
3027
|
/**
|
|
@@ -3070,7 +3087,7 @@ class TRTCCloud extends events_1.EventEmitter {
|
|
|
3070
3087
|
type = trtc_define_1.TRTCVideoStreamType.TRTCVideoStreamTypeSub;
|
|
3071
3088
|
}
|
|
3072
3089
|
if (params && !(params instanceof trtc_define_1.TRTCVideoEncParam)) {
|
|
3073
|
-
|
|
3090
|
+
logger_1.default.error('startScreenCapture, params is not instanceof TRTCVideoEncParam!');
|
|
3074
3091
|
return;
|
|
3075
3092
|
}
|
|
3076
3093
|
const currentUserId = '';
|
|
@@ -3139,7 +3156,7 @@ class TRTCCloud extends events_1.EventEmitter {
|
|
|
3139
3156
|
this.rtcCloud.setSubStreamEncoderParam(params.videoResolution, params.resMode, params.videoFps, params.videoBitrate, params.minVideoBitrate, params.enableAdjustRes);
|
|
3140
3157
|
}
|
|
3141
3158
|
else {
|
|
3142
|
-
|
|
3159
|
+
logger_1.default.error('setSubStreamEncoderParam, params is not instanceof TRTCVideoEncParam!');
|
|
3143
3160
|
}
|
|
3144
3161
|
}
|
|
3145
3162
|
/**
|
|
@@ -3163,7 +3180,7 @@ class TRTCCloud extends events_1.EventEmitter {
|
|
|
3163
3180
|
*/
|
|
3164
3181
|
addExcludedShareWindow(win) {
|
|
3165
3182
|
if (isNaN(+win)) {
|
|
3166
|
-
|
|
3183
|
+
logger_1.default.error('addExcludedShareWindow, win: ' + win + 'is not invalid!');
|
|
3167
3184
|
return;
|
|
3168
3185
|
}
|
|
3169
3186
|
this.rtcCloud.addExcludedShareWindow(win);
|
|
@@ -3176,7 +3193,7 @@ class TRTCCloud extends events_1.EventEmitter {
|
|
|
3176
3193
|
*/
|
|
3177
3194
|
removeExcludedShareWindow(win) {
|
|
3178
3195
|
if (isNaN(+win)) {
|
|
3179
|
-
|
|
3196
|
+
logger_1.default.error('removeExcludedShareWindow, win: ' + win + 'is not invalid!');
|
|
3180
3197
|
return;
|
|
3181
3198
|
}
|
|
3182
3199
|
this.rtcCloud.removeExcludedShareWindow(win);
|
|
@@ -3199,7 +3216,7 @@ class TRTCCloud extends events_1.EventEmitter {
|
|
|
3199
3216
|
*/
|
|
3200
3217
|
addIncludedShareWindow(win) {
|
|
3201
3218
|
if (isNaN(+win)) {
|
|
3202
|
-
|
|
3219
|
+
logger_1.default.error(':addIncludedShareWindow, win: ' + win + 'is not invalid!');
|
|
3203
3220
|
return;
|
|
3204
3221
|
}
|
|
3205
3222
|
this.rtcCloud.addIncludedShareWindow(win);
|
|
@@ -3212,7 +3229,7 @@ class TRTCCloud extends events_1.EventEmitter {
|
|
|
3212
3229
|
*/
|
|
3213
3230
|
removeIncludedShareWindow(win) {
|
|
3214
3231
|
if (isNaN(+win)) {
|
|
3215
|
-
|
|
3232
|
+
logger_1.default.error('removeIncludedShareWindow, win: ' + win + 'is not invalid!');
|
|
3216
3233
|
return;
|
|
3217
3234
|
}
|
|
3218
3235
|
this.rtcCloud.removeIncludedShareWindow(win);
|
|
@@ -3350,7 +3367,7 @@ class TRTCCloud extends events_1.EventEmitter {
|
|
|
3350
3367
|
return 0;
|
|
3351
3368
|
}
|
|
3352
3369
|
else {
|
|
3353
|
-
|
|
3370
|
+
logger_1.default.error('setLocalVideoRenderCallback, param is error!');
|
|
3354
3371
|
return -1;
|
|
3355
3372
|
}
|
|
3356
3373
|
}
|
|
@@ -3383,7 +3400,7 @@ class TRTCCloud extends events_1.EventEmitter {
|
|
|
3383
3400
|
return 0;
|
|
3384
3401
|
}
|
|
3385
3402
|
else {
|
|
3386
|
-
|
|
3403
|
+
logger_1.default.error('setRemoteVideoRenderCallback, userId is error!');
|
|
3387
3404
|
return -1;
|
|
3388
3405
|
}
|
|
3389
3406
|
}
|
|
@@ -3830,7 +3847,7 @@ class TRTCCloud extends events_1.EventEmitter {
|
|
|
3830
3847
|
const speedTestParams = new trtc_define_1.TRTCSpeedTestParams(sdkAppId, userId, userSig);
|
|
3831
3848
|
return this.rtcCloud.startSpeedTest(speedTestParams.sdkAppId, speedTestParams.userId, speedTestParams.userSig, speedTestParams.expectedUpBandwidth, speedTestParams.expectedDownBandwidth);
|
|
3832
3849
|
}
|
|
3833
|
-
|
|
3850
|
+
logger_1.default.error('startSpeedTest, param is error');
|
|
3834
3851
|
return -1;
|
|
3835
3852
|
}
|
|
3836
3853
|
/**
|
|
@@ -3878,7 +3895,7 @@ class TRTCCloud extends events_1.EventEmitter {
|
|
|
3878
3895
|
this._onRenderFrame(id, type, width, height, timestamp, rotation, cameraTestVideoBuffer.buffer);
|
|
3879
3896
|
}
|
|
3880
3897
|
else {
|
|
3881
|
-
|
|
3898
|
+
logger_1.default.log('camera video buffer reallocated');
|
|
3882
3899
|
}
|
|
3883
3900
|
}
|
|
3884
3901
|
else {
|
|
@@ -3888,7 +3905,7 @@ class TRTCCloud extends events_1.EventEmitter {
|
|
|
3888
3905
|
});
|
|
3889
3906
|
}
|
|
3890
3907
|
else {
|
|
3891
|
-
|
|
3908
|
+
logger_1.default.error('startCameraDeviceTest, view is undefined!');
|
|
3892
3909
|
}
|
|
3893
3910
|
}
|
|
3894
3911
|
/**
|
|
@@ -3967,6 +3984,7 @@ class TRTCCloud extends events_1.EventEmitter {
|
|
|
3967
3984
|
* - TRTCLogLevelFatal : 只输出 FATAL 级别的 Log
|
|
3968
3985
|
*/
|
|
3969
3986
|
setLogLevel(level) {
|
|
3987
|
+
logger_1.default.setLogLevel(level);
|
|
3970
3988
|
this.rtcCloud.setLogLevel(level);
|
|
3971
3989
|
}
|
|
3972
3990
|
/**
|
|
@@ -4042,7 +4060,7 @@ class TRTCCloud extends events_1.EventEmitter {
|
|
|
4042
4060
|
this._onRenderFrame(id, type, width, height, timestamp, rotation, localVideoBuffer.buffer);
|
|
4043
4061
|
}
|
|
4044
4062
|
else {
|
|
4045
|
-
|
|
4063
|
+
logger_1.default.log(`${id} ${type} video buffer reallocated`);
|
|
4046
4064
|
}
|
|
4047
4065
|
}
|
|
4048
4066
|
else {
|
|
@@ -4071,7 +4089,7 @@ class TRTCCloud extends events_1.EventEmitter {
|
|
|
4071
4089
|
this._onRenderFrame(id, type, width, height, timestamp, rotation, (_b = screenVideoBufferMap.get(id)) === null || _b === void 0 ? void 0 : _b.buffer);
|
|
4072
4090
|
}
|
|
4073
4091
|
else {
|
|
4074
|
-
|
|
4092
|
+
logger_1.default.log(`${id} ${type} video buffer reallocated`);
|
|
4075
4093
|
}
|
|
4076
4094
|
}
|
|
4077
4095
|
else {
|
|
@@ -4093,7 +4111,7 @@ class TRTCCloud extends events_1.EventEmitter {
|
|
|
4093
4111
|
* - 2 yuvcanvs
|
|
4094
4112
|
*/
|
|
4095
4113
|
setRenderMode(mode = 1) {
|
|
4096
|
-
|
|
4114
|
+
logger_1.default.warn('setRenderMode() interface is deprecated and do not need any more');
|
|
4097
4115
|
}
|
|
4098
4116
|
//----------------------------------//
|
|
4099
4117
|
// plugin API -- start
|
|
@@ -4197,7 +4215,7 @@ class TRTCCloud extends events_1.EventEmitter {
|
|
|
4197
4215
|
return String(uid) + '_' + String(type);
|
|
4198
4216
|
}
|
|
4199
4217
|
setEnableRenderFrame(enable) {
|
|
4200
|
-
|
|
4218
|
+
logger_1.default.debug('setEnableRenderFrame:' + enable);
|
|
4201
4219
|
this.enableRenderFrame = enable;
|
|
4202
4220
|
}
|
|
4203
4221
|
_getRendererMap(uid, streamType) {
|
|
@@ -4306,12 +4324,12 @@ class TRTCCloud extends events_1.EventEmitter {
|
|
|
4306
4324
|
rendererMap.forEach((renderer, node, map) => {
|
|
4307
4325
|
if (node === view && existingKey !== key) {
|
|
4308
4326
|
try {
|
|
4309
|
-
|
|
4327
|
+
logger_1.default.warn(`existing video renderer for ${existingKey}, destroy and create for ${key}.`, view);
|
|
4310
4328
|
renderer.destroy();
|
|
4311
4329
|
map.delete(node);
|
|
4312
4330
|
}
|
|
4313
4331
|
catch (err) {
|
|
4314
|
-
|
|
4332
|
+
logger_1.default.error("_checkAndDeleteExistingRenderer destroy render error:", err);
|
|
4315
4333
|
}
|
|
4316
4334
|
}
|
|
4317
4335
|
});
|
|
@@ -4320,7 +4338,7 @@ class TRTCCloud extends events_1.EventEmitter {
|
|
|
4320
4338
|
_createVideoRenderer(view, key, options) {
|
|
4321
4339
|
// 事先清空一下,避免画面叠加
|
|
4322
4340
|
if (view.childElementCount > 0) {
|
|
4323
|
-
|
|
4341
|
+
logger_1.default.warn("clear HTML element content:", view);
|
|
4324
4342
|
}
|
|
4325
4343
|
this._checkAndDeleteExistingRenderer(view, key);
|
|
4326
4344
|
view.innerHTML = '';
|
|
@@ -4348,7 +4366,7 @@ class TRTCCloud extends events_1.EventEmitter {
|
|
|
4348
4366
|
const validViews = views.filter(view => {
|
|
4349
4367
|
const isValid = view && view instanceof HTMLElement;
|
|
4350
4368
|
if (!isValid) {
|
|
4351
|
-
|
|
4369
|
+
logger_1.default.warn("create renderer failed due to invalid HTMLElement", view);
|
|
4352
4370
|
}
|
|
4353
4371
|
return isValid;
|
|
4354
4372
|
});
|
|
@@ -4361,7 +4379,7 @@ class TRTCCloud extends events_1.EventEmitter {
|
|
|
4361
4379
|
map.delete(innerKey);
|
|
4362
4380
|
}
|
|
4363
4381
|
catch (err) {
|
|
4364
|
-
|
|
4382
|
+
logger_1.default.error("_initRenderer destroy render error:", err);
|
|
4365
4383
|
}
|
|
4366
4384
|
}
|
|
4367
4385
|
});
|
|
@@ -4423,7 +4441,7 @@ class TRTCCloud extends events_1.EventEmitter {
|
|
|
4423
4441
|
throw err;
|
|
4424
4442
|
}
|
|
4425
4443
|
else {
|
|
4426
|
-
|
|
4444
|
+
logger_1.default.warn('write file ok, path:' + path);
|
|
4427
4445
|
}
|
|
4428
4446
|
});
|
|
4429
4447
|
}
|
|
@@ -4460,7 +4478,7 @@ class TRTCCloud extends events_1.EventEmitter {
|
|
|
4460
4478
|
callback(userid, streamType, videoframe);
|
|
4461
4479
|
break;
|
|
4462
4480
|
default:
|
|
4463
|
-
|
|
4481
|
+
logger_1.default.error(`custom render format: '${format}' not supported. Current data format: '${this.pixelFormat}'`);
|
|
4464
4482
|
}
|
|
4465
4483
|
}
|
|
4466
4484
|
else if (this.pixelFormat === trtc_define_1.TRTCVideoPixelFormat.TRTCVideoPixelFormat_BGRA32 && format === trtc_define_1.TRTCVideoPixelFormat.TRTCVideoPixelFormat_RGBA32) {
|
|
@@ -4469,7 +4487,7 @@ class TRTCCloud extends events_1.EventEmitter {
|
|
|
4469
4487
|
callback(userid, streamType, videoframe);
|
|
4470
4488
|
}
|
|
4471
4489
|
else {
|
|
4472
|
-
|
|
4490
|
+
logger_1.default.error(`custom render format: '${format}' not supported. Current data format: '${this.pixelFormat}'`);
|
|
4473
4491
|
}
|
|
4474
4492
|
}
|
|
4475
4493
|
}
|
package/liteav/trtc_define.d.ts
CHANGED
|
@@ -648,17 +648,19 @@ export declare class TRTCPublishCDNParam {
|
|
|
648
648
|
/**
|
|
649
649
|
* 录音参数
|
|
650
650
|
*
|
|
651
|
-
*
|
|
652
|
-
|
|
653
|
-
*
|
|
654
|
-
*
|
|
651
|
+
* @param {String} filePath - 【字段含义】录音文件的保存路径(必填)。<br/>
|
|
652
|
+
*【特别说明】该路径需精确到文件名及格式后缀,格式后缀用于决定录音文件的格式,目前支持的格式有 PCM、WAV 和 AAC。<br/>
|
|
653
|
+
* 例如:假如您指定路径为 "mypath/record/audio.aac",代表您希望 SDK 生成一个 AAC 格式的音频录制文件。<br/>
|
|
654
|
+
* 请您指定一个有读写权限的合法路径,否则录音文件无法生成。<br/>
|
|
655
655
|
* @param {TRTCAudioRecordingContent} recordingContent - 【字段含义】音频录制内容类型。
|
|
656
656
|
* 【特别说明】默认录制所有本地和远端音频。
|
|
657
|
+
* @param {Number} maxDurationPerFile - 【字段含义】maxDurationPerFile 录制文件分片时长,单位毫秒,最小值10000。默认值为0,表示不分片。
|
|
657
658
|
*/
|
|
658
659
|
export declare class TRTCAudioRecordingParams {
|
|
659
660
|
filePath: null | string;
|
|
660
661
|
recordingContent: TRTCAudioRecordingContent;
|
|
661
|
-
|
|
662
|
+
maxDurationPerFile: number;
|
|
663
|
+
constructor(filePath?: null | string, recordingContent?: TRTCAudioRecordingContent, maxDurationPerFile?: number);
|
|
662
664
|
}
|
|
663
665
|
/**
|
|
664
666
|
* 音效
|
package/liteav/trtc_define.js
CHANGED
|
@@ -1296,17 +1296,19 @@ exports.TRTCPublishCDNParam = TRTCPublishCDNParam;
|
|
|
1296
1296
|
/**
|
|
1297
1297
|
* 录音参数
|
|
1298
1298
|
*
|
|
1299
|
-
*
|
|
1300
|
-
|
|
1301
|
-
*
|
|
1302
|
-
*
|
|
1299
|
+
* @param {String} filePath - 【字段含义】录音文件的保存路径(必填)。<br/>
|
|
1300
|
+
*【特别说明】该路径需精确到文件名及格式后缀,格式后缀用于决定录音文件的格式,目前支持的格式有 PCM、WAV 和 AAC。<br/>
|
|
1301
|
+
* 例如:假如您指定路径为 "mypath/record/audio.aac",代表您希望 SDK 生成一个 AAC 格式的音频录制文件。<br/>
|
|
1302
|
+
* 请您指定一个有读写权限的合法路径,否则录音文件无法生成。<br/>
|
|
1303
1303
|
* @param {TRTCAudioRecordingContent} recordingContent - 【字段含义】音频录制内容类型。
|
|
1304
1304
|
* 【特别说明】默认录制所有本地和远端音频。
|
|
1305
|
+
* @param {Number} maxDurationPerFile - 【字段含义】maxDurationPerFile 录制文件分片时长,单位毫秒,最小值10000。默认值为0,表示不分片。
|
|
1305
1306
|
*/
|
|
1306
1307
|
class TRTCAudioRecordingParams {
|
|
1307
|
-
constructor(filePath = null, recordingContent = TRTCAudioRecordingContent.TRTCAudioRecordingContentAll) {
|
|
1308
|
+
constructor(filePath = null, recordingContent = TRTCAudioRecordingContent.TRTCAudioRecordingContentAll, maxDurationPerFile = 0) {
|
|
1308
1309
|
this.filePath = filePath;
|
|
1309
1310
|
this.recordingContent = recordingContent;
|
|
1311
|
+
this.maxDurationPerFile = maxDurationPerFile;
|
|
1310
1312
|
}
|
|
1311
1313
|
}
|
|
1312
1314
|
exports.TRTCAudioRecordingParams = TRTCAudioRecordingParams;
|