@rendiv/renderer 0.1.16 → 0.1.18
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/extract-frame.d.ts +2 -1
- package/dist/extract-frame.d.ts.map +1 -1
- package/dist/extract-frame.js +5 -3
- package/dist/extract-frame.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/render-frames.d.ts +33 -0
- package/dist/render-frames.d.ts.map +1 -1
- package/dist/render-frames.js +83 -11
- package/dist/render-frames.js.map +1 -1
- package/dist/render-media.d.ts +9 -1
- package/dist/render-media.d.ts.map +1 -1
- package/dist/render-media.js +22 -4
- package/dist/render-media.js.map +1 -1
- package/dist/render-still.d.ts +2 -0
- package/dist/render-still.d.ts.map +1 -1
- package/dist/render-still.js +2 -2
- package/dist/render-still.js.map +1 -1
- package/dist/serve.d.ts.map +1 -1
- package/dist/serve.js +5 -3
- package/dist/serve.js.map +1 -1
- package/package.json +1 -1
package/dist/extract-frame.d.ts
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
export interface ExtractFrameOptions {
|
|
2
2
|
videoPath: string;
|
|
3
3
|
timeInSeconds: number;
|
|
4
|
+
imageFormat?: 'png' | 'jpeg';
|
|
4
5
|
}
|
|
5
6
|
/**
|
|
6
7
|
* Extract a single frame from a video file at the given timestamp using FFmpeg.
|
|
7
8
|
* Uses hybrid seeking: fast keyframe seek + decode-accurate sub-seek for precision.
|
|
8
|
-
* Returns the frame as
|
|
9
|
+
* Returns the frame as an image buffer (PNG or JPEG).
|
|
9
10
|
*/
|
|
10
11
|
export declare function extractFrame(options: ExtractFrameOptions): Promise<Buffer>;
|
|
11
12
|
//# sourceMappingURL=extract-frame.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extract-frame.d.ts","sourceRoot":"","sources":["../src/extract-frame.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"extract-frame.d.ts","sourceRoot":"","sources":["../src/extract-frame.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;CAC9B;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,MAAM,CAAC,CAkD1E"}
|
package/dist/extract-frame.js
CHANGED
|
@@ -4,10 +4,10 @@ const ffmpegPath = ffmpegStatic;
|
|
|
4
4
|
/**
|
|
5
5
|
* Extract a single frame from a video file at the given timestamp using FFmpeg.
|
|
6
6
|
* Uses hybrid seeking: fast keyframe seek + decode-accurate sub-seek for precision.
|
|
7
|
-
* Returns the frame as
|
|
7
|
+
* Returns the frame as an image buffer (PNG or JPEG).
|
|
8
8
|
*/
|
|
9
9
|
export function extractFrame(options) {
|
|
10
|
-
const { videoPath, timeInSeconds } = options;
|
|
10
|
+
const { videoPath, timeInSeconds, imageFormat = 'png' } = options;
|
|
11
11
|
// Hybrid seek: fast seek to 1s before, then decode-accurate for the remainder.
|
|
12
12
|
// This gives keyframe-speed performance with frame-accurate results.
|
|
13
13
|
const preSeek = Math.max(0, timeInSeconds - 1);
|
|
@@ -18,7 +18,9 @@ export function extractFrame(options) {
|
|
|
18
18
|
'-ss', String(remainder), // Accurate seek after input
|
|
19
19
|
'-frames:v', '1', // Extract exactly 1 frame
|
|
20
20
|
'-f', 'image2pipe', // Pipe output
|
|
21
|
-
|
|
21
|
+
...(imageFormat === 'jpeg'
|
|
22
|
+
? ['-vcodec', 'mjpeg', '-q:v', '2'] // Output as JPEG (quality 2 = high)
|
|
23
|
+
: ['-vcodec', 'png']), // Output as PNG
|
|
22
24
|
'-', // Write to stdout
|
|
23
25
|
];
|
|
24
26
|
return new Promise((resolve, reject) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extract-frame.js","sourceRoot":"","sources":["../src/extract-frame.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE3C,OAAO,YAAY,MAAM,eAAe,CAAC;AAEzC,MAAM,UAAU,GAAW,YAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"extract-frame.js","sourceRoot":"","sources":["../src/extract-frame.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE3C,OAAO,YAAY,MAAM,eAAe,CAAC;AAEzC,MAAM,UAAU,GAAW,YAAiC,CAAC;AAQ7D;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,OAA4B;IACvD,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,WAAW,GAAG,KAAK,EAAE,GAAG,OAAO,CAAC;IAElE,+EAA+E;IAC/E,qEAAqE;IACrE,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,aAAa,GAAG,CAAC,CAAC,CAAC;IAC/C,MAAM,SAAS,GAAG,aAAa,GAAG,OAAO,CAAC;IAE1C,MAAM,IAAI,GAAa;QACrB,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,EAAQ,yBAAyB;QACvD,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,MAAM,CAAC,SAAS,CAAC,EAAM,4BAA4B;QAC1D,WAAW,EAAE,GAAG,EAAc,0BAA0B;QACxD,IAAI,EAAE,YAAY,EAAY,cAAc;QAC5C,GAAG,CAAC,WAAW,KAAK,MAAM;YACxB,CAAC,CAAC,CAAC,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,CAAG,oCAAoC;YAC1E,CAAC,CAAC,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,EAAkB,gBAAgB;QACzD,GAAG,EAA2B,kBAAkB;KACjD,CAAC;IAEF,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,IAAI,GAAG,KAAK,CAAC,UAAU,EAAE,IAAI,EAAE;YACnC,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;SAClC,CAAC,CAAC;QAEH,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QAE9D,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE;YACtC,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC5B,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACxB,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;gBACf,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;gBACrC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBACxB,MAAM,CAAC,IAAI,KAAK,CAAC,+BAA+B,aAAa,8BAA8B,CAAC,CAAC,CAAC;oBAC9F,OAAO;gBACT,CAAC;gBACD,OAAO,CAAC,MAAM,CAAC,CAAC;YAClB,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,IAAI,KAAK,CAAC,wCAAwC,IAAI,MAAM,MAAM,EAAE,CAAC,CAAC,CAAC;YAChF,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACvB,MAAM,CAAC,IAAI,KAAK,CAAC,2BAA2B,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAC9D,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export { renderMedia, type RenderMediaOptions } from './render-media.js';
|
|
2
|
-
export { renderFrames, type RenderFramesOptions, type RenderFramesResult, type ImageFormat } from './render-frames.js';
|
|
1
|
+
export { renderMedia, type RenderMediaOptions, type RenderMediaResult } from './render-media.js';
|
|
2
|
+
export { renderFrames, type RenderFramesOptions, type RenderFramesResult, type ImageFormat, type FrameTimings, type RenderProfile } from './render-frames.js';
|
|
3
3
|
export { renderStill, type RenderStillOptions } from './render-still.js';
|
|
4
4
|
export { stitchFramesToVideo, type StitchOptions } from './stitch-frames-to-video.js';
|
|
5
5
|
export { getCompositions, selectComposition } from './get-compositions.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,KAAK,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,KAAK,kBAAkB,EAAE,KAAK,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACjG,OAAO,EAAE,YAAY,EAAE,KAAK,mBAAmB,EAAE,KAAK,kBAAkB,EAAE,KAAK,WAAW,EAAE,KAAK,YAAY,EAAE,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAC9J,OAAO,EAAE,WAAW,EAAE,KAAK,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACzE,OAAO,EAAE,mBAAmB,EAAE,KAAK,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACtF,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC3E,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,KAAK,UAAU,EAAE,KAAK,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAClH,OAAO,EAAE,gBAAgB,EAAE,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACzE,YAAY,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAmD,MAAM,mBAAmB,CAAC;AACjG,OAAO,EAAE,YAAY,EAA8G,MAAM,oBAAoB,CAAC;AAC9J,OAAO,EAAE,WAAW,EAA2B,MAAM,mBAAmB,CAAC;AACzE,OAAO,EAAE,mBAAmB,EAAsB,MAAM,6BAA6B,CAAC;AACtF,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC3E,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,EAA4C,MAAM,cAAc,CAAC;AAClH,OAAO,EAAE,gBAAgB,EAAqB,MAAM,oBAAoB,CAAC"}
|
package/dist/render-frames.d.ts
CHANGED
|
@@ -1,6 +1,36 @@
|
|
|
1
1
|
import { type OpenBrowserOptions } from './browser.js';
|
|
2
2
|
import type { AudioSourceInfo, CompositionInfo } from './types.js';
|
|
3
3
|
export type ImageFormat = 'png' | 'jpeg';
|
|
4
|
+
export interface FrameTimings {
|
|
5
|
+
setFrameMs: number;
|
|
6
|
+
waitForHoldsMs: number;
|
|
7
|
+
screenshotMs: number;
|
|
8
|
+
totalMs: number;
|
|
9
|
+
}
|
|
10
|
+
export interface RenderProfile {
|
|
11
|
+
totalFrames: number;
|
|
12
|
+
totalTimeMs: number;
|
|
13
|
+
avgFrameTimeMs: number;
|
|
14
|
+
phases: {
|
|
15
|
+
setFrame: {
|
|
16
|
+
avgMs: number;
|
|
17
|
+
maxMs: number;
|
|
18
|
+
totalMs: number;
|
|
19
|
+
};
|
|
20
|
+
waitForHolds: {
|
|
21
|
+
avgMs: number;
|
|
22
|
+
maxMs: number;
|
|
23
|
+
totalMs: number;
|
|
24
|
+
};
|
|
25
|
+
screenshot: {
|
|
26
|
+
avgMs: number;
|
|
27
|
+
maxMs: number;
|
|
28
|
+
totalMs: number;
|
|
29
|
+
};
|
|
30
|
+
};
|
|
31
|
+
bottleneck: 'setFrame' | 'waitForHolds' | 'screenshot';
|
|
32
|
+
framesPerSecond: number;
|
|
33
|
+
}
|
|
4
34
|
export interface RenderFramesOptions {
|
|
5
35
|
serveUrl: string;
|
|
6
36
|
composition: CompositionInfo;
|
|
@@ -11,14 +41,17 @@ export interface RenderFramesOptions {
|
|
|
11
41
|
onFrameRendered?: (info: {
|
|
12
42
|
frame: number;
|
|
13
43
|
total: number;
|
|
44
|
+
timings?: FrameTimings;
|
|
14
45
|
}) => void;
|
|
15
46
|
cancelSignal?: AbortSignal;
|
|
16
47
|
timeoutPerFrame?: number;
|
|
17
48
|
imageFormat?: ImageFormat;
|
|
18
49
|
gl?: OpenBrowserOptions['gl'];
|
|
50
|
+
profiling?: boolean;
|
|
19
51
|
}
|
|
20
52
|
export interface RenderFramesResult {
|
|
21
53
|
audioSources: AudioSourceInfo[];
|
|
54
|
+
profile?: RenderProfile;
|
|
22
55
|
}
|
|
23
56
|
export declare function renderFrames(options: RenderFramesOptions): Promise<RenderFramesResult>;
|
|
24
57
|
//# sourceMappingURL=render-frames.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render-frames.d.ts","sourceRoot":"","sources":["../src/render-frames.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"render-frames.d.ts","sourceRoot":"","sources":["../src/render-frames.ts"],"names":[],"mappings":"AAIA,OAAO,EAAyB,KAAK,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAE9E,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAEnE,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,MAAM,CAAC;AAEzC,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE;QACN,QAAQ,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAA;SAAE,CAAC;QAC5D,YAAY,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAA;SAAE,CAAC;QAChE,UAAU,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAA;SAAE,CAAC;KAC/D,CAAC;IACF,UAAU,EAAE,UAAU,GAAG,cAAc,GAAG,YAAY,CAAC;IACvD,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,eAAe,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,YAAY,CAAA;KAAE,KAAK,IAAI,CAAC;IAC3F,YAAY,CAAC,EAAE,WAAW,CAAC;IAC3B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,EAAE,CAAC,EAAE,kBAAkB,CAAC,IAAI,CAAC,CAAC;IAC9B,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAsGD,MAAM,WAAW,kBAAkB;IACjC,YAAY,EAAE,eAAe,EAAE,CAAC;IAChC,OAAO,CAAC,EAAE,aAAa,CAAC;CACzB;AAED,wBAAsB,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAuG5F"}
|
package/dist/render-frames.js
CHANGED
|
@@ -1,14 +1,28 @@
|
|
|
1
1
|
import fs from 'node:fs';
|
|
2
2
|
import path from 'node:path';
|
|
3
|
+
import { performance } from 'node:perf_hooks';
|
|
3
4
|
import { openBrowser, openPage } from './browser.js';
|
|
4
5
|
import { startServer } from './serve.js';
|
|
5
|
-
async function renderSingleFrame(page, frame, outputDir, timeoutPerFrame, imageFormat) {
|
|
6
|
-
|
|
6
|
+
async function renderSingleFrame(page, frame, outputDir, timeoutPerFrame, imageFormat, profiling) {
|
|
7
|
+
const t0 = profiling ? performance.now() : 0;
|
|
8
|
+
// Set the frame and wait for it to be ready.
|
|
9
|
+
// __RENDIV_SET_FRAME__ resolves once holds === 0, so this includes
|
|
10
|
+
// both React rendering AND hold waiting (e.g. OffthreadVideo extraction).
|
|
11
|
+
// The browser records actual flushSync time in __RENDIV_RENDER_MS__.
|
|
7
12
|
await page.evaluate((f) => {
|
|
8
13
|
return window.__RENDIV_SET_FRAME__(f);
|
|
9
14
|
}, frame);
|
|
10
|
-
|
|
11
|
-
|
|
15
|
+
const t1 = profiling ? performance.now() : 0;
|
|
16
|
+
// Read the browser-side measurement of just the React flushSync time.
|
|
17
|
+
// This separates actual React rendering from hold waiting that happens
|
|
18
|
+
// inside the same evaluate call.
|
|
19
|
+
const browserRenderMs = profiling
|
|
20
|
+
? await page.evaluate(() => window.__RENDIV_RENDER_MS__ ?? 0)
|
|
21
|
+
: 0;
|
|
22
|
+
// Additional poll for holds placed asynchronously after __RENDIV_SET_FRAME__
|
|
23
|
+
// resolves (e.g. useEffect-based holdRender that fires after the promise).
|
|
24
|
+
await page.waitForFunction(() => window.__RENDIV_PENDING_HOLDS__() === 0, { timeout: timeoutPerFrame, polling: 4 });
|
|
25
|
+
const t2 = profiling ? performance.now() : 0;
|
|
12
26
|
// Screenshot
|
|
13
27
|
const paddedFrame = String(frame).padStart(6, '0');
|
|
14
28
|
const ext = imageFormat === 'jpeg' ? 'jpeg' : 'png';
|
|
@@ -18,9 +32,57 @@ async function renderSingleFrame(page, frame, outputDir, timeoutPerFrame, imageF
|
|
|
18
32
|
animations: 'disabled',
|
|
19
33
|
...(imageFormat === 'jpeg' ? { quality: 80 } : {}),
|
|
20
34
|
});
|
|
35
|
+
const t3 = profiling ? performance.now() : 0;
|
|
36
|
+
if (!profiling)
|
|
37
|
+
return null;
|
|
38
|
+
// Use browser-side render time for accurate React render measurement.
|
|
39
|
+
// The remaining evaluate time (t1 - t0 - browserRenderMs) is hold waiting
|
|
40
|
+
// that happened inside __RENDIV_SET_FRAME__'s promise.
|
|
41
|
+
const evaluateHoldMs = Math.max(0, (t1 - t0) - browserRenderMs);
|
|
42
|
+
return {
|
|
43
|
+
setFrameMs: browserRenderMs,
|
|
44
|
+
waitForHoldsMs: evaluateHoldMs + (t2 - t1),
|
|
45
|
+
screenshotMs: t3 - t2,
|
|
46
|
+
totalMs: t3 - t0,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
function computeProfile(allTimings, totalRenderTimeMs) {
|
|
50
|
+
const n = allTimings.length;
|
|
51
|
+
const sum = { setFrame: 0, waitForHolds: 0, screenshot: 0 };
|
|
52
|
+
const max = { setFrame: 0, waitForHolds: 0, screenshot: 0 };
|
|
53
|
+
for (const t of allTimings) {
|
|
54
|
+
sum.setFrame += t.setFrameMs;
|
|
55
|
+
sum.waitForHolds += t.waitForHoldsMs;
|
|
56
|
+
sum.screenshot += t.screenshotMs;
|
|
57
|
+
if (t.setFrameMs > max.setFrame)
|
|
58
|
+
max.setFrame = t.setFrameMs;
|
|
59
|
+
if (t.waitForHoldsMs > max.waitForHolds)
|
|
60
|
+
max.waitForHolds = t.waitForHoldsMs;
|
|
61
|
+
if (t.screenshotMs > max.screenshot)
|
|
62
|
+
max.screenshot = t.screenshotMs;
|
|
63
|
+
}
|
|
64
|
+
const avgTotal = allTimings.reduce((s, t) => s + t.totalMs, 0) / n;
|
|
65
|
+
const phases = {
|
|
66
|
+
setFrame: { avgMs: sum.setFrame / n, maxMs: max.setFrame, totalMs: sum.setFrame },
|
|
67
|
+
waitForHolds: { avgMs: sum.waitForHolds / n, maxMs: max.waitForHolds, totalMs: sum.waitForHolds },
|
|
68
|
+
screenshot: { avgMs: sum.screenshot / n, maxMs: max.screenshot, totalMs: sum.screenshot },
|
|
69
|
+
};
|
|
70
|
+
let bottleneck = 'setFrame';
|
|
71
|
+
if (phases.waitForHolds.totalMs > phases[bottleneck].totalMs)
|
|
72
|
+
bottleneck = 'waitForHolds';
|
|
73
|
+
if (phases.screenshot.totalMs > phases[bottleneck].totalMs)
|
|
74
|
+
bottleneck = 'screenshot';
|
|
75
|
+
return {
|
|
76
|
+
totalFrames: n,
|
|
77
|
+
totalTimeMs: totalRenderTimeMs,
|
|
78
|
+
avgFrameTimeMs: avgTotal,
|
|
79
|
+
phases,
|
|
80
|
+
bottleneck,
|
|
81
|
+
framesPerSecond: n / (totalRenderTimeMs / 1000),
|
|
82
|
+
};
|
|
21
83
|
}
|
|
22
84
|
export async function renderFrames(options) {
|
|
23
|
-
const { serveUrl, composition, outputDir, inputProps = {}, concurrency = 1, frameRange, onFrameRendered, cancelSignal, timeoutPerFrame = 30000, imageFormat = 'png', gl, } = options;
|
|
85
|
+
const { serveUrl, composition, outputDir, inputProps = {}, concurrency = 1, frameRange, onFrameRendered, cancelSignal, timeoutPerFrame = 30000, imageFormat = 'png', gl, profiling = false, } = options;
|
|
24
86
|
const [startFrame, endFrame] = frameRange ?? [0, composition.durationInFrames - 1];
|
|
25
87
|
const totalFrames = endFrame - startFrame + 1;
|
|
26
88
|
fs.mkdirSync(outputDir, { recursive: true });
|
|
@@ -38,11 +100,12 @@ export async function renderFrames(options) {
|
|
|
38
100
|
await page.waitForFunction(() => window.__RENDIV_LOADED__ === true, {
|
|
39
101
|
timeout: 30000,
|
|
40
102
|
});
|
|
41
|
-
// Set composition and
|
|
42
|
-
await page.evaluate(({ id, props }) => {
|
|
103
|
+
// Set composition, input props, and image format for OffthreadVideo
|
|
104
|
+
await page.evaluate(({ id, props, imgFormat }) => {
|
|
105
|
+
window.__RENDIV_IMAGE_FORMAT__ = imgFormat;
|
|
43
106
|
window.__RENDIV_SET_INPUT_PROPS__(props);
|
|
44
107
|
window.__RENDIV_SET_COMPOSITION__(id);
|
|
45
|
-
}, { id: composition.id, props: inputProps });
|
|
108
|
+
}, { id: composition.id, props: inputProps, imgFormat: imageFormat });
|
|
46
109
|
// Wait for composition to render
|
|
47
110
|
await page.waitForTimeout(100);
|
|
48
111
|
pages.push(page);
|
|
@@ -50,17 +113,23 @@ export async function renderFrames(options) {
|
|
|
50
113
|
// Render frames using a simple pool
|
|
51
114
|
const frameQueue = Array.from({ length: totalFrames }, (_, i) => startFrame + i);
|
|
52
115
|
let completedFrames = 0;
|
|
116
|
+
const allTimings = [];
|
|
117
|
+
const renderStartTime = profiling ? performance.now() : 0;
|
|
53
118
|
const renderNext = async (page) => {
|
|
54
119
|
while (frameQueue.length > 0) {
|
|
55
120
|
if (cancelSignal?.aborted)
|
|
56
121
|
return;
|
|
57
122
|
const frame = frameQueue.shift();
|
|
58
|
-
await renderSingleFrame(page, frame, outputDir, timeoutPerFrame, imageFormat);
|
|
123
|
+
const timings = await renderSingleFrame(page, frame, outputDir, timeoutPerFrame, imageFormat, profiling);
|
|
124
|
+
if (timings) {
|
|
125
|
+
allTimings.push(timings);
|
|
126
|
+
}
|
|
59
127
|
completedFrames++;
|
|
60
|
-
onFrameRendered?.({ frame: completedFrames, total: totalFrames });
|
|
128
|
+
onFrameRendered?.({ frame: completedFrames, total: totalFrames, timings: timings ?? undefined });
|
|
61
129
|
}
|
|
62
130
|
};
|
|
63
131
|
await Promise.all(pages.map((page) => renderNext(page)));
|
|
132
|
+
const renderEndTime = profiling ? performance.now() : 0;
|
|
64
133
|
// Collect audio source metadata registered by Audio/Video components.
|
|
65
134
|
// The persistent Map accumulates entries across all frames, so reading
|
|
66
135
|
// from any page after rendering captures everything.
|
|
@@ -75,7 +144,10 @@ export async function renderFrames(options) {
|
|
|
75
144
|
for (const page of pages) {
|
|
76
145
|
await page.close();
|
|
77
146
|
}
|
|
78
|
-
|
|
147
|
+
const profile = profiling && allTimings.length > 0
|
|
148
|
+
? computeProfile(allTimings, renderEndTime - renderStartTime)
|
|
149
|
+
: undefined;
|
|
150
|
+
return { audioSources, profile };
|
|
79
151
|
}
|
|
80
152
|
finally {
|
|
81
153
|
server.close();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render-frames.js","sourceRoot":"","sources":["../src/render-frames.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"render-frames.js","sourceRoot":"","sources":["../src/render-frames.ts"],"names":[],"mappings":"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"}
|
package/dist/render-media.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type RenderProfile } from './render-frames.js';
|
|
1
2
|
import type { CompositionInfo } from './types.js';
|
|
2
3
|
import type { GlRenderer } from './browser.js';
|
|
3
4
|
export interface RenderMediaOptions {
|
|
@@ -11,6 +12,8 @@ export interface RenderMediaOptions {
|
|
|
11
12
|
progress: number;
|
|
12
13
|
renderedFrames: number;
|
|
13
14
|
totalFrames: number;
|
|
15
|
+
avgFrameTimeMs?: number;
|
|
16
|
+
estimatedRemainingMs?: number;
|
|
14
17
|
}) => void;
|
|
15
18
|
frameRange?: [number, number];
|
|
16
19
|
cancelSignal?: AbortSignal;
|
|
@@ -24,6 +27,11 @@ export interface RenderMediaOptions {
|
|
|
24
27
|
videoEncoder?: string;
|
|
25
28
|
/** GL renderer for headless Chromium. Default: swiftshader */
|
|
26
29
|
gl?: GlRenderer;
|
|
30
|
+
/** Enable per-frame profiling. Default: false */
|
|
31
|
+
profiling?: boolean;
|
|
27
32
|
}
|
|
28
|
-
export
|
|
33
|
+
export interface RenderMediaResult {
|
|
34
|
+
profile?: RenderProfile;
|
|
35
|
+
}
|
|
36
|
+
export declare function renderMedia(options: RenderMediaOptions): Promise<RenderMediaResult>;
|
|
29
37
|
//# sourceMappingURL=render-media.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render-media.d.ts","sourceRoot":"","sources":["../src/render-media.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"render-media.d.ts","sourceRoot":"","sources":["../src/render-media.ts"],"names":[],"mappings":"AAGA,OAAO,EAA0C,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEhG,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE/C,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,eAAe,CAAC;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE;QAClB,QAAQ,EAAE,MAAM,CAAC;QACjB,cAAc,EAAE,MAAM,CAAC;QACvB,WAAW,EAAE,MAAM,CAAC;QACpB,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,oBAAoB,CAAC,EAAE,MAAM,CAAC;KAC/B,KAAK,IAAI,CAAC;IACX,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,YAAY,CAAC,EAAE,WAAW,CAAC;IAC3B,oDAAoD;IACpD,WAAW,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;IAC7B,wEAAwE;IACxE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,yDAAyD;IACzD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,4EAA4E;IAC5E,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,8DAA8D;IAC9D,EAAE,CAAC,EAAE,UAAU,CAAC;IAChB,iDAAiD;IACjD,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,EAAE,aAAa,CAAC;CACzB;AAED,wBAAsB,WAAW,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAwGzF"}
|
package/dist/render-media.js
CHANGED
|
@@ -4,7 +4,7 @@ import fs from 'node:fs';
|
|
|
4
4
|
import { renderFrames } from './render-frames.js';
|
|
5
5
|
import { stitchFramesToVideo } from './stitch-frames-to-video.js';
|
|
6
6
|
export async function renderMedia(options) {
|
|
7
|
-
const { composition, serveUrl, codec = 'mp4', outputLocation, inputProps, concurrency, onProgress, frameRange, cancelSignal, imageFormat, encodingPreset, crf, videoEncoder, gl, } = options;
|
|
7
|
+
const { composition, serveUrl, codec = 'mp4', outputLocation, inputProps, concurrency, onProgress, frameRange, cancelSignal, imageFormat, encodingPreset, crf, videoEncoder, gl, profiling = false, } = options;
|
|
8
8
|
const totalFrames = frameRange
|
|
9
9
|
? frameRange[1] - frameRange[0] + 1
|
|
10
10
|
: composition.durationInFrames;
|
|
@@ -14,8 +14,11 @@ export async function renderMedia(options) {
|
|
|
14
14
|
const outputDir = path.dirname(outputLocation);
|
|
15
15
|
fs.mkdirSync(outputDir, { recursive: true });
|
|
16
16
|
try {
|
|
17
|
+
// Running average for profiling ETA
|
|
18
|
+
let totalFrameTimeMs = 0;
|
|
19
|
+
let frameCount = 0;
|
|
17
20
|
// Step 1: Render frames and collect audio metadata
|
|
18
|
-
const { audioSources } = await renderFrames({
|
|
21
|
+
const { audioSources, profile } = await renderFrames({
|
|
19
22
|
serveUrl,
|
|
20
23
|
composition,
|
|
21
24
|
outputDir: tmpDir,
|
|
@@ -24,17 +27,31 @@ export async function renderMedia(options) {
|
|
|
24
27
|
frameRange,
|
|
25
28
|
imageFormat,
|
|
26
29
|
gl,
|
|
27
|
-
|
|
30
|
+
profiling,
|
|
31
|
+
onFrameRendered: ({ frame, total, timings }) => {
|
|
32
|
+
let avgFrameTimeMs;
|
|
33
|
+
let estimatedRemainingMs;
|
|
34
|
+
if (profiling && timings) {
|
|
35
|
+
totalFrameTimeMs += timings.totalMs;
|
|
36
|
+
frameCount++;
|
|
37
|
+
avgFrameTimeMs = totalFrameTimeMs / frameCount;
|
|
38
|
+
const remainingFrames = total - frame;
|
|
39
|
+
// Estimate using avg frame time divided by concurrency
|
|
40
|
+
const effectiveConcurrency = concurrency ?? 1;
|
|
41
|
+
estimatedRemainingMs = (remainingFrames / effectiveConcurrency) * avgFrameTimeMs;
|
|
42
|
+
}
|
|
28
43
|
onProgress?.({
|
|
29
44
|
progress: (frame / total) * 0.9, // 90% for frame rendering
|
|
30
45
|
renderedFrames: frame,
|
|
31
46
|
totalFrames: total,
|
|
47
|
+
avgFrameTimeMs,
|
|
48
|
+
estimatedRemainingMs,
|
|
32
49
|
});
|
|
33
50
|
},
|
|
34
51
|
cancelSignal,
|
|
35
52
|
});
|
|
36
53
|
if (cancelSignal?.aborted)
|
|
37
|
-
return;
|
|
54
|
+
return {};
|
|
38
55
|
// Step 2: Stitch frames to video (with audio if available)
|
|
39
56
|
onProgress?.({
|
|
40
57
|
progress: 0.9,
|
|
@@ -58,6 +75,7 @@ export async function renderMedia(options) {
|
|
|
58
75
|
renderedFrames: totalFrames,
|
|
59
76
|
totalFrames,
|
|
60
77
|
});
|
|
78
|
+
return { profile };
|
|
61
79
|
}
|
|
62
80
|
finally {
|
|
63
81
|
// Cleanup temp frames
|
package/dist/render-media.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render-media.js","sourceRoot":"","sources":["../src/render-media.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,YAAY,
|
|
1
|
+
{"version":3,"file":"render-media.js","sourceRoot":"","sources":["../src/render-media.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,YAAY,EAAgD,MAAM,oBAAoB,CAAC;AAChG,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAsClE,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAA2B;IAC3D,MAAM,EACJ,WAAW,EACX,QAAQ,EACR,KAAK,GAAG,KAAK,EACb,cAAc,EACd,UAAU,EACV,WAAW,EACX,UAAU,EACV,UAAU,EACV,YAAY,EACZ,WAAW,EACX,cAAc,EACd,GAAG,EACH,YAAY,EACZ,EAAE,EACF,SAAS,GAAG,KAAK,GAClB,GAAG,OAAO,CAAC;IAEZ,MAAM,WAAW,GAAG,UAAU;QAC5B,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC;QACnC,CAAC,CAAC,WAAW,CAAC,gBAAgB,CAAC;IAEjC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,iBAAiB,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACrE,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE1C,iCAAiC;IACjC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IAC/C,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE7C,IAAI,CAAC;QACH,oCAAoC;QACpC,IAAI,gBAAgB,GAAG,CAAC,CAAC;QACzB,IAAI,UAAU,GAAG,CAAC,CAAC;QAEnB,mDAAmD;QACnD,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,GAAG,MAAM,YAAY,CAAC;YACnD,QAAQ;YACR,WAAW;YACX,SAAS,EAAE,MAAM;YACjB,UAAU;YACV,WAAW;YACX,UAAU;YACV,WAAW;YACX,EAAE;YACF,SAAS;YACT,eAAe,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE;gBAC7C,IAAI,cAAkC,CAAC;gBACvC,IAAI,oBAAwC,CAAC;gBAE7C,IAAI,SAAS,IAAI,OAAO,EAAE,CAAC;oBACzB,gBAAgB,IAAI,OAAO,CAAC,OAAO,CAAC;oBACpC,UAAU,EAAE,CAAC;oBACb,cAAc,GAAG,gBAAgB,GAAG,UAAU,CAAC;oBAC/C,MAAM,eAAe,GAAG,KAAK,GAAG,KAAK,CAAC;oBACtC,uDAAuD;oBACvD,MAAM,oBAAoB,GAAG,WAAW,IAAI,CAAC,CAAC;oBAC9C,oBAAoB,GAAG,CAAC,eAAe,GAAG,oBAAoB,CAAC,GAAG,cAAc,CAAC;gBACnF,CAAC;gBAED,UAAU,EAAE,CAAC;oBACX,QAAQ,EAAE,CAAC,KAAK,GAAG,KAAK,CAAC,GAAG,GAAG,EAAE,0BAA0B;oBAC3D,cAAc,EAAE,KAAK;oBACrB,WAAW,EAAE,KAAK;oBAClB,cAAc;oBACd,oBAAoB;iBACrB,CAAC,CAAC;YACL,CAAC;YACD,YAAY;SACb,CAAC,CAAC;QAEH,IAAI,YAAY,EAAE,OAAO;YAAE,OAAO,EAAE,CAAC;QAErC,2DAA2D;QAC3D,UAAU,EAAE,CAAC;YACX,QAAQ,EAAE,GAAG;YACb,cAAc,EAAE,WAAW;YAC3B,WAAW;SACZ,CAAC,CAAC;QAEH,MAAM,mBAAmB,CAAC;YACxB,SAAS,EAAE,MAAM;YACjB,UAAU,EAAE,cAAc;YAC1B,GAAG,EAAE,WAAW,CAAC,GAAG;YACpB,KAAK;YACL,GAAG;YACH,cAAc;YACd,YAAY;YACZ,WAAW;YACX,YAAY;YACZ,SAAS,EAAE,QAAQ;SACpB,CAAC,CAAC;QAEH,UAAU,EAAE,CAAC;YACX,QAAQ,EAAE,GAAG;YACb,cAAc,EAAE,WAAW;YAC3B,WAAW;SACZ,CAAC,CAAC;QAEH,OAAO,EAAE,OAAO,EAAE,CAAC;IACrB,CAAC;YAAS,CAAC;QACT,sBAAsB;QACtB,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACtD,CAAC;AACH,CAAC"}
|
package/dist/render-still.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type OpenBrowserOptions } from './browser.js';
|
|
1
2
|
import type { CompositionInfo } from './types.js';
|
|
2
3
|
export interface RenderStillOptions {
|
|
3
4
|
serveUrl: string;
|
|
@@ -8,6 +9,7 @@ export interface RenderStillOptions {
|
|
|
8
9
|
imageFormat?: 'png' | 'jpeg';
|
|
9
10
|
quality?: number;
|
|
10
11
|
timeoutPerFrame?: number;
|
|
12
|
+
gl?: OpenBrowserOptions['gl'];
|
|
11
13
|
}
|
|
12
14
|
export declare function renderStill(options: RenderStillOptions): Promise<void>;
|
|
13
15
|
//# sourceMappingURL=render-still.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render-still.d.ts","sourceRoot":"","sources":["../src/render-still.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"render-still.d.ts","sourceRoot":"","sources":["../src/render-still.ts"],"names":[],"mappings":"AAEA,OAAO,EAAyB,KAAK,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAE9E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,eAAe,CAAC;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,WAAW,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,EAAE,CAAC,EAAE,kBAAkB,CAAC,IAAI,CAAC,CAAC;CAC/B;AAED,wBAAsB,WAAW,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CA6D5E"}
|
package/dist/render-still.js
CHANGED
|
@@ -3,12 +3,12 @@ import path from 'node:path';
|
|
|
3
3
|
import { openBrowser, openPage } from './browser.js';
|
|
4
4
|
import { startServer } from './serve.js';
|
|
5
5
|
export async function renderStill(options) {
|
|
6
|
-
const { serveUrl, composition, output, frame = 0, inputProps = {}, imageFormat = 'png', quality, timeoutPerFrame = 30000, } = options;
|
|
6
|
+
const { serveUrl, composition, output, frame = 0, inputProps = {}, imageFormat = 'png', quality, timeoutPerFrame = 30000, gl, } = options;
|
|
7
7
|
// Ensure output directory exists
|
|
8
8
|
const outputDir = path.dirname(output);
|
|
9
9
|
fs.mkdirSync(outputDir, { recursive: true });
|
|
10
10
|
const server = await startServer(serveUrl);
|
|
11
|
-
const browser = await openBrowser();
|
|
11
|
+
const browser = await openBrowser({ gl });
|
|
12
12
|
try {
|
|
13
13
|
const page = await openPage(browser, server.url, {
|
|
14
14
|
width: composition.width,
|
package/dist/render-still.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render-still.js","sourceRoot":"","sources":["../src/render-still.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,WAAW,EAAE,QAAQ,
|
|
1
|
+
{"version":3,"file":"render-still.js","sourceRoot":"","sources":["../src/render-still.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,WAAW,EAAE,QAAQ,EAA2B,MAAM,cAAc,CAAC;AAC9E,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAezC,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAA2B;IAC3D,MAAM,EACJ,QAAQ,EACR,WAAW,EACX,MAAM,EACN,KAAK,GAAG,CAAC,EACT,UAAU,GAAG,EAAE,EACf,WAAW,GAAG,KAAK,EACnB,OAAO,EACP,eAAe,GAAG,KAAK,EACvB,EAAE,GACH,GAAG,OAAO,CAAC;IAEZ,iCAAiC;IACjC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACvC,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE7C,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,CAAC;IAC3C,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAE1C,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,GAAG,EAAE;YAC/C,KAAK,EAAE,WAAW,CAAC,KAAK;YACxB,MAAM,EAAE,WAAW,CAAC,MAAM;SAC3B,CAAC,CAAC;QAEH,MAAM,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE,CAAE,MAAc,CAAC,iBAAiB,KAAK,IAAI,EAAE;YAC3E,OAAO,EAAE,KAAK;SACf,CAAC,CAAC;QAEH,MAAM,IAAI,CAAC,QAAQ,CACjB,CAAC,EAAE,EAAE,EAAE,KAAK,EAAkD,EAAE,EAAE;YAC/D,MAAc,CAAC,0BAA0B,CAAC,KAAK,CAAC,CAAC;YACjD,MAAc,CAAC,0BAA0B,CAAC,EAAE,CAAC,CAAC;QACjD,CAAC,EACD,EAAE,EAAE,EAAE,WAAW,CAAC,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,CAC1C,CAAC;QAEF,MAAM,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;QAE/B,YAAY;QACZ,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAS,EAAE,EAAE;YAChC,OAAQ,MAAc,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC;QACjD,CAAC,EAAE,KAAK,CAAC,CAAC;QAEV,MAAM,IAAI,CAAC,eAAe,CACxB,GAAG,EAAE,CAAE,MAAc,CAAC,wBAAwB,EAAE,KAAK,CAAC,EACtD,EAAE,OAAO,EAAE,eAAe,EAAE,CAC7B,CAAC;QAEF,MAAM,IAAI,CAAC,UAAU,CAAC;YACpB,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,WAAW,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS;YAC7D,UAAU,EAAE,UAAU;SACvB,CAAC,CAAC;QAEH,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,KAAK,EAAE,CAAC;IACjB,CAAC;AACH,CAAC"}
|
package/dist/serve.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../src/serve.ts"],"names":[],"mappings":"AAuEA,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,aAAa,SAAI,GAAG,OAAO,CAAC,WAAW,CAAC,
|
|
1
|
+
{"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../src/serve.ts"],"names":[],"mappings":"AAuEA,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,aAAa,SAAI,GAAG,OAAO,CAAC,WAAW,CAAC,CAiIpF"}
|
package/dist/serve.js
CHANGED
|
@@ -95,7 +95,9 @@ export function startServer(rootDir, preferredPort = 0) {
|
|
|
95
95
|
res.end(JSON.stringify({ error: `Video file not found: ${src}` }));
|
|
96
96
|
return;
|
|
97
97
|
}
|
|
98
|
-
const
|
|
98
|
+
const formatParam = parsed.searchParams.get('format');
|
|
99
|
+
const imageFormat = formatParam === 'jpeg' ? 'jpeg' : 'png';
|
|
100
|
+
const cacheKey = `${src}:${timeInSeconds.toFixed(6)}:${imageFormat}`;
|
|
99
101
|
try {
|
|
100
102
|
// Check cache
|
|
101
103
|
let data = frameCache.get(cacheKey);
|
|
@@ -103,7 +105,7 @@ export function startServer(rootDir, preferredPort = 0) {
|
|
|
103
105
|
// Deduplicate concurrent requests for the same frame
|
|
104
106
|
let pending = pendingExtractions.get(cacheKey);
|
|
105
107
|
if (!pending) {
|
|
106
|
-
pending = extractFrame({ videoPath, timeInSeconds }).then((buf) => {
|
|
108
|
+
pending = extractFrame({ videoPath, timeInSeconds, imageFormat }).then((buf) => {
|
|
107
109
|
frameCache.set(cacheKey, buf);
|
|
108
110
|
pendingExtractions.delete(cacheKey);
|
|
109
111
|
return buf;
|
|
@@ -116,7 +118,7 @@ export function startServer(rootDir, preferredPort = 0) {
|
|
|
116
118
|
data = await pending;
|
|
117
119
|
}
|
|
118
120
|
res.writeHead(200, {
|
|
119
|
-
'Content-Type': 'image/png',
|
|
121
|
+
'Content-Type': imageFormat === 'jpeg' ? 'image/jpeg' : 'image/png',
|
|
120
122
|
'Content-Length': String(data.length),
|
|
121
123
|
'Access-Control-Allow-Origin': '*',
|
|
122
124
|
'Cache-Control': 'public, max-age=31536000, immutable',
|
package/dist/serve.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serve.js","sourceRoot":"","sources":["../src/serve.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"serve.js","sourceRoot":"","sources":["../src/serve.ts"],"names":[],"mappings":"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"}
|