@remotion/renderer 4.0.0-alpha5 → 4.0.0-alpha7
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/download-and-map-assets-to-file.js +6 -6
- package/dist/assets/download-file.d.ts +3 -2
- package/dist/assets/download-file.js +18 -3
- package/dist/assets/download-map.js +7 -7
- package/dist/assets/read-file.d.ts +1 -1
- package/dist/assets/read-file.js +2 -2
- package/dist/assets/sanitize-filepath.js +2 -2
- package/dist/browser/BrowserFetcher.js +13 -13
- package/dist/browser/BrowserRunner.d.ts +1 -1
- package/dist/browser/BrowserRunner.js +9 -22
- package/dist/browser/LaunchOptions.d.ts +1 -2
- package/dist/browser/Launcher.js +7 -15
- package/dist/browser/NodeWebSocketTransport.js +4 -4
- package/dist/browser/get-download-destination.js +8 -8
- package/dist/call-ffmpeg.js +8 -3
- package/dist/chalk/index.d.ts +54 -0
- package/dist/chalk/index.js +135 -0
- package/dist/chalk/is-color-supported.d.ts +1 -0
- package/dist/chalk/is-color-supported.js +37 -0
- package/dist/client.d.ts +41 -41
- package/dist/combine-videos.js +6 -6
- package/dist/compositor/compose.js +12 -7
- package/dist/compositor/compositor.d.ts +2 -2
- package/dist/compositor/compositor.js +13 -8
- package/dist/compositor/get-executable-path.js +1 -10
- package/dist/create-ffmpeg-complex-filter.d.ts +1 -4
- package/dist/delete-directory.js +3 -3
- package/dist/does-have-m2-bug.js +2 -2
- package/dist/ensure-output-directory.js +5 -5
- package/dist/ffmpeg-filter-file.js +7 -7
- package/dist/find-closest-package-json.js +6 -6
- package/dist/get-compositions.d.ts +4 -0
- package/dist/get-compositions.js +2 -1
- package/dist/get-concurrency.js +3 -3
- package/dist/get-extension-from-codec.d.ts +2 -2
- package/dist/get-extension-of-filename.js +2 -2
- package/dist/get-local-browser-executable.js +4 -4
- package/dist/get-video-threads-flag.js +3 -3
- package/dist/index.d.ts +111 -36
- package/dist/index.js +9 -0
- package/dist/logger.d.ts +22 -0
- package/dist/logger.js +61 -0
- package/dist/merge-audio-track.js +2 -2
- package/dist/mime-types.js +2 -2
- package/dist/offthread-video-server.d.ts +3 -2
- package/dist/offthread-video-server.js +4 -4
- package/dist/open-browser.d.ts +1 -1
- package/dist/open-browser.js +1 -1
- package/dist/options/jpeg-quality.js +1 -1
- package/dist/prepare-server.d.ts +2 -1
- package/dist/prepare-server.js +7 -5
- package/dist/prespawn-ffmpeg.d.ts +1 -0
- package/dist/prespawn-ffmpeg.js +37 -14
- package/dist/prestitcher-memory-usage.js +2 -2
- package/dist/provide-screenshot.d.ts +1 -0
- package/dist/puppeteer-screenshot.d.ts +1 -0
- package/dist/puppeteer-screenshot.js +1 -1
- package/dist/render-frames.d.ts +4 -0
- package/dist/render-frames.js +9 -7
- package/dist/render-media.d.ts +4 -1
- package/dist/render-media.js +47 -26
- package/dist/render-still.d.ts +6 -0
- package/dist/render-still.js +20 -7
- package/dist/resolve-asset-src.js +2 -2
- package/dist/screenshot-dom-element.d.ts +1 -0
- package/dist/screenshot-task.d.ts +1 -0
- package/dist/screenshot-task.js +2 -2
- package/dist/serve-handler/index.d.ts +1 -1
- package/dist/serve-handler/index.js +15 -15
- package/dist/serve-handler/is-path-inside.js +3 -3
- package/dist/serve-static.d.ts +1 -0
- package/dist/serve-static.js +3 -2
- package/dist/stitch-frames-to-video.d.ts +2 -0
- package/dist/stitch-frames-to-video.js +62 -39
- package/dist/take-frame-and-compose.d.ts +1 -0
- package/dist/take-frame-and-compose.js +6 -6
- package/dist/tmp-dir.js +7 -7
- package/dist/validate-output-filename.d.ts +1 -1
- package/install-toolchain.mjs +2 -2
- package/package.json +9 -9
- package/types/ws/index.d.ts +5 -5
- package/dist/assets/get-video-stream-duration.d.ts +0 -9
- package/dist/assets/get-video-stream-duration.js +0 -71
- package/dist/calculate-sar-dar-pixels.d.ts +0 -9
- package/dist/calculate-sar-dar-pixels.js +0 -19
- package/dist/determine-resize-params.d.ts +0 -1
- package/dist/determine-resize-params.js +0 -10
- package/dist/determine-vcodec-ffmpeg-flags.d.ts +0 -2
- package/dist/determine-vcodec-ffmpeg-flags.js +0 -13
- package/dist/ensure-ffmpeg.d.ts +0 -18
- package/dist/ensure-ffmpeg.js +0 -58
- package/dist/ensure-presentation-timestamp.d.ts +0 -15
- package/dist/ensure-presentation-timestamp.js +0 -88
- package/dist/extract-frame-from-video.d.ts +0 -17
- package/dist/extract-frame-from-video.js +0 -191
- package/dist/ffmpeg-executable.d.ts +0 -1
- package/dist/ffmpeg-executable.js +0 -2
- package/dist/ffmpeg-flags.d.ts +0 -31
- package/dist/ffmpeg-flags.js +0 -245
- package/dist/frame-to-ffmpeg-timestamp.d.ts +0 -1
- package/dist/frame-to-ffmpeg-timestamp.js +0 -8
- package/dist/get-can-extract-frames-fast.d.ts +0 -14
- package/dist/get-can-extract-frames-fast.js +0 -71
- package/dist/get-frame-of-video-slow.d.ts +0 -15
- package/dist/get-frame-of-video-slow.js +0 -72
- package/dist/get-video-info.d.ts +0 -8
- package/dist/get-video-info.js +0 -59
- package/dist/is-beyond-last-frame.d.ts +0 -3
- package/dist/is-beyond-last-frame.js +0 -12
- package/dist/last-frame-from-video-cache.d.ts +0 -18
- package/dist/last-frame-from-video-cache.js +0 -55
- package/dist/legacy-webpack-config.d.ts +0 -9
- package/dist/legacy-webpack-config.js +0 -13
- package/dist/quality.d.ts +0 -1
- package/dist/quality.js +0 -21
- package/dist/try-to-extract-frame-of-video-fast.d.ts +0 -13
- package/dist/try-to-extract-frame-of-video-fast.js +0 -55
- package/dist/validate-ffmpeg.d.ts +0 -7
- package/dist/validate-ffmpeg.js +0 -77
- package/dist/warn-about-ffmpeg-version.d.ts +0 -5
- package/dist/warn-about-ffmpeg-version.js +0 -37
|
@@ -19,6 +19,7 @@ declare type PreStitcherOptions = {
|
|
|
19
19
|
ffmpegOverride: FfmpegOverrideFn;
|
|
20
20
|
signal: CancelSignal;
|
|
21
21
|
videoBitrate: string | null;
|
|
22
|
+
indent: boolean;
|
|
22
23
|
};
|
|
23
24
|
export declare const prespawnFfmpeg: (options: PreStitcherOptions) => {
|
|
24
25
|
task: import("execa").ExecaChildProcess<string>;
|
package/dist/prespawn-ffmpeg.js
CHANGED
|
@@ -4,10 +4,10 @@ exports.prespawnFfmpeg = void 0;
|
|
|
4
4
|
const remotion_1 = require("remotion");
|
|
5
5
|
const call_ffmpeg_1 = require("./call-ffmpeg");
|
|
6
6
|
const codec_1 = require("./codec");
|
|
7
|
-
const get_executable_path_1 = require("./compositor/get-executable-path");
|
|
8
7
|
const crf_1 = require("./crf");
|
|
9
8
|
const get_codec_name_1 = require("./get-codec-name");
|
|
10
9
|
const get_prores_profile_name_1 = require("./get-prores-profile-name");
|
|
10
|
+
const logger_1 = require("./logger");
|
|
11
11
|
const parse_ffmpeg_progress_1 = require("./parse-ffmpeg-progress");
|
|
12
12
|
const pixel_format_1 = require("./pixel-format");
|
|
13
13
|
const validate_even_dimensions_with_codec_1 = require("./validate-even-dimensions-with-codec");
|
|
@@ -30,16 +30,33 @@ const prespawnFfmpeg = (options) => {
|
|
|
30
30
|
throw new TypeError('encoderName is null: ' + JSON.stringify(options));
|
|
31
31
|
}
|
|
32
32
|
const supportsCrf = codec !== 'prores';
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
33
|
+
logger_1.Log.verboseAdvanced({
|
|
34
|
+
indent: options.indent,
|
|
35
|
+
logLevel: options.verbose ? 'verbose' : 'info',
|
|
36
|
+
tag: 'encoder',
|
|
37
|
+
}, 'encoder', encoderName);
|
|
38
|
+
logger_1.Log.verboseAdvanced({
|
|
39
|
+
indent: options.indent,
|
|
40
|
+
logLevel: options.verbose ? 'verbose' : 'info',
|
|
41
|
+
tag: 'encoder',
|
|
42
|
+
}, 'pixelFormat', pixelFormat);
|
|
43
|
+
if (supportsCrf) {
|
|
44
|
+
logger_1.Log.verboseAdvanced({
|
|
45
|
+
indent: options.indent,
|
|
46
|
+
logLevel: options.verbose ? 'verbose' : 'info',
|
|
47
|
+
tag: 'encoder',
|
|
48
|
+
}, 'pixelFormat', options.crf);
|
|
42
49
|
}
|
|
50
|
+
logger_1.Log.verboseAdvanced({
|
|
51
|
+
indent: options.indent,
|
|
52
|
+
logLevel: options.verbose ? 'verbose' : 'info',
|
|
53
|
+
tag: 'encoder',
|
|
54
|
+
}, 'codec', codec);
|
|
55
|
+
logger_1.Log.verboseAdvanced({
|
|
56
|
+
indent: options.indent,
|
|
57
|
+
logLevel: options.verbose ? 'verbose' : 'info',
|
|
58
|
+
tag: 'encoder',
|
|
59
|
+
}, 'proResProfileName', proResProfileName);
|
|
43
60
|
(0, pixel_format_1.validateSelectedPixelFormatAndCodecCombination)(pixelFormat, codec);
|
|
44
61
|
const ffmpegArgs = [
|
|
45
62
|
['-r', options.fps.toFixed(2)],
|
|
@@ -67,10 +84,16 @@ const prespawnFfmpeg = (options) => {
|
|
|
67
84
|
'-y',
|
|
68
85
|
options.outputLocation,
|
|
69
86
|
];
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
87
|
+
logger_1.Log.verboseAdvanced({
|
|
88
|
+
indent: options.indent,
|
|
89
|
+
logLevel: options.verbose ? 'verbose' : 'info',
|
|
90
|
+
tag: 'encoder',
|
|
91
|
+
}, 'Generated FFMPEG command:');
|
|
92
|
+
logger_1.Log.verboseAdvanced({
|
|
93
|
+
indent: options.indent,
|
|
94
|
+
logLevel: options.verbose ? 'verbose' : 'info',
|
|
95
|
+
tag: 'encoder',
|
|
96
|
+
}, ffmpegArgs.join(' '));
|
|
74
97
|
const ffmpegString = ffmpegArgs.flat(2).filter(Boolean);
|
|
75
98
|
const finalFfmpegString = options.ffmpegOverride
|
|
76
99
|
? options.ffmpegOverride({ type: 'pre-stitcher', args: ffmpegString })
|
|
@@ -4,7 +4,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.shouldUseParallelEncoding = void 0;
|
|
7
|
-
const
|
|
7
|
+
const node_os_1 = __importDefault(require("node:os"));
|
|
8
8
|
const estimateMemoryUsageForPrestitcher = ({ width, height, }) => {
|
|
9
9
|
// Empirically we detected that per 1 million pixels, FFMPEG uses around 1GB of memory, relatively independent of
|
|
10
10
|
// the duration of the video.
|
|
@@ -13,7 +13,7 @@ const estimateMemoryUsageForPrestitcher = ({ width, height, }) => {
|
|
|
13
13
|
return memoryUsageOfPixel * width * height;
|
|
14
14
|
};
|
|
15
15
|
const shouldUseParallelEncoding = ({ width, height, }) => {
|
|
16
|
-
const freeMemory =
|
|
16
|
+
const freeMemory = node_os_1.default.freemem();
|
|
17
17
|
const estimatedUsage = estimateMemoryUsageForPrestitcher({
|
|
18
18
|
height,
|
|
19
19
|
width,
|
|
@@ -24,7 +24,7 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|
|
24
24
|
};
|
|
25
25
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
26
|
exports.screenshot = void 0;
|
|
27
|
-
const assert = __importStar(require("assert"));
|
|
27
|
+
const assert = __importStar(require("node:assert"));
|
|
28
28
|
const screenshot_task_1 = require("./screenshot-task");
|
|
29
29
|
const screenshot = (options) => {
|
|
30
30
|
if (options.jpegQuality) {
|
package/dist/render-frames.d.ts
CHANGED
|
@@ -40,6 +40,10 @@ declare type RenderFramesOptions = {
|
|
|
40
40
|
* @deprecated Only for Remotion internal usage
|
|
41
41
|
*/
|
|
42
42
|
downloadMap?: DownloadMap;
|
|
43
|
+
/**
|
|
44
|
+
* @deprecated Only for Remotion internal usage
|
|
45
|
+
*/
|
|
46
|
+
indent?: boolean;
|
|
43
47
|
muted?: boolean;
|
|
44
48
|
concurrency?: number | string | null;
|
|
45
49
|
serveUrl: string;
|
package/dist/render-frames.js
CHANGED
|
@@ -4,8 +4,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.renderFrames = void 0;
|
|
7
|
-
const
|
|
8
|
-
const
|
|
7
|
+
const node_fs_1 = __importDefault(require("node:fs"));
|
|
8
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
9
9
|
const perf_hooks_1 = require("perf_hooks");
|
|
10
10
|
const remotion_1 = require("remotion");
|
|
11
11
|
const download_and_map_assets_to_file_1 = require("./assets/download-and-map-assets-to-file");
|
|
@@ -37,8 +37,8 @@ const validate_scale_1 = require("./validate-scale");
|
|
|
37
37
|
const MAX_RETRIES_PER_FRAME = 1;
|
|
38
38
|
const innerRenderFrames = ({ onFrameUpdate, outputDir, onStart, inputProps, jpegQuality, quality, imageFormat = image_format_1.DEFAULT_VIDEO_IMAGE_FORMAT, frameRange, onError, envVariables, onBrowserLog, onFrameBuffer, onDownload, pagesArray, serveUrl, composition, timeoutInMilliseconds, scale = 1, actualConcurrency, everyNthFrame = 1, proxyPort, cancelSignal, downloadMap, muted, makeBrowser, browserReplacer, }) => {
|
|
39
39
|
if (outputDir) {
|
|
40
|
-
if (!
|
|
41
|
-
|
|
40
|
+
if (!node_fs_1.default.existsSync(outputDir)) {
|
|
41
|
+
node_fs_1.default.mkdirSync(outputDir, {
|
|
42
42
|
recursive: true,
|
|
43
43
|
});
|
|
44
44
|
}
|
|
@@ -162,7 +162,7 @@ const innerRenderFrames = ({ onFrameUpdate, outputDir, onStart, inputProps, jpeg
|
|
|
162
162
|
freePage,
|
|
163
163
|
height,
|
|
164
164
|
imageFormat,
|
|
165
|
-
output:
|
|
165
|
+
output: node_path_1.default.join(frameDir, (0, get_frame_padded_index_1.getFrameOutputFileName)({
|
|
166
166
|
frame,
|
|
167
167
|
imageFormat,
|
|
168
168
|
index,
|
|
@@ -300,12 +300,13 @@ const renderFrames = (options) => {
|
|
|
300
300
|
(0, jpeg_quality_1.validateJpegQuality)(options.jpegQuality);
|
|
301
301
|
(0, validate_scale_1.validateScale)(options.scale);
|
|
302
302
|
const makeBrowser = () => {
|
|
303
|
-
var _a;
|
|
303
|
+
var _a, _b;
|
|
304
304
|
return (0, open_browser_1.openBrowser)(browser_1.DEFAULT_BROWSER, {
|
|
305
305
|
shouldDumpIo: options.dumpBrowserLogs,
|
|
306
306
|
browserExecutable: options.browserExecutable,
|
|
307
307
|
chromiumOptions: options.chromiumOptions,
|
|
308
308
|
forceDeviceScaleFactor: (_a = options.scale) !== null && _a !== void 0 ? _a : 1,
|
|
309
|
+
indent: (_b = options.indent) !== null && _b !== void 0 ? _b : false,
|
|
309
310
|
});
|
|
310
311
|
};
|
|
311
312
|
const browserInstance = (_a = options.puppeteerInstance) !== null && _a !== void 0 ? _a : makeBrowser();
|
|
@@ -314,7 +315,7 @@ const renderFrames = (options) => {
|
|
|
314
315
|
const actualConcurrency = (0, get_concurrency_1.getActualConcurrency)(concurrency !== null && concurrency !== void 0 ? concurrency : null);
|
|
315
316
|
const openedPages = [];
|
|
316
317
|
return new Promise((resolve, reject) => {
|
|
317
|
-
var _a, _b;
|
|
318
|
+
var _a, _b, _c;
|
|
318
319
|
const cleanup = [];
|
|
319
320
|
if (!options.downloadMap) {
|
|
320
321
|
cleanup.push(() => (0, download_map_1.cleanDownloadMap)(downloadMap));
|
|
@@ -339,6 +340,7 @@ const renderFrames = (options) => {
|
|
|
339
340
|
remotionRoot: (0, find_closest_package_json_1.findRemotionRoot)(),
|
|
340
341
|
concurrency: actualConcurrency,
|
|
341
342
|
verbose: (_b = options.verbose) !== null && _b !== void 0 ? _b : false,
|
|
343
|
+
indent: (_c = options.indent) !== null && _c !== void 0 ? _c : false,
|
|
342
344
|
}),
|
|
343
345
|
browserInstance,
|
|
344
346
|
]).then(([{ serveUrl, closeServer, offthreadPort }, puppeteerInstance]) => {
|
package/dist/render-media.d.ts
CHANGED
|
@@ -69,6 +69,10 @@ export declare type RenderMediaOptions = {
|
|
|
69
69
|
* @deprecated Only for Remotion internal usage
|
|
70
70
|
*/
|
|
71
71
|
onCtrlCExit?: (fn: () => void) => void;
|
|
72
|
+
/**
|
|
73
|
+
* @deprecated Only for Remotion internal usage
|
|
74
|
+
*/
|
|
75
|
+
indent?: boolean;
|
|
72
76
|
};
|
|
73
77
|
preferLossless?: boolean;
|
|
74
78
|
muted?: boolean;
|
|
@@ -77,7 +81,6 @@ export declare type RenderMediaOptions = {
|
|
|
77
81
|
audioBitrate?: string | null;
|
|
78
82
|
videoBitrate?: string | null;
|
|
79
83
|
disallowParallelEncoding?: boolean;
|
|
80
|
-
printLog?: (...data: unknown[]) => void;
|
|
81
84
|
audioCodec?: AudioCodec | null;
|
|
82
85
|
serveUrl: string;
|
|
83
86
|
concurrency?: number | string | null;
|
package/dist/render-media.js
CHANGED
|
@@ -4,9 +4,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.renderMedia = void 0;
|
|
7
|
-
const
|
|
8
|
-
const
|
|
9
|
-
const
|
|
7
|
+
const node_fs_1 = __importDefault(require("node:fs"));
|
|
8
|
+
const node_os_1 = __importDefault(require("node:os"));
|
|
9
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
10
10
|
const remotion_1 = require("remotion");
|
|
11
11
|
const download_map_1 = require("./assets/download-map");
|
|
12
12
|
const can_use_parallel_encoding_1 = require("./can-use-parallel-encoding");
|
|
@@ -22,6 +22,7 @@ const get_frame_to_render_1 = require("./get-frame-to-render");
|
|
|
22
22
|
const image_format_1 = require("./image-format");
|
|
23
23
|
const is_audio_codec_1 = require("./is-audio-codec");
|
|
24
24
|
const jpeg_quality_1 = require("./jpeg-quality");
|
|
25
|
+
const logger_1 = require("./logger");
|
|
25
26
|
const make_cancel_signal_1 = require("./make-cancel-signal");
|
|
26
27
|
const overwrite_1 = require("./overwrite");
|
|
27
28
|
const perf_1 = require("./perf");
|
|
@@ -45,7 +46,7 @@ const SLOWEST_FRAME_COUNT = 10;
|
|
|
45
46
|
* @see [Documentation](https://www.remotion.dev/docs/renderer/render-media)
|
|
46
47
|
*/
|
|
47
48
|
const renderMedia = ({ proResProfile, crf, composition, inputProps, pixelFormat, codec, envVariables, frameRange, puppeteerInstance, outputLocation, onProgress, overwrite, onDownload, dumpBrowserLogs, onBrowserLog, onStart, timeoutInMilliseconds, chromiumOptions, scale, browserExecutable, port, cancelSignal, muted, enforceAudioTrack, ffmpegOverride, audioBitrate, videoBitrate, audioCodec, ...options }) => {
|
|
48
|
-
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
49
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s;
|
|
49
50
|
if (options.quality) {
|
|
50
51
|
throw new Error(`The "quality" option has been renamed. Please use "jpegQuality" instead.`);
|
|
51
52
|
}
|
|
@@ -67,7 +68,7 @@ const renderMedia = ({ proResProfile, crf, composition, inputProps, pixelFormat,
|
|
|
67
68
|
});
|
|
68
69
|
}
|
|
69
70
|
const absoluteOutputLocation = outputLocation
|
|
70
|
-
?
|
|
71
|
+
? node_path_1.default.resolve(process.cwd(), outputLocation)
|
|
71
72
|
: null;
|
|
72
73
|
(0, validate_scale_1.validateScale)(scale);
|
|
73
74
|
(0, validate_ffmpeg_override_1.validateFfmpegOverride)(ffmpegOverride);
|
|
@@ -92,30 +93,47 @@ const renderMedia = ({ proResProfile, crf, composition, inputProps, pixelFormat,
|
|
|
92
93
|
const parallelEncoding = !options.disallowParallelEncoding &&
|
|
93
94
|
hasEnoughMemory &&
|
|
94
95
|
(0, can_use_parallel_encoding_1.canUseParallelEncoding)(codec);
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
96
|
+
logger_1.Log.verboseAdvanced({
|
|
97
|
+
indent: (_g = (_f = options.internal) === null || _f === void 0 ? void 0 : _f.indent) !== null && _g !== void 0 ? _g : false,
|
|
98
|
+
logLevel: options.verbose ? 'verbose' : 'info',
|
|
99
|
+
tag: 'PARALLEL ENCODING',
|
|
100
|
+
}, 'Free memory:', freeMemory, 'Estimated usage parallel encoding', estimatedUsage);
|
|
101
|
+
logger_1.Log.verboseAdvanced({
|
|
102
|
+
indent: (_j = (_h = options.internal) === null || _h === void 0 ? void 0 : _h.indent) !== null && _j !== void 0 ? _j : false,
|
|
103
|
+
logLevel: options.verbose ? 'verbose' : 'info',
|
|
104
|
+
tag: 'PARALLEL ENCODING',
|
|
105
|
+
}, 'Codec supports parallel rendering:', (0, can_use_parallel_encoding_1.canUseParallelEncoding)(codec));
|
|
106
|
+
logger_1.Log.verboseAdvanced({
|
|
107
|
+
indent: (_l = (_k = options.internal) === null || _k === void 0 ? void 0 : _k.indent) !== null && _l !== void 0 ? _l : false,
|
|
108
|
+
logLevel: options.verbose ? 'verbose' : 'info',
|
|
109
|
+
tag: 'PARALLEL ENCODING',
|
|
110
|
+
}, 'User disallowed parallel encoding:', Boolean(options.disallowParallelEncoding));
|
|
111
|
+
if (parallelEncoding) {
|
|
112
|
+
logger_1.Log.verboseAdvanced({
|
|
113
|
+
indent: (_o = (_m = options.internal) === null || _m === void 0 ? void 0 : _m.indent) !== null && _o !== void 0 ? _o : false,
|
|
114
|
+
logLevel: options.verbose ? 'verbose' : 'info',
|
|
115
|
+
tag: 'PARALLEL ENCODING',
|
|
116
|
+
}, 'Parallel encoding is enabled.');
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
logger_1.Log.verboseAdvanced({
|
|
120
|
+
indent: (_q = (_p = options.internal) === null || _p === void 0 ? void 0 : _p.indent) !== null && _q !== void 0 ? _q : false,
|
|
121
|
+
logLevel: options.verbose ? 'verbose' : 'info',
|
|
122
|
+
tag: 'PARALLEL ENCODING',
|
|
123
|
+
}, 'Parallel encoding is disabled.');
|
|
106
124
|
}
|
|
107
125
|
const imageFormat = (0, is_audio_codec_1.isAudioCodec)(codec)
|
|
108
126
|
? 'none'
|
|
109
|
-
: (
|
|
127
|
+
: (_r = options.imageFormat) !== null && _r !== void 0 ? _r : 'jpeg';
|
|
110
128
|
const jpegQuality = imageFormat === 'jpeg' ? options.jpegQuality : undefined;
|
|
111
129
|
(0, image_format_1.validateSelectedPixelFormatAndImageFormatCombination)(pixelFormat, imageFormat);
|
|
112
130
|
const preEncodedFileLocation = parallelEncoding
|
|
113
|
-
?
|
|
131
|
+
? node_path_1.default.join(downloadMap.preEncode, 'pre-encode.' + (0, get_extension_from_codec_1.getFileExtensionFromCodec)(codec, audioCodec !== null && audioCodec !== void 0 ? audioCodec : null))
|
|
114
132
|
: null;
|
|
115
133
|
const outputDir = parallelEncoding
|
|
116
134
|
? null
|
|
117
|
-
:
|
|
118
|
-
if (((
|
|
135
|
+
: node_fs_1.default.mkdtempSync(node_path_1.default.join(node_os_1.default.tmpdir(), 'react-motion-render'));
|
|
136
|
+
if (((_s = options.internal) === null || _s === void 0 ? void 0 : _s.onCtrlCExit) && outputDir) {
|
|
119
137
|
options.internal.onCtrlCExit(() => (0, delete_directory_1.deleteDirectory)(outputDir));
|
|
120
138
|
}
|
|
121
139
|
(0, validate_even_dimensions_with_codec_1.validateEvenDimensionsWithCodec)({
|
|
@@ -147,7 +165,7 @@ const renderMedia = ({ proResProfile, crf, composition, inputProps, pixelFormat,
|
|
|
147
165
|
const fps = composition.fps / (everyNthFrame !== null && everyNthFrame !== void 0 ? everyNthFrame : 1);
|
|
148
166
|
remotion_1.Internals.validateFps(fps, 'in "renderMedia()"', codec === 'gif');
|
|
149
167
|
const createPrestitcherIfNecessary = () => {
|
|
150
|
-
var _a;
|
|
168
|
+
var _a, _b, _c;
|
|
151
169
|
if (preEncodedFileLocation) {
|
|
152
170
|
preStitcher = (0, prespawn_ffmpeg_1.prespawnFfmpeg)({
|
|
153
171
|
width: composition.width * (scale !== null && scale !== void 0 ? scale : 1),
|
|
@@ -167,6 +185,7 @@ const renderMedia = ({ proResProfile, crf, composition, inputProps, pixelFormat,
|
|
|
167
185
|
signal: cancelPrestitcher.cancelSignal,
|
|
168
186
|
ffmpegOverride: ffmpegOverride !== null && ffmpegOverride !== void 0 ? ffmpegOverride : (({ args }) => args),
|
|
169
187
|
videoBitrate: videoBitrate !== null && videoBitrate !== void 0 ? videoBitrate : null,
|
|
188
|
+
indent: (_c = (_b = options.internal) === null || _b === void 0 ? void 0 : _b.indent) !== null && _c !== void 0 ? _c : false,
|
|
170
189
|
});
|
|
171
190
|
stitcherFfmpeg = preStitcher.task;
|
|
172
191
|
}
|
|
@@ -212,7 +231,7 @@ const renderMedia = ({ proResProfile, crf, composition, inputProps, pixelFormat,
|
|
|
212
231
|
};
|
|
213
232
|
const happyPath = Promise.resolve(createPrestitcherIfNecessary())
|
|
214
233
|
.then(() => {
|
|
215
|
-
var _a;
|
|
234
|
+
var _a, _b, _c;
|
|
216
235
|
const renderFramesProc = (0, render_frames_1.renderFrames)({
|
|
217
236
|
composition,
|
|
218
237
|
onFrameUpdate: (frame, frameIndex, timeToRenderInMilliseconds) => {
|
|
@@ -260,6 +279,7 @@ const renderMedia = ({ proResProfile, crf, composition, inputProps, pixelFormat,
|
|
|
260
279
|
downloadMap,
|
|
261
280
|
muted: disableAudio,
|
|
262
281
|
verbose: (_a = options.verbose) !== null && _a !== void 0 ? _a : false,
|
|
282
|
+
indent: (_c = (_b = options.internal) === null || _b === void 0 ? void 0 : _b.indent) !== null && _c !== void 0 ? _c : false,
|
|
263
283
|
});
|
|
264
284
|
return renderFramesProc;
|
|
265
285
|
})
|
|
@@ -267,7 +287,7 @@ const renderMedia = ({ proResProfile, crf, composition, inputProps, pixelFormat,
|
|
|
267
287
|
return Promise.all([renderFramesReturn, waitForPrestitcherIfNecessary()]);
|
|
268
288
|
})
|
|
269
289
|
.then(([{ assetsInfo }]) => {
|
|
270
|
-
var _a;
|
|
290
|
+
var _a, _b, _c;
|
|
271
291
|
renderedDoneIn = Date.now() - renderStart;
|
|
272
292
|
callUpdate();
|
|
273
293
|
if (absoluteOutputLocation) {
|
|
@@ -307,6 +327,7 @@ const renderMedia = ({ proResProfile, crf, composition, inputProps, pixelFormat,
|
|
|
307
327
|
audioBitrate,
|
|
308
328
|
videoBitrate,
|
|
309
329
|
audioCodec: audioCodec !== null && audioCodec !== void 0 ? audioCodec : null,
|
|
330
|
+
indent: (_c = (_b = options.internal) === null || _b === void 0 ? void 0 : _b.indent) !== null && _c !== void 0 ? _c : false,
|
|
310
331
|
}),
|
|
311
332
|
stitchStart,
|
|
312
333
|
]);
|
|
@@ -348,15 +369,15 @@ const renderMedia = ({ proResProfile, crf, composition, inputProps, pixelFormat,
|
|
|
348
369
|
.finally(() => {
|
|
349
370
|
var _a;
|
|
350
371
|
if (preEncodedFileLocation !== null &&
|
|
351
|
-
|
|
352
|
-
(0, delete_directory_1.deleteDirectory)(
|
|
372
|
+
node_fs_1.default.existsSync(preEncodedFileLocation)) {
|
|
373
|
+
(0, delete_directory_1.deleteDirectory)(node_path_1.default.dirname(preEncodedFileLocation));
|
|
353
374
|
}
|
|
354
375
|
// Clean download map if it was not passed in
|
|
355
376
|
if (!((_a = options.internal) === null || _a === void 0 ? void 0 : _a.downloadMap)) {
|
|
356
377
|
(0, download_map_1.cleanDownloadMap)(downloadMap);
|
|
357
378
|
}
|
|
358
379
|
// Clean temporary image frames when rendering ends or fails
|
|
359
|
-
if (outputDir &&
|
|
380
|
+
if (outputDir && node_fs_1.default.existsSync(outputDir)) {
|
|
360
381
|
(0, delete_directory_1.deleteDirectory)(outputDir);
|
|
361
382
|
}
|
|
362
383
|
});
|
package/dist/render-still.d.ts
CHANGED
|
@@ -3,6 +3,7 @@ import type { AnySmallCompMetadata } from 'remotion';
|
|
|
3
3
|
import type { RenderMediaOnDownload } from './assets/download-and-map-assets-to-file';
|
|
4
4
|
import type { DownloadMap } from './assets/download-map';
|
|
5
5
|
import type { BrowserExecutable } from './browser-executable';
|
|
6
|
+
import type { BrowserLog } from './browser-log';
|
|
6
7
|
import type { Browser as PuppeteerBrowser } from './browser/Browser';
|
|
7
8
|
import type { StillImageFormat } from './image-format';
|
|
8
9
|
import type { CancelSignal } from './make-cancel-signal';
|
|
@@ -23,6 +24,7 @@ declare type InnerStillOptions = {
|
|
|
23
24
|
envVariables?: Record<string, string>;
|
|
24
25
|
overwrite?: boolean;
|
|
25
26
|
browserExecutable?: BrowserExecutable;
|
|
27
|
+
onBrowserLog?: (log: BrowserLog) => void;
|
|
26
28
|
timeoutInMilliseconds?: number;
|
|
27
29
|
chromiumOptions?: ChromiumOptions;
|
|
28
30
|
scale?: number;
|
|
@@ -32,6 +34,10 @@ declare type InnerStillOptions = {
|
|
|
32
34
|
* @deprecated Only for Remotion internal usage
|
|
33
35
|
*/
|
|
34
36
|
downloadMap?: DownloadMap;
|
|
37
|
+
/**
|
|
38
|
+
* @deprecated Only for Remotion internal usage
|
|
39
|
+
*/
|
|
40
|
+
indent?: boolean;
|
|
35
41
|
verbose?: boolean;
|
|
36
42
|
};
|
|
37
43
|
declare type RenderStillReturnValue = {
|
package/dist/render-still.js
CHANGED
|
@@ -27,8 +27,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
27
27
|
};
|
|
28
28
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
29
|
exports.renderStill = void 0;
|
|
30
|
-
const
|
|
31
|
-
const
|
|
30
|
+
const node_fs_1 = __importStar(require("node:fs"));
|
|
31
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
32
32
|
const remotion_1 = require("remotion");
|
|
33
33
|
const download_map_1 = require("./assets/download-map");
|
|
34
34
|
const browser_1 = require("./browser");
|
|
@@ -47,7 +47,7 @@ const set_props_and_env_1 = require("./set-props-and-env");
|
|
|
47
47
|
const take_frame_and_compose_1 = require("./take-frame-and-compose");
|
|
48
48
|
const validate_puppeteer_timeout_1 = require("./validate-puppeteer-timeout");
|
|
49
49
|
const validate_scale_1 = require("./validate-scale");
|
|
50
|
-
const innerRenderStill = async ({ composition, quality, imageFormat = image_format_1.DEFAULT_STILL_IMAGE_FORMAT, serveUrl, puppeteerInstance, dumpBrowserLogs = false, onError, inputProps, envVariables, output, frame = 0, overwrite = true, browserExecutable, timeoutInMilliseconds, chromiumOptions, scale = 1, proxyPort, cancelSignal, downloadMap, jpegQuality, }) => {
|
|
50
|
+
const innerRenderStill = async ({ composition, quality, imageFormat = image_format_1.DEFAULT_STILL_IMAGE_FORMAT, serveUrl, puppeteerInstance, dumpBrowserLogs = false, onError, inputProps, envVariables, output, frame = 0, overwrite = true, browserExecutable, timeoutInMilliseconds, chromiumOptions, scale = 1, proxyPort, cancelSignal, downloadMap, jpegQuality, onBrowserLog, }) => {
|
|
51
51
|
if (quality) {
|
|
52
52
|
throw new Error('quality has been renamed to jpegQuality. Please rename the option.');
|
|
53
53
|
}
|
|
@@ -72,17 +72,17 @@ const innerRenderStill = async ({ composition, quality, imageFormat = image_form
|
|
|
72
72
|
(0, validate_puppeteer_timeout_1.validatePuppeteerTimeout)(timeoutInMilliseconds);
|
|
73
73
|
(0, validate_scale_1.validateScale)(scale);
|
|
74
74
|
output =
|
|
75
|
-
typeof output === 'string' ?
|
|
75
|
+
typeof output === 'string' ? node_path_1.default.resolve(process.cwd(), output) : null;
|
|
76
76
|
if (jpegQuality !== undefined && imageFormat !== 'jpeg') {
|
|
77
77
|
throw new Error("You can only pass the `quality` option if `imageFormat` is 'jpeg'.");
|
|
78
78
|
}
|
|
79
79
|
(0, jpeg_quality_1.validateJpegQuality)(jpegQuality);
|
|
80
80
|
if (output) {
|
|
81
|
-
if (
|
|
81
|
+
if (node_fs_1.default.existsSync(output)) {
|
|
82
82
|
if (!overwrite) {
|
|
83
83
|
throw new Error(`Cannot render still - "overwrite" option was set to false, but the output destination ${output} already exists.`);
|
|
84
84
|
}
|
|
85
|
-
const stat = (0,
|
|
85
|
+
const stat = (0, node_fs_1.statSync)(output);
|
|
86
86
|
if (!stat.isFile()) {
|
|
87
87
|
throw new Error(`The output location ${output} already exists, but is not a file, but something else (e.g. folder). Cannot save to it.`);
|
|
88
88
|
}
|
|
@@ -94,6 +94,7 @@ const innerRenderStill = async ({ composition, quality, imageFormat = image_form
|
|
|
94
94
|
shouldDumpIo: dumpBrowserLogs,
|
|
95
95
|
chromiumOptions,
|
|
96
96
|
forceDeviceScaleFactor: scale !== null && scale !== void 0 ? scale : 1,
|
|
97
|
+
indent: false,
|
|
97
98
|
}));
|
|
98
99
|
const page = await browserInstance.newPage();
|
|
99
100
|
await page.setViewport({
|
|
@@ -110,8 +111,16 @@ const innerRenderStill = async ({ composition, quality, imageFormat = image_form
|
|
|
110
111
|
onError: errorCallback,
|
|
111
112
|
frame: null,
|
|
112
113
|
});
|
|
114
|
+
const logCallback = (log) => {
|
|
115
|
+
onBrowserLog === null || onBrowserLog === void 0 ? void 0 : onBrowserLog({
|
|
116
|
+
stackTrace: log.stackTrace(),
|
|
117
|
+
text: log.text,
|
|
118
|
+
type: log.type,
|
|
119
|
+
});
|
|
120
|
+
};
|
|
113
121
|
const cleanup = async () => {
|
|
114
122
|
cleanUpJSException();
|
|
123
|
+
page.off('console', logCallback);
|
|
115
124
|
if (puppeteerInstance) {
|
|
116
125
|
await page.close();
|
|
117
126
|
}
|
|
@@ -124,6 +133,9 @@ const innerRenderStill = async ({ composition, quality, imageFormat = image_form
|
|
|
124
133
|
cancelSignal === null || cancelSignal === void 0 ? void 0 : cancelSignal(() => {
|
|
125
134
|
cleanup();
|
|
126
135
|
});
|
|
136
|
+
if (onBrowserLog) {
|
|
137
|
+
page.on('console', logCallback);
|
|
138
|
+
}
|
|
127
139
|
await (0, set_props_and_env_1.setPropsAndEnv)({
|
|
128
140
|
inputProps,
|
|
129
141
|
envVariables,
|
|
@@ -186,7 +198,7 @@ const renderStill = (options) => {
|
|
|
186
198
|
const downloadMap = (_a = options.downloadMap) !== null && _a !== void 0 ? _a : (0, download_map_1.makeDownloadMap)();
|
|
187
199
|
const onDownload = (_b = options.onDownload) !== null && _b !== void 0 ? _b : (() => () => undefined);
|
|
188
200
|
const happyPath = new Promise((resolve, reject) => {
|
|
189
|
-
var _a, _b;
|
|
201
|
+
var _a, _b, _c;
|
|
190
202
|
const onError = (err) => reject(err);
|
|
191
203
|
let close = null;
|
|
192
204
|
(0, prepare_server_1.prepareServer)({
|
|
@@ -198,6 +210,7 @@ const renderStill = (options) => {
|
|
|
198
210
|
remotionRoot: (0, find_closest_package_json_1.findRemotionRoot)(),
|
|
199
211
|
concurrency: 1,
|
|
200
212
|
verbose: (_b = options.verbose) !== null && _b !== void 0 ? _b : false,
|
|
213
|
+
indent: (_c = options.indent) !== null && _c !== void 0 ? _c : false,
|
|
201
214
|
})
|
|
202
215
|
.then(({ serveUrl, closeServer, offthreadPort }) => {
|
|
203
216
|
close = closeServer;
|
|
@@ -4,14 +4,14 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.resolveAssetSrc = void 0;
|
|
7
|
-
const
|
|
7
|
+
const node_url_1 = __importDefault(require("node:url"));
|
|
8
8
|
const resolveAssetSrc = (src) => {
|
|
9
9
|
if (!src.startsWith('file:')) {
|
|
10
10
|
return src;
|
|
11
11
|
}
|
|
12
12
|
const { protocol } = new URL(src);
|
|
13
13
|
if (protocol === 'file:')
|
|
14
|
-
return
|
|
14
|
+
return node_url_1.default.fileURLToPath(src);
|
|
15
15
|
throw new TypeError(`Unexpected src ${src}`);
|
|
16
16
|
};
|
|
17
17
|
exports.resolveAssetSrc = resolveAssetSrc;
|
package/dist/screenshot-task.js
CHANGED
|
@@ -4,7 +4,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.screenshotTask = void 0;
|
|
7
|
-
const
|
|
7
|
+
const node_fs_1 = __importDefault(require("node:fs"));
|
|
8
8
|
const perf_1 = require("./perf");
|
|
9
9
|
const screenshotTask = async ({ format, height, omitBackground, page, width, path, jpegQuality, clipRegion, }) => {
|
|
10
10
|
var _a;
|
|
@@ -64,7 +64,7 @@ const screenshotTask = async ({ format, height, omitBackground, page, width, pat
|
|
|
64
64
|
const saveMarker = (0, perf_1.startPerfMeasure)('save');
|
|
65
65
|
const buffer = Buffer.from(result.data, 'base64');
|
|
66
66
|
if (path)
|
|
67
|
-
await
|
|
67
|
+
await node_fs_1.default.promises.writeFile(path, buffer);
|
|
68
68
|
(0, perf_1.stopPerfMeasure)(saveMarker);
|
|
69
69
|
return buffer;
|
|
70
70
|
}
|