@easyv/biz-components 0.0.8 → 0.0.9

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.
@@ -0,0 +1,743 @@
1
+ var j = function() {
2
+ };
3
+ const o = function(e) {
4
+ return new fe(e);
5
+ };
6
+ o.LM = "2023-02-01 18:05";
7
+ var G = "Recorder", q = "getUserMedia", K = "srcSampleRate", F = "sampleRate", ee = "catch";
8
+ o.IsOpen = function() {
9
+ var e = o.Stream;
10
+ if (e) {
11
+ var t = e.getTracks && e.getTracks() || e.audioTracks || [], r = t[0];
12
+ if (r) {
13
+ var n = r.readyState;
14
+ return n == "live" || n == r.LIVE;
15
+ }
16
+ }
17
+ return !1;
18
+ };
19
+ o.BufferSize = 4096;
20
+ o.Destroy = function() {
21
+ z(G + " Destroy"), Z();
22
+ for (var e in re)
23
+ re[e]();
24
+ };
25
+ var re = {};
26
+ o.BindDestroy = function(e, t) {
27
+ re[e] = t;
28
+ };
29
+ o.Support = function() {
30
+ var e = navigator.mediaDevices || {};
31
+ return e[q] || (e = navigator, e[q] || (e[q] = e.webkitGetUserMedia || e.mozGetUserMedia || e.msGetUserMedia)), !(!e[q] || (o.Scope = e, !o.GetContext()));
32
+ };
33
+ o.GetContext = function() {
34
+ var e = window.AudioContext;
35
+ return e || (e = window.webkitAudioContext), e ? ((!o.Ctx || o.Ctx.state == "closed") && (o.Ctx = new e(), o.BindDestroy("Ctx", function() {
36
+ var t = o.Ctx;
37
+ t && t.close && (t.close(), o.Ctx = 0);
38
+ })), o.Ctx) : null;
39
+ };
40
+ var te = "ConnectEnableWebM";
41
+ o[te] = !0;
42
+ var Q = "ConnectEnableWorklet";
43
+ o[Q] = !1;
44
+ var ne = function(e, t) {
45
+ var r = e.BufferSize || o.BufferSize, n = o.Ctx, a = e.Stream, i = function(x) {
46
+ var T = a._m = n.createMediaStreamSource(a), C = n.destination, k = "createMediaStreamDestination";
47
+ n[k] && (C = n[k]()), T.connect(x), x.connect(C);
48
+ }, s, p, v, l = "", M = a._call, g = function(x) {
49
+ for (var T in M) {
50
+ for (var C = x.length, k = new Int16Array(C), I = 0, w = 0; w < C; w++) {
51
+ var y = Math.max(-1, Math.min(1, x[w]));
52
+ y = y < 0 ? y * 32768 : y * 32767, k[w] = y, I += Math.abs(y);
53
+ }
54
+ for (var L in M)
55
+ M[L](k, I);
56
+ return;
57
+ }
58
+ }, c = "ScriptProcessor", u = "audioWorklet", h = G + " " + u, b = "RecProc", _ = "MediaRecorder", S = _ + ".WebM.PCM", f = n.createScriptProcessor || n.createJavaScriptNode, d = "。由于" + u + "内部1秒375次回调,在移动端可能会有性能问题导致回调丢失录音变短,PC端无影响,暂不建议开启" + u + "。", m = function() {
59
+ p = a.isWorklet = !1, ae(a), z(
60
+ "Connect采用老的" + c + "," + (o[Q] ? "但已" : "可") + "设置" + G + "." + Q + "=true尝试启用" + u + l + d,
61
+ 3
62
+ );
63
+ var x = a._p = f.call(n, r, 1, 1);
64
+ i(x);
65
+ var T = "_D220626", C = o[T];
66
+ C && z("Use " + G + "." + T, 3), x.onaudioprocess = function(k) {
67
+ var I = k.inputBuffer.getChannelData(0);
68
+ C ? (I = new Float32Array(I), setTimeout(function() {
69
+ g(I);
70
+ })) : g(I);
71
+ };
72
+ }, R = function() {
73
+ s = a.isWebM = !1, ie(a), p = a.isWorklet = !f || o[Q];
74
+ var x = window.AudioWorkletNode;
75
+ if (!(p && n[u] && x)) {
76
+ m();
77
+ return;
78
+ }
79
+ var T = function() {
80
+ var w = function(L) {
81
+ return L.toString().replace(/^function|DEL_/g, "").replace(/\$RA/g, h);
82
+ }, y = "class " + b + " extends AudioWorkletProcessor{";
83
+ return y += "constructor " + w(function(L) {
84
+ DEL_super(L);
85
+ var O = this, P = L.processorOptions.bufferSize;
86
+ O.bufferSize = P, O.buffer = new Float32Array(P * 2), O.pos = 0, O.port.onmessage = function(A) {
87
+ A.data.kill && (O.kill = !0, console.log("$RA kill call"));
88
+ }, console.log("$RA .ctor call", L);
89
+ }), y += "process " + w(function(L, O, P) {
90
+ var A = this, H = A.bufferSize, E = A.buffer, B = A.pos;
91
+ if (L = (L[0] || [])[0] || [], L.length) {
92
+ E.set(L, B), B += L.length;
93
+ var U = ~~(B / H) * H;
94
+ if (U) {
95
+ this.port.postMessage({ val: E.slice(0, U) });
96
+ var J = E.subarray(U, B);
97
+ E = new Float32Array(H * 2), E.set(J), B = J.length, A.buffer = E;
98
+ }
99
+ A.pos = B;
100
+ }
101
+ return !A.kill;
102
+ }), y += '}try{registerProcessor("' + b + '", ' + b + ')}catch(e){console.error("' + h + '注册失败",e)}', "data:text/javascript;base64," + btoa(unescape(encodeURIComponent(y)));
103
+ }, C = function() {
104
+ return p && a._na;
105
+ }, k = a._na = function() {
106
+ v !== "" && (clearTimeout(v), v = setTimeout(function() {
107
+ v = 0, C() && (z(u + "未返回任何音频,恢复使用" + c, 3), f && m());
108
+ }, 500));
109
+ }, I = function() {
110
+ if (C()) {
111
+ var w = a._n = new x(n, b, {
112
+ processorOptions: { bufferSize: r }
113
+ });
114
+ i(w), w.port.onmessage = function(y) {
115
+ v && (clearTimeout(v), v = ""), C() ? g(y.data.val) : p || z(u + "多余回调", 3);
116
+ }, z(
117
+ "Connect采用" + u + ",设置" + G + "." + Q + "=false可恢复老式" + c + l + d,
118
+ 3
119
+ );
120
+ }
121
+ };
122
+ n.resume()[M && "finally"](function() {
123
+ if (C()) {
124
+ if (n[b]) {
125
+ I();
126
+ return;
127
+ }
128
+ var w = T();
129
+ n[u].addModule(w).then(function(y) {
130
+ C() && (n[b] = 1, I(), v && k());
131
+ })[ee](function(y) {
132
+ z(u + ".addModule失败", 1, y), C() && m();
133
+ });
134
+ }
135
+ });
136
+ }, D = function() {
137
+ var x = window[_], T = "ondataavailable", C = "audio/webm; codecs=pcm";
138
+ s = a.isWebM = o[te];
139
+ var k = x && T in x.prototype && x.isTypeSupported(C);
140
+ if (l = k ? "" : "(此浏览器不支持" + S + ")", !t || !s || !k) {
141
+ R();
142
+ return;
143
+ }
144
+ var I = function() {
145
+ return s && a._ra;
146
+ };
147
+ a._ra = function() {
148
+ v !== "" && (clearTimeout(v), v = setTimeout(function() {
149
+ I() && (z(_ + "未返回任何音频,降级使用" + u, 3), R());
150
+ }, 500));
151
+ };
152
+ var w = Object.assign({ mimeType: C }, o.ConnectWebMOptions), y = a._r = new x(a, w), L = a._rd = { sampleRate: n[F] };
153
+ y[T] = function(O) {
154
+ var P = new FileReader();
155
+ P.onloadend = function() {
156
+ if (I()) {
157
+ var A = ce(new Uint8Array(P.result), L);
158
+ if (!A) return;
159
+ if (A == -1) {
160
+ R();
161
+ return;
162
+ }
163
+ v && (clearTimeout(v), v = ""), g(A);
164
+ } else s || z(_ + "多余回调", 3);
165
+ }, P.readAsArrayBuffer(O.data);
166
+ }, y.start(~~(r / 48)), z(
167
+ "Connect采用" + S + ",设置" + G + "." + te + "=false可恢复使用" + u + "或老式" + c
168
+ );
169
+ };
170
+ D();
171
+ }, ve = function(e) {
172
+ e._na && e._na(), e._ra && e._ra();
173
+ }, ae = function(e) {
174
+ e._na = null, e._n && (e._n.port.postMessage({ kill: !0 }), e._n.disconnect(), e._n = null);
175
+ }, ie = function(e) {
176
+ e._ra = null, e._r && (e._r.stop(), e._r = null);
177
+ }, Z = function(e) {
178
+ e = e || o;
179
+ var t = e == o, r = e.Stream;
180
+ if (r && (r._m && (r._m.disconnect(), r._m = null), r._p && (r._p.disconnect(), r._p.onaudioprocess = r._p = null), ae(r), ie(r), t)) {
181
+ for (var n = r.getTracks && r.getTracks() || r.audioTracks || [], a = 0; a < n.length; a++) {
182
+ var i = n[a];
183
+ i.stop && i.stop();
184
+ }
185
+ r.stop && r.stop();
186
+ }
187
+ e.Stream = 0;
188
+ };
189
+ o.SampleData = function(e, t, r, n, a) {
190
+ n || (n = {});
191
+ var i = n.index || 0, s = n.offset || 0, p = n.frameNext || [];
192
+ a || (a = {});
193
+ var v = a.frameSize || 1;
194
+ a.frameType && (v = a.frameType == "mp3" ? 1152 : 1);
195
+ var l = e.length;
196
+ i > l + 1 && z("SampleData似乎传入了未重置chunk " + i + ">" + l, 3);
197
+ for (var M = 0, g = i; g < l; g++)
198
+ M += e[g].length;
199
+ M = Math.max(0, M - Math.floor(s));
200
+ var c = t / r;
201
+ c > 1 ? M = Math.floor(M / c) : (c = 1, r = t), M += p.length;
202
+ for (var u = new Int16Array(M), h = 0, g = 0; g < p.length; g++)
203
+ u[h] = p[g], h++;
204
+ for (; i < l; i++) {
205
+ for (var b = e[i], g = s, _ = b.length; g < _; ) {
206
+ var S = Math.floor(g), f = Math.ceil(g), d = g - S, m = b[S], R = f < _ ? b[f] : (
207
+ //后个点越界了,查找下一个数组
208
+ (e[i + 1] || [m])[0] || 0
209
+ );
210
+ u[h] = m + (R - m) * d, h++, g += c;
211
+ }
212
+ s = g - _;
213
+ }
214
+ p = null;
215
+ var D = u.length % v;
216
+ if (D > 0) {
217
+ var x = (u.length - D) * 2;
218
+ p = new Int16Array(u.buffer.slice(x)), u = new Int16Array(u.buffer.slice(0, x));
219
+ }
220
+ return {
221
+ index: i,
222
+ offset: s,
223
+ frameNext: p,
224
+ sampleRate: r,
225
+ data: u
226
+ };
227
+ };
228
+ o.PowerLevel = function(e, t) {
229
+ var r = e / t || 0, n;
230
+ return r < 1251 ? n = Math.round(r / 1250 * 10) : n = Math.round(
231
+ Math.min(100, Math.max(0, (1 + Math.log(r / 1e4) / Math.log(10)) * 100))
232
+ ), n;
233
+ };
234
+ o.PowerDBFS = function(e) {
235
+ var t = Math.max(0.1, e || 0), r = 32767;
236
+ return t = Math.min(t, r), t = 20 * Math.log(t / r) / Math.log(10), Math.max(-100, Math.round(t));
237
+ };
238
+ o.CLog = function(e, t) {
239
+ var r = /* @__PURE__ */ new Date(), n = ("0" + r.getMinutes()).substr(-2) + ":" + ("0" + r.getSeconds()).substr(-2) + "." + ("00" + r.getMilliseconds()).substr(-3), a = this && this.envIn && this.envCheck && this.id, i = ["[" + n + " " + G + (a ? ":" + a : "") + "]" + e], s = arguments, p = window.console || {}, v = 2, l = p.log;
240
+ for (typeof t == "number" ? l = t == 1 ? p.error : t == 3 ? p.warn : l : v = 1; v < s.length; v++)
241
+ i.push(s[v]);
242
+ oe ? l && l("[IsLoser]" + i[0], i.length > 1 ? i : "") : l.apply(p, i);
243
+ };
244
+ var z = function() {
245
+ o.CLog.apply(this, arguments);
246
+ }, oe = !0;
247
+ try {
248
+ oe = !console.log.apply;
249
+ } catch {
250
+ }
251
+ var le = 0;
252
+ function fe(e) {
253
+ this.id = ++le, se();
254
+ var t = {
255
+ type: "mp3",
256
+ //输出类型:mp3,wav,wav输出文件尺寸超大不推荐使用,但mp3编码支持会导致js文件超大,如果不需支持mp3可以使js文件大幅减小
257
+ bitRate: 16,
258
+ //比特率 wav:16或8位,MP3:8kbps 1k/s,8kbps 2k/s 录音文件很小
259
+ sampleRate: 16e3,
260
+ //采样率,wav格式大小=sampleRate*时间;mp3此项对低比特率有影响,高比特率几乎无影响。
261
+ //wav任意值,mp3取值范围:48000, 44100, 32000, 24000, 22050, 16000, 12000, 11025, 8000
262
+ //采样率参考https://www.cnblogs.com/devin87/p/mp3-recorder.html
263
+ onProcess: j
264
+ //fn(buffers,powerLevel,bufferDuration,bufferSampleRate,newBufferIdx,asyncEnd) buffers=[[Int16,...],...]:缓冲的PCM数据,为从开始录音到现在的所有pcm片段;powerLevel:当前缓冲的音量级别0-100,bufferDuration:已缓冲时长,bufferSampleRate:缓冲使用的采样率(当type支持边录边转码(Worker)时,此采样率和设置的采样率相同,否则不一定相同);newBufferIdx:本次回调新增的buffer起始索引;asyncEnd:fn() 如果onProcess是异步的(返回值为true时),处理完成时需要调用此回调,如果不是异步的请忽略此参数,此方法回调时必须是真异步(不能真异步时需用setTimeout包裹)。onProcess返回值:如果返回true代表开启异步模式,在某些大量运算的场合异步是必须的,必须在异步处理完成时调用asyncEnd(不能真异步时需用setTimeout包裹),在onProcess执行后新增的buffer会全部替换成空数组,因此本回调开头应立即将newBufferIdx到本次回调结尾位置的buffer全部保存到另外一个数组内,处理完成后写回buffers中本次回调的结尾位置。
265
+ //*******高级设置******
266
+ //,sourceStream:MediaStream Object
267
+ //可选直接提供一个媒体流,从这个流中录制、实时处理音频数据(当前Recorder实例独享此流);不提供时为普通的麦克风录音,由getUserMedia提供音频流(所有Recorder实例共享同一个流)
268
+ //比如:audio、video标签dom节点的captureStream方法(实验特性,不同浏览器支持程度不高)返回的流;WebRTC中的remote流;自己创建的流等
269
+ //注意:流内必须至少存在一条音轨(Audio Track),比如audio标签必须等待到可以开始播放后才会有音轨,否则open会失败
270
+ //,audioTrackSet:{ deviceId:"",groupId:"", autoGainControl:true, echoCancellation:true, noiseSuppression:true }
271
+ //普通麦克风录音时getUserMedia方法的audio配置参数,比如指定设备id,回声消除、降噪开关;注意:提供的任何配置值都不一定会生效
272
+ //由于麦克风是全局共享的,所以新配置后需要close掉以前的再重新open
273
+ //更多参考: https://developer.mozilla.org/en-US/docs/Web/API/MediaTrackConstraints
274
+ //,disableEnvInFix:false 内部参数,禁用设备卡顿时音频输入丢失补偿功能
275
+ //,takeoffEncodeChunk:NOOP //fn(chunkBytes) chunkBytes=[Uint8,...]:实时编码环境下接管编码器输出,当编码器实时编码出一块有效的二进制音频数据时实时回调此方法;参数为二进制的Uint8Array,就是编码出来的音频数据片段,所有的chunkBytes拼接在一起即为完整音频。本实现的想法最初由QQ2543775048提出
276
+ //当提供此回调方法时,将接管编码器的数据输出,编码器内部将放弃存储生成的音频数据;环境要求比较苛刻:如果当前环境不支持实时编码处理,将在open时直接走fail逻辑
277
+ //因此提供此回调后调用stop方法将无法获得有效的音频数据,因为编码器内没有音频数据,因此stop时返回的blob将是一个字节长度为0的blob
278
+ //目前只有mp3格式实现了实时编码,在支持实时处理的环境中将会实时的将编码出来的mp3片段通过此方法回调,所有的chunkBytes拼接到一起即为完整的mp3,此种拼接的结果比mock方法实时生成的音质更加,因为天然避免了首尾的静默
279
+ //目前除mp3外其他格式不可以提供此回调,提供了将在open时直接走fail逻辑
280
+ };
281
+ for (var r in e)
282
+ t[r] = e[r];
283
+ this.set = t, this._S = 9, this.Sync = { O: 9, C: 9 };
284
+ }
285
+ o.Sync = {
286
+ /*open*/
287
+ O: 9,
288
+ /*close*/
289
+ C: 9
290
+ };
291
+ o.prototype = fe.prototype = {
292
+ CLog: z,
293
+ //流相关的数据存储在哪个对象里面;如果提供了sourceStream,数据直接存储在当前对象中,否则存储在全局
294
+ _streamStore: function() {
295
+ return this.set.sourceStream ? this : o;
296
+ },
297
+ //打开录音资源True(),False(msg,isUserNotAllow),需要调用close。注意:此方法是异步的;一般使用时打开,用完立即关闭;可重复调用,可用来测试是否能录音
298
+ open: function(e, t) {
299
+ var r = this, n = r._streamStore();
300
+ e = e || j;
301
+ var a = function(f, d) {
302
+ d = !!d, r.CLog("录音open失败:" + f + ",isUserNotAllow:" + d, 1), t && t(f, d);
303
+ }, i = function() {
304
+ r.CLog("open ok id:" + r.id), e(), r._SO = 0;
305
+ }, s = n.Sync, p = ++s.O, v = s.C;
306
+ r._O = r._O_ = p, r._SO = r._S;
307
+ var l = function() {
308
+ if (v != s.C || !r._O) {
309
+ var f = "open被取消";
310
+ return p == s.O ? r.close() : f = "open被中断", a(f), !0;
311
+ }
312
+ }, M = r.envCheck({ envName: "H5", canProcess: !0 });
313
+ if (M) {
314
+ a("不能录音:" + M);
315
+ return;
316
+ }
317
+ if (r.set.sourceStream) {
318
+ if (!o.GetContext()) {
319
+ a("不支持此浏览器从流中获取录音");
320
+ return;
321
+ }
322
+ Z(n), r.Stream = r.set.sourceStream, r.Stream._call = {};
323
+ try {
324
+ ne(n);
325
+ } catch (f) {
326
+ a("从流中打开录音失败:" + f.message);
327
+ return;
328
+ }
329
+ i();
330
+ return;
331
+ }
332
+ var g = function(f, d) {
333
+ try {
334
+ window.top.a;
335
+ } catch {
336
+ a('无权录音(跨域,请尝试给iframe添加麦克风访问策略,如allow="camera;microphone")');
337
+ return;
338
+ }
339
+ /Permission|Allow/i.test(f) ? a("用户拒绝了录音权限", !0) : window.isSecureContext === !1 ? a("浏览器禁止不安全页面录音,可开启https解决") : /Found/i.test(f) ? a(d + ",无可用麦克风") : a(d);
340
+ };
341
+ if (o.IsOpen()) {
342
+ i();
343
+ return;
344
+ }
345
+ if (!o.Support()) {
346
+ g("", "此浏览器不支持录音");
347
+ return;
348
+ }
349
+ var c = function(f) {
350
+ setTimeout(function() {
351
+ f._call = {};
352
+ var d = o.Stream;
353
+ d && (Z(), f._call = d._call), o.Stream = f, !l() && (o.IsOpen() ? (d && r.CLog("发现同时多次调用open", 1), ne(n, 1), i()) : a("录音功能无效:无音频流"));
354
+ }, 100);
355
+ }, u = function(f) {
356
+ var d = f.name || f.message || f.code + ":" + f;
357
+ r.CLog("请求录音权限错误", 1, f), g(d, "无法录音:" + d);
358
+ }, h = {
359
+ noiseSuppression: !1,
360
+ //默认禁用降噪,原声录制,免得移动端表现怪异(包括系统播放声音变小)
361
+ echoCancellation: !1
362
+ //回声消除
363
+ }, b = r.set.audioTrackSet;
364
+ for (var _ in b) h[_] = b[_];
365
+ h.sampleRate = o.Ctx.sampleRate;
366
+ try {
367
+ var S = o.Scope[q]({ audio: h }, c, u);
368
+ } catch (f) {
369
+ r.CLog(q, 3, f), S = o.Scope[q]({ audio: !0 }, c, u);
370
+ }
371
+ S && S.then && S.then(c)[ee](u);
372
+ },
373
+ //关闭释放录音资源
374
+ close: function(e) {
375
+ e = e || j;
376
+ var t = this, r = t._streamStore();
377
+ t._stop();
378
+ var n = r.Sync;
379
+ if (t._O = 0, t._O_ != n.O) {
380
+ t.CLog("close被忽略(因为同时open了多个rec,只有最后一个会真正close)", 3), e();
381
+ return;
382
+ }
383
+ n.C++, Z(r), t.CLog("close"), e();
384
+ },
385
+ /*模拟一段录音数据,后面可以调用stop进行编码,需提供pcm数据[1,2,3...],pcm的采样率*/
386
+ mock: function(e, t) {
387
+ var r = this;
388
+ return r._stop(), r.isMock = 1, r.mockEnvInfo = null, r.buffers = [e], r.recSize = e.length, r[K] = t, r;
389
+ },
390
+ envCheck: function(e) {
391
+ var t, r = this, n = r.set, a = "CPU_BE";
392
+ if (!t && !o[a] && window.Int8Array && !new Int8Array(new Int32Array([1]).buffer)[0] && (se(a), t = "不支持" + a + "架构"), !t) {
393
+ var i = n.type;
394
+ r[i + "_envCheck"] ? t = r[i + "_envCheck"](e, n) : n.takeoffEncodeChunk && (t = i + "类型" + (r[i] ? "" : "(未加载编码器)") + "不支持设置takeoffEncodeChunk");
395
+ }
396
+ return t || "";
397
+ },
398
+ envStart: function(e, t) {
399
+ var r = this, n = r.set;
400
+ r.isMock = e ? 1 : 0, r.mockEnvInfo = e, r.buffers = [], r.recSize = 0, r.envInLast = 0, r.envInFirst = 0, r.envInFix = 0, r.envInFixTs = [];
401
+ var a = n[F];
402
+ if (a > t ? n[F] = t : a = 0, r[K] = t, r.CLog(
403
+ K + ": " + t + " set." + F + ": " + n[F] + (a ? " 忽略" + a : ""),
404
+ a ? 3 : 0
405
+ ), r.engineCtx = 0, r[n.type + "_start"]) {
406
+ var i = r.engineCtx = r[n.type + "_start"](n);
407
+ i && (i.pcmDatas = [], i.pcmSize = 0);
408
+ }
409
+ },
410
+ envResume: function() {
411
+ this.envInFixTs = [];
412
+ },
413
+ envIn: function(e, t) {
414
+ var r = this, n = r.set, a = r.engineCtx, i = r[K], s = e.length, p = o.PowerLevel(t, s), v = r.buffers, l = v.length;
415
+ v.push(e);
416
+ var M = v, g = l, c = Date.now(), u = Math.round(s / i * 1e3);
417
+ r.envInLast = c, r.buffers.length == 1 && (r.envInFirst = c - u);
418
+ var h = r.envInFixTs;
419
+ h.splice(0, 0, { t: c, d: u });
420
+ for (var b = c, _ = 0, S = 0; S < h.length; S++) {
421
+ var f = h[S];
422
+ if (c - f.t > 3e3) {
423
+ h.length = S;
424
+ break;
425
+ }
426
+ b = f.t, _ += f.d;
427
+ }
428
+ var d = h[1], m = c - b, R = m - _;
429
+ if (R > m / 3 && (d && m > 1e3 || h.length >= 6)) {
430
+ var D = c - d.t - u;
431
+ if (D > u / 5) {
432
+ var x = !n.disableEnvInFix;
433
+ if (r.CLog("[" + c + "]" + (x ? "" : "未") + "补偿" + D + "ms", 3), r.envInFix += D, x) {
434
+ var T = new Int16Array(D * i / 1e3);
435
+ s += T.length, v.push(T);
436
+ }
437
+ }
438
+ }
439
+ var C = r.recSize, k = s, I = C + k;
440
+ if (r.recSize = I, a) {
441
+ var w = o.SampleData(
442
+ v,
443
+ i,
444
+ n[F],
445
+ a.chunkInfo
446
+ );
447
+ a.chunkInfo = w, C = a.pcmSize, k = w.data.length, I = C + k, a.pcmSize = I, v = a.pcmDatas, l = v.length, v.push(w.data), i = w[F];
448
+ }
449
+ var y = Math.round(I / i * 1e3), L = v.length, O = M.length, P = function() {
450
+ for (var U = A ? 0 : -k, J = v[0] == null, $ = l; $ < L; $++) {
451
+ var Y = v[$];
452
+ Y == null ? J = 1 : (U += Y.length, a && Y.length && r[n.type + "_encode"](a, Y));
453
+ }
454
+ if (J && a) {
455
+ var $ = g;
456
+ for (M[0] && ($ = 0); $ < O; $++)
457
+ M[$] = null;
458
+ }
459
+ J && (U = A ? k : 0, v[0] = null), a ? a.pcmSize += U : r.recSize += U;
460
+ }, A = 0, H = "rec.set.onProcess";
461
+ try {
462
+ A = n.onProcess(
463
+ v,
464
+ p,
465
+ y,
466
+ i,
467
+ l,
468
+ P
469
+ );
470
+ } catch (U) {
471
+ console.error(H + "回调出错是不允许的,需保证不会抛异常", U);
472
+ }
473
+ var E = Date.now() - c;
474
+ if (E > 10 && r.envInFirst - c > 1e3 && r.CLog(H + "低性能,耗时" + E + "ms", 3), A === !0) {
475
+ for (var B = 0, S = l; S < L; S++)
476
+ v[S] == null ? B = 1 : v[S] = new Int16Array(0);
477
+ B ? r.CLog("未进入异步前不能清除buffers", 3) : a ? a.pcmSize -= k : r.recSize -= k;
478
+ } else
479
+ P();
480
+ },
481
+ //开始录音,需先调用open;只要open成功时,调用此方法是安全的,如果未open强行调用导致的内部错误将不会有任何提示,stop时自然能得到错误
482
+ start: function() {
483
+ var e = this, t = o.Ctx, r = 1;
484
+ if (e.set.sourceStream ? e.Stream || (r = 0) : o.IsOpen() || (r = 0), !r) {
485
+ e.CLog("未open", 1);
486
+ return;
487
+ }
488
+ if (e.CLog("开始录音"), e._stop(), e.state = 3, e.envStart(null, t[F]), e._SO && e._SO + 1 != e._S) {
489
+ e.CLog("start被中断", 3);
490
+ return;
491
+ }
492
+ e._SO = 0;
493
+ var n = function() {
494
+ e.state == 3 && (e.state = 1, e.resume());
495
+ };
496
+ if (t.state == "suspended") {
497
+ var a = "AudioContext resume: ";
498
+ e.CLog(a + "wait..."), t.resume().then(function() {
499
+ e.CLog(a + t.state), n();
500
+ })[ee](function(i) {
501
+ e.CLog(a + t.state + " 可能无法录音:" + i.message, 1, i), n();
502
+ });
503
+ } else
504
+ n();
505
+ },
506
+ /*暂停录音*/
507
+ pause: function() {
508
+ var e = this;
509
+ e.state && (e.state = 2, e.CLog("pause"), delete e._streamStore().Stream._call[e.id]);
510
+ },
511
+ /*恢复录音*/
512
+ resume: function() {
513
+ var e = this;
514
+ if (e.state) {
515
+ e.state = 1, e.CLog("resume"), e.envResume();
516
+ var t = e._streamStore().Stream;
517
+ t._call[e.id] = function(r, n) {
518
+ e.state == 1 && e.envIn(r, n);
519
+ }, ve(t);
520
+ }
521
+ },
522
+ _stop: function(e) {
523
+ var t = this, r = t.set;
524
+ t.isMock || t._S++, t.state && (t.pause(), t.state = 0), !e && t[r.type + "_stop"] && (t[r.type + "_stop"](t.engineCtx), t.engineCtx = 0);
525
+ },
526
+ /*
527
+ 结束录音并返回录音数据blob对象
528
+ True(blob,duration)
529
+ blob:录音数据audio/mp3|wav格式
530
+ duration:录音时长,单位毫秒
531
+ False(msg)
532
+ autoClose:false 可选,是否自动调用close,默认为false
533
+ */
534
+ stop: function(e, t, r) {
535
+ var n = this, a = n.set, i, s = n.envInLast - n.envInFirst, p = s && n.buffers.length;
536
+ n.CLog(
537
+ "stop 和start时差" + (s ? s + "ms 补偿" + n.envInFix + "ms envIn:" + p + " fps:" + (p / s * 1e3).toFixed(1) : "-")
538
+ );
539
+ var v = function() {
540
+ n._stop(), r && n.close();
541
+ }, l = function(f) {
542
+ n.CLog("结束录音失败:" + f, 1), t && t(f), v();
543
+ }, M = function(f, d) {
544
+ if (n.CLog(
545
+ "结束录音 编码花" + (Date.now() - i) + "ms 音频时长" + d + "ms 文件大小" + f.size + "b"
546
+ ), a.takeoffEncodeChunk)
547
+ n.CLog("启用takeoffEncodeChunk后stop返回的blob长度为0不提供音频数据", 3);
548
+ else if (f.size < Math.max(100, d / 2)) {
549
+ l("生成的" + a.type + "无效");
550
+ return;
551
+ }
552
+ e && e(f, d), v();
553
+ };
554
+ if (!n.isMock) {
555
+ var g = n.state == 3;
556
+ if (!n.state || g) {
557
+ console.log(
558
+ "未开始录音" + (g ? ",开始录音前无用户交互导致AudioContext未运行" : "")
559
+ );
560
+ return;
561
+ }
562
+ n._stop(!0);
563
+ }
564
+ var c = n.recSize;
565
+ if (!c) {
566
+ l("未采集到录音");
567
+ return;
568
+ }
569
+ if (!n.buffers[0]) {
570
+ l("音频buffers被释放");
571
+ return;
572
+ }
573
+ if (!n[a.type]) {
574
+ l("未加载" + a.type + "编码器");
575
+ return;
576
+ }
577
+ if (n.isMock) {
578
+ var u = n.envCheck(n.mockEnvInfo || { envName: "mock", canProcess: !1 });
579
+ if (u) {
580
+ l("录音错误:" + u);
581
+ return;
582
+ }
583
+ }
584
+ var h = n.engineCtx;
585
+ if (n[a.type + "_complete"] && h) {
586
+ var S = Math.round(h.pcmSize / a[F] * 1e3);
587
+ i = Date.now(), n[a.type + "_complete"](
588
+ h,
589
+ function(d) {
590
+ M(d, S);
591
+ },
592
+ l
593
+ );
594
+ return;
595
+ }
596
+ i = Date.now();
597
+ var b = o.SampleData(n.buffers, n[K], a[F]);
598
+ a[F] = b[F];
599
+ var _ = b.data, S = Math.round(_.length / a[F] * 1e3);
600
+ n.CLog("采样" + c + "->" + _.length + " 花:" + (Date.now() - i) + "ms"), setTimeout(function() {
601
+ i = Date.now(), n[a.type](
602
+ _,
603
+ function(f) {
604
+ M(f, S);
605
+ },
606
+ function(f) {
607
+ l(f);
608
+ }
609
+ );
610
+ });
611
+ }
612
+ };
613
+ var ce = function(e, t) {
614
+ t.pos || (t.pos = [0], t.tracks = {}, t.bytes = []);
615
+ var r = t.tracks, n = [t.pos[0]], a = function() {
616
+ t.pos[0] = n[0];
617
+ }, i = t.bytes.length, s = new Uint8Array(i + e.length);
618
+ if (s.set(t.bytes), s.set(e, i), t.bytes = s, !t._ht) {
619
+ if (N(s, n), V(s, n), !W(N(s, n), [24, 83, 128, 103]))
620
+ return;
621
+ for (N(s, n); n[0] < s.length; ) {
622
+ var p = N(s, n), v = V(s, n), l = [0], M = 0;
623
+ if (!v) return;
624
+ if (W(p, [22, 84, 174, 107])) {
625
+ for (; l[0] < v.length; ) {
626
+ var g = N(v, l), c = V(v, l), u = [0], h = { channels: 0, sampleRate: 0 };
627
+ if (W(g, [174]))
628
+ for (; u[0] < c.length; ) {
629
+ var b = N(c, u), _ = V(c, u), S = [0];
630
+ if (W(b, [215])) {
631
+ var f = X(_);
632
+ h.number = f, r[f] = h;
633
+ } else if (W(b, [131])) {
634
+ var f = X(_);
635
+ f == 1 ? h.type = "video" : f == 2 ? (h.type = "audio", M || (t.track0 = h), h.idx = M++) : h.type = "Type-" + f;
636
+ } else if (W(b, [134])) {
637
+ for (var d = "", m = 0; m < _.length; m++)
638
+ d += String.fromCharCode(_[m]);
639
+ h.codec = d;
640
+ } else if (W(b, [225]))
641
+ for (; S[0] < _.length; ) {
642
+ var R = N(_, S), D = V(_, S);
643
+ if (W(R, [181])) {
644
+ var f = 0, x = new Uint8Array(D.reverse()).buffer;
645
+ D.length == 4 ? f = new Float32Array(x)[0] : D.length == 8 ? f = new Float64Array(x)[0] : z("WebM Track !Float", 1, D), h[F] = Math.round(f);
646
+ } else W(R, [98, 100]) ? h.bitDepth = X(D) : W(R, [159]) && (h.channels = X(D));
647
+ }
648
+ }
649
+ }
650
+ t._ht = 1, z("WebM Tracks", r), a();
651
+ break;
652
+ }
653
+ }
654
+ }
655
+ var T = t.track0;
656
+ if (T) {
657
+ if (T.bitDepth == 16 && /FLOAT/i.test(T.codec) && (T.bitDepth = 32, z("WebM 16改32位", 3)), T[F] != t[F] || T.bitDepth != 32 || T.channels < 1 || !/(\b|_)PCM\b/i.test(T.codec))
658
+ return t.bytes = [], t.bad || z("WebM Track非预期", 3, t), t.bad = 1, -1;
659
+ for (var C = [], k = 0; n[0] < s.length; ) {
660
+ var g = N(s, n), c = V(s, n);
661
+ if (!c) break;
662
+ if (W(g, [163])) {
663
+ var I = c[0] & 15, h = r[I];
664
+ if (!h)
665
+ z("WebM !Track" + I, 1, r);
666
+ else if (h.idx === 0) {
667
+ for (var w = new Uint8Array(c.length - 4), m = 4; m < c.length; m++)
668
+ w[m - 4] = c[m];
669
+ C.push(w), k += w.length;
670
+ }
671
+ }
672
+ a();
673
+ }
674
+ if (k) {
675
+ var y = new Uint8Array(s.length - t.pos[0]);
676
+ y.set(s.subarray(t.pos[0])), t.bytes = y, t.pos[0] = 0;
677
+ for (var w = new Uint8Array(k), m = 0, L = 0; m < C.length; m++)
678
+ w.set(C[m], L), L += C[m].length;
679
+ var x = new Float32Array(w.buffer);
680
+ if (T.channels > 1) {
681
+ for (var O = [], m = 0; m < x.length; )
682
+ O.push(x[m]), m += T.channels;
683
+ x = new Float32Array(O);
684
+ }
685
+ return x;
686
+ }
687
+ }
688
+ }, W = function(e, t) {
689
+ if (!e || e.length != t.length) return !1;
690
+ if (e.length == 1) return e[0] == t[0];
691
+ for (var r = 0; r < e.length; r++)
692
+ if (e[r] != t[r]) return !1;
693
+ return !0;
694
+ }, X = function(e) {
695
+ for (var t = "", r = 0; r < e.length; r++) {
696
+ var n = e[r];
697
+ t += (n < 16 ? "0" : "") + n.toString(16);
698
+ }
699
+ return parseInt(t, 16) || 0;
700
+ }, N = function(e, t, r) {
701
+ var n = t[0];
702
+ if (!(n >= e.length)) {
703
+ var a = e[n], i = ("0000000" + a.toString(2)).substr(-8), s = /^(0*1)(\d*)$/.exec(i);
704
+ if (s) {
705
+ var p = s[1].length, v = [];
706
+ if (!(n + p > e.length)) {
707
+ for (var l = 0; l < p; l++)
708
+ v[l] = e[n], n++;
709
+ return r && (v[0] = parseInt(s[2] || "0", 2)), t[0] = n, v;
710
+ }
711
+ }
712
+ }
713
+ }, V = function(e, t) {
714
+ var r = N(e, t, 1);
715
+ if (r) {
716
+ var n = X(r), a = t[0], i = [];
717
+ if (n < 2147483647) {
718
+ if (a + n > e.length) return;
719
+ for (var s = 0; s < n; s++)
720
+ i[s] = e[a], a++;
721
+ }
722
+ return t[0] = a, i;
723
+ }
724
+ };
725
+ o.TrafficImgUrl = "//ia.51.la/go1?id=20469973&pvFlag=1";
726
+ var se = o.Traffic = function(e) {
727
+ e = e ? "/" + G + "/Report/" + e : "";
728
+ var t = o.TrafficImgUrl;
729
+ if (t) {
730
+ var r = o.Traffic, n = /^(https?:..[^\/#]*\/?)[^#]*/i.exec(location.href) || [], a = n[1] || "http://file/", i = (n[0] || a) + e;
731
+ if (t.indexOf("//") == 0 && (/^https:/i.test(i) ? t = "https:" + t : t = "http:" + t), e && (t = t + "&cu=" + encodeURIComponent(a + e)), !r[i]) {
732
+ r[i] = 1;
733
+ var s = new Image();
734
+ s.src = t, z(
735
+ "Traffic Analysis Image: " + (e || G + ".TrafficImgUrl=" + o.TrafficImgUrl)
736
+ );
737
+ }
738
+ }
739
+ };
740
+ export {
741
+ o as Recorder
742
+ };
743
+ //# sourceMappingURL=recorder.es.js.map