@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.
- package/dist/components/AiMessageRender/AiMessageRender.es.js +14 -4
- package/dist/components/AiMessageRender/AiMessageRender.es.js.map +1 -1
- package/dist/components/VoiceAnimation/VoiceAnimation.d.ts +7 -0
- package/dist/components/VoiceAnimation/VoiceAnimation.es.js +20 -0
- package/dist/components/VoiceAnimation/VoiceAnimation.es.js.map +1 -0
- package/dist/components/VoiceAnimation/index.d.ts +1 -0
- package/dist/components/index.d.ts +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.es.js +12 -6
- package/dist/index.es.js.map +1 -1
- package/dist/style.css +1 -0
- package/dist/utils/funASR/funASRManager.d.ts +103 -0
- package/dist/utils/funASR/funASRManager.es.js +78 -0
- package/dist/utils/funASR/funASRManager.es.js.map +1 -0
- package/dist/utils/funASR/index.d.ts +1 -0
- package/dist/utils/funASR/pcm.d.ts +1 -0
- package/dist/utils/funASR/pcm.es.js +46 -0
- package/dist/utils/funASR/pcm.es.js.map +1 -0
- package/dist/utils/funASR/recorder.d.ts +3 -0
- package/dist/utils/funASR/recorder.es.js +743 -0
- package/dist/utils/funASR/recorder.es.js.map +1 -0
- package/dist/utils/funASR/wav.d.ts +1 -0
- package/dist/utils/funASR/wav.es.js +28 -0
- package/dist/utils/funASR/wav.es.js.map +1 -0
- package/dist/utils/funASR/wsConnecter.d.ts +16 -0
- package/dist/utils/funASR/wsConnecter.es.js +53 -0
- package/dist/utils/funASR/wsConnecter.es.js.map +1 -0
- package/dist/utils/index.d.ts +1 -0
- package/package.json +4 -1
|
@@ -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
|