@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
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
var _a;
|
|
26
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
27
|
+
exports.isColorSupported = void 0;
|
|
28
|
+
const tty = __importStar(require("tty"));
|
|
29
|
+
const argv = process.argv || [];
|
|
30
|
+
const env = process.env || {};
|
|
31
|
+
const isDisabled = 'NO_COLOR' in env || argv.includes('--no-color');
|
|
32
|
+
const isForced = 'FORCE_COLOR' in env || argv.includes('--color');
|
|
33
|
+
const isWindows = process.platform === 'win32';
|
|
34
|
+
const isCompatibleTerminal = ((_a = tty === null || tty === void 0 ? void 0 : tty.isatty) === null || _a === void 0 ? void 0 : _a.call(tty, 1)) && env.TERM && env.TERM !== 'dumb';
|
|
35
|
+
const isCI = 'CI' in env &&
|
|
36
|
+
('GITHUB_ACTIONS' in env || 'GITLAB_CI' in env || 'CIRCLECI' in env);
|
|
37
|
+
exports.isColorSupported = !isDisabled && (isForced || isWindows || isCompatibleTerminal || isCI);
|
package/dist/client.d.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
export declare const BrowserSafeApis: {
|
|
2
|
-
getFileExtensionFromCodec: <T extends "
|
|
2
|
+
getFileExtensionFromCodec: <T extends "h264" | "h265" | "vp8" | "vp9" | "mp3" | "aac" | "wav" | "prores" | "h264-mkv" | "gif">(codec: T, audioCodec: "mp3" | "aac" | "pcm-16" | "opus" | null) => import("./file-extensions").FileExtension;
|
|
3
3
|
validCodecs: readonly ["h264", "h265", "vp8", "vp9", "mp3", "aac", "wav", "prores", "h264-mkv", "gif"];
|
|
4
4
|
validAudioCodecs: readonly ["pcm-16", "aac", "mp3", "opus"];
|
|
5
|
-
getDefaultCrfForCodec: (codec: "
|
|
6
|
-
getValidCrfRanges: (codec: "
|
|
7
|
-
isAudioCodec: (codec: "
|
|
5
|
+
getDefaultCrfForCodec: (codec: "h264" | "h265" | "vp8" | "vp9" | "mp3" | "aac" | "wav" | "prores" | "h264-mkv" | "gif") => number;
|
|
6
|
+
getValidCrfRanges: (codec: "h264" | "h265" | "vp8" | "vp9" | "mp3" | "aac" | "wav" | "prores" | "h264-mkv" | "gif") => [number, number];
|
|
7
|
+
isAudioCodec: (codec: "h264" | "h265" | "vp8" | "vp9" | "mp3" | "aac" | "wav" | "prores" | "h264-mkv" | "gif" | undefined) => boolean;
|
|
8
8
|
proResProfileOptions: readonly ["4444-xq", "4444", "hq", "standard", "light", "proxy"];
|
|
9
9
|
validPixelFormats: readonly ["yuv420p", "yuva420p", "yuv422p", "yuv444p", "yuv420p10le", "yuv422p10le", "yuv444p10le", "yuva444p10le"];
|
|
10
10
|
DEFAULT_PIXEL_FORMAT: "yuv420p" | "yuva420p" | "yuv422p" | "yuv444p" | "yuv420p10le" | "yuv422p10le" | "yuv444p10le" | "yuva444p10le";
|
|
@@ -21,79 +21,79 @@ export declare const BrowserSafeApis: {
|
|
|
21
21
|
readonly wav: readonly ["pcm-16"];
|
|
22
22
|
};
|
|
23
23
|
defaultFileExtensionMap: {
|
|
24
|
-
|
|
24
|
+
h264: {
|
|
25
25
|
default: import("./file-extensions").FileExtension;
|
|
26
26
|
forAudioCodec: {
|
|
27
|
-
|
|
27
|
+
aac: {
|
|
28
28
|
possible: import("./file-extensions").FileExtension[];
|
|
29
29
|
default: import("./file-extensions").FileExtension;
|
|
30
30
|
};
|
|
31
|
-
|
|
31
|
+
"pcm-16": {
|
|
32
32
|
possible: import("./file-extensions").FileExtension[];
|
|
33
33
|
default: import("./file-extensions").FileExtension;
|
|
34
34
|
};
|
|
35
35
|
};
|
|
36
36
|
};
|
|
37
|
-
|
|
37
|
+
h265: {
|
|
38
38
|
default: import("./file-extensions").FileExtension;
|
|
39
39
|
forAudioCodec: {
|
|
40
|
-
|
|
40
|
+
aac: {
|
|
41
41
|
possible: import("./file-extensions").FileExtension[];
|
|
42
42
|
default: import("./file-extensions").FileExtension;
|
|
43
43
|
};
|
|
44
|
-
|
|
44
|
+
"pcm-16": {
|
|
45
45
|
possible: import("./file-extensions").FileExtension[];
|
|
46
46
|
default: import("./file-extensions").FileExtension;
|
|
47
47
|
};
|
|
48
48
|
};
|
|
49
49
|
};
|
|
50
|
-
|
|
50
|
+
vp8: {
|
|
51
51
|
default: import("./file-extensions").FileExtension;
|
|
52
52
|
forAudioCodec: {
|
|
53
53
|
"pcm-16": {
|
|
54
54
|
possible: import("./file-extensions").FileExtension[];
|
|
55
55
|
default: import("./file-extensions").FileExtension;
|
|
56
56
|
};
|
|
57
|
-
|
|
57
|
+
opus: {
|
|
58
58
|
possible: import("./file-extensions").FileExtension[];
|
|
59
59
|
default: import("./file-extensions").FileExtension;
|
|
60
60
|
};
|
|
61
61
|
};
|
|
62
62
|
};
|
|
63
|
-
|
|
63
|
+
vp9: {
|
|
64
64
|
default: import("./file-extensions").FileExtension;
|
|
65
65
|
forAudioCodec: {
|
|
66
66
|
"pcm-16": {
|
|
67
67
|
possible: import("./file-extensions").FileExtension[];
|
|
68
68
|
default: import("./file-extensions").FileExtension;
|
|
69
69
|
};
|
|
70
|
-
|
|
70
|
+
opus: {
|
|
71
71
|
possible: import("./file-extensions").FileExtension[];
|
|
72
72
|
default: import("./file-extensions").FileExtension;
|
|
73
73
|
};
|
|
74
74
|
};
|
|
75
75
|
};
|
|
76
|
-
|
|
76
|
+
mp3: {
|
|
77
77
|
default: import("./file-extensions").FileExtension;
|
|
78
78
|
forAudioCodec: {
|
|
79
|
-
|
|
79
|
+
mp3: {
|
|
80
80
|
possible: import("./file-extensions").FileExtension[];
|
|
81
81
|
default: import("./file-extensions").FileExtension;
|
|
82
82
|
};
|
|
83
|
-
|
|
83
|
+
"pcm-16": {
|
|
84
84
|
possible: import("./file-extensions").FileExtension[];
|
|
85
85
|
default: import("./file-extensions").FileExtension;
|
|
86
86
|
};
|
|
87
87
|
};
|
|
88
88
|
};
|
|
89
|
-
|
|
89
|
+
aac: {
|
|
90
90
|
default: import("./file-extensions").FileExtension;
|
|
91
91
|
forAudioCodec: {
|
|
92
|
-
|
|
92
|
+
aac: {
|
|
93
93
|
possible: import("./file-extensions").FileExtension[];
|
|
94
94
|
default: import("./file-extensions").FileExtension;
|
|
95
95
|
};
|
|
96
|
-
|
|
96
|
+
"pcm-16": {
|
|
97
97
|
possible: import("./file-extensions").FileExtension[];
|
|
98
98
|
default: import("./file-extensions").FileExtension;
|
|
99
99
|
};
|
|
@@ -111,11 +111,11 @@ export declare const BrowserSafeApis: {
|
|
|
111
111
|
prores: {
|
|
112
112
|
default: import("./file-extensions").FileExtension;
|
|
113
113
|
forAudioCodec: {
|
|
114
|
-
|
|
114
|
+
aac: {
|
|
115
115
|
possible: import("./file-extensions").FileExtension[];
|
|
116
116
|
default: import("./file-extensions").FileExtension;
|
|
117
117
|
};
|
|
118
|
-
|
|
118
|
+
"pcm-16": {
|
|
119
119
|
possible: import("./file-extensions").FileExtension[];
|
|
120
120
|
default: import("./file-extensions").FileExtension;
|
|
121
121
|
};
|
|
@@ -141,21 +141,13 @@ export declare const BrowserSafeApis: {
|
|
|
141
141
|
};
|
|
142
142
|
};
|
|
143
143
|
defaultAudioCodecs: {
|
|
144
|
-
aac: {
|
|
145
|
-
compressed: "pcm-16" | "aac" | null;
|
|
146
|
-
lossless: "pcm-16" | "aac" | null;
|
|
147
|
-
};
|
|
148
|
-
mp3: {
|
|
149
|
-
compressed: "pcm-16" | "mp3" | null;
|
|
150
|
-
lossless: "pcm-16" | "mp3" | null;
|
|
151
|
-
};
|
|
152
144
|
h264: {
|
|
153
|
-
compressed: "
|
|
154
|
-
lossless: "
|
|
145
|
+
compressed: "aac" | "pcm-16" | null;
|
|
146
|
+
lossless: "aac" | "pcm-16" | null;
|
|
155
147
|
};
|
|
156
148
|
h265: {
|
|
157
|
-
compressed: "
|
|
158
|
-
lossless: "
|
|
149
|
+
compressed: "aac" | "pcm-16" | null;
|
|
150
|
+
lossless: "aac" | "pcm-16" | null;
|
|
159
151
|
};
|
|
160
152
|
vp8: {
|
|
161
153
|
compressed: "pcm-16" | "opus" | null;
|
|
@@ -165,13 +157,21 @@ export declare const BrowserSafeApis: {
|
|
|
165
157
|
compressed: "pcm-16" | "opus" | null;
|
|
166
158
|
lossless: "pcm-16" | "opus" | null;
|
|
167
159
|
};
|
|
160
|
+
mp3: {
|
|
161
|
+
compressed: "mp3" | "pcm-16" | null;
|
|
162
|
+
lossless: "mp3" | "pcm-16" | null;
|
|
163
|
+
};
|
|
164
|
+
aac: {
|
|
165
|
+
compressed: "aac" | "pcm-16" | null;
|
|
166
|
+
lossless: "aac" | "pcm-16" | null;
|
|
167
|
+
};
|
|
168
168
|
wav: {
|
|
169
169
|
compressed: "pcm-16" | null;
|
|
170
170
|
lossless: "pcm-16" | null;
|
|
171
171
|
};
|
|
172
172
|
prores: {
|
|
173
|
-
compressed: "
|
|
174
|
-
lossless: "
|
|
173
|
+
compressed: "aac" | "pcm-16" | null;
|
|
174
|
+
lossless: "aac" | "pcm-16" | null;
|
|
175
175
|
};
|
|
176
176
|
"h264-mkv": {
|
|
177
177
|
compressed: "pcm-16" | null;
|
|
@@ -182,10 +182,10 @@ export declare const BrowserSafeApis: {
|
|
|
182
182
|
lossless: any;
|
|
183
183
|
};
|
|
184
184
|
};
|
|
185
|
-
defaultCodecsForFileExtension: Record<import("./file-extensions").FileExtension, "
|
|
186
|
-
validateOutputFilename: <T_1 extends "
|
|
185
|
+
defaultCodecsForFileExtension: Record<import("./file-extensions").FileExtension, "h264" | "h265" | "vp8" | "vp9" | "mp3" | "aac" | "wav" | "prores" | "h264-mkv" | "gif">;
|
|
186
|
+
validateOutputFilename: <T_1 extends "h264" | "h265" | "vp8" | "vp9" | "mp3" | "aac" | "wav" | "prores" | "h264-mkv" | "gif">({ codec, audioCodec, extension, preferLossless, }: {
|
|
187
187
|
codec: T_1;
|
|
188
|
-
audioCodec: "
|
|
188
|
+
audioCodec: "mp3" | "aac" | "pcm-16" | "opus" | null;
|
|
189
189
|
extension: string;
|
|
190
190
|
preferLossless: boolean;
|
|
191
191
|
}) => void;
|
|
@@ -199,6 +199,6 @@ export declare const BrowserSafeApis: {
|
|
|
199
199
|
muteOption: import(".").RemotionOption;
|
|
200
200
|
videoCodecOption: import(".").RemotionOption;
|
|
201
201
|
};
|
|
202
|
-
codecSupportsCrf: (codec: "
|
|
203
|
-
codecSupportsVideoBitrate: (codec: "
|
|
202
|
+
codecSupportsCrf: (codec: "h264" | "h265" | "vp8" | "vp9" | "mp3" | "aac" | "wav" | "prores" | "h264-mkv" | "gif") => boolean;
|
|
203
|
+
codecSupportsVideoBitrate: (codec: "h264" | "h265" | "vp8" | "vp9" | "mp3" | "aac" | "wav" | "prores" | "h264-mkv" | "gif") => boolean;
|
|
204
204
|
};
|
package/dist/combine-videos.js
CHANGED
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
// Combine multiple video chunks, useful for decentralized rendering
|
|
3
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
4
|
exports.combineVideos = void 0;
|
|
5
|
-
const
|
|
6
|
-
const
|
|
5
|
+
const node_fs_1 = require("node:fs");
|
|
6
|
+
const node_path_1 = require("node:path");
|
|
7
7
|
const audio_codec_1 = require("./audio-codec");
|
|
8
8
|
const call_ffmpeg_1 = require("./call-ffmpeg");
|
|
9
9
|
const is_audio_codec_1 = require("./is-audio-codec");
|
|
@@ -13,8 +13,8 @@ const combineVideos = async (options) => {
|
|
|
13
13
|
var _a;
|
|
14
14
|
const { files, filelistDir, output, onProgress, numberOfFrames, codec, fps, numberOfGifLoops, audioCodec, } = options;
|
|
15
15
|
const fileList = files.map((p) => `file '${p}'`).join('\n');
|
|
16
|
-
const fileListTxt = (0,
|
|
17
|
-
(0,
|
|
16
|
+
const fileListTxt = (0, node_path_1.join)(filelistDir, 'files.txt');
|
|
17
|
+
(0, node_fs_1.writeFileSync)(fileListTxt, fileList);
|
|
18
18
|
const resolvedAudioCodec = audioCodec !== null && audioCodec !== void 0 ? audioCodec : (0, audio_codec_1.getDefaultAudioCodec)({ codec, preferLossless: false });
|
|
19
19
|
try {
|
|
20
20
|
const task = (0, call_ffmpeg_1.callFf)('ffmpeg', [
|
|
@@ -56,10 +56,10 @@ const combineVideos = async (options) => {
|
|
|
56
56
|
});
|
|
57
57
|
await task;
|
|
58
58
|
onProgress(numberOfFrames);
|
|
59
|
-
(0,
|
|
59
|
+
(0, node_fs_1.rmSync)(filelistDir, { recursive: true });
|
|
60
60
|
}
|
|
61
61
|
catch (err) {
|
|
62
|
-
(0,
|
|
62
|
+
(0, node_fs_1.rmSync)(filelistDir, { recursive: true });
|
|
63
63
|
throw err;
|
|
64
64
|
}
|
|
65
65
|
};
|
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.callCompositor = exports.compose = exports.serializeCommand = void 0;
|
|
4
|
-
const
|
|
5
|
-
const
|
|
6
|
-
const
|
|
4
|
+
const node_child_process_1 = require("node:child_process");
|
|
5
|
+
const node_crypto_1 = require("node:crypto");
|
|
6
|
+
const node_fs_1 = require("node:fs");
|
|
7
|
+
const promises_1 = require("node:fs/promises");
|
|
7
8
|
const call_ffmpeg_1 = require("../call-ffmpeg");
|
|
8
9
|
const get_executable_path_1 = require("./get-executable-path");
|
|
9
10
|
const make_nonce_1 = require("./make-nonce");
|
|
10
11
|
const getCompositorHash = ({ ...input }) => {
|
|
11
|
-
return (0,
|
|
12
|
+
return (0, node_crypto_1.createHash)('sha256').update(JSON.stringify(input)).digest('base64');
|
|
12
13
|
};
|
|
13
14
|
const serializeCommand = (command, params) => {
|
|
14
15
|
return {
|
|
@@ -39,9 +40,11 @@ const compose = async ({ height, width, layers, output, downloadMap, imageFormat
|
|
|
39
40
|
exports.compose = compose;
|
|
40
41
|
const callCompositor = (payload) => {
|
|
41
42
|
return new Promise((resolve, reject) => {
|
|
42
|
-
const
|
|
43
|
-
|
|
44
|
-
|
|
43
|
+
const execPath = (0, get_executable_path_1.getExecutablePath)('compositor');
|
|
44
|
+
if (!process.env.READ_ONLY_FS) {
|
|
45
|
+
(0, node_fs_1.chmodSync)(execPath, 0o755);
|
|
46
|
+
}
|
|
47
|
+
const child = (0, node_child_process_1.spawn)(execPath, [payload], (0, call_ffmpeg_1.dynamicLibraryPathOptions)());
|
|
45
48
|
const stderrChunks = [];
|
|
46
49
|
child.stderr.on('data', (d) => stderrChunks.push(d));
|
|
47
50
|
child.on('close', (code) => {
|
|
@@ -62,6 +65,8 @@ const callCompositor = (payload) => {
|
|
|
62
65
|
}
|
|
63
66
|
}
|
|
64
67
|
});
|
|
68
|
+
child.stdin.write(payload);
|
|
69
|
+
child.stdin.end();
|
|
65
70
|
});
|
|
66
71
|
};
|
|
67
72
|
exports.callCompositor = callCompositor;
|
|
@@ -7,6 +7,6 @@ declare type Compositor = {
|
|
|
7
7
|
pid: number | null;
|
|
8
8
|
};
|
|
9
9
|
export declare const getIdealMaximumFrameCacheItems: () => number;
|
|
10
|
-
export declare const startLongRunningCompositor: (maximumFrameCacheItems: number, verbose: boolean) => Compositor;
|
|
11
|
-
export declare const startCompositor: <T extends keyof CompositorCommand>(type: T, payload: CompositorCommand[T]) => Compositor;
|
|
10
|
+
export declare const startLongRunningCompositor: (maximumFrameCacheItems: number, verbose: boolean, indent: boolean) => Compositor;
|
|
11
|
+
export declare const startCompositor: <T extends keyof CompositorCommand>(type: T, payload: CompositorCommand[T], indent: boolean) => Compositor;
|
|
12
12
|
export {};
|
|
@@ -4,15 +4,17 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.startCompositor = exports.startLongRunningCompositor = exports.getIdealMaximumFrameCacheItems = void 0;
|
|
7
|
-
const
|
|
8
|
-
const
|
|
7
|
+
const node_child_process_1 = require("node:child_process");
|
|
8
|
+
const node_fs_1 = require("node:fs");
|
|
9
|
+
const node_os_1 = __importDefault(require("node:os"));
|
|
9
10
|
const call_ffmpeg_1 = require("../call-ffmpeg");
|
|
10
11
|
const get_concurrency_1 = require("../get-concurrency");
|
|
12
|
+
const logger_1 = require("../logger");
|
|
11
13
|
const compose_1 = require("./compose");
|
|
12
14
|
const get_executable_path_1 = require("./get-executable-path");
|
|
13
15
|
const make_nonce_1 = require("./make-nonce");
|
|
14
16
|
const getIdealMaximumFrameCacheItems = () => {
|
|
15
|
-
const freeMemory =
|
|
17
|
+
const freeMemory = node_os_1.default.freemem();
|
|
16
18
|
// Assuming 1 frame is approximately 6MB
|
|
17
19
|
// Assuming only half the available memory should be used
|
|
18
20
|
const max = Math.floor(freeMemory / (1024 * 1024 * 6));
|
|
@@ -21,26 +23,29 @@ const getIdealMaximumFrameCacheItems = () => {
|
|
|
21
23
|
return Math.max(100, Math.min(max, 1000));
|
|
22
24
|
};
|
|
23
25
|
exports.getIdealMaximumFrameCacheItems = getIdealMaximumFrameCacheItems;
|
|
24
|
-
const startLongRunningCompositor = (maximumFrameCacheItems, verbose) => {
|
|
26
|
+
const startLongRunningCompositor = (maximumFrameCacheItems, verbose, indent) => {
|
|
25
27
|
return (0, exports.startCompositor)('StartLongRunningProcess', {
|
|
26
28
|
concurrency: (0, get_concurrency_1.getActualConcurrency)(null),
|
|
27
29
|
maximum_frame_cache_items: maximumFrameCacheItems,
|
|
28
30
|
verbose,
|
|
29
|
-
});
|
|
31
|
+
}, indent);
|
|
30
32
|
};
|
|
31
33
|
exports.startLongRunningCompositor = startLongRunningCompositor;
|
|
32
|
-
const startCompositor = (type, payload) => {
|
|
34
|
+
const startCompositor = (type, payload, indent) => {
|
|
33
35
|
var _a;
|
|
34
36
|
const bin = (0, get_executable_path_1.getExecutablePath)('compositor');
|
|
37
|
+
if (!process.env.READ_ONLY_FS) {
|
|
38
|
+
(0, node_fs_1.chmodSync)(bin, 0o755);
|
|
39
|
+
}
|
|
35
40
|
const fullCommand = (0, compose_1.serializeCommand)(type, payload);
|
|
36
|
-
const child = (0,
|
|
41
|
+
const child = (0, node_child_process_1.spawn)(bin, [JSON.stringify(fullCommand)], (0, call_ffmpeg_1.dynamicLibraryPathOptions)());
|
|
37
42
|
const stderrChunks = [];
|
|
38
43
|
let outputBuffer = Buffer.from('');
|
|
39
44
|
const separator = Buffer.from('remotion_buffer:');
|
|
40
45
|
const waiters = new Map();
|
|
41
46
|
const onMessage = (statusType, nonce, data) => {
|
|
42
47
|
if (nonce === '0') {
|
|
43
|
-
|
|
48
|
+
logger_1.Log.verboseAdvanced({ indent, logLevel: (0, logger_1.getLogLevel)(), tag: 'COMPOSITOR' }, data.toString('utf8'));
|
|
44
49
|
}
|
|
45
50
|
if (waiters.has(nonce)) {
|
|
46
51
|
if (statusType === 'error') {
|
|
@@ -8,17 +8,8 @@ function isMusl() {
|
|
|
8
8
|
return !glibcVersionRuntime;
|
|
9
9
|
}
|
|
10
10
|
const getExecutablePath = (type) => {
|
|
11
|
-
if (type === 'ffmpeg' && process.env.FFMPEG_BIN_PATH) {
|
|
12
|
-
return '/opt/ffmpeg/remotion/bin/ffmpeg';
|
|
13
|
-
}
|
|
14
|
-
if (type === 'ffprobe' && process.env.FFPROBE_BIN_PATH) {
|
|
15
|
-
return '/opt/ffmpeg/remotion/bin/ffprobe';
|
|
16
|
-
}
|
|
17
|
-
if (type === 'ffmpeg-cwd' && process.env.FFMPEG_CWD) {
|
|
18
|
-
return '/opt/ffmpeg';
|
|
19
|
-
}
|
|
20
11
|
if (type === 'compositor' && process.env.COMPOSITOR_PATH) {
|
|
21
|
-
return
|
|
12
|
+
return process.env.COMPOSITOR_PATH;
|
|
22
13
|
}
|
|
23
14
|
const key = type === 'compositor'
|
|
24
15
|
? 'binaryPath'
|
|
@@ -4,9 +4,6 @@ export declare const createFfmpegComplexFilter: ({ filters, downloadMap, }: {
|
|
|
4
4
|
filters: PreprocessedAudioTrack[];
|
|
5
5
|
downloadMap: DownloadMap;
|
|
6
6
|
}) => Promise<{
|
|
7
|
-
complexFilterFlag: [
|
|
8
|
-
string,
|
|
9
|
-
string
|
|
10
|
-
] | null;
|
|
7
|
+
complexFilterFlag: [string, string] | null;
|
|
11
8
|
cleanup: () => void;
|
|
12
9
|
}>;
|
package/dist/delete-directory.js
CHANGED
|
@@ -24,13 +24,13 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|
|
24
24
|
};
|
|
25
25
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
26
|
exports.deleteDirectory = void 0;
|
|
27
|
-
const
|
|
27
|
+
const node_fs_1 = __importStar(require("node:fs"));
|
|
28
28
|
const is_serve_url_1 = require("./is-serve-url");
|
|
29
29
|
const deleteDirectory = (directory) => {
|
|
30
30
|
if ((0, is_serve_url_1.isServeUrl)(directory)) {
|
|
31
31
|
return;
|
|
32
32
|
}
|
|
33
|
-
if (!(0,
|
|
33
|
+
if (!(0, node_fs_1.existsSync)(directory)) {
|
|
34
34
|
return;
|
|
35
35
|
}
|
|
36
36
|
// Working around a bug with NodeJS 16 on Windows:
|
|
@@ -41,7 +41,7 @@ const deleteDirectory = (directory) => {
|
|
|
41
41
|
let retries = 2;
|
|
42
42
|
while (retries >= 0) {
|
|
43
43
|
try {
|
|
44
|
-
|
|
44
|
+
node_fs_1.default.rmSync(directory, {
|
|
45
45
|
maxRetries: 2,
|
|
46
46
|
recursive: true,
|
|
47
47
|
force: true,
|
package/dist/does-have-m2-bug.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.warnAboutM2Bug = void 0;
|
|
4
|
-
const
|
|
4
|
+
const node_os_1 = require("node:os");
|
|
5
5
|
const warnAboutM2Bug = (codec, pixelFormat) => {
|
|
6
|
-
const isM2 = (0,
|
|
6
|
+
const isM2 = (0, node_os_1.cpus)().find((c) => c.model.includes('Apple M2'));
|
|
7
7
|
if (codec === 'prores' && pixelFormat === 'yuv422p10le' && isM2) {
|
|
8
8
|
console.warn();
|
|
9
9
|
console.warn('⚠️ Known issue: Apple M2 CPUs currently suffer from a bug where transparent ProRes videos have flickering. https://github.com/remotion-dev/remotion/issues/1929');
|
|
@@ -4,12 +4,12 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.ensureOutputDirectory = 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 ensureOutputDirectory = (outputLocation) => {
|
|
10
|
-
const dirName =
|
|
11
|
-
if (!
|
|
12
|
-
|
|
10
|
+
const dirName = node_path_1.default.dirname(outputLocation);
|
|
11
|
+
if (!node_fs_1.default.existsSync(dirName)) {
|
|
12
|
+
node_fs_1.default.mkdirSync(dirName, {
|
|
13
13
|
recursive: true,
|
|
14
14
|
});
|
|
15
15
|
}
|
|
@@ -29,25 +29,25 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
29
29
|
};
|
|
30
30
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
31
31
|
exports.makeFfmpegFilterFileStr = exports.makeFfmpegFilterFile = void 0;
|
|
32
|
-
const
|
|
33
|
-
const
|
|
32
|
+
const node_fs_1 = __importStar(require("node:fs"));
|
|
33
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
34
34
|
const makeFfmpegFilterFile = (complexFilter, downloadMap) => {
|
|
35
35
|
return (0, exports.makeFfmpegFilterFileStr)(complexFilter.filter, downloadMap);
|
|
36
36
|
};
|
|
37
37
|
exports.makeFfmpegFilterFile = makeFfmpegFilterFile;
|
|
38
38
|
const makeFfmpegFilterFileStr = async (complexFilter, downloadMap) => {
|
|
39
39
|
const random = Math.random().toString().replace('.', '');
|
|
40
|
-
const filterFile =
|
|
40
|
+
const filterFile = node_path_1.default.join(downloadMap.complexFilter, 'complex-filter-' + random + '.txt');
|
|
41
41
|
// Race condition: Sometimes the download map is deleted before the file is written.
|
|
42
42
|
// Can remove this once the original bug has been fixed
|
|
43
|
-
if (!(0,
|
|
44
|
-
|
|
43
|
+
if (!(0, node_fs_1.existsSync)(downloadMap.complexFilter)) {
|
|
44
|
+
node_fs_1.default.mkdirSync(downloadMap.complexFilter, { recursive: true });
|
|
45
45
|
}
|
|
46
|
-
await
|
|
46
|
+
await node_fs_1.default.promises.writeFile(filterFile, complexFilter);
|
|
47
47
|
return {
|
|
48
48
|
file: filterFile,
|
|
49
49
|
cleanup: () => {
|
|
50
|
-
|
|
50
|
+
node_fs_1.default.unlinkSync(filterFile);
|
|
51
51
|
},
|
|
52
52
|
};
|
|
53
53
|
};
|
|
@@ -4,19 +4,19 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.findRemotionRoot = exports.findClosestPackageJson = 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 recursionLimit = 5;
|
|
10
10
|
const findClosestPackageJson = () => {
|
|
11
11
|
let currentDir = process.cwd();
|
|
12
12
|
let possiblePackageJson = '';
|
|
13
13
|
for (let i = 0; i < recursionLimit; i++) {
|
|
14
|
-
possiblePackageJson =
|
|
15
|
-
const exists =
|
|
14
|
+
possiblePackageJson = node_path_1.default.join(currentDir, 'package.json');
|
|
15
|
+
const exists = node_fs_1.default.existsSync(possiblePackageJson);
|
|
16
16
|
if (exists) {
|
|
17
17
|
return possiblePackageJson;
|
|
18
18
|
}
|
|
19
|
-
currentDir =
|
|
19
|
+
currentDir = node_path_1.default.dirname(currentDir);
|
|
20
20
|
}
|
|
21
21
|
return null;
|
|
22
22
|
};
|
|
@@ -26,6 +26,6 @@ const findRemotionRoot = () => {
|
|
|
26
26
|
if (closestPackageJson === null) {
|
|
27
27
|
return process.cwd();
|
|
28
28
|
}
|
|
29
|
-
return
|
|
29
|
+
return node_path_1.default.dirname(closestPackageJson);
|
|
30
30
|
};
|
|
31
31
|
exports.findRemotionRoot = findRemotionRoot;
|
package/dist/get-compositions.js
CHANGED
|
@@ -68,7 +68,7 @@ const getCompositions = async (serveUrlOrWebpackUrl, config) => {
|
|
|
68
68
|
chromiumOptions: (_c = config === null || config === void 0 ? void 0 : config.chromiumOptions) !== null && _c !== void 0 ? _c : {},
|
|
69
69
|
});
|
|
70
70
|
return new Promise((resolve, reject) => {
|
|
71
|
-
var _a, _b;
|
|
71
|
+
var _a, _b, _c;
|
|
72
72
|
const onError = (err) => reject(err);
|
|
73
73
|
const cleanupPageError = (0, handle_javascript_exception_1.handleJavascriptException)({
|
|
74
74
|
page,
|
|
@@ -85,6 +85,7 @@ const getCompositions = async (serveUrlOrWebpackUrl, config) => {
|
|
|
85
85
|
remotionRoot: (0, find_closest_package_json_1.findRemotionRoot)(),
|
|
86
86
|
concurrency: 1,
|
|
87
87
|
verbose: (_b = config === null || config === void 0 ? void 0 : config.verbose) !== null && _b !== void 0 ? _b : false,
|
|
88
|
+
indent: (_c = config === null || config === void 0 ? void 0 : config.indent) !== null && _c !== void 0 ? _c : false,
|
|
88
89
|
})
|
|
89
90
|
.then(({ serveUrl, closeServer, offthreadPort }) => {
|
|
90
91
|
close = closeServer;
|
package/dist/get-concurrency.js
CHANGED
|
@@ -4,12 +4,12 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.getActualConcurrency = void 0;
|
|
7
|
-
const
|
|
7
|
+
const node_os_1 = __importDefault(require("node:os"));
|
|
8
8
|
const getActualConcurrency = (userPreference) => {
|
|
9
9
|
if (userPreference === null) {
|
|
10
|
-
return Math.round(Math.min(8, Math.max(1,
|
|
10
|
+
return Math.round(Math.min(8, Math.max(1, node_os_1.default.cpus().length / 2)));
|
|
11
11
|
}
|
|
12
|
-
const max =
|
|
12
|
+
const max = node_os_1.default.cpus().length;
|
|
13
13
|
const min = 1;
|
|
14
14
|
let rounded;
|
|
15
15
|
if (typeof userPreference === 'string') {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { AudioCodec } from './audio-codec';
|
|
2
2
|
import type { Codec } from './codec';
|
|
3
3
|
import type { FileExtension } from './file-extensions';
|
|
4
|
-
export declare const getFileExtensionFromCodec: <T extends "
|
|
5
|
-
export declare const makeFileExtensionMap: () => Record<string, ("
|
|
4
|
+
export declare const getFileExtensionFromCodec: <T extends "h264" | "h265" | "vp8" | "vp9" | "mp3" | "aac" | "wav" | "prores" | "h264-mkv" | "gif">(codec: T, audioCodec: AudioCodec | null) => FileExtension;
|
|
5
|
+
export declare const makeFileExtensionMap: () => Record<string, ("h264" | "h265" | "vp8" | "vp9" | "mp3" | "aac" | "wav" | "prores" | "h264-mkv" | "gif")[]>;
|
|
6
6
|
export declare const defaultCodecsForFileExtension: Record<FileExtension, Codec>;
|
|
@@ -4,12 +4,12 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.getExtensionOfFilename = void 0;
|
|
7
|
-
const
|
|
7
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
8
8
|
const getExtensionOfFilename = (filename) => {
|
|
9
9
|
if (filename === null) {
|
|
10
10
|
return null;
|
|
11
11
|
}
|
|
12
|
-
const filenameArr =
|
|
12
|
+
const filenameArr = node_path_1.default.normalize(filename).split('.');
|
|
13
13
|
const hasExtension = filenameArr.length >= 2;
|
|
14
14
|
const filenameArrLength = filenameArr.length;
|
|
15
15
|
const extension = hasExtension ? filenameArr[filenameArrLength - 1] : null;
|