@remotion/renderer 4.1.0-alpha3 → 4.1.0-alpha4
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/assets/get-video-stream-duration.d.ts +9 -0
- package/dist/assets/get-video-stream-duration.js +71 -0
- package/dist/browser/Browser.d.ts +7 -6
- package/dist/browser/Browser.js +12 -12
- package/dist/browser/BrowserPage.d.ts +13 -2
- package/dist/browser/BrowserPage.js +15 -8
- package/dist/browser/BrowserRunner.js +2 -2
- package/dist/browser/LaunchOptions.d.ts +2 -0
- package/dist/browser/Launcher.js +2 -1
- package/dist/browser/Target.d.ts +2 -1
- package/dist/browser/Target.js +3 -1
- package/dist/browser/should-log-message.js +8 -0
- package/dist/calculate-sar-dar-pixels.d.ts +9 -0
- package/dist/calculate-sar-dar-pixels.js +19 -0
- package/dist/compositor/compositor.d.ts +3 -2
- package/dist/compositor/compositor.js +6 -5
- package/dist/cycle-browser-tabs.d.ts +2 -1
- package/dist/cycle-browser-tabs.js +2 -2
- package/dist/determine-resize-params.d.ts +4 -0
- package/dist/determine-resize-params.js +10 -0
- package/dist/determine-vcodec-ffmpeg-flags.d.ts +2 -0
- package/dist/determine-vcodec-ffmpeg-flags.js +13 -0
- package/dist/ensure-ffmpeg.d.ts +18 -0
- package/dist/ensure-ffmpeg.js +58 -0
- package/dist/ensure-presentation-timestamp.d.ts +15 -0
- package/dist/ensure-presentation-timestamp.js +88 -0
- package/dist/extract-frame-from-video.d.ts +16 -0
- package/dist/extract-frame-from-video.js +191 -0
- package/dist/ffmpeg-executable.d.ts +1 -0
- package/dist/ffmpeg-executable.js +2 -0
- package/dist/ffmpeg-flags.d.ts +31 -0
- package/dist/ffmpeg-flags.js +245 -0
- package/dist/format-logs.d.ts +3 -0
- package/dist/format-logs.js +201 -0
- package/dist/frame-to-ffmpeg-timestamp.d.ts +1 -0
- package/dist/frame-to-ffmpeg-timestamp.js +8 -0
- package/dist/get-browser-instance.d.ts +3 -2
- package/dist/get-browser-instance.js +5 -5
- package/dist/get-can-extract-frames-fast.d.ts +14 -0
- package/dist/get-can-extract-frames-fast.js +71 -0
- package/dist/get-compositions.d.ts +4 -3
- package/dist/get-compositions.js +6 -5
- package/dist/get-frame-of-video-slow.d.ts +17 -0
- package/dist/get-frame-of-video-slow.js +72 -0
- package/dist/get-video-info.d.ts +8 -0
- package/dist/get-video-info.js +59 -0
- package/dist/index.d.ts +14 -15
- package/dist/is-beyond-last-frame.d.ts +3 -0
- package/dist/is-beyond-last-frame.js +12 -0
- package/dist/last-frame-from-video-cache.d.ts +17 -0
- package/dist/last-frame-from-video-cache.js +55 -0
- package/dist/legacy-webpack-config.d.ts +9 -0
- package/dist/legacy-webpack-config.js +13 -0
- package/dist/logger.d.ts +0 -1
- package/dist/logger.js +5 -10
- package/dist/offthread-video-server.d.ts +3 -2
- package/dist/offthread-video-server.js +4 -3
- package/dist/open-browser.d.ts +3 -2
- package/dist/open-browser.js +7 -5
- package/dist/perf.js +4 -2
- package/dist/prepare-server.d.ts +3 -2
- package/dist/prepare-server.js +4 -4
- package/dist/prespawn-ffmpeg.d.ts +2 -1
- package/dist/prespawn-ffmpeg.js +2 -30
- package/dist/quality.d.ts +1 -0
- package/dist/quality.js +21 -0
- package/dist/render-frames.d.ts +11 -4
- package/dist/render-frames.js +15 -11
- package/dist/render-media.d.ts +11 -4
- package/dist/render-media.js +12 -14
- package/dist/render-still.d.ts +8 -2
- package/dist/render-still.js +8 -8
- package/dist/replace-browser.d.ts +2 -1
- package/dist/replace-browser.js +2 -2
- package/dist/select-composition.d.ts +2 -1
- package/dist/select-composition.js +8 -8
- package/dist/serve-static.d.ts +2 -1
- package/dist/serve-static.js +1 -1
- package/dist/stitch-frames-to-video.d.ts +2 -1
- package/dist/stitch-frames-to-video.js +12 -22
- package/dist/try-to-extract-frame-of-video-fast.d.ts +12 -0
- package/dist/try-to-extract-frame-of-video-fast.js +55 -0
- package/dist/validate-ffmpeg.d.ts +7 -0
- package/dist/validate-ffmpeg.js +77 -0
- package/dist/warn-about-ffmpeg-version.d.ts +5 -0
- package/dist/warn-about-ffmpeg-version.js +37 -0
- package/package.json +9 -9
package/dist/index.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
1
2
|
import execa from 'execa';
|
|
2
3
|
import { HeadlessBrowser } from './browser/Browser';
|
|
3
4
|
import { SymbolicateableError } from './error-handling/symbolicateable-error';
|
|
@@ -42,7 +43,7 @@ export declare const RenderInternals: {
|
|
|
42
43
|
downloadMap: import("./assets/download-map").DownloadMap;
|
|
43
44
|
remotionRoot: string;
|
|
44
45
|
concurrency: number;
|
|
45
|
-
|
|
46
|
+
logLevel: "verbose" | "info" | "warn" | "error";
|
|
46
47
|
indent: boolean;
|
|
47
48
|
}) => Promise<{
|
|
48
49
|
port: number;
|
|
@@ -300,7 +301,7 @@ export declare const RenderInternals: {
|
|
|
300
301
|
validStillImageFormats: readonly ["png", "jpeg", "pdf", "webp"];
|
|
301
302
|
validVideoImageFormats: readonly ["png", "jpeg", "none"];
|
|
302
303
|
DEFAULT_STILL_IMAGE_FORMAT: "png" | "jpeg" | "pdf" | "webp";
|
|
303
|
-
DEFAULT_VIDEO_IMAGE_FORMAT: "
|
|
304
|
+
DEFAULT_VIDEO_IMAGE_FORMAT: "none" | "png" | "jpeg";
|
|
304
305
|
DEFAULT_JPEG_QUALITY: number;
|
|
305
306
|
chalk: {
|
|
306
307
|
enabled: boolean;
|
|
@@ -358,7 +359,6 @@ export declare const RenderInternals: {
|
|
|
358
359
|
logLevel: "verbose" | "info" | "warn" | "error";
|
|
359
360
|
} & {
|
|
360
361
|
tag?: string | undefined;
|
|
361
|
-
secondTag?: string | undefined;
|
|
362
362
|
}, message?: any, ...optionalParams: any[]) => void;
|
|
363
363
|
info: (message?: any, ...optionalParams: any[]) => void;
|
|
364
364
|
infoAdvanced: (options: {
|
|
@@ -377,12 +377,12 @@ export declare const RenderInternals: {
|
|
|
377
377
|
INDENT_TOKEN: string;
|
|
378
378
|
isColorSupported: boolean;
|
|
379
379
|
HeadlessBrowser: typeof HeadlessBrowser;
|
|
380
|
-
prepareServer: ({ webpackConfigOrServeUrl, port, remotionRoot, concurrency,
|
|
380
|
+
prepareServer: ({ webpackConfigOrServeUrl, port, remotionRoot, concurrency, logLevel, indent, }: {
|
|
381
381
|
webpackConfigOrServeUrl: string;
|
|
382
382
|
port: number | null;
|
|
383
383
|
remotionRoot: string;
|
|
384
384
|
concurrency: number;
|
|
385
|
-
|
|
385
|
+
logLevel: "verbose" | "info" | "warn" | "error";
|
|
386
386
|
indent: boolean;
|
|
387
387
|
}) => Promise<import("./prepare-server").RemotionServer>;
|
|
388
388
|
makeOrReuseServer: (server: import("./prepare-server").RemotionServer | undefined, config: {
|
|
@@ -390,7 +390,7 @@ export declare const RenderInternals: {
|
|
|
390
390
|
port: number | null;
|
|
391
391
|
remotionRoot: string;
|
|
392
392
|
concurrency: number;
|
|
393
|
-
|
|
393
|
+
logLevel: "verbose" | "info" | "warn" | "error";
|
|
394
394
|
indent: boolean;
|
|
395
395
|
}, { onDownload, onError, }: {
|
|
396
396
|
onError: (err: Error) => void;
|
|
@@ -407,7 +407,6 @@ export declare const RenderInternals: {
|
|
|
407
407
|
imageFormat: "png" | "jpeg" | "pdf" | "webp";
|
|
408
408
|
jpegQuality: number;
|
|
409
409
|
puppeteerInstance: HeadlessBrowser | null;
|
|
410
|
-
dumpBrowserLogs: boolean;
|
|
411
410
|
envVariables: Record<string, string>;
|
|
412
411
|
overwrite: boolean;
|
|
413
412
|
browserExecutable: import("./browser-executable").BrowserExecutable;
|
|
@@ -419,20 +418,20 @@ export declare const RenderInternals: {
|
|
|
419
418
|
cancelSignal: import("./make-cancel-signal").CancelSignal | null;
|
|
420
419
|
indent: boolean;
|
|
421
420
|
server: import("./prepare-server").RemotionServer | undefined;
|
|
422
|
-
|
|
421
|
+
logLevel: "verbose" | "info" | "warn" | "error";
|
|
423
422
|
serveUrl: string;
|
|
424
423
|
port: number | null;
|
|
425
424
|
}) => Promise<{
|
|
426
425
|
buffer: Buffer | null;
|
|
427
426
|
}>;
|
|
428
|
-
internalOpenBrowser: ({ browser, browserExecutable, chromiumOptions, forceDeviceScaleFactor, indent,
|
|
429
|
-
shouldDumpIo: boolean;
|
|
427
|
+
internalOpenBrowser: ({ browser, browserExecutable, chromiumOptions, forceDeviceScaleFactor, indent, viewport, logLevel, }: {
|
|
430
428
|
browserExecutable: string | null;
|
|
431
429
|
chromiumOptions: import("./open-browser").ChromiumOptions;
|
|
432
430
|
forceDeviceScaleFactor: number | undefined;
|
|
433
431
|
viewport: import("./browser/PuppeteerViewport").Viewport | null;
|
|
434
432
|
indent: boolean;
|
|
435
433
|
browser: import("./browser").Browser;
|
|
434
|
+
logLevel: "verbose" | "info" | "warn" | "error";
|
|
436
435
|
}) => Promise<HeadlessBrowser>;
|
|
437
436
|
internalSelectComposition: (options: {
|
|
438
437
|
inputProps: Record<string, unknown>;
|
|
@@ -445,11 +444,11 @@ export declare const RenderInternals: {
|
|
|
445
444
|
port: number | null;
|
|
446
445
|
indent: boolean;
|
|
447
446
|
server: import("./prepare-server").RemotionServer | undefined;
|
|
448
|
-
|
|
447
|
+
logLevel: "verbose" | "info" | "warn" | "error";
|
|
449
448
|
serveUrl: string;
|
|
450
449
|
id: string;
|
|
451
450
|
}) => Promise<import("remotion").AnyCompMetadata>;
|
|
452
|
-
internalGetCompositions: ({ browserExecutable, chromiumOptions, envVariables, indent, inputProps, onBrowserLog, port, puppeteerInstance, serveUrlOrWebpackUrl, server, timeoutInMilliseconds,
|
|
451
|
+
internalGetCompositions: ({ browserExecutable, chromiumOptions, envVariables, indent, inputProps, onBrowserLog, port, puppeteerInstance, serveUrlOrWebpackUrl, server, timeoutInMilliseconds, logLevel, }: {
|
|
453
452
|
inputProps: Record<string, unknown>;
|
|
454
453
|
envVariables: Record<string, string>;
|
|
455
454
|
puppeteerInstance: HeadlessBrowser | undefined;
|
|
@@ -460,11 +459,11 @@ export declare const RenderInternals: {
|
|
|
460
459
|
port: number | null;
|
|
461
460
|
server: import("./prepare-server").RemotionServer | undefined;
|
|
462
461
|
indent: boolean;
|
|
463
|
-
|
|
462
|
+
logLevel: "verbose" | "info" | "warn" | "error";
|
|
464
463
|
serveUrlOrWebpackUrl: string;
|
|
465
464
|
}) => Promise<import("remotion").AnyCompMetadata[]>;
|
|
466
|
-
internalRenderFrames: ({ browserExecutable, cancelSignal, chromiumOptions, composition, concurrency,
|
|
467
|
-
internalRenderMedia: ({ proResProfile, crf, composition, inputProps, pixelFormat, codec, envVariables, frameRange, puppeteerInstance, outputLocation, onProgress, overwrite, onDownload,
|
|
465
|
+
internalRenderFrames: ({ browserExecutable, cancelSignal, chromiumOptions, composition, concurrency, envVariables, everyNthFrame, frameRange, imageFormat, indent, inputProps, jpegQuality, muted, onBrowserLog, onDownload, onFrameBuffer, onFrameUpdate, onStart, outputDir, port, puppeteerInstance, scale, server, timeoutInMilliseconds, logLevel, webpackBundleOrServeUrl, }: import("./render-frames").InternalRenderFramesOptions) => Promise<import("./types").RenderFramesOutput>;
|
|
466
|
+
internalRenderMedia: ({ proResProfile, crf, composition, inputProps, pixelFormat, codec, envVariables, frameRange, puppeteerInstance, outputLocation, onProgress, overwrite, onDownload, onBrowserLog, onStart, timeoutInMilliseconds, chromiumOptions, scale, browserExecutable, port, cancelSignal, muted, enforceAudioTrack, ffmpegOverride, audioBitrate, videoBitrate, audioCodec, concurrency, disallowParallelEncoding, everyNthFrame, imageFormat: provisionalImageFormat, indent, jpegQuality, numberOfGifLoops, onCtrlCExit, preferLossless, serveUrl, server: reusedServer, logLevel, }: import("./render-media").InternalRenderMediaOptions) => Promise<{
|
|
468
467
|
buffer: Buffer | null;
|
|
469
468
|
slowestFrames: import("./render-media").SlowFrame[];
|
|
470
469
|
}>;
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { DownloadMap } from './assets/download-map';
|
|
2
|
+
export declare const isBeyondLastFrame: (downloadMap: DownloadMap, src: string, time: number) => boolean | 0;
|
|
3
|
+
export declare const markAsBeyondLastFrame: (downloadMap: DownloadMap, src: string, time: number) => void;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.markAsBeyondLastFrame = exports.isBeyondLastFrame = void 0;
|
|
4
|
+
const isBeyondLastFrame = (downloadMap, src, time) => {
|
|
5
|
+
return (downloadMap.isBeyondLastFrameMap[src] &&
|
|
6
|
+
time >= downloadMap.isBeyondLastFrameMap[src]);
|
|
7
|
+
};
|
|
8
|
+
exports.isBeyondLastFrame = isBeyondLastFrame;
|
|
9
|
+
const markAsBeyondLastFrame = (downloadMap, src, time) => {
|
|
10
|
+
downloadMap.isBeyondLastFrameMap[src] = time;
|
|
11
|
+
};
|
|
12
|
+
exports.markAsBeyondLastFrame = markAsBeyondLastFrame;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { OffthreadVideoImageFormat } from 'remotion';
|
|
2
|
+
import type { DownloadMap, SpecialVCodecForTransparency } from './assets/download-map';
|
|
3
|
+
import type { FfmpegExecutable } from './ffmpeg-executable';
|
|
4
|
+
export type LastFrameOptions = {
|
|
5
|
+
ffmpegExecutable: FfmpegExecutable;
|
|
6
|
+
ffprobeExecutable: FfmpegExecutable;
|
|
7
|
+
offset: number;
|
|
8
|
+
src: string;
|
|
9
|
+
specialVCodecForTransparency: SpecialVCodecForTransparency;
|
|
10
|
+
imageFormat: OffthreadVideoImageFormat;
|
|
11
|
+
needsResize: [number, number] | null;
|
|
12
|
+
downloadMap: DownloadMap;
|
|
13
|
+
remotionRoot: string;
|
|
14
|
+
};
|
|
15
|
+
export declare const setLastFrameInCache: (options: LastFrameOptions, data: Buffer) => void;
|
|
16
|
+
export declare const getLastFrameFromCache: (options: LastFrameOptions) => Buffer | null;
|
|
17
|
+
export declare const clearLastFileCache: (downloadMap: DownloadMap) => void;
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// OffthreadVideo requires sometimes that the last frame of a video gets extracted, however, this can be slow. We allocate a cache for it but that can be garbage collected
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.clearLastFileCache = exports.getLastFrameFromCache = exports.setLastFrameInCache = void 0;
|
|
5
|
+
const MAX_CACHE_SIZE = 50 * 1024 * 1024; // 50MB
|
|
6
|
+
let bufferSize = 0;
|
|
7
|
+
const makeLastFrameCacheKey = (options) => {
|
|
8
|
+
return [
|
|
9
|
+
options.ffmpegExecutable,
|
|
10
|
+
options.offset,
|
|
11
|
+
options.src,
|
|
12
|
+
options.imageFormat,
|
|
13
|
+
options.downloadMap.id,
|
|
14
|
+
].join('-');
|
|
15
|
+
};
|
|
16
|
+
const setLastFrameInCache = (options, data) => {
|
|
17
|
+
const key = makeLastFrameCacheKey(options);
|
|
18
|
+
if (options.downloadMap.lastFrameMap[key]) {
|
|
19
|
+
bufferSize -= options.downloadMap.lastFrameMap[key].data.byteLength;
|
|
20
|
+
}
|
|
21
|
+
options.downloadMap.lastFrameMap[key] = { data, lastAccessed: Date.now() };
|
|
22
|
+
bufferSize += data.byteLength;
|
|
23
|
+
ensureMaxSize(options.downloadMap);
|
|
24
|
+
};
|
|
25
|
+
exports.setLastFrameInCache = setLastFrameInCache;
|
|
26
|
+
const getLastFrameFromCache = (options) => {
|
|
27
|
+
var _a;
|
|
28
|
+
const key = makeLastFrameCacheKey(options);
|
|
29
|
+
if (!options.downloadMap.lastFrameMap[key]) {
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
options.downloadMap.lastFrameMap[key].lastAccessed = Date.now();
|
|
33
|
+
return (_a = options.downloadMap.lastFrameMap[key].data) !== null && _a !== void 0 ? _a : null;
|
|
34
|
+
};
|
|
35
|
+
exports.getLastFrameFromCache = getLastFrameFromCache;
|
|
36
|
+
const removedLastFrameFromCache = (key, downloadMap) => {
|
|
37
|
+
if (!downloadMap.lastFrameMap[key]) {
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
bufferSize -= downloadMap.lastFrameMap[key].data.byteLength;
|
|
41
|
+
delete downloadMap.lastFrameMap[key];
|
|
42
|
+
};
|
|
43
|
+
const ensureMaxSize = (downloadMap) => {
|
|
44
|
+
// eslint-disable-next-line no-unmodified-loop-condition
|
|
45
|
+
while (bufferSize > MAX_CACHE_SIZE) {
|
|
46
|
+
const earliest = Object.entries(downloadMap.lastFrameMap).sort((a, b) => {
|
|
47
|
+
return a[1].lastAccessed - b[1].lastAccessed;
|
|
48
|
+
})[0];
|
|
49
|
+
removedLastFrameFromCache(earliest[0], downloadMap);
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
const clearLastFileCache = (downloadMap) => {
|
|
53
|
+
downloadMap.lastFrameMap = {};
|
|
54
|
+
};
|
|
55
|
+
exports.clearLastFileCache = clearLastFileCache;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getServeUrlWithFallback = void 0;
|
|
4
|
+
const getServeUrlWithFallback = (serve) => {
|
|
5
|
+
if ('webpackBundle' in serve) {
|
|
6
|
+
return serve.webpackBundle;
|
|
7
|
+
}
|
|
8
|
+
if ('serveUrl' in serve) {
|
|
9
|
+
return serve.serveUrl;
|
|
10
|
+
}
|
|
11
|
+
throw new Error('You must pass the `serveUrl` parameter');
|
|
12
|
+
};
|
|
13
|
+
exports.getServeUrlWithFallback = getServeUrlWithFallback;
|
package/dist/logger.d.ts
CHANGED
package/dist/logger.js
CHANGED
|
@@ -22,12 +22,7 @@ exports.Log = {
|
|
|
22
22
|
if ((0, log_level_1.isEqualOrBelowLogLevel)(options.logLevel, 'verbose')) {
|
|
23
23
|
return console.log(...[
|
|
24
24
|
options.indent ? exports.INDENT_TOKEN : null,
|
|
25
|
-
|
|
26
|
-
options.tag ? (0, exports.verboseTag)(options.tag) : null,
|
|
27
|
-
options.secondTag ? (0, exports.secondverboseTag)(options.secondTag) : null,
|
|
28
|
-
]
|
|
29
|
-
.filter(truthy_1.truthy)
|
|
30
|
-
.join(''),
|
|
25
|
+
options.tag ? (0, exports.verboseTag)(options.tag) : null,
|
|
31
26
|
...args.map((a) => chalk_1.chalk.gray(a)),
|
|
32
27
|
].filter(truthy_1.truthy));
|
|
33
28
|
}
|
|
@@ -36,12 +31,12 @@ exports.Log = {
|
|
|
36
31
|
exports.Log.infoAdvanced({ indent: false, logLevel: (0, exports.getLogLevel)() }, ...args);
|
|
37
32
|
},
|
|
38
33
|
infoAdvanced: (options, ...args) => {
|
|
39
|
-
|
|
40
|
-
return console.log(...[options.indent ? exports.INDENT_TOKEN : null, ...args].filter(truthy_1.truthy));
|
|
41
|
-
}
|
|
34
|
+
return console.log(...[options.indent ? exports.INDENT_TOKEN : null, ...args].filter(truthy_1.truthy));
|
|
42
35
|
},
|
|
43
36
|
warn: (...args) => {
|
|
44
|
-
|
|
37
|
+
if ((0, log_level_1.isEqualOrBelowLogLevel)((0, exports.getLogLevel)(), 'warn')) {
|
|
38
|
+
exports.Log.warnAdvanced({ indent: false, logLevel: (0, exports.getLogLevel)() }, ...args);
|
|
39
|
+
}
|
|
45
40
|
},
|
|
46
41
|
warnAdvanced: (options, ...args) => {
|
|
47
42
|
if ((0, log_level_1.isEqualOrBelowLogLevel)(options.logLevel, 'warn')) {
|
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
import type { RequestListener } from 'node:http';
|
|
2
2
|
import type { DownloadMap } from './assets/download-map';
|
|
3
3
|
import type { Compositor } from './compositor/compositor';
|
|
4
|
+
import type { LogLevel } from './log-level';
|
|
4
5
|
export declare const extractUrlAndSourceFromUrl: (url: string) => {
|
|
5
6
|
src: string;
|
|
6
7
|
time: number;
|
|
7
8
|
transparent: boolean;
|
|
8
9
|
};
|
|
9
|
-
export declare const startOffthreadVideoServer: ({ downloadMap, concurrency,
|
|
10
|
+
export declare const startOffthreadVideoServer: ({ downloadMap, concurrency, logLevel, indent, }: {
|
|
10
11
|
downloadMap: DownloadMap;
|
|
11
12
|
concurrency: number;
|
|
12
|
-
|
|
13
|
+
logLevel: LogLevel;
|
|
13
14
|
indent: boolean;
|
|
14
15
|
}) => {
|
|
15
16
|
listener: RequestListener;
|
|
@@ -4,6 +4,7 @@ exports.OffthreadVideoServerEmitter = exports.startOffthreadVideoServer = export
|
|
|
4
4
|
const node_url_1 = require("node:url");
|
|
5
5
|
const download_and_map_assets_to_file_1 = require("./assets/download-and-map-assets-to-file");
|
|
6
6
|
const compositor_1 = require("./compositor/compositor");
|
|
7
|
+
const log_level_1 = require("./log-level");
|
|
7
8
|
const extractUrlAndSourceFromUrl = (url) => {
|
|
8
9
|
const parsed = new URL(url, 'http://localhost');
|
|
9
10
|
const query = parsed.search;
|
|
@@ -27,13 +28,13 @@ const extractUrlAndSourceFromUrl = (url) => {
|
|
|
27
28
|
};
|
|
28
29
|
};
|
|
29
30
|
exports.extractUrlAndSourceFromUrl = extractUrlAndSourceFromUrl;
|
|
30
|
-
const startOffthreadVideoServer = ({ downloadMap, concurrency,
|
|
31
|
+
const startOffthreadVideoServer = ({ downloadMap, concurrency, logLevel, indent, }) => {
|
|
31
32
|
const events = new OffthreadVideoServerEmitter();
|
|
32
33
|
const compositor = (0, compositor_1.startCompositor)('StartLongRunningProcess', {
|
|
33
34
|
concurrency,
|
|
34
35
|
maximum_frame_cache_items: (0, compositor_1.getIdealMaximumFrameCacheItems)(),
|
|
35
|
-
verbose,
|
|
36
|
-
}, indent);
|
|
36
|
+
verbose: (0, log_level_1.isEqualOrBelowLogLevel)(logLevel, 'verbose'),
|
|
37
|
+
}, logLevel, indent);
|
|
37
38
|
return {
|
|
38
39
|
close: () => {
|
|
39
40
|
compositor.finishCommands();
|
package/dist/open-browser.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { Browser } from './browser';
|
|
2
2
|
import type { HeadlessBrowser } from './browser/Browser';
|
|
3
3
|
import type { Viewport } from './browser/PuppeteerViewport';
|
|
4
|
+
import { type LogLevel } from './log-level';
|
|
4
5
|
declare const validRenderers: readonly ["swangle", "angle", "egl", "swiftshader"];
|
|
5
6
|
type OpenGlRenderer = typeof validRenderers[number];
|
|
6
7
|
export type ChromiumOptions = {
|
|
@@ -12,13 +13,13 @@ export type ChromiumOptions = {
|
|
|
12
13
|
};
|
|
13
14
|
export declare const killAllBrowsers: () => Promise<void>;
|
|
14
15
|
type InternalOpenBrowserOptions = {
|
|
15
|
-
shouldDumpIo: boolean;
|
|
16
16
|
browserExecutable: string | null;
|
|
17
17
|
chromiumOptions: ChromiumOptions;
|
|
18
18
|
forceDeviceScaleFactor: number | undefined;
|
|
19
19
|
viewport: Viewport | null;
|
|
20
20
|
indent: boolean;
|
|
21
21
|
browser: Browser;
|
|
22
|
+
logLevel: LogLevel;
|
|
22
23
|
};
|
|
23
24
|
export type OpenBrowserOptions = {
|
|
24
25
|
shouldDumpIo?: boolean;
|
|
@@ -26,7 +27,7 @@ export type OpenBrowserOptions = {
|
|
|
26
27
|
chromiumOptions?: ChromiumOptions;
|
|
27
28
|
forceDeviceScaleFactor?: number;
|
|
28
29
|
};
|
|
29
|
-
export declare const internalOpenBrowser: ({ browser, browserExecutable, chromiumOptions, forceDeviceScaleFactor, indent,
|
|
30
|
+
export declare const internalOpenBrowser: ({ browser, browserExecutable, chromiumOptions, forceDeviceScaleFactor, indent, viewport, logLevel, }: InternalOpenBrowserOptions) => Promise<HeadlessBrowser>;
|
|
30
31
|
/**
|
|
31
32
|
* @description Opens a Chrome or Chromium browser instance.
|
|
32
33
|
* @see [Documentation](https://www.remotion.dev/docs/renderer/open-browser)
|
package/dist/open-browser.js
CHANGED
|
@@ -4,6 +4,7 @@ exports.openBrowser = exports.internalOpenBrowser = exports.killAllBrowsers = vo
|
|
|
4
4
|
const node_1 = require("./browser/node");
|
|
5
5
|
const get_local_browser_executable_1 = require("./get-local-browser-executable");
|
|
6
6
|
const get_video_threads_flag_1 = require("./get-video-threads-flag");
|
|
7
|
+
const log_level_1 = require("./log-level");
|
|
7
8
|
const validate_opengl_renderer_1 = require("./validate-opengl-renderer");
|
|
8
9
|
const validRenderers = ['swangle', 'angle', 'egl', 'swiftshader'];
|
|
9
10
|
const getOpenGlRenderer = (option) => {
|
|
@@ -21,13 +22,13 @@ const browserInstances = [];
|
|
|
21
22
|
const killAllBrowsers = async () => {
|
|
22
23
|
for (const browser of browserInstances) {
|
|
23
24
|
try {
|
|
24
|
-
await browser.close(true);
|
|
25
|
+
await browser.close(true, 'info', false);
|
|
25
26
|
}
|
|
26
27
|
catch (err) { }
|
|
27
28
|
}
|
|
28
29
|
};
|
|
29
30
|
exports.killAllBrowsers = killAllBrowsers;
|
|
30
|
-
const internalOpenBrowser = async ({ browser, browserExecutable, chromiumOptions, forceDeviceScaleFactor, indent,
|
|
31
|
+
const internalOpenBrowser = async ({ browser, browserExecutable, chromiumOptions, forceDeviceScaleFactor, indent, viewport, logLevel, }) => {
|
|
31
32
|
var _a, _b;
|
|
32
33
|
if (browser === 'firefox') {
|
|
33
34
|
throw new TypeError('Firefox supported is not yet turned on. Stay tuned for the future.');
|
|
@@ -38,7 +39,8 @@ const internalOpenBrowser = async ({ browser, browserExecutable, chromiumOptions
|
|
|
38
39
|
const browserInstance = await node_1.puppeteer.launch({
|
|
39
40
|
executablePath,
|
|
40
41
|
product: browser,
|
|
41
|
-
dumpio:
|
|
42
|
+
dumpio: (0, log_level_1.isEqualOrBelowLogLevel)(logLevel, 'verbose'),
|
|
43
|
+
logLevel,
|
|
42
44
|
indent,
|
|
43
45
|
args: [
|
|
44
46
|
'about:blank',
|
|
@@ -109,7 +111,7 @@ const internalOpenBrowser = async ({ browser, browserExecutable, chromiumOptions
|
|
|
109
111
|
deviceScaleFactor: 1,
|
|
110
112
|
},
|
|
111
113
|
});
|
|
112
|
-
const pages = await browserInstance.pages();
|
|
114
|
+
const pages = await browserInstance.pages(logLevel, indent);
|
|
113
115
|
await pages[0].close();
|
|
114
116
|
browserInstances.push(browserInstance);
|
|
115
117
|
return browserInstance;
|
|
@@ -127,8 +129,8 @@ const openBrowser = (browser, options) => {
|
|
|
127
129
|
chromiumOptions: chromiumOptions !== null && chromiumOptions !== void 0 ? chromiumOptions : {},
|
|
128
130
|
forceDeviceScaleFactor,
|
|
129
131
|
indent: false,
|
|
130
|
-
shouldDumpIo: shouldDumpIo !== null && shouldDumpIo !== void 0 ? shouldDumpIo : false,
|
|
131
132
|
viewport: null,
|
|
133
|
+
logLevel: shouldDumpIo ? 'verbose' : 'info',
|
|
132
134
|
});
|
|
133
135
|
};
|
|
134
136
|
exports.openBrowser = openBrowser;
|
package/dist/perf.js
CHANGED
|
@@ -29,8 +29,10 @@ exports.stopPerfMeasure = stopPerfMeasure;
|
|
|
29
29
|
const getPerf = () => {
|
|
30
30
|
return [
|
|
31
31
|
'Render performance:',
|
|
32
|
-
...Object.keys(perf)
|
|
33
|
-
|
|
32
|
+
...Object.keys(perf)
|
|
33
|
+
.filter((p) => perf[p].length)
|
|
34
|
+
.map((p) => {
|
|
35
|
+
return ` ${p} => ${perf[p].reduce((a, b) => a + b, 0) / perf[p].length}ms (n = ${perf[p].length})`;
|
|
34
36
|
}),
|
|
35
37
|
];
|
|
36
38
|
};
|
package/dist/prepare-server.d.ts
CHANGED
|
@@ -3,6 +3,7 @@ import type { DownloadMap } from './assets/download-map';
|
|
|
3
3
|
import type { Compositor } from './compositor/compositor';
|
|
4
4
|
import type { OffthreadVideoServerEmitter } from './offthread-video-server';
|
|
5
5
|
import type { AnySourceMapConsumer } from './symbolicate-stacktrace';
|
|
6
|
+
import type { LogLevel } from './log-level';
|
|
6
7
|
export type RemotionServer = {
|
|
7
8
|
serveUrl: string;
|
|
8
9
|
closeServer: (force: boolean) => Promise<unknown>;
|
|
@@ -17,10 +18,10 @@ type PrepareServerOptions = {
|
|
|
17
18
|
port: number | null;
|
|
18
19
|
remotionRoot: string;
|
|
19
20
|
concurrency: number;
|
|
20
|
-
|
|
21
|
+
logLevel: LogLevel;
|
|
21
22
|
indent: boolean;
|
|
22
23
|
};
|
|
23
|
-
export declare const prepareServer: ({ webpackConfigOrServeUrl, port, remotionRoot, concurrency,
|
|
24
|
+
export declare const prepareServer: ({ webpackConfigOrServeUrl, port, remotionRoot, concurrency, logLevel, indent, }: PrepareServerOptions) => Promise<RemotionServer>;
|
|
24
25
|
export declare const makeOrReuseServer: (server: RemotionServer | undefined, config: PrepareServerOptions, { onDownload, onError, }: {
|
|
25
26
|
onError: (err: Error) => void;
|
|
26
27
|
onDownload: RenderMediaOnDownload | null;
|
package/dist/prepare-server.js
CHANGED
|
@@ -14,16 +14,16 @@ const logger_1 = require("./logger");
|
|
|
14
14
|
const serve_static_1 = require("./serve-static");
|
|
15
15
|
const symbolicate_stacktrace_1 = require("./symbolicate-stacktrace");
|
|
16
16
|
const wait_for_symbolication_error_to_be_done_1 = require("./wait-for-symbolication-error-to-be-done");
|
|
17
|
-
const prepareServer = async ({ webpackConfigOrServeUrl, port, remotionRoot, concurrency,
|
|
17
|
+
const prepareServer = async ({ webpackConfigOrServeUrl, port, remotionRoot, concurrency, logLevel, indent, }) => {
|
|
18
18
|
const downloadMap = (0, download_map_1.makeDownloadMap)();
|
|
19
|
-
logger_1.Log.verboseAdvanced({ indent, logLevel
|
|
19
|
+
logger_1.Log.verboseAdvanced({ indent, logLevel }, 'Created directory for temporary files', downloadMap.assetDir);
|
|
20
20
|
if ((0, is_serve_url_1.isServeUrl)(webpackConfigOrServeUrl)) {
|
|
21
21
|
const { port: offthreadPort, close: closeProxy, compositor: comp, events, } = await (0, serve_static_1.serveStatic)(null, {
|
|
22
22
|
port,
|
|
23
23
|
downloadMap,
|
|
24
24
|
remotionRoot,
|
|
25
25
|
concurrency,
|
|
26
|
-
|
|
26
|
+
logLevel,
|
|
27
27
|
indent,
|
|
28
28
|
});
|
|
29
29
|
return Promise.resolve({
|
|
@@ -51,7 +51,7 @@ const prepareServer = async ({ webpackConfigOrServeUrl, port, remotionRoot, conc
|
|
|
51
51
|
downloadMap,
|
|
52
52
|
remotionRoot,
|
|
53
53
|
concurrency,
|
|
54
|
-
|
|
54
|
+
logLevel,
|
|
55
55
|
indent,
|
|
56
56
|
});
|
|
57
57
|
return Promise.resolve({
|
|
@@ -4,6 +4,7 @@ import type { VideoImageFormat } from './image-format';
|
|
|
4
4
|
import type { CancelSignal } from './make-cancel-signal';
|
|
5
5
|
import type { PixelFormat } from './pixel-format';
|
|
6
6
|
import type { ProResProfile } from './prores-profile';
|
|
7
|
+
import type { LogLevel } from './log-level';
|
|
7
8
|
type RunningStatus = {
|
|
8
9
|
type: 'running';
|
|
9
10
|
} | {
|
|
@@ -24,7 +25,7 @@ type PreStitcherOptions = {
|
|
|
24
25
|
crf: number | null | undefined;
|
|
25
26
|
onProgress: (progress: number) => void;
|
|
26
27
|
proResProfile: ProResProfile | undefined;
|
|
27
|
-
|
|
28
|
+
logLevel: LogLevel;
|
|
28
29
|
imageFormat: VideoImageFormat;
|
|
29
30
|
ffmpegOverride: FfmpegOverrideFn;
|
|
30
31
|
signal: CancelSignal;
|
package/dist/prespawn-ffmpeg.js
CHANGED
|
@@ -29,34 +29,6 @@ const prespawnFfmpeg = (options) => {
|
|
|
29
29
|
if (encoderName === null) {
|
|
30
30
|
throw new TypeError('encoderName is null: ' + JSON.stringify(options));
|
|
31
31
|
}
|
|
32
|
-
const supportsCrf = codec !== 'prores';
|
|
33
|
-
logger_1.Log.verboseAdvanced({
|
|
34
|
-
indent: options.indent,
|
|
35
|
-
logLevel: options.verbose ? 'verbose' : 'info',
|
|
36
|
-
tag: 'prespawnFfmpeg()',
|
|
37
|
-
}, 'encoder', encoderName);
|
|
38
|
-
logger_1.Log.verboseAdvanced({
|
|
39
|
-
indent: options.indent,
|
|
40
|
-
logLevel: options.verbose ? 'verbose' : 'info',
|
|
41
|
-
tag: 'prespawnFfmpeg()',
|
|
42
|
-
}, 'pixelFormat', pixelFormat);
|
|
43
|
-
if (supportsCrf) {
|
|
44
|
-
logger_1.Log.verboseAdvanced({
|
|
45
|
-
indent: options.indent,
|
|
46
|
-
logLevel: options.verbose ? 'verbose' : 'info',
|
|
47
|
-
tag: 'prespawnFfmpeg()',
|
|
48
|
-
}, 'pixelFormat', options.crf);
|
|
49
|
-
}
|
|
50
|
-
logger_1.Log.verboseAdvanced({
|
|
51
|
-
indent: options.indent,
|
|
52
|
-
logLevel: options.verbose ? 'verbose' : 'info',
|
|
53
|
-
tag: 'prespawnFfmpeg()',
|
|
54
|
-
}, 'codec', codec);
|
|
55
|
-
logger_1.Log.verboseAdvanced({
|
|
56
|
-
indent: options.indent,
|
|
57
|
-
logLevel: options.verbose ? 'verbose' : 'info',
|
|
58
|
-
tag: 'prespawnFfmpeg()',
|
|
59
|
-
}, 'proResProfileName', proResProfileName);
|
|
60
32
|
(0, pixel_format_1.validateSelectedPixelFormatAndCodecCombination)(pixelFormat, codec);
|
|
61
33
|
const ffmpegArgs = [
|
|
62
34
|
['-r', options.fps.toFixed(2)],
|
|
@@ -86,12 +58,12 @@ const prespawnFfmpeg = (options) => {
|
|
|
86
58
|
];
|
|
87
59
|
logger_1.Log.verboseAdvanced({
|
|
88
60
|
indent: options.indent,
|
|
89
|
-
logLevel: options.
|
|
61
|
+
logLevel: options.logLevel,
|
|
90
62
|
tag: 'prespawnFfmpeg()',
|
|
91
63
|
}, 'Generated FFMPEG command:');
|
|
92
64
|
logger_1.Log.verboseAdvanced({
|
|
93
65
|
indent: options.indent,
|
|
94
|
-
logLevel: options.
|
|
66
|
+
logLevel: options.logLevel,
|
|
95
67
|
tag: 'prespawnFfmpeg()',
|
|
96
68
|
}, ffmpegArgs.join(' '));
|
|
97
69
|
const ffmpegString = ffmpegArgs.flat(2).filter(Boolean);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const validateQuality: (q: number | undefined) => void;
|
package/dist/quality.js
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.validateQuality = void 0;
|
|
4
|
+
const validateQuality = (q) => {
|
|
5
|
+
if (typeof q !== 'undefined' && typeof q !== 'number') {
|
|
6
|
+
throw new Error(`Quality option must be a number or undefined. Got ${typeof q} (${JSON.stringify(q)})`);
|
|
7
|
+
}
|
|
8
|
+
if (typeof q === 'undefined') {
|
|
9
|
+
return;
|
|
10
|
+
}
|
|
11
|
+
if (!Number.isFinite(q)) {
|
|
12
|
+
throw new RangeError(`Quality must be a finite number, but is ${q}`);
|
|
13
|
+
}
|
|
14
|
+
if (Number.isNaN(q)) {
|
|
15
|
+
throw new RangeError(`Quality is NaN, but must be a real number`);
|
|
16
|
+
}
|
|
17
|
+
if (q > 100 || q < 0) {
|
|
18
|
+
throw new RangeError('Quality option must be between 0 and 100.');
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
exports.validateQuality = validateQuality;
|
package/dist/render-frames.d.ts
CHANGED
|
@@ -10,6 +10,7 @@ import type { CancelSignal } from './make-cancel-signal';
|
|
|
10
10
|
import type { ChromiumOptions } from './open-browser';
|
|
11
11
|
import type { RemotionServer } from './prepare-server';
|
|
12
12
|
import type { OnStartData, RenderFramesOutput } from './types';
|
|
13
|
+
import { type LogLevel } from './log-level';
|
|
13
14
|
export type InternalRenderFramesOptions = {
|
|
14
15
|
onStart: null | ((data: OnStartData) => void);
|
|
15
16
|
onFrameUpdate: null | ((framesRendered: number, frameIndex: number, timeToRenderInMilliseconds: number) => void);
|
|
@@ -20,7 +21,6 @@ export type InternalRenderFramesOptions = {
|
|
|
20
21
|
jpegQuality: number;
|
|
21
22
|
frameRange: FrameRange | null;
|
|
22
23
|
everyNthFrame: number;
|
|
23
|
-
dumpBrowserLogs: boolean;
|
|
24
24
|
puppeteerInstance: HeadlessBrowser | undefined;
|
|
25
25
|
browserExecutable: BrowserExecutable | null;
|
|
26
26
|
onBrowserLog: null | ((log: BrowserLog) => void);
|
|
@@ -37,7 +37,7 @@ export type InternalRenderFramesOptions = {
|
|
|
37
37
|
muted: boolean;
|
|
38
38
|
concurrency: number | string | null;
|
|
39
39
|
webpackBundleOrServeUrl: string;
|
|
40
|
-
|
|
40
|
+
logLevel: LogLevel;
|
|
41
41
|
};
|
|
42
42
|
export type RenderFramesOptions = {
|
|
43
43
|
onStart: (data: OnStartData) => void;
|
|
@@ -53,7 +53,15 @@ export type RenderFramesOptions = {
|
|
|
53
53
|
jpegQuality?: number;
|
|
54
54
|
frameRange?: FrameRange | null;
|
|
55
55
|
everyNthFrame?: number;
|
|
56
|
+
/**
|
|
57
|
+
* @deprecated Use "logLevel": "verbose" instead
|
|
58
|
+
*/
|
|
56
59
|
dumpBrowserLogs?: boolean;
|
|
60
|
+
/**
|
|
61
|
+
* @deprecated Use "logLevel" instead
|
|
62
|
+
*/
|
|
63
|
+
verbose?: boolean;
|
|
64
|
+
logLevel?: LogLevel;
|
|
57
65
|
puppeteerInstance?: HeadlessBrowser;
|
|
58
66
|
browserExecutable?: BrowserExecutable;
|
|
59
67
|
onBrowserLog?: (log: BrowserLog) => void;
|
|
@@ -68,9 +76,8 @@ export type RenderFramesOptions = {
|
|
|
68
76
|
muted?: boolean;
|
|
69
77
|
concurrency?: number | string | null;
|
|
70
78
|
serveUrl: string;
|
|
71
|
-
verbose?: boolean;
|
|
72
79
|
};
|
|
73
|
-
export declare const internalRenderFrames: ({ browserExecutable, cancelSignal, chromiumOptions, composition, concurrency,
|
|
80
|
+
export declare const internalRenderFrames: ({ browserExecutable, cancelSignal, chromiumOptions, composition, concurrency, envVariables, everyNthFrame, frameRange, imageFormat, indent, inputProps, jpegQuality, muted, onBrowserLog, onDownload, onFrameBuffer, onFrameUpdate, onStart, outputDir, port, puppeteerInstance, scale, server, timeoutInMilliseconds, logLevel, webpackBundleOrServeUrl, }: InternalRenderFramesOptions) => Promise<RenderFramesOutput>;
|
|
74
81
|
/**
|
|
75
82
|
* @description Renders a series of images using Puppeteer and computes information for mixing audio.
|
|
76
83
|
* @see [Documentation](https://www.remotion.dev/docs/renderer/render-frames)
|