@remotion/renderer 4.0.0-alpha4 → 4.0.0-alpha5
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/README.md +5 -43
- package/dist/assets/download-map.d.ts +0 -26
- package/dist/assets/download-map.js +0 -5
- package/dist/assets/get-audio-channels.d.ts +1 -2
- package/dist/assets/get-audio-channels.js +5 -9
- package/dist/audio-codec.d.ts +4 -3
- package/dist/audio-codec.js +3 -9
- package/dist/browser/BrowserFetcher.d.ts +0 -1
- package/dist/browser/BrowserFetcher.js +1 -2
- package/dist/browser/BrowserRunner.js +8 -2
- package/dist/browser/FrameManager.js +2 -3
- package/dist/browser/LaunchOptions.d.ts +1 -0
- package/dist/browser/Launcher.js +2 -1
- package/dist/browser/devtools-commands.d.ts +5 -1
- package/dist/browser/devtools-types.d.ts +78 -0
- package/dist/browser/is-target-closed-err.d.ts +1 -0
- package/dist/browser/is-target-closed-err.js +9 -0
- package/dist/call-ffmpeg.d.ts +14 -0
- package/dist/call-ffmpeg.js +37 -0
- package/dist/check-apple-silicon.js +2 -45
- package/dist/client.d.ts +67 -42
- package/dist/client.js +27 -1
- package/dist/codec-supports-media.d.ts +2 -1
- package/dist/codec-supports-media.js +20 -5
- package/dist/combine-videos.d.ts +0 -3
- package/dist/combine-videos.js +5 -9
- package/dist/compositor/compose.d.ts +3 -1
- package/dist/compositor/compose.js +34 -14
- package/dist/compositor/compositor.d.ts +12 -0
- package/dist/compositor/compositor.js +202 -0
- package/dist/compositor/get-executable-path.d.ts +1 -1
- package/dist/compositor/get-executable-path.js +27 -8
- package/dist/compositor/make-nonce.d.ts +1 -0
- package/dist/compositor/make-nonce.js +8 -0
- package/dist/compositor/payloads.d.ts +34 -7
- package/dist/create-ffmpeg-complex-filter.d.ts +5 -5
- package/dist/create-ffmpeg-complex-filter.js +2 -4
- package/dist/create-ffmpeg-merge-filter.d.ts +2 -5
- package/dist/create-ffmpeg-merge-filter.js +2 -10
- package/dist/create-silent-audio.d.ts +1 -4
- package/dist/create-silent-audio.js +3 -7
- package/dist/crf.js +8 -2
- package/dist/delete-directory.js +16 -16
- package/dist/file-extensions.d.ts +1 -12
- package/dist/file-extensions.js +1 -13
- package/dist/get-compositions.d.ts +3 -5
- package/dist/get-compositions.js +8 -11
- package/dist/get-extension-from-codec.d.ts +2 -2
- package/dist/get-frame-padded-index.d.ts +2 -1
- package/dist/guess-extension-for-media.d.ts +1 -3
- package/dist/guess-extension-for-media.js +4 -8
- package/dist/image-format.d.ts +12 -6
- package/dist/image-format.js +16 -13
- package/dist/index.d.ts +66 -59
- package/dist/index.js +15 -17
- package/dist/jpeg-quality.d.ts +1 -0
- package/dist/jpeg-quality.js +21 -0
- package/dist/merge-audio-track.d.ts +0 -2
- package/dist/merge-audio-track.js +3 -10
- package/dist/offthread-video-server.d.ts +8 -8
- package/dist/offthread-video-server.js +63 -56
- package/dist/open-browser.d.ts +1 -0
- package/dist/open-browser.js +7 -6
- package/dist/options/audio-bitrate.d.ts +2 -0
- package/dist/options/audio-bitrate.js +11 -0
- package/dist/options/crf.d.ts +2 -0
- package/dist/options/crf.js +11 -0
- package/dist/options/enforce-audio.d.ts +2 -0
- package/dist/options/enforce-audio.js +11 -0
- package/dist/options/jpeg-quality.d.ts +2 -0
- package/dist/options/jpeg-quality.js +11 -0
- package/dist/options/mute.d.ts +2 -0
- package/dist/options/mute.js +11 -0
- package/dist/options/option.d.ts +8 -0
- package/dist/options/option.js +2 -0
- package/dist/options/scale.d.ts +2 -0
- package/dist/options/scale.js +11 -0
- package/dist/options/video-bitrate.d.ts +2 -0
- package/dist/options/video-bitrate.js +11 -0
- package/dist/options/video-codec.d.ts +2 -0
- package/dist/options/video-codec.js +11 -0
- package/dist/perf.d.ts +1 -1
- package/dist/perf.js +9 -7
- package/dist/prepare-server.d.ts +3 -4
- package/dist/prepare-server.js +5 -5
- package/dist/preprocess-audio-track.d.ts +0 -4
- package/dist/preprocess-audio-track.js +4 -8
- package/dist/prespawn-ffmpeg.d.ts +6 -9
- package/dist/prespawn-ffmpeg.js +7 -12
- package/dist/prestitcher-memory-usage.d.ts +0 -4
- package/dist/prestitcher-memory-usage.js +2 -3
- package/dist/prores-profile.d.ts +1 -2
- package/dist/prores-profile.js +4 -4
- package/dist/provide-screenshot.d.ts +4 -5
- package/dist/provide-screenshot.js +2 -2
- package/dist/puppeteer-screenshot.d.ts +3 -3
- package/dist/puppeteer-screenshot.js +9 -32
- package/dist/render-frames.d.ts +13 -25
- package/dist/render-frames.js +29 -40
- package/dist/render-media.d.ts +16 -18
- package/dist/render-media.js +33 -43
- package/dist/render-still.d.ts +10 -8
- package/dist/render-still.js +14 -13
- package/dist/screenshot-dom-element.d.ts +4 -5
- package/dist/screenshot-dom-element.js +6 -3
- package/dist/screenshot-task.d.ts +2 -3
- package/dist/screenshot-task.js +38 -23
- package/dist/serve-handler/index.js +6 -4
- package/dist/serve-static.d.ts +2 -3
- package/dist/serve-static.js +24 -20
- package/dist/stitch-frames-to-video.d.ts +2 -12
- package/dist/stitch-frames-to-video.js +24 -33
- package/dist/take-frame-and-compose.d.ts +4 -5
- package/dist/take-frame-and-compose.js +12 -6
- package/dist/tmp-dir.js +1 -2
- package/dist/validate-concurrency.d.ts +2 -0
- package/dist/validate-concurrency.js +11 -5
- package/dist/validate-output-filename.d.ts +1 -1
- package/dist/validate-puppeteer-timeout.js +1 -0
- package/install-toolchain.mjs +36 -0
- package/package.json +11 -10
package/dist/client.d.ts
CHANGED
|
@@ -1,97 +1,99 @@
|
|
|
1
1
|
export declare const BrowserSafeApis: {
|
|
2
|
-
getFileExtensionFromCodec: <T extends "
|
|
2
|
+
getFileExtensionFromCodec: <T extends "aac" | "mp3" | "h264" | "h265" | "vp8" | "vp9" | "wav" | "prores" | "h264-mkv" | "gif">(codec: T, audioCodec: "pcm-16" | "aac" | "mp3" | "opus" | null) => import("./file-extensions").FileExtension;
|
|
3
3
|
validCodecs: readonly ["h264", "h265", "vp8", "vp9", "mp3", "aac", "wav", "prores", "h264-mkv", "gif"];
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
4
|
+
validAudioCodecs: readonly ["pcm-16", "aac", "mp3", "opus"];
|
|
5
|
+
getDefaultCrfForCodec: (codec: "aac" | "mp3" | "h264" | "h265" | "vp8" | "vp9" | "wav" | "prores" | "h264-mkv" | "gif") => number;
|
|
6
|
+
getValidCrfRanges: (codec: "aac" | "mp3" | "h264" | "h265" | "vp8" | "vp9" | "wav" | "prores" | "h264-mkv" | "gif") => [number, number];
|
|
7
|
+
isAudioCodec: (codec: "aac" | "mp3" | "h264" | "h265" | "vp8" | "vp9" | "wav" | "prores" | "h264-mkv" | "gif" | undefined) => boolean;
|
|
8
|
+
proResProfileOptions: readonly ["4444-xq", "4444", "hq", "standard", "light", "proxy"];
|
|
7
9
|
validPixelFormats: readonly ["yuv420p", "yuva420p", "yuv422p", "yuv444p", "yuv420p10le", "yuv422p10le", "yuv444p10le", "yuva444p10le"];
|
|
8
10
|
DEFAULT_PIXEL_FORMAT: "yuv420p" | "yuva420p" | "yuv422p" | "yuv444p" | "yuv420p10le" | "yuv422p10le" | "yuv444p10le" | "yuva444p10le";
|
|
9
11
|
supportedAudioCodecs: {
|
|
10
12
|
readonly h264: readonly ["aac", "pcm-16"];
|
|
11
13
|
readonly 'h264-mkv': readonly ["pcm-16"];
|
|
12
14
|
readonly aac: readonly ["aac", "pcm-16"];
|
|
13
|
-
readonly gif:
|
|
15
|
+
readonly gif: const[];
|
|
14
16
|
readonly h265: readonly ["aac", "pcm-16"];
|
|
15
17
|
readonly mp3: readonly ["mp3", "pcm-16"];
|
|
16
|
-
readonly prores: readonly ["
|
|
18
|
+
readonly prores: readonly ["aac", "pcm-16"];
|
|
17
19
|
readonly vp8: readonly ["opus", "pcm-16"];
|
|
18
20
|
readonly vp9: readonly ["opus", "pcm-16"];
|
|
19
21
|
readonly wav: readonly ["pcm-16"];
|
|
20
22
|
};
|
|
21
23
|
defaultFileExtensionMap: {
|
|
22
|
-
|
|
24
|
+
aac: {
|
|
23
25
|
default: import("./file-extensions").FileExtension;
|
|
24
26
|
forAudioCodec: {
|
|
25
|
-
|
|
27
|
+
"pcm-16": {
|
|
26
28
|
possible: import("./file-extensions").FileExtension[];
|
|
27
29
|
default: import("./file-extensions").FileExtension;
|
|
28
30
|
};
|
|
29
|
-
|
|
31
|
+
aac: {
|
|
30
32
|
possible: import("./file-extensions").FileExtension[];
|
|
31
33
|
default: import("./file-extensions").FileExtension;
|
|
32
34
|
};
|
|
33
35
|
};
|
|
34
36
|
};
|
|
35
|
-
|
|
37
|
+
mp3: {
|
|
36
38
|
default: import("./file-extensions").FileExtension;
|
|
37
39
|
forAudioCodec: {
|
|
38
|
-
|
|
40
|
+
"pcm-16": {
|
|
39
41
|
possible: import("./file-extensions").FileExtension[];
|
|
40
42
|
default: import("./file-extensions").FileExtension;
|
|
41
43
|
};
|
|
42
|
-
|
|
44
|
+
mp3: {
|
|
43
45
|
possible: import("./file-extensions").FileExtension[];
|
|
44
46
|
default: import("./file-extensions").FileExtension;
|
|
45
47
|
};
|
|
46
48
|
};
|
|
47
49
|
};
|
|
48
|
-
|
|
50
|
+
h264: {
|
|
49
51
|
default: import("./file-extensions").FileExtension;
|
|
50
52
|
forAudioCodec: {
|
|
51
53
|
"pcm-16": {
|
|
52
54
|
possible: import("./file-extensions").FileExtension[];
|
|
53
55
|
default: import("./file-extensions").FileExtension;
|
|
54
56
|
};
|
|
55
|
-
|
|
57
|
+
aac: {
|
|
56
58
|
possible: import("./file-extensions").FileExtension[];
|
|
57
59
|
default: import("./file-extensions").FileExtension;
|
|
58
60
|
};
|
|
59
61
|
};
|
|
60
62
|
};
|
|
61
|
-
|
|
63
|
+
h265: {
|
|
62
64
|
default: import("./file-extensions").FileExtension;
|
|
63
65
|
forAudioCodec: {
|
|
64
66
|
"pcm-16": {
|
|
65
67
|
possible: import("./file-extensions").FileExtension[];
|
|
66
68
|
default: import("./file-extensions").FileExtension;
|
|
67
69
|
};
|
|
68
|
-
|
|
70
|
+
aac: {
|
|
69
71
|
possible: import("./file-extensions").FileExtension[];
|
|
70
72
|
default: import("./file-extensions").FileExtension;
|
|
71
73
|
};
|
|
72
74
|
};
|
|
73
75
|
};
|
|
74
|
-
|
|
76
|
+
vp8: {
|
|
75
77
|
default: import("./file-extensions").FileExtension;
|
|
76
78
|
forAudioCodec: {
|
|
77
|
-
|
|
79
|
+
"pcm-16": {
|
|
78
80
|
possible: import("./file-extensions").FileExtension[];
|
|
79
81
|
default: import("./file-extensions").FileExtension;
|
|
80
82
|
};
|
|
81
|
-
|
|
83
|
+
opus: {
|
|
82
84
|
possible: import("./file-extensions").FileExtension[];
|
|
83
85
|
default: import("./file-extensions").FileExtension;
|
|
84
86
|
};
|
|
85
87
|
};
|
|
86
88
|
};
|
|
87
|
-
|
|
89
|
+
vp9: {
|
|
88
90
|
default: import("./file-extensions").FileExtension;
|
|
89
91
|
forAudioCodec: {
|
|
90
|
-
|
|
92
|
+
"pcm-16": {
|
|
91
93
|
possible: import("./file-extensions").FileExtension[];
|
|
92
94
|
default: import("./file-extensions").FileExtension;
|
|
93
95
|
};
|
|
94
|
-
|
|
96
|
+
opus: {
|
|
95
97
|
possible: import("./file-extensions").FileExtension[];
|
|
96
98
|
default: import("./file-extensions").FileExtension;
|
|
97
99
|
};
|
|
@@ -109,11 +111,11 @@ export declare const BrowserSafeApis: {
|
|
|
109
111
|
prores: {
|
|
110
112
|
default: import("./file-extensions").FileExtension;
|
|
111
113
|
forAudioCodec: {
|
|
112
|
-
|
|
114
|
+
"pcm-16": {
|
|
113
115
|
possible: import("./file-extensions").FileExtension[];
|
|
114
116
|
default: import("./file-extensions").FileExtension;
|
|
115
117
|
};
|
|
116
|
-
|
|
118
|
+
aac: {
|
|
117
119
|
possible: import("./file-extensions").FileExtension[];
|
|
118
120
|
default: import("./file-extensions").FileExtension;
|
|
119
121
|
};
|
|
@@ -130,17 +132,30 @@ export declare const BrowserSafeApis: {
|
|
|
130
132
|
};
|
|
131
133
|
gif: {
|
|
132
134
|
default: import("./file-extensions").FileExtension;
|
|
133
|
-
forAudioCodec: {
|
|
135
|
+
forAudioCodec: {
|
|
136
|
+
[x: string]: {
|
|
137
|
+
possible: import("./file-extensions").FileExtension[];
|
|
138
|
+
default: import("./file-extensions").FileExtension;
|
|
139
|
+
};
|
|
140
|
+
};
|
|
134
141
|
};
|
|
135
142
|
};
|
|
136
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
|
+
};
|
|
137
152
|
h264: {
|
|
138
|
-
compressed: "
|
|
139
|
-
lossless: "
|
|
153
|
+
compressed: "pcm-16" | "aac" | null;
|
|
154
|
+
lossless: "pcm-16" | "aac" | null;
|
|
140
155
|
};
|
|
141
156
|
h265: {
|
|
142
|
-
compressed: "
|
|
143
|
-
lossless: "
|
|
157
|
+
compressed: "pcm-16" | "aac" | null;
|
|
158
|
+
lossless: "pcm-16" | "aac" | null;
|
|
144
159
|
};
|
|
145
160
|
vp8: {
|
|
146
161
|
compressed: "pcm-16" | "opus" | null;
|
|
@@ -150,30 +165,40 @@ export declare const BrowserSafeApis: {
|
|
|
150
165
|
compressed: "pcm-16" | "opus" | null;
|
|
151
166
|
lossless: "pcm-16" | "opus" | null;
|
|
152
167
|
};
|
|
153
|
-
mp3: {
|
|
154
|
-
compressed: "mp3" | "pcm-16" | null;
|
|
155
|
-
lossless: "mp3" | "pcm-16" | null;
|
|
156
|
-
};
|
|
157
|
-
aac: {
|
|
158
|
-
compressed: "aac" | "pcm-16" | null;
|
|
159
|
-
lossless: "aac" | "pcm-16" | null;
|
|
160
|
-
};
|
|
161
168
|
wav: {
|
|
162
169
|
compressed: "pcm-16" | null;
|
|
163
170
|
lossless: "pcm-16" | null;
|
|
164
171
|
};
|
|
165
172
|
prores: {
|
|
166
|
-
compressed: "
|
|
167
|
-
lossless: "
|
|
173
|
+
compressed: "pcm-16" | "aac" | null;
|
|
174
|
+
lossless: "pcm-16" | "aac" | null;
|
|
168
175
|
};
|
|
169
176
|
"h264-mkv": {
|
|
170
177
|
compressed: "pcm-16" | null;
|
|
171
178
|
lossless: "pcm-16" | null;
|
|
172
179
|
};
|
|
173
180
|
gif: {
|
|
174
|
-
compressed:
|
|
175
|
-
lossless:
|
|
181
|
+
compressed: any;
|
|
182
|
+
lossless: any;
|
|
176
183
|
};
|
|
177
184
|
};
|
|
178
|
-
defaultCodecsForFileExtension: Record<import("./file-extensions").FileExtension, "
|
|
185
|
+
defaultCodecsForFileExtension: Record<import("./file-extensions").FileExtension, "aac" | "mp3" | "h264" | "h265" | "vp8" | "vp9" | "wav" | "prores" | "h264-mkv" | "gif">;
|
|
186
|
+
validateOutputFilename: <T_1 extends "aac" | "mp3" | "h264" | "h265" | "vp8" | "vp9" | "wav" | "prores" | "h264-mkv" | "gif">({ codec, audioCodec, extension, preferLossless, }: {
|
|
187
|
+
codec: T_1;
|
|
188
|
+
audioCodec: "pcm-16" | "aac" | "mp3" | "opus" | null;
|
|
189
|
+
extension: string;
|
|
190
|
+
preferLossless: boolean;
|
|
191
|
+
}) => void;
|
|
192
|
+
options: {
|
|
193
|
+
scaleOption: import(".").RemotionOption;
|
|
194
|
+
crfOption: import(".").RemotionOption;
|
|
195
|
+
jpegQualityOption: import(".").RemotionOption;
|
|
196
|
+
videoBitrate: import(".").RemotionOption;
|
|
197
|
+
audioBitrateOption: import(".").RemotionOption;
|
|
198
|
+
enforceAudioOption: import(".").RemotionOption;
|
|
199
|
+
muteOption: import(".").RemotionOption;
|
|
200
|
+
videoCodecOption: import(".").RemotionOption;
|
|
201
|
+
};
|
|
202
|
+
codecSupportsCrf: (codec: "aac" | "mp3" | "h264" | "h265" | "vp8" | "vp9" | "wav" | "prores" | "h264-mkv" | "gif") => boolean;
|
|
203
|
+
codecSupportsVideoBitrate: (codec: "aac" | "mp3" | "h264" | "h265" | "vp8" | "vp9" | "wav" | "prores" | "h264-mkv" | "gif") => boolean;
|
|
179
204
|
};
|
package/dist/client.js
CHANGED
|
@@ -3,21 +3,47 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.BrowserSafeApis = void 0;
|
|
4
4
|
const audio_codec_1 = require("./audio-codec");
|
|
5
5
|
const codec_1 = require("./codec");
|
|
6
|
+
const codec_supports_media_1 = require("./codec-supports-media");
|
|
6
7
|
const crf_1 = require("./crf");
|
|
7
8
|
const file_extensions_1 = require("./file-extensions");
|
|
8
9
|
const get_extension_from_codec_1 = require("./get-extension-from-codec");
|
|
9
10
|
const is_audio_codec_1 = require("./is-audio-codec");
|
|
11
|
+
const audio_bitrate_1 = require("./options/audio-bitrate");
|
|
12
|
+
const crf_2 = require("./options/crf");
|
|
13
|
+
const enforce_audio_1 = require("./options/enforce-audio");
|
|
14
|
+
const jpeg_quality_1 = require("./options/jpeg-quality");
|
|
15
|
+
const mute_1 = require("./options/mute");
|
|
16
|
+
const scale_1 = require("./options/scale");
|
|
17
|
+
const video_bitrate_1 = require("./options/video-bitrate");
|
|
18
|
+
const video_codec_1 = require("./options/video-codec");
|
|
10
19
|
const pixel_format_1 = require("./pixel-format");
|
|
20
|
+
const prores_profile_1 = require("./prores-profile");
|
|
21
|
+
const validate_output_filename_1 = require("./validate-output-filename");
|
|
11
22
|
exports.BrowserSafeApis = {
|
|
12
23
|
getFileExtensionFromCodec: get_extension_from_codec_1.getFileExtensionFromCodec,
|
|
13
24
|
validCodecs: codec_1.validCodecs,
|
|
25
|
+
validAudioCodecs: audio_codec_1.validAudioCodecs,
|
|
14
26
|
getDefaultCrfForCodec: crf_1.getDefaultCrfForCodec,
|
|
15
27
|
getValidCrfRanges: crf_1.getValidCrfRanges,
|
|
16
28
|
isAudioCodec: is_audio_codec_1.isAudioCodec,
|
|
29
|
+
proResProfileOptions: prores_profile_1.proResProfileOptions,
|
|
17
30
|
validPixelFormats: pixel_format_1.validPixelFormats,
|
|
18
31
|
DEFAULT_PIXEL_FORMAT: pixel_format_1.DEFAULT_PIXEL_FORMAT,
|
|
19
|
-
supportedAudioCodecs:
|
|
32
|
+
supportedAudioCodecs: audio_codec_1.supportedAudioCodecs,
|
|
20
33
|
defaultFileExtensionMap: file_extensions_1.defaultFileExtensionMap,
|
|
21
34
|
defaultAudioCodecs: audio_codec_1.defaultAudioCodecs,
|
|
22
35
|
defaultCodecsForFileExtension: get_extension_from_codec_1.defaultCodecsForFileExtension,
|
|
36
|
+
validateOutputFilename: validate_output_filename_1.validateOutputFilename,
|
|
37
|
+
options: {
|
|
38
|
+
scaleOption: scale_1.scaleOption,
|
|
39
|
+
crfOption: crf_2.crfOption,
|
|
40
|
+
jpegQualityOption: jpeg_quality_1.jpegQualityOption,
|
|
41
|
+
videoBitrate: video_bitrate_1.videoBitrate,
|
|
42
|
+
audioBitrateOption: audio_bitrate_1.audioBitrateOption,
|
|
43
|
+
enforceAudioOption: enforce_audio_1.enforceAudioOption,
|
|
44
|
+
muteOption: mute_1.muteOption,
|
|
45
|
+
videoCodecOption: video_codec_1.videoCodecOption,
|
|
46
|
+
},
|
|
47
|
+
codecSupportsCrf: codec_supports_media_1.codecSupportsCrf,
|
|
48
|
+
codecSupportsVideoBitrate: codec_supports_media_1.codecSupportsVideoBitrate,
|
|
23
49
|
};
|
|
@@ -4,5 +4,6 @@ declare type MediaSupport = {
|
|
|
4
4
|
audio: boolean;
|
|
5
5
|
};
|
|
6
6
|
export declare const codecSupportsMedia: (codec: Codec) => MediaSupport;
|
|
7
|
-
export declare const codecSupportsCrf: (codec: Codec) => boolean
|
|
7
|
+
export declare const codecSupportsCrf: (codec: Codec) => boolean;
|
|
8
|
+
export declare const codecSupportsVideoBitrate: (codec: Codec) => boolean;
|
|
8
9
|
export {};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.codecSupportsCrf = exports.codecSupportsMedia = void 0;
|
|
4
|
-
const
|
|
3
|
+
exports.codecSupportsVideoBitrate = exports.codecSupportsCrf = exports.codecSupportsMedia = void 0;
|
|
4
|
+
const crf_1 = require("./crf");
|
|
5
5
|
const support = {
|
|
6
6
|
'h264-mkv': {
|
|
7
7
|
audio: true,
|
|
@@ -48,9 +48,24 @@ const codecSupportsMedia = (codec) => {
|
|
|
48
48
|
return support[codec];
|
|
49
49
|
};
|
|
50
50
|
exports.codecSupportsMedia = codecSupportsMedia;
|
|
51
|
+
const codecSupportsVideoBitrateMap = {
|
|
52
|
+
'h264-mkv': true,
|
|
53
|
+
aac: false,
|
|
54
|
+
gif: false,
|
|
55
|
+
h264: true,
|
|
56
|
+
h265: true,
|
|
57
|
+
mp3: false,
|
|
58
|
+
prores: false,
|
|
59
|
+
vp8: true,
|
|
60
|
+
vp9: true,
|
|
61
|
+
wav: false,
|
|
62
|
+
};
|
|
51
63
|
const codecSupportsCrf = (codec) => {
|
|
52
|
-
const
|
|
53
|
-
|
|
54
|
-
return supportsCrf;
|
|
64
|
+
const range = (0, crf_1.getValidCrfRanges)(codec);
|
|
65
|
+
return range[0] !== range[1];
|
|
55
66
|
};
|
|
56
67
|
exports.codecSupportsCrf = codecSupportsCrf;
|
|
68
|
+
const codecSupportsVideoBitrate = (codec) => {
|
|
69
|
+
return codecSupportsVideoBitrateMap[codec];
|
|
70
|
+
};
|
|
71
|
+
exports.codecSupportsVideoBitrate = codecSupportsVideoBitrate;
|
package/dist/combine-videos.d.ts
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import type { AudioCodec } from './audio-codec';
|
|
2
2
|
import type { Codec } from './codec';
|
|
3
|
-
import type { FfmpegExecutable } from './ffmpeg-executable';
|
|
4
3
|
declare type Options = {
|
|
5
4
|
files: string[];
|
|
6
5
|
filelistDir: string;
|
|
@@ -10,8 +9,6 @@ declare type Options = {
|
|
|
10
9
|
codec: Codec;
|
|
11
10
|
fps: number;
|
|
12
11
|
numberOfGifLoops: number | null;
|
|
13
|
-
remotionRoot: string;
|
|
14
|
-
ffmpegExecutable: FfmpegExecutable;
|
|
15
12
|
audioCodec: AudioCodec | null;
|
|
16
13
|
};
|
|
17
14
|
export declare const combineVideos: (options: Options) => Promise<void>;
|
package/dist/combine-videos.js
CHANGED
|
@@ -1,27 +1,23 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
// Combine multiple video chunks, useful for decentralized rendering
|
|
3
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
4
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
5
|
-
};
|
|
6
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
4
|
exports.combineVideos = void 0;
|
|
8
|
-
const execa_1 = __importDefault(require("execa"));
|
|
9
5
|
const fs_1 = require("fs");
|
|
10
6
|
const path_1 = require("path");
|
|
11
7
|
const audio_codec_1 = require("./audio-codec");
|
|
12
|
-
const
|
|
8
|
+
const call_ffmpeg_1 = require("./call-ffmpeg");
|
|
13
9
|
const is_audio_codec_1 = require("./is-audio-codec");
|
|
14
10
|
const parse_ffmpeg_progress_1 = require("./parse-ffmpeg-progress");
|
|
15
11
|
const truthy_1 = require("./truthy");
|
|
16
12
|
const combineVideos = async (options) => {
|
|
17
13
|
var _a;
|
|
18
|
-
const { files, filelistDir, output, onProgress, numberOfFrames, codec, fps, numberOfGifLoops,
|
|
14
|
+
const { files, filelistDir, output, onProgress, numberOfFrames, codec, fps, numberOfGifLoops, audioCodec, } = options;
|
|
19
15
|
const fileList = files.map((p) => `file '${p}'`).join('\n');
|
|
20
16
|
const fileListTxt = (0, path_1.join)(filelistDir, 'files.txt');
|
|
21
17
|
(0, fs_1.writeFileSync)(fileListTxt, fileList);
|
|
22
18
|
const resolvedAudioCodec = audioCodec !== null && audioCodec !== void 0 ? audioCodec : (0, audio_codec_1.getDefaultAudioCodec)({ codec, preferLossless: false });
|
|
23
19
|
try {
|
|
24
|
-
const task = (0,
|
|
20
|
+
const task = (0, call_ffmpeg_1.callFf)('ffmpeg', [
|
|
25
21
|
(0, is_audio_codec_1.isAudioCodec)(codec) ? null : '-r',
|
|
26
22
|
(0, is_audio_codec_1.isAudioCodec)(codec) ? null : String(fps),
|
|
27
23
|
'-f',
|
|
@@ -60,10 +56,10 @@ const combineVideos = async (options) => {
|
|
|
60
56
|
});
|
|
61
57
|
await task;
|
|
62
58
|
onProgress(numberOfFrames);
|
|
63
|
-
(
|
|
59
|
+
(0, fs_1.rmSync)(filelistDir, { recursive: true });
|
|
64
60
|
}
|
|
65
61
|
catch (err) {
|
|
66
|
-
(
|
|
62
|
+
(0, fs_1.rmSync)(filelistDir, { recursive: true });
|
|
67
63
|
throw err;
|
|
68
64
|
}
|
|
69
65
|
};
|
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
import type { DownloadMap } from '../assets/download-map';
|
|
2
|
-
import type { CompositorImageFormat, Layer } from './payloads';
|
|
2
|
+
import type { CompositorCommand, CompositorCommandSerialized, CompositorImageFormat, Layer } from './payloads';
|
|
3
3
|
declare type CompositorInput = {
|
|
4
4
|
height: number;
|
|
5
5
|
width: number;
|
|
6
6
|
layers: Layer[];
|
|
7
7
|
imageFormat: CompositorImageFormat;
|
|
8
8
|
};
|
|
9
|
+
export declare const serializeCommand: <Type extends keyof CompositorCommand>(command: Type, params: CompositorCommand[Type]) => CompositorCommandSerialized<Type>;
|
|
9
10
|
export declare const compose: ({ height, width, layers, output, downloadMap, imageFormat, }: CompositorInput & {
|
|
10
11
|
downloadMap: DownloadMap;
|
|
11
12
|
output: string;
|
|
12
13
|
}) => Promise<void>;
|
|
14
|
+
export declare const callCompositor: (payload: string) => Promise<void>;
|
|
13
15
|
export {};
|
|
@@ -1,31 +1,46 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.compose = void 0;
|
|
3
|
+
exports.callCompositor = exports.compose = exports.serializeCommand = void 0;
|
|
4
4
|
const child_process_1 = require("child_process");
|
|
5
5
|
const crypto_1 = require("crypto");
|
|
6
6
|
const promises_1 = require("fs/promises");
|
|
7
|
+
const call_ffmpeg_1 = require("../call-ffmpeg");
|
|
7
8
|
const get_executable_path_1 = require("./get-executable-path");
|
|
9
|
+
const make_nonce_1 = require("./make-nonce");
|
|
8
10
|
const getCompositorHash = ({ ...input }) => {
|
|
9
11
|
return (0, crypto_1.createHash)('sha256').update(JSON.stringify(input)).digest('base64');
|
|
10
12
|
};
|
|
13
|
+
const serializeCommand = (command, params) => {
|
|
14
|
+
return {
|
|
15
|
+
nonce: (0, make_nonce_1.makeNonce)(),
|
|
16
|
+
payload: {
|
|
17
|
+
type: command,
|
|
18
|
+
params,
|
|
19
|
+
},
|
|
20
|
+
};
|
|
21
|
+
};
|
|
22
|
+
exports.serializeCommand = serializeCommand;
|
|
11
23
|
const compose = async ({ height, width, layers, output, downloadMap, imageFormat, }) => {
|
|
12
|
-
const bin = (0, get_executable_path_1.getExecutablePath)();
|
|
13
24
|
const hash = getCompositorHash({ height, width, layers, imageFormat });
|
|
14
25
|
if (downloadMap.compositorCache[hash]) {
|
|
15
26
|
await (0, promises_1.copyFile)(downloadMap.compositorCache[hash], output);
|
|
16
27
|
return;
|
|
17
28
|
}
|
|
18
|
-
const payload = {
|
|
19
|
-
v: 1,
|
|
29
|
+
const payload = (0, exports.serializeCommand)('Compose', {
|
|
20
30
|
height,
|
|
21
31
|
width,
|
|
22
32
|
layers,
|
|
23
33
|
output,
|
|
24
34
|
output_format: imageFormat,
|
|
25
|
-
};
|
|
26
|
-
await
|
|
27
|
-
|
|
28
|
-
|
|
35
|
+
});
|
|
36
|
+
await (0, exports.callCompositor)(JSON.stringify(payload));
|
|
37
|
+
downloadMap.compositorCache[hash] = output;
|
|
38
|
+
};
|
|
39
|
+
exports.compose = compose;
|
|
40
|
+
const callCompositor = (payload) => {
|
|
41
|
+
return new Promise((resolve, reject) => {
|
|
42
|
+
const child = (0, child_process_1.spawn)((0, get_executable_path_1.getExecutablePath)('compositor'), [payload], (0, call_ffmpeg_1.dynamicLibraryPathOptions)());
|
|
43
|
+
child.stdin.write(payload);
|
|
29
44
|
child.stdin.end();
|
|
30
45
|
const stderrChunks = [];
|
|
31
46
|
child.stderr.on('data', (d) => stderrChunks.push(d));
|
|
@@ -35,13 +50,18 @@ const compose = async ({ height, width, layers, output, downloadMap, imageFormat
|
|
|
35
50
|
}
|
|
36
51
|
else {
|
|
37
52
|
const message = Buffer.concat(stderrChunks).toString('utf-8');
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
53
|
+
try {
|
|
54
|
+
// Try to see if the error is a JSON
|
|
55
|
+
const parsed = JSON.parse(message);
|
|
56
|
+
const msg = `Compositor error: ${parsed.error}`;
|
|
57
|
+
const err = new Error(`${msg}\n${parsed.backtrace}`);
|
|
58
|
+
reject(err);
|
|
59
|
+
}
|
|
60
|
+
catch (err) {
|
|
61
|
+
reject(new Error(`Compositor panicked: ${message}`));
|
|
62
|
+
}
|
|
42
63
|
}
|
|
43
64
|
});
|
|
44
65
|
});
|
|
45
|
-
downloadMap.compositorCache[hash] = output;
|
|
46
66
|
};
|
|
47
|
-
exports.
|
|
67
|
+
exports.callCompositor = callCompositor;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import type { CompositorCommand } from './payloads';
|
|
3
|
+
declare type Compositor = {
|
|
4
|
+
finishCommands: () => void;
|
|
5
|
+
executeCommand: <T extends keyof CompositorCommand>(type: T, payload: CompositorCommand[T]) => Promise<Buffer>;
|
|
6
|
+
waitForDone: () => Promise<void>;
|
|
7
|
+
pid: number | null;
|
|
8
|
+
};
|
|
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;
|
|
12
|
+
export {};
|