@remotion/renderer 4.0.0-oops.3 → 4.0.0-prefetch.11
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/calculate-asset-positions.d.ts +2 -2
- package/dist/assets/convert-assets-to-file-urls.d.ts +5 -4
- package/dist/assets/convert-assets-to-file-urls.js +2 -2
- package/dist/assets/download-and-map-assets-to-file.d.ts +16 -6
- package/dist/assets/download-and-map-assets-to-file.js +152 -45
- package/dist/assets/download-file.d.ts +10 -5
- package/dist/assets/download-file.js +20 -5
- package/dist/assets/download-map.d.ts +64 -0
- package/dist/assets/download-map.js +73 -0
- package/dist/assets/ffmpeg-volume-expression.d.ts +3 -3
- package/dist/assets/ffmpeg-volume-expression.js +16 -14
- package/dist/assets/flatten-volume-array.d.ts +1 -1
- package/dist/assets/get-audio-channels.d.ts +3 -4
- package/dist/assets/get-audio-channels.js +14 -4
- package/dist/assets/get-video-stream-duration.d.ts +4 -0
- package/dist/assets/get-video-stream-duration.js +59 -0
- package/dist/assets/read-file.js +4 -1
- package/dist/assets/types.d.ts +1 -1
- package/dist/browser/Browser.d.ts +60 -0
- package/dist/browser/Browser.js +218 -0
- package/dist/browser/BrowserConnector.d.ts +19 -0
- package/dist/browser/BrowserConnector.js +17 -0
- package/dist/browser/BrowserFetcher.d.ts +89 -0
- package/dist/browser/BrowserFetcher.js +510 -0
- package/dist/browser/BrowserPage.d.ts +74 -0
- package/dist/browser/BrowserPage.js +283 -0
- package/dist/browser/BrowserRunner.d.ts +39 -0
- package/dist/browser/BrowserRunner.js +308 -0
- package/dist/browser/Connection.d.ts +42 -0
- package/dist/browser/Connection.js +242 -0
- package/dist/browser/ConsoleMessage.d.ts +31 -0
- package/dist/browser/ConsoleMessage.js +48 -0
- package/dist/browser/DOMWorld.d.ts +52 -0
- package/dist/browser/DOMWorld.js +272 -0
- package/dist/browser/Errors.d.ts +25 -0
- package/dist/browser/Errors.js +35 -0
- package/dist/browser/EvalTypes.d.ts +27 -0
- package/dist/browser/EvalTypes.js +17 -0
- package/dist/browser/EventEmitter.d.ts +23 -0
- package/dist/browser/EventEmitter.js +53 -0
- package/dist/browser/ExecutionContext.d.ts +34 -0
- package/dist/browser/ExecutionContext.js +174 -0
- package/dist/browser/FrameManager.d.ts +93 -0
- package/dist/browser/FrameManager.js +496 -0
- package/dist/browser/HTTPRequest.d.ts +28 -0
- package/dist/browser/HTTPRequest.js +37 -0
- package/dist/browser/HTTPResponse.d.ts +21 -0
- package/dist/browser/HTTPResponse.js +41 -0
- package/dist/browser/JSHandle.d.ts +35 -0
- package/dist/browser/JSHandle.js +90 -0
- package/dist/browser/LaunchOptions.d.ts +37 -0
- package/dist/browser/LaunchOptions.js +17 -0
- package/dist/browser/Launcher.d.ts +9 -0
- package/dist/browser/Launcher.js +504 -0
- package/dist/browser/LifecycleWatcher.d.ts +29 -0
- package/dist/browser/LifecycleWatcher.js +180 -0
- package/dist/browser/NetworkEventManager.d.ts +33 -0
- package/dist/browser/NetworkEventManager.js +81 -0
- package/dist/browser/NetworkManager.d.ts +34 -0
- package/dist/browser/NetworkManager.js +231 -0
- package/dist/browser/NodeWebSocketTransport.d.ts +17 -0
- package/dist/browser/NodeWebSocketTransport.js +87 -0
- package/dist/browser/Product.d.ts +16 -0
- package/dist/browser/Product.js +17 -0
- package/dist/browser/PuppeteerNode.d.ts +40 -0
- package/dist/browser/PuppeteerNode.js +81 -0
- package/dist/browser/PuppeteerViewport.d.ts +5 -0
- package/dist/browser/PuppeteerViewport.js +2 -0
- package/dist/browser/ScreenshotOptions.d.ts +14 -0
- package/dist/browser/ScreenshotOptions.js +2 -0
- package/dist/browser/Target.d.ts +61 -0
- package/dist/browser/Target.js +146 -0
- package/dist/browser/TaskQueue.d.ts +20 -0
- package/dist/browser/TaskQueue.js +47 -0
- package/dist/browser/TimeoutSettings.d.ts +24 -0
- package/dist/browser/TimeoutSettings.js +62 -0
- package/dist/browser/assert.d.ts +1 -0
- package/dist/browser/assert.js +9 -0
- package/dist/browser/create-browser-fetcher.d.ts +17 -0
- package/dist/browser/create-browser-fetcher.js +119 -0
- package/dist/browser/devtools-commands.d.ts +270 -0
- package/dist/browser/devtools-commands.js +2 -0
- package/dist/browser/devtools-types.d.ts +1122 -0
- package/dist/browser/devtools-types.js +2 -0
- package/dist/browser/get-download-destination.d.ts +1 -0
- package/dist/browser/get-download-destination.js +38 -0
- package/dist/browser/mitt/index.d.ts +22 -0
- package/dist/browser/mitt/index.js +49 -0
- package/dist/browser/node.d.ts +2 -0
- package/dist/browser/node.js +9 -0
- package/dist/browser/revisions.d.ts +21 -0
- package/dist/browser/revisions.js +22 -0
- package/dist/browser/util.d.ts +47 -0
- package/dist/browser/util.js +169 -0
- package/dist/browser-executable.d.ts +1 -0
- package/dist/browser-executable.js +2 -0
- package/dist/browser-log.d.ts +1 -1
- package/dist/browser.d.ts +2 -0
- package/dist/browser.js +4 -0
- package/dist/calculate-ffmpeg-filters.d.ts +1 -1
- package/dist/calculate-ffmpeg-filters.js +2 -2
- package/dist/calculate-sar-dar-pixels.d.ts +9 -0
- package/dist/calculate-sar-dar-pixels.js +19 -0
- package/dist/can-use-parallel-encoding.d.ts +1 -1
- package/dist/can-use-parallel-encoding.js +2 -2
- package/dist/codec-supports-media.d.ts +8 -0
- package/dist/codec-supports-media.js +56 -0
- package/dist/codec.d.ts +4 -0
- package/dist/codec.js +16 -0
- package/dist/combine-videos.d.ts +4 -2
- package/dist/combine-videos.js +19 -5
- package/dist/compress-assets.d.ts +7 -0
- package/dist/compress-assets.js +25 -0
- package/dist/convert-number-of-gif-loops-to-ffmpeg.d.ts +1 -0
- package/dist/convert-number-of-gif-loops-to-ffmpeg.js +17 -0
- package/dist/convert-to-pcm.d.ts +1 -1
- package/dist/create-ffmpeg-complex-filter.d.ts +2 -1
- package/dist/create-ffmpeg-complex-filter.js +2 -11
- package/dist/create-ffmpeg-merge-filter.js +3 -3
- package/dist/create-silent-audio.d.ts +1 -1
- package/dist/crf.d.ts +5 -0
- package/dist/crf.js +64 -0
- package/dist/cycle-browser-tabs.d.ts +3 -2
- package/dist/cycle-browser-tabs.js +14 -2
- package/dist/delay-render-embedded-stack.d.ts +1 -1
- package/dist/ensure-frames-in-order.d.ts +1 -1
- package/dist/ensure-frames-in-order.js +3 -2
- package/dist/ensure-presentation-timestamp.d.ts +2 -0
- package/dist/ensure-presentation-timestamp.js +69 -0
- package/dist/error-handling/handle-javascript-exception.d.ts +2 -2
- package/dist/error-handling/handle-javascript-exception.js +3 -4
- package/dist/error-handling/symbolicate-error.d.ts +1 -1
- package/dist/error-handling/symbolicateable-error.d.ts +1 -1
- package/dist/extract-frame-from-video.d.ts +16 -0
- package/dist/extract-frame-from-video.js +277 -0
- package/dist/ffmpeg-executable.d.ts +1 -0
- package/dist/ffmpeg-executable.js +2 -0
- package/dist/ffmpeg-filter-file.d.ts +2 -1
- package/dist/ffmpeg-filter-file.js +4 -6
- package/dist/frame-range.d.ts +2 -0
- package/dist/frame-range.js +49 -0
- package/dist/frame-to-ffmpeg-timestamp.d.ts +1 -0
- package/dist/frame-to-ffmpeg-timestamp.js +8 -0
- package/dist/get-audio-codec-name.d.ts +1 -1
- package/dist/get-audio-codec-name.js +2 -2
- package/dist/get-browser-instance.d.ts +4 -3
- package/dist/get-browser-instance.js +2 -2
- package/dist/get-codec-name.d.ts +1 -1
- package/dist/get-codec-name.js +5 -2
- package/dist/get-compositions.d.ts +15 -5
- package/dist/get-compositions.js +35 -11
- package/dist/get-duration-from-frame-range.d.ts +1 -2
- package/dist/get-duration-from-frame-range.js +13 -9
- package/dist/get-extension-from-codec.d.ts +2 -2
- package/dist/get-extension-from-codec.js +5 -0
- package/dist/get-extension-of-filename.d.ts +1 -1
- package/dist/get-extension-of-filename.js +3 -0
- package/dist/get-frame-padded-index.d.ts +14 -0
- package/dist/get-frame-padded-index.js +33 -0
- package/dist/get-frame-to-render.d.ts +1 -1
- package/dist/get-local-browser-executable.d.ts +2 -1
- package/dist/get-local-browser-executable.js +7 -5
- package/dist/get-port.js +30 -37
- package/dist/get-prores-profile-name.d.ts +2 -1
- package/dist/get-video-info.d.ts +3 -0
- package/dist/get-video-info.js +49 -0
- package/dist/get-video-threads-flag.d.ts +1 -0
- package/dist/get-video-threads-flag.js +18 -0
- package/dist/guess-extension-for-media.d.ts +1 -0
- package/dist/guess-extension-for-media.js +27 -0
- package/dist/image-format.d.ts +6 -1
- package/dist/image-format.js +25 -1
- package/dist/index.d.ts +95 -20
- package/dist/index.js +93 -6
- package/dist/is-audio-codec.d.ts +2 -0
- package/dist/is-audio-codec.js +7 -0
- 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/log-level.d.ts +4 -0
- package/dist/log-level.js +15 -0
- package/dist/make-cancel-signal.d.ts +7 -0
- package/dist/make-cancel-signal.js +25 -0
- package/dist/merge-audio-track.d.ts +3 -1
- package/dist/merge-audio-track.js +14 -8
- package/dist/mime-db.d.ts +6 -0
- package/dist/mime-db.js +8636 -0
- package/dist/mime-types.d.ts +3 -0
- package/dist/mime-types.js +94 -0
- package/dist/offthread-video-server.d.ts +17 -0
- package/dist/offthread-video-server.js +86 -0
- package/dist/open-browser.d.ts +10 -7
- package/dist/open-browser.js +63 -20
- package/dist/overwrite.d.ts +1 -0
- package/dist/overwrite.js +4 -0
- package/dist/perf.d.ts +5 -0
- package/dist/perf.js +35 -0
- package/dist/pixel-format.d.ts +5 -0
- package/dist/pixel-format.js +26 -0
- package/dist/prepare-server.d.ts +14 -2
- package/dist/prepare-server.js +38 -5
- package/dist/preprocess-audio-track.d.ts +5 -2
- package/dist/preprocess-audio-track.js +3 -3
- package/dist/prespawn-ffmpeg.d.ts +7 -1
- package/dist/prespawn-ffmpeg.js +20 -16
- package/dist/prestitcher-memory-usage.d.ts +12 -0
- package/dist/prestitcher-memory-usage.js +30 -0
- package/dist/prores-profile.d.ts +5 -0
- package/dist/prores-profile.js +23 -0
- package/dist/provide-screenshot.d.ts +4 -4
- package/dist/provide-screenshot.js +1 -2
- package/dist/puppeteer-evaluate.d.ts +1 -1
- package/dist/puppeteer-evaluate.js +3 -4
- package/dist/puppeteer-screenshot.d.ts +3 -2
- package/dist/puppeteer-screenshot.js +7 -5
- package/dist/quality.d.ts +1 -0
- package/dist/quality.js +21 -0
- package/dist/render-frames.d.ts +24 -8
- package/dist/render-frames.js +153 -65
- package/dist/render-media.d.ts +36 -9
- package/dist/render-media.js +194 -70
- package/dist/render-still.d.ts +25 -7
- package/dist/render-still.js +91 -26
- package/dist/screenshot-dom-element.d.ts +6 -7
- package/dist/screenshot-dom-element.js +3 -6
- package/dist/screenshot-task.d.ts +3 -2
- package/dist/screenshot-task.js +36 -23
- package/dist/seek-to-frame.d.ts +2 -2
- package/dist/seek-to-frame.js +2 -2
- package/dist/serve-handler/index.d.ts +4 -0
- package/dist/serve-handler/index.js +204 -0
- package/dist/serve-handler/is-path-inside.d.ts +1 -0
- package/dist/serve-handler/is-path-inside.js +27 -0
- package/dist/serve-handler/range-parser.d.ts +13 -0
- package/dist/serve-handler/range-parser.js +57 -0
- package/dist/serve-static.d.ts +11 -3
- package/dist/serve-static.js +37 -7
- package/dist/set-props-and-env.d.ts +6 -2
- package/dist/set-props-and-env.js +65 -12
- package/dist/stitch-frames-to-video.d.ts +17 -5
- package/dist/stitch-frames-to-video.js +130 -46
- package/dist/stringify-ffmpeg-filter.d.ts +2 -2
- package/dist/stringify-ffmpeg-filter.js +12 -7
- package/dist/symbolicate-stacktrace.d.ts +1 -1
- package/dist/symbolicate-stacktrace.js +3 -3
- package/dist/tmp-dir.js +5 -1
- package/dist/truthy.d.ts +3 -0
- package/dist/truthy.js +7 -0
- package/dist/types.d.ts +1 -1
- package/dist/validate-concurrency.d.ts +1 -0
- package/dist/validate-concurrency.js +24 -0
- package/dist/validate-even-dimensions-with-codec.d.ts +1 -1
- package/dist/validate-even-dimensions-with-codec.js +2 -2
- package/dist/validate-every-nth-frame.d.ts +1 -0
- package/dist/validate-every-nth-frame.js +21 -0
- package/dist/validate-ffmpeg.js +2 -3
- package/dist/validate-frame.d.ts +1 -0
- package/dist/validate-frame.js +24 -0
- package/dist/validate-opengl-renderer.d.ts +5 -0
- package/dist/validate-opengl-renderer.js +15 -0
- package/dist/validate-output-filename.d.ts +1 -1
- package/dist/validate-output-filename.js +5 -0
- package/dist/wait-for-symbolication-error-to-be-done.d.ts +3 -0
- package/dist/wait-for-symbolication-error-to-be-done.js +34 -0
- package/dist/ws/ws-types.d.ts +14 -0
- package/dist/ws/ws-types.js +10 -0
- package/package.json +13 -16
- package/tsconfig.json +2 -2
- package/types/ws/index.d.ts +509 -0
- package/vitest.config.ts +8 -0
- package/dist/make-assets-download-dir.d.ts +0 -1
- package/dist/make-assets-download-dir.js +0 -8
package/dist/render-frames.js
CHANGED
|
@@ -8,21 +8,27 @@ const fs_1 = __importDefault(require("fs"));
|
|
|
8
8
|
const path_1 = __importDefault(require("path"));
|
|
9
9
|
const remotion_1 = require("remotion");
|
|
10
10
|
const download_and_map_assets_to_file_1 = require("./assets/download-and-map-assets-to-file");
|
|
11
|
+
const download_map_1 = require("./assets/download-map");
|
|
12
|
+
const browser_1 = require("./browser");
|
|
13
|
+
const compress_assets_1 = require("./compress-assets");
|
|
11
14
|
const cycle_browser_tabs_1 = require("./cycle-browser-tabs");
|
|
12
15
|
const handle_javascript_exception_1 = require("./error-handling/handle-javascript-exception");
|
|
13
16
|
const get_concurrency_1 = require("./get-concurrency");
|
|
14
17
|
const get_duration_from_frame_range_1 = require("./get-duration-from-frame-range");
|
|
18
|
+
const get_frame_padded_index_1 = require("./get-frame-padded-index");
|
|
15
19
|
const get_frame_to_render_1 = require("./get-frame-to-render");
|
|
16
20
|
const image_format_1 = require("./image-format");
|
|
17
21
|
const legacy_webpack_config_1 = require("./legacy-webpack-config");
|
|
18
|
-
const make_assets_download_dir_1 = require("./make-assets-download-dir");
|
|
19
22
|
const open_browser_1 = require("./open-browser");
|
|
23
|
+
const perf_1 = require("./perf");
|
|
20
24
|
const pool_1 = require("./pool");
|
|
21
25
|
const prepare_server_1 = require("./prepare-server");
|
|
22
26
|
const provide_screenshot_1 = require("./provide-screenshot");
|
|
23
27
|
const puppeteer_evaluate_1 = require("./puppeteer-evaluate");
|
|
28
|
+
const quality_1 = require("./quality");
|
|
24
29
|
const seek_to_frame_1 = require("./seek-to-frame");
|
|
25
30
|
const set_props_and_env_1 = require("./set-props-and-env");
|
|
31
|
+
const truthy_1 = require("./truthy");
|
|
26
32
|
const validate_scale_1 = require("./validate-scale");
|
|
27
33
|
const getComposition = (others) => {
|
|
28
34
|
if ('composition' in others) {
|
|
@@ -33,9 +39,14 @@ const getComposition = (others) => {
|
|
|
33
39
|
}
|
|
34
40
|
return undefined;
|
|
35
41
|
};
|
|
36
|
-
const
|
|
42
|
+
const getPool = async (pages) => {
|
|
43
|
+
const puppeteerPages = await Promise.all(pages);
|
|
44
|
+
const pool = new pool_1.Pool(puppeteerPages);
|
|
45
|
+
return pool;
|
|
46
|
+
};
|
|
47
|
+
const innerRenderFrames = ({ onFrameUpdate, outputDir, onStart, inputProps, quality, imageFormat = image_format_1.DEFAULT_IMAGE_FORMAT, frameRange, puppeteerInstance, onError, envVariables, onBrowserLog, onFrameBuffer, onDownload, pagesArray, serveUrl, composition, timeoutInMilliseconds, scale, actualParallelism, everyNthFrame = 1, proxyPort, cancelSignal, downloadMap, muted, }) => {
|
|
37
48
|
if (!puppeteerInstance) {
|
|
38
|
-
throw new Error('
|
|
49
|
+
throw new Error('no puppeteer instance passed to innerRenderFrames - internal error');
|
|
39
50
|
}
|
|
40
51
|
if (outputDir) {
|
|
41
52
|
if (!fs_1.default.existsSync(outputDir)) {
|
|
@@ -44,12 +55,14 @@ const innerRenderFrames = async ({ onFrameUpdate, outputDir, onStart, inputProps
|
|
|
44
55
|
});
|
|
45
56
|
}
|
|
46
57
|
}
|
|
58
|
+
const downloadPromises = [];
|
|
47
59
|
const realFrameRange = (0, get_frame_to_render_1.getRealFrameRange)(composition.durationInFrames, frameRange !== null && frameRange !== void 0 ? frameRange : null);
|
|
48
|
-
const
|
|
60
|
+
const framesToRender = (0, get_duration_from_frame_range_1.getFramesToRender)(realFrameRange, everyNthFrame);
|
|
61
|
+
const lastFrame = framesToRender[framesToRender.length - 1];
|
|
49
62
|
const pages = new Array(actualParallelism).fill(true).map(async () => {
|
|
50
63
|
const page = await puppeteerInstance.newPage();
|
|
51
64
|
pagesArray.push(page);
|
|
52
|
-
page.setViewport({
|
|
65
|
+
await page.setViewport({
|
|
53
66
|
width: composition.width,
|
|
54
67
|
height: composition.height,
|
|
55
68
|
deviceScaleFactor: scale !== null && scale !== void 0 ? scale : 1,
|
|
@@ -57,18 +70,14 @@ const innerRenderFrames = async ({ onFrameUpdate, outputDir, onStart, inputProps
|
|
|
57
70
|
const logCallback = (log) => {
|
|
58
71
|
onBrowserLog === null || onBrowserLog === void 0 ? void 0 : onBrowserLog({
|
|
59
72
|
stackTrace: log.stackTrace(),
|
|
60
|
-
text: log.text
|
|
61
|
-
type: log.type
|
|
73
|
+
text: log.text,
|
|
74
|
+
type: log.type,
|
|
62
75
|
});
|
|
63
76
|
};
|
|
64
77
|
if (onBrowserLog) {
|
|
65
78
|
page.on('console', logCallback);
|
|
66
79
|
}
|
|
67
|
-
const initialFrame =
|
|
68
|
-
? frameRange
|
|
69
|
-
: frameRange === null || frameRange === undefined
|
|
70
|
-
? 0
|
|
71
|
-
: frameRange[0];
|
|
80
|
+
const initialFrame = realFrameRange[0];
|
|
72
81
|
await (0, set_props_and_env_1.setPropsAndEnv)({
|
|
73
82
|
inputProps,
|
|
74
83
|
envVariables,
|
|
@@ -76,40 +85,62 @@ const innerRenderFrames = async ({ onFrameUpdate, outputDir, onStart, inputProps
|
|
|
76
85
|
serveUrl,
|
|
77
86
|
initialFrame,
|
|
78
87
|
timeoutInMilliseconds,
|
|
88
|
+
proxyPort,
|
|
89
|
+
retriesRemaining: 2,
|
|
90
|
+
audioEnabled: !muted,
|
|
91
|
+
videoEnabled: imageFormat !== 'none',
|
|
79
92
|
});
|
|
80
93
|
await (0, puppeteer_evaluate_1.puppeteerEvaluateWithCatch)({
|
|
81
|
-
|
|
94
|
+
// eslint-disable-next-line max-params
|
|
95
|
+
pageFunction: (id, defaultProps, durationInFrames, fps, height, width) => {
|
|
82
96
|
window.setBundleMode({
|
|
83
97
|
type: 'composition',
|
|
84
98
|
compositionName: id,
|
|
99
|
+
compositionDefaultProps: defaultProps,
|
|
100
|
+
compositionDurationInFrames: durationInFrames,
|
|
101
|
+
compositionFps: fps,
|
|
102
|
+
compositionHeight: height,
|
|
103
|
+
compositionWidth: width,
|
|
85
104
|
});
|
|
86
105
|
},
|
|
87
|
-
args: [
|
|
106
|
+
args: [
|
|
107
|
+
composition.id,
|
|
108
|
+
composition.defaultProps,
|
|
109
|
+
composition.durationInFrames,
|
|
110
|
+
composition.fps,
|
|
111
|
+
composition.height,
|
|
112
|
+
composition.width,
|
|
113
|
+
],
|
|
88
114
|
frame: null,
|
|
89
115
|
page,
|
|
90
116
|
});
|
|
91
117
|
page.off('console', logCallback);
|
|
92
118
|
return page;
|
|
93
119
|
});
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
const
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
120
|
+
// If rendering a GIF and skipping frames, we must ensure it starts from 0
|
|
121
|
+
// and then is consecutive so FFMPEG recognizes the sequence
|
|
122
|
+
const countType = everyNthFrame === 1 ? 'actual-frames' : 'from-zero';
|
|
123
|
+
const filePadLength = (0, get_frame_padded_index_1.getFilePadLength)({
|
|
124
|
+
lastFrame,
|
|
125
|
+
totalFrames: framesToRender.length,
|
|
126
|
+
countType,
|
|
127
|
+
});
|
|
100
128
|
let framesRendered = 0;
|
|
129
|
+
const poolPromise = getPool(pages);
|
|
101
130
|
onStart({
|
|
102
|
-
frameCount,
|
|
131
|
+
frameCount: framesToRender.length,
|
|
132
|
+
});
|
|
133
|
+
const assets = new Array(framesToRender.length).fill(undefined);
|
|
134
|
+
let stopped = false;
|
|
135
|
+
cancelSignal === null || cancelSignal === void 0 ? void 0 : cancelSignal(() => {
|
|
136
|
+
stopped = true;
|
|
103
137
|
});
|
|
104
|
-
const
|
|
105
|
-
|
|
106
|
-
await Promise.all(new Array(frameCount)
|
|
107
|
-
.fill(Boolean)
|
|
108
|
-
.map((x, i) => i)
|
|
109
|
-
.map(async (index) => {
|
|
110
|
-
const frame = realFrameRange[0] + index;
|
|
138
|
+
const progress = Promise.all(framesToRender.map(async (frame, index) => {
|
|
139
|
+
const pool = await poolPromise;
|
|
111
140
|
const freePage = await pool.acquire();
|
|
112
|
-
|
|
141
|
+
if (stopped) {
|
|
142
|
+
throw new Error('Render was stopped');
|
|
143
|
+
}
|
|
113
144
|
const errorCallbackOnFrame = (err) => {
|
|
114
145
|
onError(err);
|
|
115
146
|
};
|
|
@@ -122,22 +153,31 @@ const innerRenderFrames = async ({ onFrameUpdate, outputDir, onStart, inputProps
|
|
|
122
153
|
await (0, seek_to_frame_1.seekToFrame)({ frame, page: freePage });
|
|
123
154
|
if (imageFormat !== 'none') {
|
|
124
155
|
if (onFrameBuffer) {
|
|
156
|
+
const id = (0, perf_1.startPerfMeasure)('save');
|
|
125
157
|
const buffer = await (0, provide_screenshot_1.provideScreenshot)({
|
|
126
158
|
page: freePage,
|
|
127
159
|
imageFormat,
|
|
128
160
|
quality,
|
|
129
161
|
options: {
|
|
130
162
|
frame,
|
|
131
|
-
output:
|
|
163
|
+
output: null,
|
|
132
164
|
},
|
|
133
165
|
});
|
|
166
|
+
(0, perf_1.stopPerfMeasure)(id);
|
|
134
167
|
onFrameBuffer(buffer, frame);
|
|
135
168
|
}
|
|
136
169
|
else {
|
|
137
170
|
if (!outputDir) {
|
|
138
171
|
throw new Error('Called renderFrames() without specifying either `outputDir` or `onFrameBuffer`');
|
|
139
172
|
}
|
|
140
|
-
const output = path_1.default.join(outputDir,
|
|
173
|
+
const output = path_1.default.join(outputDir, (0, get_frame_padded_index_1.getFrameOutputFileName)({
|
|
174
|
+
frame,
|
|
175
|
+
imageFormat,
|
|
176
|
+
index,
|
|
177
|
+
countType,
|
|
178
|
+
lastFrame,
|
|
179
|
+
totalFrames: framesToRender.length,
|
|
180
|
+
}));
|
|
141
181
|
await (0, provide_screenshot_1.provideScreenshot)({
|
|
142
182
|
page: freePage,
|
|
143
183
|
imageFormat,
|
|
@@ -157,13 +197,13 @@ const innerRenderFrames = async ({ onFrameUpdate, outputDir, onStart, inputProps
|
|
|
157
197
|
frame,
|
|
158
198
|
page: freePage,
|
|
159
199
|
});
|
|
160
|
-
const compressedAssets = collectedAssets.map((asset) =>
|
|
200
|
+
const compressedAssets = collectedAssets.map((asset) => (0, compress_assets_1.compressAsset)(assets.filter(truthy_1.truthy).flat(1), asset));
|
|
161
201
|
assets[index] = compressedAssets;
|
|
162
202
|
compressedAssets.forEach((asset) => {
|
|
163
203
|
(0, download_and_map_assets_to_file_1.downloadAndMapAssetsToFileUrl)({
|
|
164
204
|
asset,
|
|
165
|
-
|
|
166
|
-
|
|
205
|
+
onDownload,
|
|
206
|
+
downloadMap,
|
|
167
207
|
}).catch((err) => {
|
|
168
208
|
onError(new Error(`Error while downloading asset: ${err.stack}`));
|
|
169
209
|
});
|
|
@@ -175,53 +215,95 @@ const innerRenderFrames = async ({ onFrameUpdate, outputDir, onStart, inputProps
|
|
|
175
215
|
freePage.off('error', errorCallbackOnFrame);
|
|
176
216
|
return compressedAssets;
|
|
177
217
|
}));
|
|
178
|
-
const
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
218
|
+
const happyPath = progress.then(() => {
|
|
219
|
+
const returnValue = {
|
|
220
|
+
assetsInfo: {
|
|
221
|
+
assets,
|
|
222
|
+
imageSequenceName: `element-%0${filePadLength}d.${imageFormat}`,
|
|
223
|
+
firstFrameIndex: framesToRender[0],
|
|
224
|
+
downloadMap,
|
|
225
|
+
},
|
|
226
|
+
frameCount: framesToRender.length,
|
|
227
|
+
};
|
|
228
|
+
return returnValue;
|
|
229
|
+
});
|
|
230
|
+
return happyPath
|
|
231
|
+
.then(() => {
|
|
232
|
+
return Promise.all(downloadPromises);
|
|
233
|
+
})
|
|
234
|
+
.then(() => happyPath);
|
|
188
235
|
};
|
|
189
|
-
const renderFrames =
|
|
190
|
-
var _a, _b;
|
|
236
|
+
const renderFrames = (options) => {
|
|
237
|
+
var _a, _b, _c, _d, _e;
|
|
191
238
|
const composition = getComposition(options);
|
|
192
239
|
if (!composition) {
|
|
193
240
|
throw new Error('No `composition` option has been specified for renderFrames()');
|
|
194
241
|
}
|
|
195
242
|
remotion_1.Internals.validateDimension(composition.height, 'height', 'in the `config` object passed to `renderFrames()`');
|
|
196
243
|
remotion_1.Internals.validateDimension(composition.width, 'width', 'in the `config` object passed to `renderFrames()`');
|
|
197
|
-
remotion_1.Internals.validateFps(composition.fps, 'in the `config` object of `renderFrames()`');
|
|
244
|
+
remotion_1.Internals.validateFps(composition.fps, 'in the `config` object of `renderFrames()`', false);
|
|
198
245
|
remotion_1.Internals.validateDurationInFrames(composition.durationInFrames, 'in the `config` object passed to `renderFrames()`');
|
|
199
246
|
if (options.quality !== undefined && options.imageFormat !== 'jpeg') {
|
|
200
247
|
throw new Error("You can only pass the `quality` option if `imageFormat` is 'jpeg'.");
|
|
201
248
|
}
|
|
202
249
|
const selectedServeUrl = (0, legacy_webpack_config_1.getServeUrlWithFallback)(options);
|
|
203
|
-
|
|
250
|
+
(0, quality_1.validateQuality)(options.quality);
|
|
204
251
|
(0, validate_scale_1.validateScale)(options.scale);
|
|
205
|
-
const
|
|
206
|
-
const browserInstance = (_a = options.puppeteerInstance) !== null && _a !== void 0 ? _a : (await (0, open_browser_1.openBrowser)(remotion_1.Internals.DEFAULT_BROWSER, {
|
|
252
|
+
const browserInstance = (_a = options.puppeteerInstance) !== null && _a !== void 0 ? _a : (0, open_browser_1.openBrowser)(browser_1.DEFAULT_BROWSER, {
|
|
207
253
|
shouldDumpIo: options.dumpBrowserLogs,
|
|
208
254
|
browserExecutable: options.browserExecutable,
|
|
209
255
|
chromiumOptions: options.chromiumOptions,
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
const
|
|
256
|
+
forceDeviceScaleFactor: (_b = options.scale) !== null && _b !== void 0 ? _b : 1,
|
|
257
|
+
});
|
|
258
|
+
const downloadMap = (_c = options.downloadMap) !== null && _c !== void 0 ? _c : (0, download_map_1.makeDownloadMap)();
|
|
259
|
+
const onDownload = (_d = options.onDownload) !== null && _d !== void 0 ? _d : (() => () => undefined);
|
|
260
|
+
const actualParallelism = (0, get_concurrency_1.getActualConcurrency)((_e = options.parallelism) !== null && _e !== void 0 ? _e : null);
|
|
213
261
|
const openedPages = [];
|
|
214
262
|
return new Promise((resolve, reject) => {
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
263
|
+
var _a, _b, _c;
|
|
264
|
+
const cleanup = [];
|
|
265
|
+
const onError = (err) => {
|
|
266
|
+
reject(err);
|
|
267
|
+
};
|
|
268
|
+
Promise.race([
|
|
269
|
+
new Promise((_, rej) => {
|
|
270
|
+
var _a;
|
|
271
|
+
(_a = options.cancelSignal) === null || _a === void 0 ? void 0 : _a.call(options, () => {
|
|
272
|
+
rej(new Error('renderFrames() got cancelled'));
|
|
273
|
+
});
|
|
274
|
+
}),
|
|
275
|
+
Promise.all([
|
|
276
|
+
(0, prepare_server_1.prepareServer)({
|
|
277
|
+
webpackConfigOrServeUrl: selectedServeUrl,
|
|
278
|
+
onDownload,
|
|
279
|
+
onError,
|
|
280
|
+
ffmpegExecutable: (_a = options.ffmpegExecutable) !== null && _a !== void 0 ? _a : null,
|
|
281
|
+
ffprobeExecutable: (_b = options.ffprobeExecutable) !== null && _b !== void 0 ? _b : null,
|
|
282
|
+
port: (_c = options.port) !== null && _c !== void 0 ? _c : null,
|
|
283
|
+
downloadMap,
|
|
284
|
+
}),
|
|
285
|
+
browserInstance,
|
|
286
|
+
]).then(([{ serveUrl, closeServer, offthreadPort }, puppeteerInstance]) => {
|
|
287
|
+
const { stopCycling } = (0, cycle_browser_tabs_1.cycleBrowserTabs)(puppeteerInstance, actualParallelism);
|
|
288
|
+
cleanup.push(stopCycling);
|
|
289
|
+
cleanup.push(closeServer);
|
|
290
|
+
return innerRenderFrames({
|
|
291
|
+
...options,
|
|
292
|
+
puppeteerInstance,
|
|
293
|
+
onError,
|
|
294
|
+
pagesArray: openedPages,
|
|
295
|
+
serveUrl,
|
|
296
|
+
composition,
|
|
297
|
+
actualParallelism,
|
|
298
|
+
onDownload,
|
|
299
|
+
proxyPort: offthreadPort,
|
|
300
|
+
downloadMap,
|
|
301
|
+
});
|
|
302
|
+
}),
|
|
303
|
+
])
|
|
304
|
+
.then((res) => {
|
|
305
|
+
return resolve(res);
|
|
223
306
|
})
|
|
224
|
-
.then((res) => resolve(res))
|
|
225
307
|
.catch((err) => reject(err))
|
|
226
308
|
.finally(() => {
|
|
227
309
|
// If browser instance was passed in, we close all the pages
|
|
@@ -233,12 +315,18 @@ const renderFrames = async (options) => {
|
|
|
233
315
|
});
|
|
234
316
|
}
|
|
235
317
|
else {
|
|
236
|
-
|
|
318
|
+
Promise.resolve(browserInstance)
|
|
319
|
+
.then((puppeteerInstance) => {
|
|
320
|
+
return puppeteerInstance.close();
|
|
321
|
+
})
|
|
322
|
+
.catch((err) => {
|
|
237
323
|
console.log('Unable to close browser', err);
|
|
238
324
|
});
|
|
239
325
|
}
|
|
240
|
-
|
|
241
|
-
|
|
326
|
+
cleanup.forEach((c) => {
|
|
327
|
+
c();
|
|
328
|
+
});
|
|
329
|
+
// Don't clear download dir because it might be used by stitchFramesToVideo
|
|
242
330
|
});
|
|
243
331
|
});
|
|
244
332
|
};
|
package/dist/render-media.d.ts
CHANGED
|
@@ -1,10 +1,19 @@
|
|
|
1
|
-
|
|
2
|
-
import {
|
|
3
|
-
import { RenderMediaOnDownload } from './assets/download-and-map-assets-to-file';
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import type { SmallTCompMetadata } from 'remotion';
|
|
3
|
+
import type { RenderMediaOnDownload } from './assets/download-and-map-assets-to-file';
|
|
4
|
+
import type { DownloadMap } from './assets/download-map';
|
|
5
|
+
import type { BrowserExecutable } from './browser-executable';
|
|
6
|
+
import type { BrowserLog } from './browser-log';
|
|
7
|
+
import type { Browser as PuppeteerBrowser } from './browser/Browser';
|
|
8
|
+
import type { Codec } from './codec';
|
|
9
|
+
import type { FfmpegExecutable } from './ffmpeg-executable';
|
|
10
|
+
import type { FrameRange } from './frame-range';
|
|
11
|
+
import type { ServeUrlOrWebpackBundle } from './legacy-webpack-config';
|
|
12
|
+
import type { CancelSignal } from './make-cancel-signal';
|
|
13
|
+
import type { ChromiumOptions } from './open-browser';
|
|
14
|
+
import type { PixelFormat } from './pixel-format';
|
|
15
|
+
import type { ProResProfile } from './prores-profile';
|
|
16
|
+
import type { OnStartData } from './types';
|
|
8
17
|
export declare type StitchingState = 'encoding' | 'muxing';
|
|
9
18
|
export declare type RenderMediaOnProgress = (progress: {
|
|
10
19
|
renderedFrames: number;
|
|
@@ -14,7 +23,7 @@ export declare type RenderMediaOnProgress = (progress: {
|
|
|
14
23
|
stitchStage: StitchingState;
|
|
15
24
|
}) => void;
|
|
16
25
|
export declare type RenderMediaOptions = {
|
|
17
|
-
outputLocation
|
|
26
|
+
outputLocation?: string | null;
|
|
18
27
|
codec: Codec;
|
|
19
28
|
composition: SmallTCompMetadata;
|
|
20
29
|
inputProps?: unknown;
|
|
@@ -22,10 +31,13 @@ export declare type RenderMediaOptions = {
|
|
|
22
31
|
crf?: number | null;
|
|
23
32
|
imageFormat?: 'png' | 'jpeg' | 'none';
|
|
24
33
|
ffmpegExecutable?: FfmpegExecutable;
|
|
34
|
+
ffprobeExecutable?: FfmpegExecutable;
|
|
25
35
|
pixelFormat?: PixelFormat;
|
|
26
36
|
envVariables?: Record<string, string>;
|
|
27
37
|
quality?: number;
|
|
28
38
|
frameRange?: FrameRange | null;
|
|
39
|
+
everyNthFrame?: number;
|
|
40
|
+
numberOfGifLoops?: number | null;
|
|
29
41
|
puppeteerInstance?: PuppeteerBrowser;
|
|
30
42
|
overwrite?: boolean;
|
|
31
43
|
onProgress?: RenderMediaOnProgress;
|
|
@@ -37,5 +49,20 @@ export declare type RenderMediaOptions = {
|
|
|
37
49
|
timeoutInMilliseconds?: number;
|
|
38
50
|
chromiumOptions?: ChromiumOptions;
|
|
39
51
|
scale?: number;
|
|
52
|
+
port?: number | null;
|
|
53
|
+
cancelSignal?: CancelSignal;
|
|
54
|
+
browserExecutable?: BrowserExecutable;
|
|
55
|
+
verbose?: boolean;
|
|
56
|
+
/**
|
|
57
|
+
* @deprecated Only for Remotion internal usage
|
|
58
|
+
*/
|
|
59
|
+
downloadMap?: DownloadMap;
|
|
60
|
+
muted?: boolean;
|
|
61
|
+
enforceAudioTrack?: boolean;
|
|
40
62
|
} & ServeUrlOrWebpackBundle;
|
|
41
|
-
|
|
63
|
+
/**
|
|
64
|
+
*
|
|
65
|
+
* @description Render a video from a composition
|
|
66
|
+
* @link https://www.remotion.dev/docs/renderer/render-media
|
|
67
|
+
*/
|
|
68
|
+
export declare const renderMedia: ({ parallelism, proResProfile, crf, composition, ffmpegExecutable, ffprobeExecutable, inputProps, pixelFormat, codec, envVariables, frameRange, puppeteerInstance, outputLocation, onProgress, overwrite, onDownload, dumpBrowserLogs, onBrowserLog, onStart, timeoutInMilliseconds, chromiumOptions, scale, browserExecutable, port, cancelSignal, muted, enforceAudioTrack, ...options }: RenderMediaOptions) => Promise<Buffer | null>;
|