@banou/media-player 0.8.8 → 0.8.10
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/engine/index.d.ts +1 -1
- package/dist/engine/index.js +2 -2
- package/dist/engine/playback.d.ts +13 -0
- package/dist/{engine-B6flRjLd.js → engine-Cownv8gD.js} +139 -98
- package/dist/index.js +377 -351
- package/dist/react/video-player.d.ts +9 -0
- package/package.json +1 -1
- package/src/lib/engine/index.ts +1 -1
- package/src/lib/engine/playback.ts +141 -7
- package/src/lib/react/hooks/use-playback.ts +38 -2
- package/src/lib/react/video-player.tsx +9 -0
package/dist/engine/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { startPlayback, terminateRemuxer, DEFAULT_BUFFER_SIZE } from './playback';
|
|
1
|
+
export { startPlayback, terminateRemuxer, MediaElementError, isMediaElementError, DEFAULT_BUFFER_SIZE } from './playback';
|
|
2
2
|
export type { PlaybackOptions, PlaybackController, MediaIndex, AudioStream } from './playback';
|
|
3
3
|
export { createSubtitleRenderer, SUBTITLES_OFF } from './subtitles';
|
|
4
4
|
export type { SubtitleRenderer, SubtitleRendererOptions, SubtitleStream } from './subtitles';
|
package/dist/engine/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { a as e, c as t,
|
|
2
|
-
export {
|
|
1
|
+
import { a as e, c as t, d as n, f as r, i, l as a, n as o, o as s, r as c, s as l, t as u, u as d } from "../engine-Cownv8gD.js";
|
|
2
|
+
export { i as DEFAULT_BUFFER_SIZE, e as MediaElementError, a as SUBTITLES_OFF, u as createPictureInPicture, d as createSubtitleRenderer, c as createThumbnailGenerator, n as getTimeRanges, s as isMediaElementError, o as pictureInPictureMode, l as startPlayback, t as terminateRemuxer, r as updateSourceBuffer };
|
|
@@ -37,6 +37,19 @@ export type PlaybackController = {
|
|
|
37
37
|
videoMimeType: string;
|
|
38
38
|
audioMimeType: string;
|
|
39
39
|
};
|
|
40
|
+
/**
|
|
41
|
+
* A terminal failure of the media element itself, as opposed to anything this pipeline did.
|
|
42
|
+
*
|
|
43
|
+
* It is worth its own type because it is the one error class that says something about the CURE:
|
|
44
|
+
* the element is finished and no append will ever succeed against it again, so reporting it to the
|
|
45
|
+
* viewer is pointless and only a rebuilt element clears it. The flag rather than an `instanceof`
|
|
46
|
+
* is what survives the error crossing a module boundary.
|
|
47
|
+
*/
|
|
48
|
+
export declare class MediaElementError extends Error {
|
|
49
|
+
readonly mediaElement = true;
|
|
50
|
+
constructor(message: string, options?: ErrorOptions);
|
|
51
|
+
}
|
|
52
|
+
export declare const isMediaElementError: (error: unknown) => boolean;
|
|
40
53
|
export declare const DEFAULT_BUFFER_SIZE = 2500000;
|
|
41
54
|
export declare const terminateRemuxer: (remuxer: {
|
|
42
55
|
worker: Worker;
|
|
@@ -162,32 +162,37 @@ var a = (e) => Array(e.buffered.length).fill(void 0).map((t, n) => ({
|
|
|
162
162
|
clearInterval(y), t.removeEventListener("ratechange", b), c?.destroy(), c = void 0;
|
|
163
163
|
}
|
|
164
164
|
};
|
|
165
|
-
}, h =
|
|
165
|
+
}, h = class extends Error {
|
|
166
|
+
mediaElement = !0;
|
|
167
|
+
constructor(e, t) {
|
|
168
|
+
super(e, t), this.name = "MediaElementError";
|
|
169
|
+
}
|
|
170
|
+
}, g = (e) => !!e && typeof e == "object" && e.mediaElement === !0, _ = -20, v = 60, y = 30, b = -5, x = 20, S = 5, C = 15e3, w = 1, T = 200, E = 250, D = 25e5, O = (e) => {
|
|
166
171
|
let { worker: t } = e, n = setTimeout(() => t.terminate(), 2e3);
|
|
167
172
|
e.destroy().catch(() => {}).finally(() => {
|
|
168
173
|
clearTimeout(n), t.terminate();
|
|
169
174
|
});
|
|
170
|
-
},
|
|
171
|
-
let { videoElement: n, canvasElement: r, read: i, length: o, publicPath: c, libavWorkerUrl: l, jassubWorkerUrl: u, jassubWasmUrl: d, jassubLegacyWasmUrl: f, defaultFontUrl: p, bufferSize:
|
|
175
|
+
}, k = async (t) => {
|
|
176
|
+
let { videoElement: n, canvasElement: r, read: i, length: o, publicPath: c, libavWorkerUrl: l, jassubWorkerUrl: u, jassubWasmUrl: d, jassubLegacyWasmUrl: f, defaultFontUrl: p, bufferSize: g = D, audioStreamIndex: k, onReady: A, onError: j, onRecovered: ee, onSeek: M, onSubtitleStreams: te, onAudioStreams: ne } = t, N = await e({
|
|
172
177
|
publicPath: c,
|
|
173
178
|
workerUrl: l,
|
|
174
179
|
workerOptions: { type: "module" },
|
|
175
|
-
bufferSize:
|
|
180
|
+
bufferSize: g,
|
|
176
181
|
length: o,
|
|
177
|
-
audioStreamIndex:
|
|
182
|
+
audioStreamIndex: k,
|
|
178
183
|
read: i
|
|
179
|
-
}),
|
|
180
|
-
if (!
|
|
181
|
-
|
|
182
|
-
for (let e of [...
|
|
184
|
+
}), P = [], F = !1, I = () => {
|
|
185
|
+
if (!F) {
|
|
186
|
+
F = !0;
|
|
187
|
+
for (let e of [...P].reverse()) try {
|
|
183
188
|
e();
|
|
184
189
|
} catch {}
|
|
185
190
|
}
|
|
186
191
|
};
|
|
187
|
-
|
|
192
|
+
P.push(() => O(N));
|
|
188
193
|
try {
|
|
189
|
-
let e = await
|
|
190
|
-
|
|
194
|
+
let e = await N.init(), t = e.audioStreams ?? [], i = t.some((e) => e.streamIndex === k) ? k : t[0]?.streamIndex ?? -1;
|
|
195
|
+
ne?.(t, i);
|
|
191
196
|
let o = m({
|
|
192
197
|
video: n,
|
|
193
198
|
canvas: r,
|
|
@@ -195,117 +200,153 @@ var a = (e) => Array(e.buffered.length).fill(void 0).map((t, n) => ({
|
|
|
195
200
|
wasmUrl: d,
|
|
196
201
|
legacyWasmUrl: f,
|
|
197
202
|
defaultFontUrl: p,
|
|
198
|
-
onStreams:
|
|
203
|
+
onStreams: te
|
|
199
204
|
});
|
|
200
|
-
if (
|
|
205
|
+
if (P.push(() => o.destroy()), e.attachments?.length && o.pushAttachments(e.attachments), !e.info.output.videoMimeType) throw Error("The video codec in this file could not be identified");
|
|
201
206
|
let c = [e.info.output.videoMimeType, e.info.output.audioMimeType].filter(Boolean).join(","), l = `video/mp4; codecs="${c}"`;
|
|
202
207
|
if (!MediaSource.isTypeSupported(l)) throw Error(`This browser cannot play the codecs in this file: ${c}`);
|
|
203
|
-
let
|
|
204
|
-
|
|
205
|
-
|
|
208
|
+
let g = new MediaSource(), D = URL.createObjectURL(g);
|
|
209
|
+
P.push(() => URL.revokeObjectURL(D)), n.src = D, P.push(() => {
|
|
210
|
+
try {
|
|
211
|
+
n.pause();
|
|
212
|
+
} catch {}
|
|
213
|
+
n.removeAttribute("src"), n.load();
|
|
214
|
+
});
|
|
215
|
+
let O = await new Promise((t, n) => {
|
|
206
216
|
let r = setTimeout(() => {
|
|
207
217
|
i(), n(/* @__PURE__ */ Error("The MediaSource never opened"));
|
|
208
|
-
},
|
|
209
|
-
clearTimeout(r),
|
|
218
|
+
}, C), i = () => {
|
|
219
|
+
clearTimeout(r), g.removeEventListener("sourceopen", a), g.removeEventListener("sourceclose", o), g.removeEventListener("error", o);
|
|
210
220
|
}, a = () => {
|
|
211
221
|
try {
|
|
212
|
-
let n =
|
|
222
|
+
let n = g.addSourceBuffer(l);
|
|
213
223
|
n.mode = "segments";
|
|
214
224
|
let r = e.info.input.duration;
|
|
215
|
-
Number.isFinite(r) && r > 0 && (
|
|
225
|
+
Number.isFinite(r) && r > 0 && (g.duration = r), i(), t(n);
|
|
216
226
|
} catch (e) {
|
|
217
227
|
i(), n(e);
|
|
218
228
|
}
|
|
219
229
|
}, o = () => {
|
|
220
230
|
i(), n(/* @__PURE__ */ Error("The MediaSource closed before a SourceBuffer could be created"));
|
|
221
231
|
};
|
|
222
|
-
|
|
223
|
-
}), { appendBuffer:
|
|
224
|
-
await
|
|
225
|
-
let
|
|
226
|
-
let
|
|
227
|
-
t &&
|
|
228
|
-
},
|
|
229
|
-
let t = n.currentTime, r = e ?
|
|
230
|
-
for (let { start: e, end: n } of a(
|
|
231
|
-
},
|
|
232
|
-
let e = a(
|
|
232
|
+
g.addEventListener("sourceopen", a, { once: !0 }), g.addEventListener("sourceclose", o, { once: !0 }), g.addEventListener("error", o, { once: !0 });
|
|
233
|
+
}), { appendBuffer: L, unbufferRange: re, updateTimestampOffset: ie, endOfStream: ae } = s(O, g);
|
|
234
|
+
await L(e.data), e.subtitles?.length && o.pushFragments(e.subtitles), A?.();
|
|
235
|
+
let R = !1, z = !1, B = !1, V = 0, H = 0, U = null, W = 0, G = 0, K = !1, oe = 0, q = (e, t, n = !1) => {
|
|
236
|
+
let r = e?.message === "Cancelled";
|
|
237
|
+
t && r || (console.error(e), !(K && !n) && (K = !0, j?.(r ? Error("Reading the video file failed", { cause: e }) : e)));
|
|
238
|
+
}, se = async (e = !1) => {
|
|
239
|
+
let t = n.currentTime, r = e ? b : _, i = e ? x : v;
|
|
240
|
+
for (let { start: e, end: n } of a(O)) e < t + r && await re(e, t + r), n > t + i && await re(t + i, n);
|
|
241
|
+
}, ce = () => {
|
|
242
|
+
let e = a(O);
|
|
233
243
|
if (!e.length) return !0;
|
|
234
244
|
let t = n.currentTime;
|
|
235
|
-
if (Math.max(...e.map((e) => e.end)) >= t +
|
|
236
|
-
let r = e.find((e) => e.start <= t +
|
|
237
|
-
return !r || r.end < t +
|
|
238
|
-
},
|
|
245
|
+
if (Math.max(...e.map((e) => e.end)) >= t + v) return !1;
|
|
246
|
+
let r = e.find((e) => e.start <= t + w && t < e.end);
|
|
247
|
+
return !r || r.end < t + y;
|
|
248
|
+
}, J = () => {
|
|
239
249
|
let e = n.currentTime;
|
|
240
|
-
return a(
|
|
241
|
-
},
|
|
242
|
-
let e =
|
|
243
|
-
return !!e && e.end >=
|
|
244
|
-
},
|
|
245
|
-
let e = a(
|
|
246
|
-
e.length && (
|
|
247
|
-
},
|
|
248
|
-
|
|
249
|
-
let t = ++
|
|
250
|
+
return a(O).find((t) => t.start <= e + w && e < t.end);
|
|
251
|
+
}, le = () => {
|
|
252
|
+
let e = J();
|
|
253
|
+
return !!e && e.end >= G - .1;
|
|
254
|
+
}, ue = () => {
|
|
255
|
+
let e = a(O).map((e) => e.end);
|
|
256
|
+
e.length && (G = Math.max(G, ...e));
|
|
257
|
+
}, Y = async (e) => {
|
|
258
|
+
z = !0, U = null, W = 0, oe = e;
|
|
259
|
+
let t = ++H;
|
|
250
260
|
try {
|
|
251
|
-
let { data: n, pts: r, subtitles: i } = await
|
|
252
|
-
if (
|
|
253
|
-
n.byteLength && (await
|
|
261
|
+
let { data: n, pts: r, subtitles: i, finished: a } = await N.seek(e);
|
|
262
|
+
if (F || t !== H || (a && (B = !0), i?.length && o.pushFragments(i), await ie(r), F || t !== H)) return;
|
|
263
|
+
n.byteLength && (await L(n), ue());
|
|
254
264
|
} catch (e) {
|
|
255
|
-
|
|
265
|
+
q(e, F || t !== H);
|
|
256
266
|
} finally {
|
|
257
|
-
t ===
|
|
267
|
+
t === H && (z = !1);
|
|
258
268
|
}
|
|
259
|
-
},
|
|
260
|
-
let e =
|
|
269
|
+
}, de = async () => {
|
|
270
|
+
let e = U;
|
|
261
271
|
if (e) try {
|
|
262
|
-
await
|
|
272
|
+
await L(e), ue(), U === e && (U = null, W = 0);
|
|
263
273
|
} catch (t) {
|
|
264
|
-
if (
|
|
274
|
+
if (U !== e) return;
|
|
265
275
|
if (t?.name === "QuotaExceededError") {
|
|
266
|
-
let t = await
|
|
267
|
-
if (
|
|
276
|
+
let t = await se(!0).then(() => !0, () => !1);
|
|
277
|
+
if (U !== e) return;
|
|
268
278
|
if (t) {
|
|
269
|
-
|
|
279
|
+
B = !1, await Y(J()?.end ?? n.currentTime);
|
|
270
280
|
return;
|
|
271
281
|
}
|
|
272
282
|
}
|
|
273
|
-
if (
|
|
274
|
-
throw
|
|
283
|
+
if (W += 1, W < S) return;
|
|
284
|
+
throw U = null, t;
|
|
275
285
|
}
|
|
276
|
-
},
|
|
277
|
-
if (
|
|
278
|
-
let e = ++
|
|
279
|
-
|
|
286
|
+
}, fe = async () => {
|
|
287
|
+
if (R || z || $ !== void 0 || F || !U && (B || !ce())) return;
|
|
288
|
+
let e = ++V, t = H, n = () => F || e !== V || t !== H;
|
|
289
|
+
R = !0;
|
|
280
290
|
try {
|
|
281
|
-
if (!
|
|
282
|
-
let { data: e, subtitles: t, finished: r } = await
|
|
283
|
-
if (n() || (r && (
|
|
284
|
-
|
|
291
|
+
if (!U) {
|
|
292
|
+
let { data: e, subtitles: t, finished: r } = await N.read();
|
|
293
|
+
if (n() || (r && (B = !0), t?.length && o.pushFragments(t), !e.byteLength)) return;
|
|
294
|
+
U = e, W = 0;
|
|
285
295
|
}
|
|
286
|
-
await
|
|
296
|
+
await de(), !n() && K && (K = !1, ee?.());
|
|
287
297
|
} catch (e) {
|
|
288
|
-
|
|
298
|
+
q(e, n());
|
|
289
299
|
} finally {
|
|
290
|
-
e ===
|
|
300
|
+
e === V && (R = !1);
|
|
301
|
+
}
|
|
302
|
+
}, pe = (e) => e >= oe && !!J(), X = 0, Z = null, Q, me = (e) => {
|
|
303
|
+
let t = performance.now(), n = t - X;
|
|
304
|
+
if (n >= T) {
|
|
305
|
+
X = t, Z = null, M?.(e);
|
|
306
|
+
return;
|
|
291
307
|
}
|
|
292
|
-
|
|
308
|
+
Z = e, !Q && (Q = setTimeout(() => {
|
|
309
|
+
Q = void 0;
|
|
310
|
+
let e = Z;
|
|
311
|
+
Z = null, !(e === null || F) && (X = performance.now(), M?.(e));
|
|
312
|
+
}, T - n));
|
|
313
|
+
};
|
|
314
|
+
P.push(() => {
|
|
315
|
+
Q && clearTimeout(Q);
|
|
316
|
+
});
|
|
317
|
+
let he = 0, $;
|
|
318
|
+
P.push(() => {
|
|
319
|
+
$ && clearTimeout($);
|
|
320
|
+
});
|
|
321
|
+
let ge = () => {
|
|
293
322
|
let t = n.currentTime, r = e.info.input.duration || n.duration;
|
|
294
|
-
r > 0 &&
|
|
323
|
+
r > 0 && me(Math.min(Math.max(t / r, 0), 1));
|
|
324
|
+
let i = performance.now(), a = i - he < E;
|
|
325
|
+
if (he = i, !pe(t)) {
|
|
326
|
+
if (B = !1, $ && clearTimeout($), !a) {
|
|
327
|
+
$ = void 0, Y(t);
|
|
328
|
+
return;
|
|
329
|
+
}
|
|
330
|
+
$ = setTimeout(() => {
|
|
331
|
+
if ($ = void 0, F) return;
|
|
332
|
+
let e = n.currentTime;
|
|
333
|
+
pe(e) || (B = !1, Y(e));
|
|
334
|
+
}, E);
|
|
335
|
+
}
|
|
295
336
|
};
|
|
296
|
-
n.addEventListener("seeking",
|
|
297
|
-
let
|
|
298
|
-
if (
|
|
299
|
-
|
|
337
|
+
n.addEventListener("seeking", ge), P.push(() => n.removeEventListener("seeking", ge));
|
|
338
|
+
let _e = !1, ve = () => {
|
|
339
|
+
if (_e) return;
|
|
340
|
+
_e = !0;
|
|
300
341
|
let e = n.error;
|
|
301
|
-
|
|
342
|
+
q(new h(`the media element failed: ${e?.message ?? "unknown"}`, { cause: e }), !1, !0);
|
|
302
343
|
};
|
|
303
|
-
n.addEventListener("error",
|
|
304
|
-
let
|
|
305
|
-
|
|
344
|
+
n.addEventListener("error", ve), P.push(() => n.removeEventListener("error", ve));
|
|
345
|
+
let ye = setInterval(() => {
|
|
346
|
+
_e || n.error || (se().catch(() => {}), fe().catch((e) => q(e, !1)), B && !U && le() && g.readyState === "open" && ae().catch(() => {}));
|
|
306
347
|
}, 100);
|
|
307
|
-
return
|
|
308
|
-
destroy:
|
|
348
|
+
return P.push(() => clearInterval(ye)), {
|
|
349
|
+
destroy: I,
|
|
309
350
|
selectSubtitleStream: (e) => o.selectStream(e),
|
|
310
351
|
indexes: e.indexes ?? [],
|
|
311
352
|
duration: e.info.input.duration,
|
|
@@ -313,10 +354,10 @@ var a = (e) => Array(e.buffered.length).fill(void 0).map((t, n) => ({
|
|
|
313
354
|
audioMimeType: e.info.output.audioMimeType
|
|
314
355
|
};
|
|
315
356
|
} catch (e) {
|
|
316
|
-
throw
|
|
357
|
+
throw I(), e;
|
|
317
358
|
}
|
|
318
|
-
},
|
|
319
|
-
let { publicPath: n, workerUrl: r, length: i, read: a, onThumbnails: o, width: s =
|
|
359
|
+
}, A = 5, j = 500, ee = 320, M = 1e6, te = 3, ne = 1e4, N = async (e) => {
|
|
360
|
+
let { publicPath: n, workerUrl: r, length: i, read: a, onThumbnails: o, width: s = ee } = e, c = await t({
|
|
320
361
|
publicPath: n,
|
|
321
362
|
workerUrl: r,
|
|
322
363
|
workerOptions: { type: "module" },
|
|
@@ -324,14 +365,14 @@ var a = (e) => Array(e.buffered.length).fill(void 0).map((t, n) => ({
|
|
|
324
365
|
read: a
|
|
325
366
|
});
|
|
326
367
|
try {
|
|
327
|
-
let t = await c.init(), n = t.duration, r = Math.max(e.interval ??
|
|
368
|
+
let t = await c.init(), n = t.duration, r = Math.max(e.interval ?? A, n / j), a = [];
|
|
328
369
|
for (let [e, o] of t.indexes.entries()) {
|
|
329
370
|
let s = a.at(-1);
|
|
330
371
|
s && o.timestamp - s.timestamp < r || a.push({
|
|
331
372
|
timestamp: o.timestamp,
|
|
332
373
|
endTime: n,
|
|
333
374
|
startByte: o.pos,
|
|
334
|
-
endByte: Math.min((t.indexes[e + 1]?.pos ?? i) +
|
|
375
|
+
endByte: Math.min((t.indexes[e + 1]?.pos ?? i) + M, i),
|
|
335
376
|
done: !1,
|
|
336
377
|
attempts: 0
|
|
337
378
|
});
|
|
@@ -362,7 +403,7 @@ var a = (e) => Array(e.buffered.length).fill(void 0).map((t, n) => ({
|
|
|
362
403
|
}, p = (e) => {
|
|
363
404
|
e.done = !0, d = d.then(async () => {
|
|
364
405
|
if (u) return;
|
|
365
|
-
let t = await Promise.race([c.readKeyframe(e.timestamp), new Promise((e, t) => setTimeout(() => t(/* @__PURE__ */ Error("timed out")),
|
|
406
|
+
let t = await Promise.race([c.readKeyframe(e.timestamp), new Promise((e, t) => setTimeout(() => t(/* @__PURE__ */ Error("timed out")), ne))]), n = await createImageBitmap(new Blob([t], { type: "image/png" })), r = new OffscreenCanvas(s, Math.max(1, Math.round(n.height * (s / n.width))));
|
|
366
407
|
r.getContext("2d").drawImage(n, 0, 0, r.width, r.height), n.close();
|
|
367
408
|
let i = await r.convertToBlob({
|
|
368
409
|
type: "image/webp",
|
|
@@ -374,7 +415,7 @@ var a = (e) => Array(e.buffered.length).fill(void 0).map((t, n) => ({
|
|
|
374
415
|
endTime: e.endTime
|
|
375
416
|
}].sort((e, t) => e.startTime - t.startTime), f());
|
|
376
417
|
}).catch(() => {
|
|
377
|
-
e.attempts += 1, e.done = e.attempts >=
|
|
418
|
+
e.attempts += 1, e.done = e.attempts >= te;
|
|
378
419
|
});
|
|
379
420
|
};
|
|
380
421
|
return f(), {
|
|
@@ -384,14 +425,14 @@ var a = (e) => Array(e.buffered.length).fill(void 0).map((t, n) => ({
|
|
|
384
425
|
destroy: () => {
|
|
385
426
|
u = !0;
|
|
386
427
|
for (let e of l) URL.revokeObjectURL(e.url);
|
|
387
|
-
l = [],
|
|
428
|
+
l = [], O(c);
|
|
388
429
|
}
|
|
389
430
|
};
|
|
390
431
|
} catch (e) {
|
|
391
|
-
throw
|
|
432
|
+
throw O(c), e;
|
|
392
433
|
}
|
|
393
|
-
},
|
|
394
|
-
let { video: t, canvas: n } = e, r = e.mode ??
|
|
434
|
+
}, P = 1280, F = 1920, I = 250, L = 100, re = () => typeof HTMLCanvasElement < "u" && "captureStream" in HTMLCanvasElement.prototype, ie = () => typeof document < "u" && typeof HTMLVideoElement < "u" && typeof HTMLVideoElement.prototype.requestPictureInPicture == "function" && !!document.pictureInPictureEnabled, ae = () => typeof HTMLVideoElement < "u" && "mozCaptureStream" in HTMLVideoElement.prototype, R = () => re() ? ie() ? "window" : ae() ? "burn-in" : null : null, z = (e) => {
|
|
435
|
+
let { video: t, canvas: n } = e, r = e.mode ?? R() ?? "window", i = e.maxWidth ?? (r === "burn-in" ? F : P), a, o, s, c = !1, l = !1, u = !1, d = !1, f, p = () => r === "burn-in" ? !!a : !!a && document.pictureInPictureElement === a.mirror, m = (e, r) => {
|
|
395
436
|
r.drawImage(t, 0, 0, e.width, e.height), n.width > 0 && n.height > 0 && r.drawImage(n, 0, 0, e.width, e.height);
|
|
396
437
|
}, h = () => {
|
|
397
438
|
a && m(a.composite, a.context);
|
|
@@ -418,11 +459,11 @@ var a = (e) => Array(e.buffered.length).fill(void 0).map((t, n) => ({
|
|
|
418
459
|
l = !0;
|
|
419
460
|
let { mirror: e } = a;
|
|
420
461
|
h(), e.play().then(() => new Promise((e) => {
|
|
421
|
-
setTimeout(e,
|
|
462
|
+
setTimeout(e, L);
|
|
422
463
|
})).catch(() => {}).finally(() => {
|
|
423
464
|
e.pause(), setTimeout(() => {
|
|
424
465
|
l = !1;
|
|
425
|
-
},
|
|
466
|
+
}, L);
|
|
426
467
|
});
|
|
427
468
|
}, E = [["play", () => {
|
|
428
469
|
t.play().catch(() => {});
|
|
@@ -459,7 +500,7 @@ var a = (e) => Array(e.buffered.length).fill(void 0).map((t, n) => ({
|
|
|
459
500
|
};
|
|
460
501
|
if (a = f, u.srcObject = f.stream, (e.container ?? t.parentElement ?? document.body).appendChild(u), v(), s = setInterval(() => {
|
|
461
502
|
t.paused && h();
|
|
462
|
-
},
|
|
503
|
+
}, I), u.play().catch(() => {}), u.readyState === 0 && await new Promise((e) => {
|
|
463
504
|
let t = () => {
|
|
464
505
|
clearTimeout(n), e();
|
|
465
506
|
}, n = setTimeout(t, 1e3);
|
|
@@ -505,4 +546,4 @@ var a = (e) => Array(e.buffered.length).fill(void 0).map((t, n) => ({
|
|
|
505
546
|
};
|
|
506
547
|
};
|
|
507
548
|
//#endregion
|
|
508
|
-
export {
|
|
549
|
+
export { h as a, O as c, a as d, s as f, D as i, c as l, R as n, g as o, N as r, k as s, z as t, m as u };
|