@bendyline/squisq-video-react 1.0.5 → 1.1.1
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/chunk-LZYWP4HB.js +28 -0
- package/dist/chunk-LZYWP4HB.js.map +1 -0
- package/dist/hooks/useVideoExport.d.ts +2 -2
- package/dist/hooks/useVideoExport.d.ts.map +1 -1
- package/dist/hooks/useVideoExport.js +31 -6
- package/dist/hooks/useVideoExport.js.map +1 -1
- package/dist/mainThreadEncoder.d.ts +7 -0
- package/dist/mainThreadEncoder.d.ts.map +1 -1
- package/dist/mainThreadEncoder.js +23 -0
- package/dist/mainThreadEncoder.js.map +1 -1
- package/dist/workerEncoder.d.ts +17 -0
- package/dist/workerEncoder.d.ts.map +1 -0
- package/dist/workerEncoder.js +103 -0
- package/dist/workerEncoder.js.map +1 -0
- package/dist/workers/encode.worker.js +26 -3
- package/dist/workers/encode.worker.js.map +1 -1
- package/package.json +7 -4
- package/src/hooks/useVideoExport.ts +43 -9
- package/src/mainThreadEncoder.ts +22 -0
- package/src/workerEncoder.ts +123 -0
- package/src/workers/encode.worker.ts +25 -3
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
// src/mp4Mux.ts
|
|
2
|
+
import { Muxer, ArrayBufferTarget } from "mp4-muxer";
|
|
3
|
+
function createMp4Muxer(options) {
|
|
4
|
+
const target = new ArrayBufferTarget();
|
|
5
|
+
const muxer = new Muxer({
|
|
6
|
+
target,
|
|
7
|
+
video: {
|
|
8
|
+
codec: "avc",
|
|
9
|
+
width: options.width,
|
|
10
|
+
height: options.height
|
|
11
|
+
},
|
|
12
|
+
fastStart: "in-memory"
|
|
13
|
+
});
|
|
14
|
+
return {
|
|
15
|
+
addVideoChunk(chunk, meta) {
|
|
16
|
+
muxer.addVideoChunk(chunk, meta);
|
|
17
|
+
},
|
|
18
|
+
finalize() {
|
|
19
|
+
muxer.finalize();
|
|
20
|
+
return target.buffer;
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export {
|
|
26
|
+
createMp4Muxer
|
|
27
|
+
};
|
|
28
|
+
//# sourceMappingURL=chunk-LZYWP4HB.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/mp4Mux.ts"],"sourcesContent":["/**\n * mp4Mux — Thin wrapper around mp4-muxer for WebCodecs encoding.\n *\n * Creates a Muxer instance configured for H.264 video, accumulates\n * encoded chunks, and produces a final MP4 ArrayBuffer.\n */\n\nimport { Muxer, ArrayBufferTarget } from 'mp4-muxer';\n\nexport interface Mp4MuxerOptions {\n width: number;\n height: number;\n fps: number;\n}\n\nexport interface Mp4MuxerHandle {\n /** Add an encoded video chunk to the muxer. */\n addVideoChunk(chunk: EncodedVideoChunk, meta?: EncodedVideoChunkMetadata): void;\n /** Finalize and return the MP4 as an ArrayBuffer. */\n finalize(): ArrayBuffer;\n}\n\n/**\n * Create an MP4 muxer configured for H.264 video.\n */\nexport function createMp4Muxer(options: Mp4MuxerOptions): Mp4MuxerHandle {\n const target = new ArrayBufferTarget();\n\n const muxer = new Muxer({\n target,\n video: {\n codec: 'avc',\n width: options.width,\n height: options.height,\n },\n fastStart: 'in-memory',\n });\n\n return {\n addVideoChunk(chunk: EncodedVideoChunk, meta?: EncodedVideoChunkMetadata) {\n muxer.addVideoChunk(chunk, meta);\n },\n\n finalize(): ArrayBuffer {\n muxer.finalize();\n return target.buffer;\n },\n };\n}\n"],"mappings":";AAOA,SAAS,OAAO,yBAAyB;AAkBlC,SAAS,eAAe,SAA0C;AACvE,QAAM,SAAS,IAAI,kBAAkB;AAErC,QAAM,QAAQ,IAAI,MAAM;AAAA,IACtB;AAAA,IACA,OAAO;AAAA,MACL,OAAO;AAAA,MACP,OAAO,QAAQ;AAAA,MACf,QAAQ,QAAQ;AAAA,IAClB;AAAA,IACA,WAAW;AAAA,EACb,CAAC;AAED,SAAO;AAAA,IACL,cAAc,OAA0B,MAAkC;AACxE,YAAM,cAAc,OAAO,IAAI;AAAA,IACjC;AAAA,IAEA,WAAwB;AACtB,YAAM,SAAS;AACf,aAAO,OAAO;AAAA,IAChB;AAAA,EACF;AACF;","names":[]}
|
|
@@ -52,8 +52,8 @@ export interface VideoExportResult {
|
|
|
52
52
|
phase: string;
|
|
53
53
|
/** Video duration detected from the doc (seconds) */
|
|
54
54
|
duration: number;
|
|
55
|
-
/** Encoder backend ('webcodecs' when active, null when idle) */
|
|
56
|
-
backend: 'webcodecs' | null;
|
|
55
|
+
/** Encoder backend ('webcodecs' when WebCodecs H.264 active, 'ffmpeg-wasm' when worker fallback active, null when idle) */
|
|
56
|
+
backend: 'webcodecs' | 'ffmpeg-wasm' | null;
|
|
57
57
|
/** Blob download URL (populated when state === 'complete') */
|
|
58
58
|
downloadUrl: string | null;
|
|
59
59
|
/** File size in bytes (populated when state === 'complete') */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useVideoExport.d.ts","sourceRoot":"","sources":["../../src/hooks/useVideoExport.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,2BAA2B,CAAC;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAE9E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"useVideoExport.d.ts","sourceRoot":"","sources":["../../src/hooks/useVideoExport.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,2BAA2B,CAAC;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAE9E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAY3D,MAAM,MAAM,gBAAgB,GACxB,MAAM,GACN,WAAW,GACX,WAAW,GACX,UAAU,GACV,UAAU,GACV,OAAO,CAAC;AAEZ,MAAM,WAAW,iBAAiB;IAChC,kDAAkD;IAClD,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,sCAAsC;IACtC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,kDAAkD;IAClD,WAAW,CAAC,EAAE,gBAAgB,CAAC;IAC/B;;;OAGG;IACH,MAAM,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAClC;;;OAGG;IACH,KAAK,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACjC,mFAAmF;IACnF,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,2DAA2D;IAC3D,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,kFAAkF;IAClF,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,iBAAiB;IAChC,2BAA2B;IAC3B,KAAK,EAAE,gBAAgB,CAAC;IACxB,gCAAgC;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,sDAAsD;IACtD,KAAK,EAAE,MAAM,CAAC;IACd,qDAAqD;IACrD,QAAQ,EAAE,MAAM,CAAC;IACjB,2HAA2H;IAC3H,OAAO,EAAE,WAAW,GAAG,aAAa,GAAG,IAAI,CAAC;IAC5C,8DAA8D;IAC9D,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,+DAA+D;IAC/D,QAAQ,EAAE,MAAM,CAAC;IACjB,uDAAuD;IACvD,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,2CAA2C;IAC3C,OAAO,EAAE,MAAM,CAAC;IAChB,4DAA4D;IAC5D,kBAAkB,EAAE,MAAM,CAAC;IAC3B,yBAAyB;IACzB,WAAW,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,iBAAiB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACpE,mCAAmC;IACnC,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,+DAA+D;IAC/D,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB;AAID,wBAAgB,cAAc,IAAI,iBAAiB,CAsRlD"}
|
|
@@ -16,7 +16,8 @@
|
|
|
16
16
|
*/
|
|
17
17
|
import { useState, useRef, useCallback, useEffect } from 'react';
|
|
18
18
|
import { resolveDimensions } from '@bendyline/squisq-video';
|
|
19
|
-
import { createEncoder, supportsWebCodecs } from '../mainThreadEncoder.js';
|
|
19
|
+
import { createEncoder, supportsWebCodecs, supportsWebCodecsH264, } from '../mainThreadEncoder.js';
|
|
20
|
+
import { createWorkerEncoder } from '../workerEncoder.js';
|
|
20
21
|
import { useFrameCapture } from './useFrameCapture.js';
|
|
21
22
|
// ── Hook ───────────────────────────────────────────────────────────
|
|
22
23
|
export function useVideoExport() {
|
|
@@ -103,9 +104,12 @@ export function useVideoExport() {
|
|
|
103
104
|
const { width, height } = resolveDimensions({ orientation });
|
|
104
105
|
try {
|
|
105
106
|
// ── Check browser support ─────────────────────────────────
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
107
|
+
const webCodecsAvailable = supportsWebCodecs();
|
|
108
|
+
const sharedArrayBufferAvailable = typeof SharedArrayBuffer !== 'undefined';
|
|
109
|
+
if (!webCodecsAvailable && !sharedArrayBufferAvailable) {
|
|
110
|
+
throw new Error('No video encoder available. WebCodecs requires Chrome 94+ / Edge 94+, ' +
|
|
111
|
+
'and the ffmpeg.wasm fallback requires SharedArrayBuffer ' +
|
|
112
|
+
'(Cross-Origin-Isolation headers).');
|
|
109
113
|
}
|
|
110
114
|
// ── Step 1: Prepare ───────────────────────────────────────
|
|
111
115
|
setState('preparing');
|
|
@@ -144,9 +148,30 @@ export function useVideoExport() {
|
|
|
144
148
|
// ── Step 2: Create encoder ────────────────────────────────
|
|
145
149
|
setPhase('Starting encoder…');
|
|
146
150
|
setProgress(5);
|
|
147
|
-
|
|
151
|
+
// Prefer main-thread WebCodecs (fast), but probe whether H.264
|
|
152
|
+
// is actually supported. Linux Chromium has VideoEncoder but
|
|
153
|
+
// no proprietary H.264 codec — fall back to the worker, which
|
|
154
|
+
// loads ffmpeg.wasm in that case.
|
|
155
|
+
const canUseWebCodecs = webCodecsAvailable && (await supportsWebCodecsH264({ width, height, fps, quality }));
|
|
156
|
+
let encoder;
|
|
157
|
+
if (canUseWebCodecs) {
|
|
158
|
+
encoder = createEncoder({ width, height, fps, quality });
|
|
159
|
+
setBackend('webcodecs');
|
|
160
|
+
}
|
|
161
|
+
else if (sharedArrayBufferAvailable) {
|
|
162
|
+
const workerEncoder = createWorkerEncoder({ width, height, fps, quality });
|
|
163
|
+
encoder = workerEncoder;
|
|
164
|
+
const selectedBackend = await workerEncoder.ready;
|
|
165
|
+
setBackend(selectedBackend);
|
|
166
|
+
setPhase(selectedBackend === 'ffmpeg-wasm'
|
|
167
|
+
? 'Starting encoder (ffmpeg.wasm)…'
|
|
168
|
+
: 'Starting encoder…');
|
|
169
|
+
}
|
|
170
|
+
else {
|
|
171
|
+
throw new Error('WebCodecs H.264 is unavailable in this browser and the ffmpeg.wasm ' +
|
|
172
|
+
'fallback requires SharedArrayBuffer (Cross-Origin-Isolation headers).');
|
|
173
|
+
}
|
|
148
174
|
encoderRef.current = encoder;
|
|
149
|
-
setBackend('webcodecs');
|
|
150
175
|
if (cancelledRef.current)
|
|
151
176
|
return;
|
|
152
177
|
// ── Step 3: Capture frames and encode ─────────────────────
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useVideoExport.js","sourceRoot":"","sources":["../../src/hooks/useVideoExport.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAIjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAE5D,OAAO,
|
|
1
|
+
{"version":3,"file":"useVideoExport.js","sourceRoot":"","sources":["../../src/hooks/useVideoExport.ts"],"names":[],"mappings":"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"}
|
|
@@ -28,6 +28,13 @@ export interface MainThreadEncoder {
|
|
|
28
28
|
* Check whether the browser supports WebCodecs video encoding.
|
|
29
29
|
*/
|
|
30
30
|
export declare function supportsWebCodecs(): boolean;
|
|
31
|
+
/**
|
|
32
|
+
* Probe whether the WebCodecs encoder actually supports the H.264 profile
|
|
33
|
+
* we use. The `VideoEncoder` global can exist while the specific codec is
|
|
34
|
+
* unavailable — this is the case on Linux Chromium, which ships without
|
|
35
|
+
* the proprietary H.264 encoder.
|
|
36
|
+
*/
|
|
37
|
+
export declare function supportsWebCodecsH264(config: EncoderConfig): Promise<boolean>;
|
|
31
38
|
/**
|
|
32
39
|
* Create a main-thread WebCodecs encoder.
|
|
33
40
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mainThreadEncoder.d.ts","sourceRoot":"","sources":["../src/mainThreadEncoder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;CACtC;AAED,MAAM,WAAW,iBAAiB;IAChC,kEAAkE;IAClE,WAAW,CAAC,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3D,8EAA8E;IAC9E,QAAQ,IAAI,OAAO,CAAC,WAAW,CAAC,CAAC;IACjC,oEAAoE;IACpE,KAAK,IAAI,IAAI,CAAC;CACf;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAE3C;AAeD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,aAAa,GAAG,iBAAiB,CAuEtE"}
|
|
1
|
+
{"version":3,"file":"mainThreadEncoder.d.ts","sourceRoot":"","sources":["../src/mainThreadEncoder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;CACtC;AAED,MAAM,WAAW,iBAAiB;IAChC,kEAAkE;IAClE,WAAW,CAAC,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3D,8EAA8E;IAC9E,QAAQ,IAAI,OAAO,CAAC,WAAW,CAAC,CAAC;IACjC,oEAAoE;IACpE,KAAK,IAAI,IAAI,CAAC;CACf;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAE3C;AAED;;;;;GAKG;AACH,wBAAsB,qBAAqB,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,CAcnF;AAeD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,aAAa,GAAG,iBAAiB,CAuEtE"}
|
|
@@ -17,6 +17,29 @@ import { createMp4Muxer } from './mp4Mux.js';
|
|
|
17
17
|
export function supportsWebCodecs() {
|
|
18
18
|
return typeof VideoEncoder !== 'undefined' && typeof VideoFrame !== 'undefined';
|
|
19
19
|
}
|
|
20
|
+
/**
|
|
21
|
+
* Probe whether the WebCodecs encoder actually supports the H.264 profile
|
|
22
|
+
* we use. The `VideoEncoder` global can exist while the specific codec is
|
|
23
|
+
* unavailable — this is the case on Linux Chromium, which ships without
|
|
24
|
+
* the proprietary H.264 encoder.
|
|
25
|
+
*/
|
|
26
|
+
export async function supportsWebCodecsH264(config) {
|
|
27
|
+
if (!supportsWebCodecs())
|
|
28
|
+
return false;
|
|
29
|
+
try {
|
|
30
|
+
const support = await VideoEncoder.isConfigSupported({
|
|
31
|
+
codec: 'avc1.640028',
|
|
32
|
+
width: config.width,
|
|
33
|
+
height: config.height,
|
|
34
|
+
bitrate: bitrateForQuality(config.quality, config.width, config.height),
|
|
35
|
+
framerate: config.fps,
|
|
36
|
+
});
|
|
37
|
+
return support.supported === true;
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
20
43
|
function bitrateForQuality(quality, width, height) {
|
|
21
44
|
const pixels = width * height;
|
|
22
45
|
const baseBitrate = pixels * 4; // ~4 bits per pixel baseline
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mainThreadEncoder.js","sourceRoot":"","sources":["../src/mainThreadEncoder.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"mainThreadEncoder.js","sourceRoot":"","sources":["../src/mainThreadEncoder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Worker-backed video encoder.
|
|
3
|
+
*
|
|
4
|
+
* Spawns `workers/encode.worker.ts` and exposes the same shape as
|
|
5
|
+
* `MainThreadEncoder` so `useVideoExport` can treat both backends
|
|
6
|
+
* uniformly. Used as a fallback when WebCodecs H.264 isn't supported
|
|
7
|
+
* (typical on Linux Chromium): the worker auto-selects its ffmpeg.wasm
|
|
8
|
+
* path in that case.
|
|
9
|
+
*/
|
|
10
|
+
import type { MainThreadEncoder, EncoderConfig } from './mainThreadEncoder.js';
|
|
11
|
+
/** Resolves once the worker has reported which backend it picked. */
|
|
12
|
+
export interface WorkerEncoder extends MainThreadEncoder {
|
|
13
|
+
/** Backend the worker selected ('webcodecs' or 'ffmpeg-wasm'). */
|
|
14
|
+
readonly ready: Promise<'webcodecs' | 'ffmpeg-wasm'>;
|
|
15
|
+
}
|
|
16
|
+
export declare function createWorkerEncoder(config: EncoderConfig): WorkerEncoder;
|
|
17
|
+
//# sourceMappingURL=workerEncoder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workerEncoder.d.ts","sourceRoot":"","sources":["../src/workerEncoder.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAG/E,qEAAqE;AACrE,MAAM,WAAW,aAAc,SAAQ,iBAAiB;IACtD,kEAAkE;IAClE,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,WAAW,GAAG,aAAa,CAAC,CAAC;CACtD;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,aAAa,GAAG,aAAa,CAuGxE"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Worker-backed video encoder.
|
|
3
|
+
*
|
|
4
|
+
* Spawns `workers/encode.worker.ts` and exposes the same shape as
|
|
5
|
+
* `MainThreadEncoder` so `useVideoExport` can treat both backends
|
|
6
|
+
* uniformly. Used as a fallback when WebCodecs H.264 isn't supported
|
|
7
|
+
* (typical on Linux Chromium): the worker auto-selects its ffmpeg.wasm
|
|
8
|
+
* path in that case.
|
|
9
|
+
*/
|
|
10
|
+
export function createWorkerEncoder(config) {
|
|
11
|
+
if (!config.fps || config.fps <= 0 || !config.width || !config.height) {
|
|
12
|
+
throw new Error(`Invalid encoder config: fps=${config.fps}, width=${config.width}, height=${config.height}`);
|
|
13
|
+
}
|
|
14
|
+
const worker = new Worker(new URL('./workers/encode.worker.js', import.meta.url), {
|
|
15
|
+
type: 'module',
|
|
16
|
+
});
|
|
17
|
+
let closed = false;
|
|
18
|
+
let fatalError = null;
|
|
19
|
+
let finalizeResolve = null;
|
|
20
|
+
let finalizeReject = null;
|
|
21
|
+
let readyResolve = null;
|
|
22
|
+
let readyReject = null;
|
|
23
|
+
const ready = new Promise((resolve, reject) => {
|
|
24
|
+
readyResolve = resolve;
|
|
25
|
+
readyReject = reject;
|
|
26
|
+
});
|
|
27
|
+
const frameDuration = 1000000 / config.fps; // microseconds per frame
|
|
28
|
+
function post(msg, transfer) {
|
|
29
|
+
worker.postMessage(msg, transfer ?? []);
|
|
30
|
+
}
|
|
31
|
+
worker.onmessage = (event) => {
|
|
32
|
+
const msg = event.data;
|
|
33
|
+
switch (msg.type) {
|
|
34
|
+
case 'capabilities':
|
|
35
|
+
readyResolve?.(msg.backend);
|
|
36
|
+
readyResolve = readyReject = null;
|
|
37
|
+
break;
|
|
38
|
+
case 'complete':
|
|
39
|
+
finalizeResolve?.(msg.data);
|
|
40
|
+
finalizeResolve = finalizeReject = null;
|
|
41
|
+
worker.terminate();
|
|
42
|
+
break;
|
|
43
|
+
case 'error': {
|
|
44
|
+
const err = new Error(msg.message);
|
|
45
|
+
fatalError = err;
|
|
46
|
+
readyReject?.(err);
|
|
47
|
+
finalizeReject?.(err);
|
|
48
|
+
readyResolve = readyReject = null;
|
|
49
|
+
finalizeResolve = finalizeReject = null;
|
|
50
|
+
worker.terminate();
|
|
51
|
+
break;
|
|
52
|
+
}
|
|
53
|
+
// 'progress' is informational; ignored at this layer
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
worker.onerror = (event) => {
|
|
57
|
+
const err = new Error(event.message || 'Worker error');
|
|
58
|
+
fatalError = err;
|
|
59
|
+
readyReject?.(err);
|
|
60
|
+
finalizeReject?.(err);
|
|
61
|
+
readyResolve = readyReject = null;
|
|
62
|
+
finalizeResolve = finalizeReject = null;
|
|
63
|
+
worker.terminate();
|
|
64
|
+
};
|
|
65
|
+
post({
|
|
66
|
+
type: 'init',
|
|
67
|
+
width: config.width,
|
|
68
|
+
height: config.height,
|
|
69
|
+
fps: config.fps,
|
|
70
|
+
quality: config.quality,
|
|
71
|
+
});
|
|
72
|
+
return {
|
|
73
|
+
ready,
|
|
74
|
+
encodeFrame(bitmap, frameIndex) {
|
|
75
|
+
if (closed || fatalError) {
|
|
76
|
+
bitmap.close();
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
const timestamp = Math.round(frameIndex * frameDuration);
|
|
80
|
+
post({ type: 'frame', bitmap, frameIndex, timestamp }, [bitmap]);
|
|
81
|
+
},
|
|
82
|
+
async finalize() {
|
|
83
|
+
if (closed)
|
|
84
|
+
throw new Error('Encoder already closed');
|
|
85
|
+
if (fatalError)
|
|
86
|
+
throw fatalError;
|
|
87
|
+
closed = true;
|
|
88
|
+
return new Promise((resolve, reject) => {
|
|
89
|
+
finalizeResolve = resolve;
|
|
90
|
+
finalizeReject = reject;
|
|
91
|
+
post({ type: 'finalize' });
|
|
92
|
+
});
|
|
93
|
+
},
|
|
94
|
+
close() {
|
|
95
|
+
if (closed)
|
|
96
|
+
return;
|
|
97
|
+
closed = true;
|
|
98
|
+
post({ type: 'cancel' });
|
|
99
|
+
worker.terminate();
|
|
100
|
+
},
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=workerEncoder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workerEncoder.js","sourceRoot":"","sources":["../src/workerEncoder.ts"],"names":[],"mappings":"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"}
|
|
@@ -40,6 +40,29 @@ function hasWebCodecs() {
|
|
|
40
40
|
function hasSharedArrayBuffer() {
|
|
41
41
|
return typeof SharedArrayBuffer !== 'undefined';
|
|
42
42
|
}
|
|
43
|
+
/**
|
|
44
|
+
* Check whether the browser's WebCodecs implementation actually supports
|
|
45
|
+
* the H.264 Baseline profile we use. Linux Chromium ships without the
|
|
46
|
+
* proprietary H.264 encoder, so `VideoEncoder` exists but `configure()`
|
|
47
|
+
* for `avc1.*` fails asynchronously.
|
|
48
|
+
*/
|
|
49
|
+
async function supportsWebCodecsH264(config) {
|
|
50
|
+
if (!hasWebCodecs())
|
|
51
|
+
return false;
|
|
52
|
+
try {
|
|
53
|
+
const support = await VideoEncoder.isConfigSupported({
|
|
54
|
+
codec: 'avc1.42001f',
|
|
55
|
+
width: config.width,
|
|
56
|
+
height: config.height,
|
|
57
|
+
bitrate: bitrateForQuality(config.quality, config.width, config.height),
|
|
58
|
+
framerate: config.fps,
|
|
59
|
+
});
|
|
60
|
+
return support.supported === true;
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
return false;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
43
66
|
// ── WebCodecs Backend ──────────────────────────────────────────────
|
|
44
67
|
function initWebCodecs(config) {
|
|
45
68
|
muxer = createMp4Muxer({
|
|
@@ -260,7 +283,7 @@ self.onmessage = async (event) => {
|
|
|
260
283
|
cancelled = false;
|
|
261
284
|
totalFramesReceived = 0;
|
|
262
285
|
_totalFramesEncoded = 0;
|
|
263
|
-
if (
|
|
286
|
+
if (await supportsWebCodecsH264(msg)) {
|
|
264
287
|
backend = 'webcodecs';
|
|
265
288
|
initWebCodecs(msg);
|
|
266
289
|
}
|
|
@@ -270,8 +293,8 @@ self.onmessage = async (event) => {
|
|
|
270
293
|
}
|
|
271
294
|
else {
|
|
272
295
|
postError('No video encoding support available. ' +
|
|
273
|
-
'WebCodecs
|
|
274
|
-
'ffmpeg.wasm requires SharedArrayBuffer (Cross-Origin-Isolation headers).');
|
|
296
|
+
'WebCodecs H.264 is unavailable (typical on Linux Chromium without proprietary codecs) ' +
|
|
297
|
+
'and ffmpeg.wasm requires SharedArrayBuffer (Cross-Origin-Isolation headers).');
|
|
275
298
|
return;
|
|
276
299
|
}
|
|
277
300
|
post({ type: 'capabilities', backend });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"encode.worker.js","sourceRoot":"","sources":["../../src/workers/encode.worker.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"encode.worker.js","sourceRoot":"","sources":["../../src/workers/encode.worker.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bendyline/squisq-video-react",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.1.1",
|
|
4
4
|
"description": "React components for browser-based video export of Squisq documents via WebCodecs",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Bendyline",
|
|
@@ -37,6 +37,7 @@
|
|
|
37
37
|
],
|
|
38
38
|
"scripts": {
|
|
39
39
|
"build": "tsup",
|
|
40
|
+
"dev": "concurrently -n js,dts -c blue,gray -r \"tsup --watch --no-dts --no-clean\" \"tsup --watch --dts-only --no-clean\"",
|
|
40
41
|
"typecheck": "tsc --noEmit"
|
|
41
42
|
},
|
|
42
43
|
"peerDependencies": {
|
|
@@ -44,9 +45,11 @@
|
|
|
44
45
|
"react-dom": "^18.0.0 || ^19.0.0"
|
|
45
46
|
},
|
|
46
47
|
"dependencies": {
|
|
47
|
-
"@bendyline/squisq": "1.
|
|
48
|
-
"@bendyline/squisq-video": "1.
|
|
49
|
-
"@bendyline/squisq-react": "1.
|
|
48
|
+
"@bendyline/squisq": "1.4.0",
|
|
49
|
+
"@bendyline/squisq-video": "1.1.1",
|
|
50
|
+
"@bendyline/squisq-react": "1.3.1",
|
|
51
|
+
"@ffmpeg/ffmpeg": "0.12.15",
|
|
52
|
+
"@ffmpeg/util": "0.12.2",
|
|
50
53
|
"html2canvas": "1.4.1",
|
|
51
54
|
"mp4-muxer": "5.2.2"
|
|
52
55
|
},
|
|
@@ -21,7 +21,13 @@ import type { MediaProvider } from '@bendyline/squisq/schemas';
|
|
|
21
21
|
import type { VideoQuality, VideoOrientation } from '@bendyline/squisq-video';
|
|
22
22
|
import { resolveDimensions } from '@bendyline/squisq-video';
|
|
23
23
|
import type { CaptionMode } from '@bendyline/squisq-react';
|
|
24
|
-
import {
|
|
24
|
+
import {
|
|
25
|
+
createEncoder,
|
|
26
|
+
supportsWebCodecs,
|
|
27
|
+
supportsWebCodecsH264,
|
|
28
|
+
type MainThreadEncoder,
|
|
29
|
+
} from '../mainThreadEncoder.js';
|
|
30
|
+
import { createWorkerEncoder } from '../workerEncoder.js';
|
|
25
31
|
import { useFrameCapture } from './useFrameCapture.js';
|
|
26
32
|
|
|
27
33
|
// ── Types ──────────────────────────────────────────────────────────
|
|
@@ -68,8 +74,8 @@ export interface VideoExportResult {
|
|
|
68
74
|
phase: string;
|
|
69
75
|
/** Video duration detected from the doc (seconds) */
|
|
70
76
|
duration: number;
|
|
71
|
-
/** Encoder backend ('webcodecs' when active, null when idle) */
|
|
72
|
-
backend: 'webcodecs' | null;
|
|
77
|
+
/** Encoder backend ('webcodecs' when WebCodecs H.264 active, 'ffmpeg-wasm' when worker fallback active, null when idle) */
|
|
78
|
+
backend: 'webcodecs' | 'ffmpeg-wasm' | null;
|
|
73
79
|
/** Blob download URL (populated when state === 'complete') */
|
|
74
80
|
downloadUrl: string | null;
|
|
75
81
|
/** File size in bytes (populated when state === 'complete') */
|
|
@@ -95,7 +101,7 @@ export function useVideoExport(): VideoExportResult {
|
|
|
95
101
|
const [progress, setProgress] = useState(0);
|
|
96
102
|
const [phase, setPhase] = useState('');
|
|
97
103
|
const [duration, setDuration] = useState(0);
|
|
98
|
-
const [backend, setBackend] = useState<'webcodecs' | null>(null);
|
|
104
|
+
const [backend, setBackend] = useState<'webcodecs' | 'ffmpeg-wasm' | null>(null);
|
|
99
105
|
const [downloadUrl, setDownloadUrl] = useState<string | null>(null);
|
|
100
106
|
const [fileSize, setFileSize] = useState(0);
|
|
101
107
|
const [error, setError] = useState<string | null>(null);
|
|
@@ -181,10 +187,13 @@ export function useVideoExport(): VideoExportResult {
|
|
|
181
187
|
|
|
182
188
|
try {
|
|
183
189
|
// ── Check browser support ─────────────────────────────────
|
|
184
|
-
|
|
190
|
+
const webCodecsAvailable = supportsWebCodecs();
|
|
191
|
+
const sharedArrayBufferAvailable = typeof SharedArrayBuffer !== 'undefined';
|
|
192
|
+
if (!webCodecsAvailable && !sharedArrayBufferAvailable) {
|
|
185
193
|
throw new Error(
|
|
186
|
-
'
|
|
187
|
-
'
|
|
194
|
+
'No video encoder available. WebCodecs requires Chrome 94+ / Edge 94+, ' +
|
|
195
|
+
'and the ffmpeg.wasm fallback requires SharedArrayBuffer ' +
|
|
196
|
+
'(Cross-Origin-Isolation headers).',
|
|
188
197
|
);
|
|
189
198
|
}
|
|
190
199
|
|
|
@@ -234,9 +243,34 @@ export function useVideoExport(): VideoExportResult {
|
|
|
234
243
|
setPhase('Starting encoder…');
|
|
235
244
|
setProgress(5);
|
|
236
245
|
|
|
237
|
-
|
|
246
|
+
// Prefer main-thread WebCodecs (fast), but probe whether H.264
|
|
247
|
+
// is actually supported. Linux Chromium has VideoEncoder but
|
|
248
|
+
// no proprietary H.264 codec — fall back to the worker, which
|
|
249
|
+
// loads ffmpeg.wasm in that case.
|
|
250
|
+
const canUseWebCodecs =
|
|
251
|
+
webCodecsAvailable && (await supportsWebCodecsH264({ width, height, fps, quality }));
|
|
252
|
+
|
|
253
|
+
let encoder: MainThreadEncoder;
|
|
254
|
+
if (canUseWebCodecs) {
|
|
255
|
+
encoder = createEncoder({ width, height, fps, quality });
|
|
256
|
+
setBackend('webcodecs');
|
|
257
|
+
} else if (sharedArrayBufferAvailable) {
|
|
258
|
+
const workerEncoder = createWorkerEncoder({ width, height, fps, quality });
|
|
259
|
+
encoder = workerEncoder;
|
|
260
|
+
const selectedBackend = await workerEncoder.ready;
|
|
261
|
+
setBackend(selectedBackend);
|
|
262
|
+
setPhase(
|
|
263
|
+
selectedBackend === 'ffmpeg-wasm'
|
|
264
|
+
? 'Starting encoder (ffmpeg.wasm)…'
|
|
265
|
+
: 'Starting encoder…',
|
|
266
|
+
);
|
|
267
|
+
} else {
|
|
268
|
+
throw new Error(
|
|
269
|
+
'WebCodecs H.264 is unavailable in this browser and the ffmpeg.wasm ' +
|
|
270
|
+
'fallback requires SharedArrayBuffer (Cross-Origin-Isolation headers).',
|
|
271
|
+
);
|
|
272
|
+
}
|
|
238
273
|
encoderRef.current = encoder;
|
|
239
|
-
setBackend('webcodecs');
|
|
240
274
|
|
|
241
275
|
if (cancelledRef.current) return;
|
|
242
276
|
|
package/src/mainThreadEncoder.ts
CHANGED
|
@@ -36,6 +36,28 @@ export function supportsWebCodecs(): boolean {
|
|
|
36
36
|
return typeof VideoEncoder !== 'undefined' && typeof VideoFrame !== 'undefined';
|
|
37
37
|
}
|
|
38
38
|
|
|
39
|
+
/**
|
|
40
|
+
* Probe whether the WebCodecs encoder actually supports the H.264 profile
|
|
41
|
+
* we use. The `VideoEncoder` global can exist while the specific codec is
|
|
42
|
+
* unavailable — this is the case on Linux Chromium, which ships without
|
|
43
|
+
* the proprietary H.264 encoder.
|
|
44
|
+
*/
|
|
45
|
+
export async function supportsWebCodecsH264(config: EncoderConfig): Promise<boolean> {
|
|
46
|
+
if (!supportsWebCodecs()) return false;
|
|
47
|
+
try {
|
|
48
|
+
const support = await VideoEncoder.isConfigSupported({
|
|
49
|
+
codec: 'avc1.640028',
|
|
50
|
+
width: config.width,
|
|
51
|
+
height: config.height,
|
|
52
|
+
bitrate: bitrateForQuality(config.quality, config.width, config.height),
|
|
53
|
+
framerate: config.fps,
|
|
54
|
+
});
|
|
55
|
+
return support.supported === true;
|
|
56
|
+
} catch {
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
39
61
|
function bitrateForQuality(quality: string, width: number, height: number): number {
|
|
40
62
|
const pixels = width * height;
|
|
41
63
|
const baseBitrate = pixels * 4; // ~4 bits per pixel baseline
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Worker-backed video encoder.
|
|
3
|
+
*
|
|
4
|
+
* Spawns `workers/encode.worker.ts` and exposes the same shape as
|
|
5
|
+
* `MainThreadEncoder` so `useVideoExport` can treat both backends
|
|
6
|
+
* uniformly. Used as a fallback when WebCodecs H.264 isn't supported
|
|
7
|
+
* (typical on Linux Chromium): the worker auto-selects its ffmpeg.wasm
|
|
8
|
+
* path in that case.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import type { MainThreadEncoder, EncoderConfig } from './mainThreadEncoder.js';
|
|
12
|
+
import type { MainToWorkerMessage, WorkerToMainMessage } from './workers/workerTypes.js';
|
|
13
|
+
|
|
14
|
+
/** Resolves once the worker has reported which backend it picked. */
|
|
15
|
+
export interface WorkerEncoder extends MainThreadEncoder {
|
|
16
|
+
/** Backend the worker selected ('webcodecs' or 'ffmpeg-wasm'). */
|
|
17
|
+
readonly ready: Promise<'webcodecs' | 'ffmpeg-wasm'>;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export function createWorkerEncoder(config: EncoderConfig): WorkerEncoder {
|
|
21
|
+
if (!config.fps || config.fps <= 0 || !config.width || !config.height) {
|
|
22
|
+
throw new Error(
|
|
23
|
+
`Invalid encoder config: fps=${config.fps}, width=${config.width}, height=${config.height}`,
|
|
24
|
+
);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const worker = new Worker(new URL('./workers/encode.worker.js', import.meta.url), {
|
|
28
|
+
type: 'module',
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
let closed = false;
|
|
32
|
+
let fatalError: Error | null = null;
|
|
33
|
+
let finalizeResolve: ((buffer: ArrayBuffer) => void) | null = null;
|
|
34
|
+
let finalizeReject: ((err: Error) => void) | null = null;
|
|
35
|
+
let readyResolve: ((backend: 'webcodecs' | 'ffmpeg-wasm') => void) | null = null;
|
|
36
|
+
let readyReject: ((err: Error) => void) | null = null;
|
|
37
|
+
|
|
38
|
+
const ready = new Promise<'webcodecs' | 'ffmpeg-wasm'>((resolve, reject) => {
|
|
39
|
+
readyResolve = resolve;
|
|
40
|
+
readyReject = reject;
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
const frameDuration = 1_000_000 / config.fps; // microseconds per frame
|
|
44
|
+
|
|
45
|
+
function post(msg: MainToWorkerMessage, transfer?: Transferable[]) {
|
|
46
|
+
worker.postMessage(msg, transfer ?? []);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
worker.onmessage = (event: MessageEvent<WorkerToMainMessage>) => {
|
|
50
|
+
const msg = event.data;
|
|
51
|
+
switch (msg.type) {
|
|
52
|
+
case 'capabilities':
|
|
53
|
+
readyResolve?.(msg.backend);
|
|
54
|
+
readyResolve = readyReject = null;
|
|
55
|
+
break;
|
|
56
|
+
case 'complete':
|
|
57
|
+
finalizeResolve?.(msg.data);
|
|
58
|
+
finalizeResolve = finalizeReject = null;
|
|
59
|
+
worker.terminate();
|
|
60
|
+
break;
|
|
61
|
+
case 'error': {
|
|
62
|
+
const err = new Error(msg.message);
|
|
63
|
+
fatalError = err;
|
|
64
|
+
readyReject?.(err);
|
|
65
|
+
finalizeReject?.(err);
|
|
66
|
+
readyResolve = readyReject = null;
|
|
67
|
+
finalizeResolve = finalizeReject = null;
|
|
68
|
+
worker.terminate();
|
|
69
|
+
break;
|
|
70
|
+
}
|
|
71
|
+
// 'progress' is informational; ignored at this layer
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
worker.onerror = (event) => {
|
|
76
|
+
const err = new Error(event.message || 'Worker error');
|
|
77
|
+
fatalError = err;
|
|
78
|
+
readyReject?.(err);
|
|
79
|
+
finalizeReject?.(err);
|
|
80
|
+
readyResolve = readyReject = null;
|
|
81
|
+
finalizeResolve = finalizeReject = null;
|
|
82
|
+
worker.terminate();
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
post({
|
|
86
|
+
type: 'init',
|
|
87
|
+
width: config.width,
|
|
88
|
+
height: config.height,
|
|
89
|
+
fps: config.fps,
|
|
90
|
+
quality: config.quality,
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
return {
|
|
94
|
+
ready,
|
|
95
|
+
|
|
96
|
+
encodeFrame(bitmap: ImageBitmap, frameIndex: number) {
|
|
97
|
+
if (closed || fatalError) {
|
|
98
|
+
bitmap.close();
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
const timestamp = Math.round(frameIndex * frameDuration);
|
|
102
|
+
post({ type: 'frame', bitmap, frameIndex, timestamp }, [bitmap]);
|
|
103
|
+
},
|
|
104
|
+
|
|
105
|
+
async finalize(): Promise<ArrayBuffer> {
|
|
106
|
+
if (closed) throw new Error('Encoder already closed');
|
|
107
|
+
if (fatalError) throw fatalError;
|
|
108
|
+
closed = true;
|
|
109
|
+
return new Promise<ArrayBuffer>((resolve, reject) => {
|
|
110
|
+
finalizeResolve = resolve;
|
|
111
|
+
finalizeReject = reject;
|
|
112
|
+
post({ type: 'finalize' });
|
|
113
|
+
});
|
|
114
|
+
},
|
|
115
|
+
|
|
116
|
+
close() {
|
|
117
|
+
if (closed) return;
|
|
118
|
+
closed = true;
|
|
119
|
+
post({ type: 'cancel' });
|
|
120
|
+
worker.terminate();
|
|
121
|
+
},
|
|
122
|
+
};
|
|
123
|
+
}
|
|
@@ -60,6 +60,28 @@ function hasSharedArrayBuffer(): boolean {
|
|
|
60
60
|
return typeof SharedArrayBuffer !== 'undefined';
|
|
61
61
|
}
|
|
62
62
|
|
|
63
|
+
/**
|
|
64
|
+
* Check whether the browser's WebCodecs implementation actually supports
|
|
65
|
+
* the H.264 Baseline profile we use. Linux Chromium ships without the
|
|
66
|
+
* proprietary H.264 encoder, so `VideoEncoder` exists but `configure()`
|
|
67
|
+
* for `avc1.*` fails asynchronously.
|
|
68
|
+
*/
|
|
69
|
+
async function supportsWebCodecsH264(config: InitMessage): Promise<boolean> {
|
|
70
|
+
if (!hasWebCodecs()) return false;
|
|
71
|
+
try {
|
|
72
|
+
const support = await VideoEncoder.isConfigSupported({
|
|
73
|
+
codec: 'avc1.42001f',
|
|
74
|
+
width: config.width,
|
|
75
|
+
height: config.height,
|
|
76
|
+
bitrate: bitrateForQuality(config.quality, config.width, config.height),
|
|
77
|
+
framerate: config.fps,
|
|
78
|
+
});
|
|
79
|
+
return support.supported === true;
|
|
80
|
+
} catch {
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
63
85
|
// ── WebCodecs Backend ──────────────────────────────────────────────
|
|
64
86
|
|
|
65
87
|
function initWebCodecs(config: InitMessage) {
|
|
@@ -326,7 +348,7 @@ self.onmessage = async (event: MessageEvent<MainToWorkerMessage>) => {
|
|
|
326
348
|
totalFramesReceived = 0;
|
|
327
349
|
_totalFramesEncoded = 0;
|
|
328
350
|
|
|
329
|
-
if (
|
|
351
|
+
if (await supportsWebCodecsH264(msg)) {
|
|
330
352
|
backend = 'webcodecs';
|
|
331
353
|
initWebCodecs(msg);
|
|
332
354
|
} else if (hasSharedArrayBuffer()) {
|
|
@@ -335,8 +357,8 @@ self.onmessage = async (event: MessageEvent<MainToWorkerMessage>) => {
|
|
|
335
357
|
} else {
|
|
336
358
|
postError(
|
|
337
359
|
'No video encoding support available. ' +
|
|
338
|
-
'WebCodecs
|
|
339
|
-
'ffmpeg.wasm requires SharedArrayBuffer (Cross-Origin-Isolation headers).',
|
|
360
|
+
'WebCodecs H.264 is unavailable (typical on Linux Chromium without proprietary codecs) ' +
|
|
361
|
+
'and ffmpeg.wasm requires SharedArrayBuffer (Cross-Origin-Isolation headers).',
|
|
340
362
|
);
|
|
341
363
|
return;
|
|
342
364
|
}
|