@remotion/renderer 4.0.533 → 4.0.534
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/aac-priming.js +6 -2
- package/dist/browser/BrowserFetcher.d.ts +7 -1
- package/dist/browser/BrowserFetcher.js +33 -13
- package/dist/browser/Connection.js +5 -17
- package/dist/browser/DOMWorld.js +19 -13
- package/dist/browser/devtools-commands.d.ts +13 -1
- package/dist/browser/devtools-types.d.ts +62 -0
- package/dist/browser/get-chrome-download-url.d.ts +1 -1
- package/dist/browser/get-chrome-download-url.js +19 -33
- package/dist/can-use-parallel-encoding.d.ts +0 -1
- package/dist/can-use-parallel-encoding.js +10 -10
- package/dist/client.d.ts +87 -4
- package/dist/client.js +2 -0
- package/dist/cycle-browser-tabs.js +9 -1
- package/dist/ensure-browser.js +30 -6
- package/dist/esm/client.mjs +937 -796
- package/dist/esm/index.mjs +4125 -3027
- package/dist/esm/pure.mjs +33 -9
- package/dist/file-extensions.js +4 -1
- package/dist/get-mp4-brand.d.ts +1 -0
- package/dist/get-mp4-brand.js +21 -0
- package/dist/image-format.d.ts +1 -0
- package/dist/image-format.js +8 -4
- package/dist/index.d.ts +11 -1
- package/dist/index.js +4 -0
- package/dist/memory/from-macos-sysctl.d.ts +1 -0
- package/dist/memory/from-macos-sysctl.js +50 -0
- package/dist/memory/from-proc-meminfo.d.ts +1 -1
- package/dist/memory/from-proc-meminfo.js +7 -4
- package/dist/memory/get-available-memory.js +29 -21
- package/dist/mux-video-and-audio.js +8 -2
- package/dist/next-frame-to-render.d.ts +3 -7
- package/dist/next-frame-to-render.js +3 -22
- package/dist/open-browser.js +1 -0
- package/dist/options/allow-html-in-canvas.js +1 -1
- package/dist/options/api-key.js +1 -1
- package/dist/options/ask-ai.js +1 -1
- package/dist/options/audio-bitrate.js +1 -1
- package/dist/options/audio-codec.js +12 -6
- package/dist/options/beep-on-finish.js +1 -1
- package/dist/options/benchmark-concurrencies.js +1 -1
- package/dist/options/binaries-directory.js +1 -1
- package/dist/options/browser-executable.js +1 -1
- package/dist/options/browser.js +1 -1
- package/dist/options/bundle-cache.js +1 -1
- package/dist/options/canvas-tabs.js +1 -1
- package/dist/options/chrome-mode.js +1 -1
- package/dist/options/color-space.js +1 -1
- package/dist/options/concurrency.js +1 -1
- package/dist/options/config.js +1 -1
- package/dist/options/crf.js +1 -1
- package/dist/options/cross-site-isolation.js +1 -1
- package/dist/options/dark-mode.js +1 -1
- package/dist/options/default-coding-agent.js +1 -1
- package/dist/options/default-editor.js +1 -1
- package/dist/options/delete-after.js +1 -1
- package/dist/options/disable-git-source.js +1 -1
- package/dist/options/disable-shared-memory-capture.d.ts +16 -0
- package/dist/options/disable-shared-memory-capture.js +29 -0
- package/dist/options/disable-web-security.js +1 -1
- package/dist/options/disallow-parallel-encoding.js +1 -1
- package/dist/options/enable-cancellation.js +1 -1
- package/dist/options/enable-lambda-insights.js +1 -1
- package/dist/options/enable-multiprocess-on-linux.js +1 -1
- package/dist/options/encoding-buffer-size.js +1 -1
- package/dist/options/encoding-max-rate.js +1 -1
- package/dist/options/enforce-audio.js +1 -1
- package/dist/options/env-file.js +1 -1
- package/dist/options/every-nth-frame.js +1 -1
- package/dist/options/experimental-keep-audio-context-alive.js +1 -1
- package/dist/options/experimental-tracks.d.ts +18 -0
- package/dist/options/experimental-tracks.js +42 -0
- package/dist/options/folder-expiry.js +1 -1
- package/dist/options/for-seamless-aac-concatenation.js +1 -1
- package/dist/options/force-new-studio.js +1 -1
- package/dist/options/frames.js +1 -1
- package/dist/options/gl.js +1 -1
- package/dist/options/gop-size.js +1 -1
- package/dist/options/hardware-acceleration.js +1 -1
- package/dist/options/headless.js +1 -1
- package/dist/options/ignore-certificate-errors.js +1 -1
- package/dist/options/image-sequence-pattern.d.ts +1 -1
- package/dist/options/image-sequence-pattern.js +1 -1
- package/dist/options/image-sequence.js +1 -1
- package/dist/options/index.d.ts +36 -2
- package/dist/options/index.js +4 -0
- package/dist/options/interactivity.js +1 -1
- package/dist/options/ipv4.js +1 -1
- package/dist/options/is-production.js +1 -1
- package/dist/options/jpeg-quality.js +5 -2
- package/dist/options/keyboard-shortcuts.js +1 -1
- package/dist/options/latency-hint.js +1 -1
- package/dist/options/license-key.js +1 -1
- package/dist/options/log-level.js +1 -1
- package/dist/options/metadata.js +1 -1
- package/dist/options/mute.js +1 -1
- package/dist/options/no-open.js +1 -1
- package/dist/options/number-of-gif-loops.js +1 -1
- package/dist/options/number-of-shared-audio-tags.js +1 -1
- package/dist/options/offthreadvideo-cache-size.js +1 -1
- package/dist/options/offthreadvideo-threads.js +1 -1
- package/dist/options/on-browser-download.js +1 -1
- package/dist/options/options-map.d.ts +49 -1
- package/dist/options/options-map.js +4 -0
- package/dist/options/out-dir.js +1 -1
- package/dist/options/override-duration.js +1 -1
- package/dist/options/override-fps.js +1 -1
- package/dist/options/override-height.js +1 -1
- package/dist/options/override-width.js +1 -1
- package/dist/options/overwrite.js +1 -1
- package/dist/options/package-manager.js +1 -1
- package/dist/options/pixel-format.js +1 -1
- package/dist/options/port.js +1 -1
- package/dist/options/prefer-lossless.js +1 -1
- package/dist/options/preview-sample-rate.js +1 -1
- package/dist/options/props.js +1 -1
- package/dist/options/prores-profile.js +1 -1
- package/dist/options/public-dir.js +1 -1
- package/dist/options/public-license-key.js +1 -1
- package/dist/options/public-path.js +1 -1
- package/dist/options/repro.js +1 -1
- package/dist/options/rspack.d.ts +1 -1
- package/dist/options/rspack.js +1 -1
- package/dist/options/runs.js +1 -1
- package/dist/options/sample-rate.js +1 -1
- package/dist/options/scale.js +1 -1
- package/dist/options/separate-audio.js +1 -1
- package/dist/options/skip-skills.js +1 -1
- package/dist/options/still-frame.js +1 -1
- package/dist/options/still-image-format.js +1 -1
- package/dist/options/throw-if-site-exists.js +1 -1
- package/dist/options/timeout.js +1 -1
- package/dist/options/user-agent.js +1 -1
- package/dist/options/version-flag.js +1 -1
- package/dist/options/video-bitrate.js +1 -1
- package/dist/options/video-cache-size.js +1 -1
- package/dist/options/video-codec.js +4 -3
- package/dist/options/video-image-format.js +6 -2
- package/dist/options/webhook-custom-data.js +1 -1
- package/dist/options/webpack-poll.js +1 -1
- package/dist/options/x264-preset.js +1 -1
- package/dist/prespawn-ffmpeg.d.ts +20 -0
- package/dist/prespawn-ffmpeg.js +152 -29
- package/dist/probe-shared-memory-capture.d.ts +8 -0
- package/dist/probe-shared-memory-capture.js +111 -0
- package/dist/puppeteer-screenshot.d.ts +3 -1
- package/dist/puppeteer-screenshot.js +1 -0
- package/dist/pure.d.ts +1 -1
- package/dist/remotion-shared-memory-ffmpeg.d.ts +26 -0
- package/dist/remotion-shared-memory-ffmpeg.js +312 -0
- package/dist/remotion-shared-memory.d.ts +49 -0
- package/dist/remotion-shared-memory.js +359 -0
- package/dist/render-frame-and-retry-target-close.d.ts +5 -2
- package/dist/render-frame-and-retry-target-close.js +20 -4
- package/dist/render-frame-with-option-to-reject.d.ts +4 -1
- package/dist/render-frame-with-option-to-reject.js +206 -115
- package/dist/render-frame.d.ts +4 -5
- package/dist/render-frame.js +3 -1
- package/dist/render-frames.d.ts +3 -0
- package/dist/render-frames.js +15 -18
- package/dist/render-media.d.ts +1 -1
- package/dist/render-media.js +131 -46
- package/dist/render-still.js +1 -0
- package/dist/screenshot-background.d.ts +2 -0
- package/dist/screenshot-background.js +20 -0
- package/dist/screenshot-task.d.ts +4 -2
- package/dist/screenshot-task.js +40 -21
- package/dist/seek-to-frame.js +1 -1
- package/dist/stitch-frames-to-video.js +71 -10
- package/dist/take-frame.d.ts +11 -3
- package/dist/take-frame.js +10 -8
- package/dist/validate-output-filename.d.ts +1 -1
- package/dist/validate-output-filename.js +10 -2
- package/package.json +13 -13
|
@@ -12,16 +12,19 @@ const handle_javascript_exception_1 = require("./error-handling/handle-javascrip
|
|
|
12
12
|
const filter_asset_types_1 = require("./filter-asset-types");
|
|
13
13
|
const get_frame_padded_index_1 = require("./get-frame-padded-index");
|
|
14
14
|
const logger_1 = require("./logger");
|
|
15
|
+
const remotion_shared_memory_1 = require("./remotion-shared-memory");
|
|
15
16
|
const seek_to_frame_1 = require("./seek-to-frame");
|
|
16
17
|
const take_frame_1 = require("./take-frame");
|
|
17
|
-
const renderFrameWithOptionToReject = async ({ reject, width, height, compId, attempt, stoppedSignal, indent, logLevel, timeoutInMilliseconds, outputDir, onFrameBuffer, imageFormat, onError, lastFrame, jpegQuality, frameDir, scale, countType, assets, assetIndex, framesToRender, onArtifact, onDownload, downloadMap, binariesDirectory, cancelSignal, framesRenderedObj, onFrameUpdate, frame, page, imageSequencePattern, fps, trimLeftOffset, trimRightOffset, allFramesAndExtraFrames, }) => {
|
|
18
|
+
const renderFrameWithOptionToReject = async ({ reject, width, height, compId, attempt, stoppedSignal, indent, logLevel, timeoutInMilliseconds, outputDir, onFrameBuffer, onFrame, remotionSharedMemory, imageFormat, onError, lastFrame, jpegQuality, frameDir, scale, countType, assets, assetIndex, framesToRender, onArtifact, onDownload, downloadMap, binariesDirectory, cancelSignal, framesRenderedObj, onFrameUpdate, frame, page, imageSequencePattern, fps, trimLeftOffset, trimRightOffset, allFramesAndExtraFrames, }) => {
|
|
18
19
|
const startTime = performance.now();
|
|
19
20
|
const index = framesToRender.indexOf(frame);
|
|
20
21
|
const assetsOnly = index === -1;
|
|
21
22
|
if (stoppedSignal.stopped) {
|
|
22
23
|
return Promise.reject(new Error('Render was stopped'));
|
|
23
24
|
}
|
|
25
|
+
let pageError = null;
|
|
24
26
|
const errorCallbackOnFrame = (err) => {
|
|
27
|
+
pageError !== null && pageError !== void 0 ? pageError : (pageError = err);
|
|
25
28
|
reject(err);
|
|
26
29
|
};
|
|
27
30
|
const cleanupPageError = (0, handle_javascript_exception_1.handleJavascriptException)({
|
|
@@ -30,129 +33,217 @@ const renderFrameWithOptionToReject = async ({ reject, width, height, compId, at
|
|
|
30
33
|
frame,
|
|
31
34
|
});
|
|
32
35
|
page.on('error', errorCallbackOnFrame);
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
logger_1.Log.verbose({ indent, logLevel }, `Seeking to frame ${frame} took ${timeToSeek}ms`);
|
|
46
|
-
}
|
|
47
|
-
if (!outputDir && !onFrameBuffer && imageFormat !== 'none') {
|
|
48
|
-
throw new Error('Called renderFrames() without specifying either `outputDir` or `onFrameBuffer`');
|
|
49
|
-
}
|
|
50
|
-
if (outputDir && onFrameBuffer && imageFormat !== 'none') {
|
|
51
|
-
throw new Error('Pass either `outputDir` or `onFrameBuffer` to renderFrames(), not both.');
|
|
52
|
-
}
|
|
53
|
-
const [buffer, collectedAssets] = await Promise.all([
|
|
54
|
-
(0, take_frame_1.takeFrame)({
|
|
55
|
-
freePage: page,
|
|
56
|
-
height,
|
|
57
|
-
imageFormat: assetsOnly ? 'none' : imageFormat,
|
|
58
|
-
output: index === null
|
|
59
|
-
? null
|
|
60
|
-
: path_1.default.join(frameDir, (0, get_frame_padded_index_1.getFrameOutputFileName)({
|
|
61
|
-
frame,
|
|
62
|
-
imageFormat,
|
|
63
|
-
index,
|
|
64
|
-
countType,
|
|
65
|
-
lastFrame,
|
|
66
|
-
totalFrames: framesToRender.length,
|
|
67
|
-
imageSequencePattern,
|
|
68
|
-
})),
|
|
69
|
-
jpegQuality,
|
|
70
|
-
width,
|
|
71
|
-
scale,
|
|
72
|
-
wantsBuffer: Boolean(onFrameBuffer),
|
|
73
|
-
timeoutInMilliseconds,
|
|
74
|
-
}),
|
|
75
|
-
(0, collect_assets_1.collectAssets)({
|
|
36
|
+
let pageListenersCleaned = false;
|
|
37
|
+
const cleanupPageListeners = () => {
|
|
38
|
+
if (pageListenersCleaned) {
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
pageListenersCleaned = true;
|
|
42
|
+
cleanupPageError();
|
|
43
|
+
page.off('error', errorCallbackOnFrame);
|
|
44
|
+
};
|
|
45
|
+
try {
|
|
46
|
+
const startSeeking = Date.now();
|
|
47
|
+
await (0, seek_to_frame_1.seekToFrame)({
|
|
76
48
|
frame,
|
|
77
|
-
|
|
49
|
+
page,
|
|
50
|
+
composition: compId,
|
|
78
51
|
timeoutInMilliseconds,
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
52
|
+
indent,
|
|
53
|
+
logLevel,
|
|
54
|
+
attempt,
|
|
55
|
+
});
|
|
56
|
+
const timeToSeek = Date.now() - startSeeking;
|
|
57
|
+
if (timeToSeek > 1000) {
|
|
58
|
+
logger_1.Log.verbose({ indent, logLevel }, `Seeking to frame ${frame} took ${timeToSeek}ms`);
|
|
84
59
|
}
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
const audioAndVideoAssets = (0, filter_asset_types_1.onlyAudioAndVideoAssets)(collectedAssets);
|
|
88
|
-
const artifactAssets = (0, filter_asset_types_1.onlyArtifact)({
|
|
89
|
-
assets: collectedAssets,
|
|
90
|
-
frameBuffer: buffer,
|
|
91
|
-
});
|
|
92
|
-
for (const artifact of artifactAssets) {
|
|
93
|
-
const previousFrame = assetIndex.firstArtifactFrameByFilename.get(artifact.filename);
|
|
94
|
-
if (previousFrame !== undefined) {
|
|
95
|
-
return Promise.reject(new Error(`An artifact with output "${artifact.filename}" was already registered at frame ${previousFrame}, but now registered again at frame ${artifact.frame}. Artifacts must have unique names. https://remotion.dev/docs/artifacts`));
|
|
60
|
+
if (!outputDir && !onFrameBuffer && !onFrame && imageFormat !== 'none') {
|
|
61
|
+
throw new Error('Called renderFrames() without specifying either `outputDir` or `onFrameBuffer`');
|
|
96
62
|
}
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
const compressedAssets = audioAndVideoAssets.map((asset) => {
|
|
100
|
-
return (0, compress_assets_1.compressAsset)(assetIndex.firstAssetBySrc, asset);
|
|
101
|
-
});
|
|
102
|
-
const inlineAudioAssets = (0, filter_asset_types_1.onlyInlineAudio)(collectedAssets);
|
|
103
|
-
const outputFrame = allFramesAndExtraFrames[0] + allFramesAndExtraFrames.indexOf(frame);
|
|
104
|
-
assets.push({
|
|
105
|
-
audioAndVideoAssets: compressedAssets,
|
|
106
|
-
frame,
|
|
107
|
-
artifactAssets: artifactAssets.map((a) => {
|
|
108
|
-
return {
|
|
109
|
-
frame: a.frame,
|
|
110
|
-
filename: a.filename,
|
|
111
|
-
};
|
|
112
|
-
}),
|
|
113
|
-
inlineAudioAssets,
|
|
114
|
-
});
|
|
115
|
-
for (const asset of compressedAssets) {
|
|
116
|
-
if (asset.src.length >= 400 && !assetIndex.firstAssetBySrc.has(asset.src)) {
|
|
117
|
-
assetIndex.firstAssetBySrc.set(asset.src, asset);
|
|
63
|
+
if (outputDir && (onFrameBuffer || onFrame) && imageFormat !== 'none') {
|
|
64
|
+
throw new Error('Pass either `outputDir` or `onFrameBuffer` to renderFrames(), not both.');
|
|
118
65
|
}
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
66
|
+
const [captureResult, assetsResult] = await Promise.allSettled([
|
|
67
|
+
(0, take_frame_1.takeFrame)({
|
|
68
|
+
freePage: page,
|
|
69
|
+
height,
|
|
70
|
+
imageFormat: assetsOnly ? 'none' : imageFormat,
|
|
71
|
+
output: index === null
|
|
72
|
+
? null
|
|
73
|
+
: path_1.default.join(frameDir, (0, get_frame_padded_index_1.getFrameOutputFileName)({
|
|
74
|
+
frame,
|
|
75
|
+
imageFormat,
|
|
76
|
+
index,
|
|
77
|
+
countType,
|
|
78
|
+
lastFrame,
|
|
79
|
+
totalFrames: framesToRender.length,
|
|
80
|
+
imageSequencePattern,
|
|
81
|
+
})),
|
|
82
|
+
jpegQuality,
|
|
83
|
+
width,
|
|
84
|
+
scale,
|
|
85
|
+
wantsBuffer: Boolean(onFrameBuffer || onFrame),
|
|
86
|
+
timeoutInMilliseconds,
|
|
87
|
+
remotionSharedMemory,
|
|
88
|
+
}),
|
|
89
|
+
(0, collect_assets_1.collectAssets)({
|
|
90
|
+
frame,
|
|
91
|
+
freePage: page,
|
|
92
|
+
timeoutInMilliseconds,
|
|
93
|
+
}),
|
|
94
|
+
]);
|
|
95
|
+
if (captureResult.status === 'rejected') {
|
|
96
|
+
throw captureResult.reason;
|
|
123
97
|
}
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
98
|
+
const buffer = captureResult.value;
|
|
99
|
+
if (assetsResult.status === 'rejected') {
|
|
100
|
+
if (buffer !== null && (0, remotion_shared_memory_1.isRemotionRawFrame)(buffer)) {
|
|
101
|
+
try {
|
|
102
|
+
await buffer.release();
|
|
103
|
+
}
|
|
104
|
+
catch (_a) {
|
|
105
|
+
// Preserve the asset collection error so the frame can be retried.
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
throw assetsResult.reason;
|
|
109
|
+
}
|
|
110
|
+
const collectedAssets = assetsResult.value;
|
|
111
|
+
let frameBufferForArtifacts = Buffer.isBuffer(buffer) ? buffer : null;
|
|
112
|
+
if (buffer !== null &&
|
|
113
|
+
(0, remotion_shared_memory_1.isRemotionRawFrame)(buffer) &&
|
|
114
|
+
collectedAssets.some((asset) => asset.type === 'artifact' && asset.contentType === 'thumbnail')) {
|
|
115
|
+
try {
|
|
116
|
+
const thumbnail = await (0, take_frame_1.takeFrame)({
|
|
117
|
+
freePage: page,
|
|
118
|
+
height,
|
|
119
|
+
imageFormat,
|
|
120
|
+
output: null,
|
|
121
|
+
jpegQuality,
|
|
122
|
+
width,
|
|
123
|
+
scale,
|
|
124
|
+
wantsBuffer: true,
|
|
125
|
+
timeoutInMilliseconds,
|
|
126
|
+
remotionSharedMemory: null,
|
|
127
|
+
});
|
|
128
|
+
if (!thumbnail) {
|
|
129
|
+
throw new Error('Could not capture a thumbnail artifact.');
|
|
130
|
+
}
|
|
131
|
+
frameBufferForArtifacts = thumbnail;
|
|
132
|
+
}
|
|
133
|
+
catch (error) {
|
|
134
|
+
try {
|
|
135
|
+
await buffer.release();
|
|
136
|
+
}
|
|
137
|
+
catch (_b) {
|
|
138
|
+
// Preserve the thumbnail capture error so the frame can be retried.
|
|
139
|
+
}
|
|
140
|
+
throw error;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
cleanupPageListeners();
|
|
144
|
+
if (pageError) {
|
|
145
|
+
if (buffer !== null && (0, remotion_shared_memory_1.isRemotionRawFrame)(buffer)) {
|
|
146
|
+
try {
|
|
147
|
+
await buffer.release();
|
|
148
|
+
}
|
|
149
|
+
catch (_c) {
|
|
150
|
+
// Preserve the page error so the frame can be retried.
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
throw pageError;
|
|
154
|
+
}
|
|
155
|
+
if ((onFrameBuffer || onFrame) && !assetsOnly) {
|
|
156
|
+
if (!buffer) {
|
|
157
|
+
throw new Error('unexpected null buffer');
|
|
158
|
+
}
|
|
159
|
+
if (onFrame) {
|
|
160
|
+
await onFrame(buffer, frame);
|
|
161
|
+
}
|
|
162
|
+
else {
|
|
163
|
+
if ((0, remotion_shared_memory_1.isRemotionRawFrame)(buffer)) {
|
|
164
|
+
try {
|
|
165
|
+
await buffer.release();
|
|
166
|
+
}
|
|
167
|
+
catch (_d) {
|
|
168
|
+
// The type mismatch is the primary error.
|
|
169
|
+
}
|
|
170
|
+
throw new Error('Raw shared-memory frames cannot be passed to renderFrames().');
|
|
171
|
+
}
|
|
172
|
+
await (onFrameBuffer === null || onFrameBuffer === void 0 ? void 0 : onFrameBuffer(buffer, frame));
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
const audioAndVideoAssets = (0, filter_asset_types_1.onlyAudioAndVideoAssets)(collectedAssets);
|
|
176
|
+
const artifactAssets = (0, filter_asset_types_1.onlyArtifact)({
|
|
177
|
+
assets: collectedAssets,
|
|
178
|
+
frameBuffer: frameBufferForArtifacts,
|
|
139
179
|
});
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
180
|
+
for (const artifact of artifactAssets) {
|
|
181
|
+
const previousFrame = assetIndex.firstArtifactFrameByFilename.get(artifact.filename);
|
|
182
|
+
if (previousFrame !== undefined) {
|
|
183
|
+
return Promise.reject(new Error(`An artifact with output "${artifact.filename}" was already registered at frame ${previousFrame}, but now registered again at frame ${artifact.frame}. Artifacts must have unique names. https://remotion.dev/docs/artifacts`));
|
|
184
|
+
}
|
|
185
|
+
onArtifact === null || onArtifact === void 0 ? void 0 : onArtifact(artifact);
|
|
186
|
+
}
|
|
187
|
+
const compressedAssets = audioAndVideoAssets.map((asset) => {
|
|
188
|
+
return (0, compress_assets_1.compressAsset)(assetIndex.firstAssetBySrc, asset);
|
|
149
189
|
});
|
|
190
|
+
const inlineAudioAssets = (0, filter_asset_types_1.onlyInlineAudio)(collectedAssets);
|
|
191
|
+
const outputFrame = allFramesAndExtraFrames[0] + allFramesAndExtraFrames.indexOf(frame);
|
|
192
|
+
assets.push({
|
|
193
|
+
audioAndVideoAssets: compressedAssets,
|
|
194
|
+
frame,
|
|
195
|
+
artifactAssets: artifactAssets.map((a) => {
|
|
196
|
+
return {
|
|
197
|
+
frame: a.frame,
|
|
198
|
+
filename: a.filename,
|
|
199
|
+
};
|
|
200
|
+
}),
|
|
201
|
+
inlineAudioAssets,
|
|
202
|
+
});
|
|
203
|
+
for (const asset of compressedAssets) {
|
|
204
|
+
if (asset.src.length >= 400 &&
|
|
205
|
+
!assetIndex.firstAssetBySrc.has(asset.src)) {
|
|
206
|
+
assetIndex.firstAssetBySrc.set(asset.src, asset);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
for (const artifact of artifactAssets) {
|
|
210
|
+
if (!assetIndex.firstArtifactFrameByFilename.has(artifact.filename)) {
|
|
211
|
+
assetIndex.firstArtifactFrameByFilename.set(artifact.filename, artifact.frame);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
for (const renderAsset of compressedAssets) {
|
|
215
|
+
(0, download_and_map_assets_to_file_1.downloadAndMapAssetsToFileUrl)({
|
|
216
|
+
renderAsset,
|
|
217
|
+
onDownload,
|
|
218
|
+
downloadMap,
|
|
219
|
+
indent,
|
|
220
|
+
logLevel,
|
|
221
|
+
binariesDirectory,
|
|
222
|
+
cancelSignalForAudioAnalysis: cancelSignal,
|
|
223
|
+
shouldAnalyzeAudioImmediately: true,
|
|
224
|
+
}).catch((err) => {
|
|
225
|
+
const truncateWithEllipsis = renderAsset.src.substring(0, 1000) +
|
|
226
|
+
(renderAsset.src.length > 1000 ? '...' : '');
|
|
227
|
+
onError(new Error(`Error while downloading ${truncateWithEllipsis}: ${err.stack}`));
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
for (const renderAsset of inlineAudioAssets) {
|
|
231
|
+
downloadMap.inlineAudioMixing.addAsset({
|
|
232
|
+
asset: { ...renderAsset, frame: outputFrame },
|
|
233
|
+
fps,
|
|
234
|
+
totalNumberOfFrames: allFramesAndExtraFrames.length,
|
|
235
|
+
firstFrame: allFramesAndExtraFrames[0],
|
|
236
|
+
trimLeftOffset,
|
|
237
|
+
trimRightOffset,
|
|
238
|
+
});
|
|
239
|
+
}
|
|
240
|
+
if (!assetsOnly) {
|
|
241
|
+
framesRenderedObj.count++;
|
|
242
|
+
onFrameUpdate === null || onFrameUpdate === void 0 ? void 0 : onFrameUpdate(framesRenderedObj.count, frame, performance.now() - startTime);
|
|
243
|
+
}
|
|
150
244
|
}
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
if (!assetsOnly) {
|
|
154
|
-
framesRenderedObj.count++;
|
|
155
|
-
onFrameUpdate === null || onFrameUpdate === void 0 ? void 0 : onFrameUpdate(framesRenderedObj.count, frame, performance.now() - startTime);
|
|
245
|
+
finally {
|
|
246
|
+
cleanupPageListeners();
|
|
156
247
|
}
|
|
157
248
|
};
|
|
158
249
|
exports.renderFrameWithOptionToReject = renderFrameWithOptionToReject;
|
package/dist/render-frame.d.ts
CHANGED
|
@@ -4,8 +4,9 @@ import type { DownloadMap } from './assets/download-map';
|
|
|
4
4
|
import type { Page } from './browser/BrowserPage';
|
|
5
5
|
import type { CountType } from './get-frame-padded-index';
|
|
6
6
|
import type { CancelSignal } from './make-cancel-signal';
|
|
7
|
+
import type { CapturedFrame, RemotionSharedMemoryCapture } from './remotion-shared-memory';
|
|
7
8
|
import type { AssetIndex, FrameAndAssets, OnArtifact } from './render-frames';
|
|
8
|
-
export declare const renderFrame: ({ attempt, binariesDirectory, cancelSignal, imageFormat, indent, logLevel, assets, assetIndex, countType, downloadMap, frameDir, framesToRender, jpegQuality, onArtifact, onDownload, scale, composition, onError, outputDir, stoppedSignal, timeoutInMilliseconds, lastFrame, onFrameBuffer, onFrameUpdate, framesRenderedObj, frame, page, imageSequencePattern, trimLeftOffset, trimRightOffset, allFramesAndExtraFrames, }: {
|
|
9
|
+
export declare const renderFrame: ({ attempt, binariesDirectory, cancelSignal, imageFormat, indent, logLevel, assets, assetIndex, countType, downloadMap, frameDir, framesToRender, jpegQuality, onArtifact, onDownload, scale, composition, onError, outputDir, stoppedSignal, timeoutInMilliseconds, lastFrame, onFrameBuffer, onFrame, remotionSharedMemory, onFrameUpdate, framesRenderedObj, frame, page, imageSequencePattern, trimLeftOffset, trimRightOffset, allFramesAndExtraFrames, }: {
|
|
9
10
|
attempt: number;
|
|
10
11
|
indent: boolean;
|
|
11
12
|
logLevel: "error" | "info" | "trace" | "verbose" | "warn";
|
|
@@ -30,15 +31,13 @@ export declare const renderFrame: ({ attempt, binariesDirectory, cancelSignal, i
|
|
|
30
31
|
timeoutInMilliseconds: number;
|
|
31
32
|
outputDir: string | null;
|
|
32
33
|
onFrameBuffer: ((buffer: Buffer, frame: number) => void | Promise<void>) | null | undefined;
|
|
34
|
+
onFrame: ((frame: CapturedFrame, frameNumber: number) => void | Promise<void>) | null;
|
|
35
|
+
remotionSharedMemory: RemotionSharedMemoryCapture | null;
|
|
33
36
|
lastFrame: number;
|
|
34
37
|
onFrameUpdate: ((framesRendered: number, frameIndex: number, timeToRenderInMilliseconds: number) => void) | null;
|
|
35
38
|
framesRenderedObj: {
|
|
36
39
|
count: number;
|
|
37
40
|
};
|
|
38
|
-
nextFrameToRender: {
|
|
39
|
-
getNextFrame: (_pageIndex: number) => number;
|
|
40
|
-
returnFrame: (frame: number) => void;
|
|
41
|
-
};
|
|
42
41
|
frame: number;
|
|
43
42
|
page: Page;
|
|
44
43
|
imageSequencePattern: string | null;
|
package/dist/render-frame.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.renderFrame = void 0;
|
|
4
4
|
const render_frame_with_option_to_reject_1 = require("./render-frame-with-option-to-reject");
|
|
5
|
-
const renderFrame = ({ attempt, binariesDirectory, cancelSignal, imageFormat, indent, logLevel, assets, assetIndex, countType, downloadMap, frameDir, framesToRender, jpegQuality, onArtifact, onDownload, scale, composition, onError, outputDir, stoppedSignal, timeoutInMilliseconds, lastFrame, onFrameBuffer, onFrameUpdate, framesRenderedObj, frame, page, imageSequencePattern, trimLeftOffset, trimRightOffset, allFramesAndExtraFrames, }) => {
|
|
5
|
+
const renderFrame = ({ attempt, binariesDirectory, cancelSignal, imageFormat, indent, logLevel, assets, assetIndex, countType, downloadMap, frameDir, framesToRender, jpegQuality, onArtifact, onDownload, scale, composition, onError, outputDir, stoppedSignal, timeoutInMilliseconds, lastFrame, onFrameBuffer, onFrame, remotionSharedMemory, onFrameUpdate, framesRenderedObj, frame, page, imageSequencePattern, trimLeftOffset, trimRightOffset, allFramesAndExtraFrames, }) => {
|
|
6
6
|
return new Promise((resolve, reject) => {
|
|
7
7
|
(0, render_frame_with_option_to_reject_1.renderFrameWithOptionToReject)({
|
|
8
8
|
reject,
|
|
@@ -16,6 +16,8 @@ const renderFrame = ({ attempt, binariesDirectory, cancelSignal, imageFormat, in
|
|
|
16
16
|
timeoutInMilliseconds,
|
|
17
17
|
imageFormat,
|
|
18
18
|
onFrameBuffer,
|
|
19
|
+
onFrame,
|
|
20
|
+
remotionSharedMemory,
|
|
19
21
|
outputDir,
|
|
20
22
|
assets,
|
|
21
23
|
assetIndex,
|
package/dist/render-frames.d.ts
CHANGED
|
@@ -11,6 +11,7 @@ import type { ChromiumOptions } from './open-browser';
|
|
|
11
11
|
import type { ToOptions } from './options/option';
|
|
12
12
|
import type { optionsMap } from './options/options-map';
|
|
13
13
|
import type { RemotionServer } from './prepare-server';
|
|
14
|
+
import type { CapturedFrame, RemotionSharedMemoryCapture } from './remotion-shared-memory';
|
|
14
15
|
import type { EmittedArtifact } from './serialize-artifact';
|
|
15
16
|
import type { OnStartData, RenderFramesOutput } from './types';
|
|
16
17
|
export type OnArtifact = (asset: EmittedArtifact) => void;
|
|
@@ -29,6 +30,8 @@ type InternalRenderFramesOptions = {
|
|
|
29
30
|
browserExecutable: BrowserExecutable | null;
|
|
30
31
|
onBrowserLog: null | ((log: BrowserLog) => void);
|
|
31
32
|
onFrameBuffer: null | ((buffer: Buffer, frame: number) => void | Promise<void>);
|
|
33
|
+
onFrame: null | ((frame: CapturedFrame, frameNumber: number) => void | Promise<void>);
|
|
34
|
+
remotionSharedMemory: RemotionSharedMemoryCapture | null;
|
|
32
35
|
onDownload: RenderMediaOnDownload | null;
|
|
33
36
|
chromiumOptions: ChromiumOptions;
|
|
34
37
|
scale: number;
|
package/dist/render-frames.js
CHANGED
|
@@ -11,7 +11,6 @@ const browser_1 = require("./browser");
|
|
|
11
11
|
const browser_download_progress_bar_1 = require("./browser/browser-download-progress-bar");
|
|
12
12
|
const flaky_errors_1 = require("./browser/flaky-errors");
|
|
13
13
|
const TimeoutSettings_1 = require("./browser/TimeoutSettings");
|
|
14
|
-
const can_use_parallel_encoding_1 = require("./can-use-parallel-encoding");
|
|
15
14
|
const cycle_browser_tabs_1 = require("./cycle-browser-tabs");
|
|
16
15
|
const default_on_log_1 = require("./default-on-log");
|
|
17
16
|
const find_closest_package_json_1 = require("./find-closest-package-json");
|
|
@@ -37,7 +36,7 @@ const validate_scale_1 = require("./validate-scale");
|
|
|
37
36
|
const validate_selected_frames_1 = require("./validate-selected-frames");
|
|
38
37
|
const wrap_with_error_handling_1 = require("./wrap-with-error-handling");
|
|
39
38
|
const MAX_RETRIES_PER_FRAME = 1;
|
|
40
|
-
const innerRenderFrames = async ({ onFrameUpdate, outputDir, onStart, serializedInputPropsWithCustomSchema, serializedResolvedPropsWithCustomSchema, jpegQuality, imageFormat, frameRange, frames, outputFramesInSequence, onError, envVariables, onBrowserLog, onFrameBuffer, onDownload, pagesArray, serveUrl, composition, timeoutInMilliseconds, scale, resolvedConcurrency, everyNthFrame, proxyPort, cancelSignal, downloadMap, muted, makeBrowser, browserReplacer, sourceMapGetter, logLevel, indent, parallelEncodingEnabled, compositionStart, forSeamlessAacConcatenation, onArtifact, binariesDirectory, imageSequencePattern, mediaCacheSizeInBytes, onLog, darkMode, sampleRate, }) => {
|
|
39
|
+
const innerRenderFrames = async ({ onFrameUpdate, outputDir, onStart, serializedInputPropsWithCustomSchema, serializedResolvedPropsWithCustomSchema, jpegQuality, imageFormat, frameRange, frames, outputFramesInSequence, onError, envVariables, onBrowserLog, onFrameBuffer, onFrame, remotionSharedMemory, onDownload, pagesArray, serveUrl, composition, timeoutInMilliseconds, scale, resolvedConcurrency, everyNthFrame, proxyPort, cancelSignal, downloadMap, muted, makeBrowser, browserReplacer, sourceMapGetter, logLevel, indent, parallelEncodingEnabled, compositionStart, forSeamlessAacConcatenation, onArtifact, binariesDirectory, imageSequencePattern, mediaCacheSizeInBytes, onLog, darkMode, sampleRate, }) => {
|
|
41
40
|
if (outputDir) {
|
|
42
41
|
if (!node_fs_1.default.existsSync(outputDir)) {
|
|
43
42
|
node_fs_1.default.mkdirSync(outputDir, {
|
|
@@ -68,8 +67,8 @@ const innerRenderFrames = async ({ onFrameUpdate, outputDir, onStart, serialized
|
|
|
68
67
|
: framesToRender.length / composition.fps;
|
|
69
68
|
const lastFrame = framesToRender[framesToRender.length - 1];
|
|
70
69
|
const concurrencyOrFramesToRender = Math.min(framesToRender.length, resolvedConcurrency);
|
|
71
|
-
const makeNewPage = (frame, pageIndex) => {
|
|
72
|
-
|
|
70
|
+
const makeNewPage = async (frame, pageIndex) => {
|
|
71
|
+
const page = await (0, make_page_1.makePage)({
|
|
73
72
|
context: sourceMapGetter,
|
|
74
73
|
initialFrame: frame,
|
|
75
74
|
browserReplacer,
|
|
@@ -94,6 +93,8 @@ const innerRenderFrames = async ({ onFrameUpdate, outputDir, onStart, serialized
|
|
|
94
93
|
darkMode,
|
|
95
94
|
sampleRate,
|
|
96
95
|
});
|
|
96
|
+
await (remotionSharedMemory === null || remotionSharedMemory === void 0 ? void 0 : remotionSharedMemory.ensurePage(page));
|
|
97
|
+
return page;
|
|
97
98
|
};
|
|
98
99
|
const getPool = async () => {
|
|
99
100
|
const pages = new Array(concurrencyOrFramesToRender)
|
|
@@ -145,19 +146,9 @@ const innerRenderFrames = async ({ onFrameUpdate, outputDir, onStart, serialized
|
|
|
145
146
|
...framesToRender,
|
|
146
147
|
...extraFramesToCaptureAssetsBackend,
|
|
147
148
|
];
|
|
148
|
-
const
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
}
|
|
152
|
-
const nextFrameToRender = shouldUsePartitionedRendering
|
|
153
|
-
? (0, next_frame_to_render_1.partitionedNextFrameToRenderState)({
|
|
154
|
-
allFramesAndExtraFrames,
|
|
155
|
-
concurrencyOrFramesToRender,
|
|
156
|
-
})
|
|
157
|
-
: (0, next_frame_to_render_1.nextFrameToRenderState)({
|
|
158
|
-
allFramesAndExtraFrames,
|
|
159
|
-
concurrencyOrFramesToRender,
|
|
160
|
-
});
|
|
149
|
+
const nextFrameToRender = (0, next_frame_to_render_1.nextFrameToRenderState)({
|
|
150
|
+
allFramesAndExtraFrames,
|
|
151
|
+
});
|
|
161
152
|
const pattern = imageSequencePattern || `element-[frame].[ext]`;
|
|
162
153
|
const imageSequenceName = pattern
|
|
163
154
|
.replace(/\[frame\]/g, `%0${filePadLength}d`)
|
|
@@ -194,6 +185,8 @@ const innerRenderFrames = async ({ onFrameUpdate, outputDir, onStart, serialized
|
|
|
194
185
|
lastFrame,
|
|
195
186
|
makeNewPage,
|
|
196
187
|
onFrameBuffer,
|
|
188
|
+
onFrame,
|
|
189
|
+
remotionSharedMemory,
|
|
197
190
|
onFrameUpdate,
|
|
198
191
|
nextFrameToRender,
|
|
199
192
|
imageSequencePattern: pattern,
|
|
@@ -220,7 +213,7 @@ const innerRenderFrames = async ({ onFrameUpdate, outputDir, onStart, serialized
|
|
|
220
213
|
frameCount: framesToRender.length,
|
|
221
214
|
};
|
|
222
215
|
};
|
|
223
|
-
const internalRenderFramesRaw = ({ browserExecutable, cancelSignal, chromiumOptions, composition, concurrency, envVariables, everyNthFrame, frameRange, frames, outputFramesInSequence, imageFormat, indent, jpegQuality, muted, onBrowserLog, onDownload, onFrameBuffer, onFrameUpdate, onStart, outputDir, port, puppeteerInstance, scale, server, timeoutInMilliseconds, logLevel, webpackBundleOrServeUrl, serializedInputPropsWithCustomSchema, serializedResolvedPropsWithCustomSchema, offthreadVideoCacheSizeInBytes, parallelEncodingEnabled, binariesDirectory, forSeamlessAacConcatenation, compositionStart, onBrowserDownload, onArtifact, chromeMode, offthreadVideoThreads, imageSequencePattern, mediaCacheSizeInBytes, onLog, sampleRate, }) => {
|
|
216
|
+
const internalRenderFramesRaw = ({ browserExecutable, cancelSignal, chromiumOptions, composition, concurrency, envVariables, everyNthFrame, frameRange, frames, outputFramesInSequence, imageFormat, indent, jpegQuality, muted, onBrowserLog, onDownload, onFrameBuffer, onFrame, remotionSharedMemory, onFrameUpdate, onStart, outputDir, port, puppeteerInstance, scale, server, timeoutInMilliseconds, logLevel, webpackBundleOrServeUrl, serializedInputPropsWithCustomSchema, serializedResolvedPropsWithCustomSchema, offthreadVideoCacheSizeInBytes, parallelEncodingEnabled, binariesDirectory, forSeamlessAacConcatenation, compositionStart, onBrowserDownload, onArtifact, chromeMode, offthreadVideoThreads, imageSequencePattern, mediaCacheSizeInBytes, onLog, sampleRate, }) => {
|
|
224
217
|
(0, validate_1.validateDimension)(composition.height, 'height', 'in the `config` object passed to `renderFrames()`');
|
|
225
218
|
(0, validate_1.validateDimension)(composition.width, 'width', 'in the `config` object passed to `renderFrames()`');
|
|
226
219
|
(0, validate_1.validateFps)(composition.fps, 'in the `config` object of `renderFrames()`', false);
|
|
@@ -309,6 +302,8 @@ const internalRenderFramesRaw = ({ browserExecutable, cancelSignal, chromiumOpti
|
|
|
309
302
|
muted,
|
|
310
303
|
onBrowserLog,
|
|
311
304
|
onFrameBuffer,
|
|
305
|
+
onFrame,
|
|
306
|
+
remotionSharedMemory,
|
|
312
307
|
onFrameUpdate,
|
|
313
308
|
onStart,
|
|
314
309
|
outputDir,
|
|
@@ -441,6 +436,8 @@ const renderFrames = (options) => {
|
|
|
441
436
|
muted: muted !== null && muted !== void 0 ? muted : false,
|
|
442
437
|
onBrowserLog: onBrowserLog !== null && onBrowserLog !== void 0 ? onBrowserLog : null,
|
|
443
438
|
onFrameBuffer: onFrameBuffer !== null && onFrameBuffer !== void 0 ? onFrameBuffer : null,
|
|
439
|
+
onFrame: null,
|
|
440
|
+
remotionSharedMemory: null,
|
|
444
441
|
onFrameUpdate,
|
|
445
442
|
onStart,
|
|
446
443
|
outputDir,
|
package/dist/render-media.d.ts
CHANGED
|
@@ -148,5 +148,5 @@ type RenderMediaResult = {
|
|
|
148
148
|
contentType: string;
|
|
149
149
|
};
|
|
150
150
|
export declare const internalRenderMedia: (args_0: InternalRenderMediaOptions) => Promise<RenderMediaResult>;
|
|
151
|
-
export declare const renderMedia: ({ proResProfile, x264Preset, gopSize, 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, encodingMaxRate, encodingBufferSize, audioCodec, jpegQuality, concurrency, serveUrl, disallowParallelEncoding, everyNthFrame, imageFormat, numberOfGifLoops, dumpBrowserLogs, preferLossless, verbose, quality, logLevel: passedLogLevel, offthreadVideoCacheSizeInBytes, colorSpace, repro, binariesDirectory, separateAudioTo, forSeamlessAacConcatenation, onBrowserDownload, onArtifact, metadata, hardwareAcceleration, chromeMode, offthreadVideoThreads, compositionStart, mediaCacheSizeInBytes, isProduction, sampleRate, ...apiKeyOrLicenseKey }: RenderMediaOptions) => Promise<RenderMediaResult>;
|
|
151
|
+
export declare const renderMedia: ({ proResProfile, x264Preset, gopSize, 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, encodingMaxRate, encodingBufferSize, audioCodec, jpegQuality, concurrency, serveUrl, disallowParallelEncoding, disableSharedMemoryCapture, everyNthFrame, imageFormat, numberOfGifLoops, dumpBrowserLogs, preferLossless, verbose, quality, logLevel: passedLogLevel, offthreadVideoCacheSizeInBytes, colorSpace, repro, binariesDirectory, separateAudioTo, forSeamlessAacConcatenation, onBrowserDownload, onArtifact, metadata, hardwareAcceleration, chromeMode, offthreadVideoThreads, compositionStart, mediaCacheSizeInBytes, isProduction, sampleRate, ...apiKeyOrLicenseKey }: RenderMediaOptions) => Promise<RenderMediaResult>;
|
|
152
152
|
export {};
|