@remotion/renderer 4.0.0-alpha4 → 4.0.0-alpha6

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.
Files changed (143) hide show
  1. package/README.md +5 -43
  2. package/dist/assets/download-and-map-assets-to-file.js +6 -6
  3. package/dist/assets/download-file.d.ts +3 -2
  4. package/dist/assets/download-file.js +18 -3
  5. package/dist/assets/download-map.d.ts +0 -26
  6. package/dist/assets/download-map.js +7 -12
  7. package/dist/assets/get-audio-channels.d.ts +1 -2
  8. package/dist/assets/get-audio-channels.js +5 -9
  9. package/dist/assets/read-file.d.ts +1 -1
  10. package/dist/assets/read-file.js +2 -2
  11. package/dist/assets/sanitize-filepath.js +2 -2
  12. package/dist/audio-codec.d.ts +4 -3
  13. package/dist/audio-codec.js +3 -9
  14. package/dist/browser/BrowserFetcher.d.ts +0 -1
  15. package/dist/browser/BrowserFetcher.js +14 -15
  16. package/dist/browser/BrowserRunner.d.ts +1 -1
  17. package/dist/browser/BrowserRunner.js +10 -4
  18. package/dist/browser/FrameManager.js +2 -3
  19. package/dist/browser/LaunchOptions.d.ts +1 -0
  20. package/dist/browser/Launcher.js +6 -5
  21. package/dist/browser/NodeWebSocketTransport.js +4 -4
  22. package/dist/browser/devtools-commands.d.ts +5 -1
  23. package/dist/browser/devtools-types.d.ts +78 -0
  24. package/dist/browser/get-download-destination.js +8 -8
  25. package/dist/browser/is-target-closed-err.d.ts +1 -0
  26. package/dist/browser/is-target-closed-err.js +9 -0
  27. package/dist/call-ffmpeg.d.ts +14 -0
  28. package/dist/call-ffmpeg.js +40 -0
  29. package/dist/check-apple-silicon.js +2 -45
  30. package/dist/client.d.ts +79 -42
  31. package/dist/client.js +27 -1
  32. package/dist/codec-supports-media.d.ts +2 -1
  33. package/dist/codec-supports-media.js +20 -5
  34. package/dist/combine-videos.d.ts +0 -3
  35. package/dist/combine-videos.js +9 -13
  36. package/dist/compositor/compose.d.ts +3 -1
  37. package/dist/compositor/compose.js +41 -18
  38. package/dist/compositor/compositor.d.ts +12 -0
  39. package/dist/compositor/compositor.js +204 -0
  40. package/dist/compositor/get-executable-path.d.ts +1 -1
  41. package/dist/compositor/get-executable-path.js +27 -8
  42. package/dist/compositor/make-nonce.d.ts +1 -0
  43. package/dist/compositor/make-nonce.js +8 -0
  44. package/dist/compositor/payloads.d.ts +34 -7
  45. package/dist/create-ffmpeg-complex-filter.d.ts +5 -5
  46. package/dist/create-ffmpeg-complex-filter.js +2 -4
  47. package/dist/create-ffmpeg-merge-filter.d.ts +2 -5
  48. package/dist/create-ffmpeg-merge-filter.js +2 -10
  49. package/dist/create-silent-audio.d.ts +1 -4
  50. package/dist/create-silent-audio.js +3 -7
  51. package/dist/crf.js +8 -2
  52. package/dist/delete-directory.js +18 -18
  53. package/dist/does-have-m2-bug.js +2 -2
  54. package/dist/ensure-output-directory.js +5 -5
  55. package/dist/ffmpeg-filter-file.js +7 -7
  56. package/dist/file-extensions.d.ts +1 -12
  57. package/dist/file-extensions.js +8 -14
  58. package/dist/find-closest-package-json.js +6 -6
  59. package/dist/get-compositions.d.ts +3 -5
  60. package/dist/get-compositions.js +8 -11
  61. package/dist/get-concurrency.js +3 -3
  62. package/dist/get-extension-from-codec.d.ts +2 -2
  63. package/dist/get-extension-of-filename.js +2 -2
  64. package/dist/get-frame-padded-index.d.ts +2 -1
  65. package/dist/get-local-browser-executable.js +4 -4
  66. package/dist/get-video-threads-flag.js +3 -3
  67. package/dist/guess-extension-for-media.d.ts +1 -3
  68. package/dist/guess-extension-for-media.js +4 -8
  69. package/dist/image-format.d.ts +12 -6
  70. package/dist/image-format.js +16 -13
  71. package/dist/index.d.ts +80 -61
  72. package/dist/index.js +15 -17
  73. package/dist/jpeg-quality.d.ts +1 -0
  74. package/dist/jpeg-quality.js +21 -0
  75. package/dist/merge-audio-track.d.ts +0 -2
  76. package/dist/merge-audio-track.js +5 -12
  77. package/dist/mime-types.js +2 -2
  78. package/dist/offthread-video-server.d.ts +9 -9
  79. package/dist/offthread-video-server.js +65 -58
  80. package/dist/open-browser.d.ts +1 -0
  81. package/dist/open-browser.js +7 -6
  82. package/dist/options/audio-bitrate.d.ts +2 -0
  83. package/dist/options/audio-bitrate.js +11 -0
  84. package/dist/options/crf.d.ts +2 -0
  85. package/dist/options/crf.js +11 -0
  86. package/dist/options/enforce-audio.d.ts +2 -0
  87. package/dist/options/enforce-audio.js +11 -0
  88. package/dist/options/jpeg-quality.d.ts +2 -0
  89. package/dist/options/jpeg-quality.js +11 -0
  90. package/dist/options/mute.d.ts +2 -0
  91. package/dist/options/mute.js +11 -0
  92. package/dist/options/option.d.ts +8 -0
  93. package/dist/options/option.js +2 -0
  94. package/dist/options/scale.d.ts +2 -0
  95. package/dist/options/scale.js +11 -0
  96. package/dist/options/video-bitrate.d.ts +2 -0
  97. package/dist/options/video-bitrate.js +11 -0
  98. package/dist/options/video-codec.d.ts +2 -0
  99. package/dist/options/video-codec.js +11 -0
  100. package/dist/perf.d.ts +1 -1
  101. package/dist/perf.js +9 -7
  102. package/dist/prepare-server.d.ts +3 -4
  103. package/dist/prepare-server.js +9 -9
  104. package/dist/preprocess-audio-track.d.ts +0 -4
  105. package/dist/preprocess-audio-track.js +4 -8
  106. package/dist/prespawn-ffmpeg.d.ts +6 -9
  107. package/dist/prespawn-ffmpeg.js +7 -12
  108. package/dist/prestitcher-memory-usage.d.ts +0 -4
  109. package/dist/prestitcher-memory-usage.js +4 -5
  110. package/dist/prores-profile.d.ts +1 -2
  111. package/dist/prores-profile.js +4 -4
  112. package/dist/provide-screenshot.d.ts +4 -5
  113. package/dist/provide-screenshot.js +2 -2
  114. package/dist/puppeteer-screenshot.d.ts +3 -3
  115. package/dist/puppeteer-screenshot.js +10 -33
  116. package/dist/render-frames.d.ts +13 -25
  117. package/dist/render-frames.js +34 -45
  118. package/dist/render-media.d.ts +16 -18
  119. package/dist/render-media.js +42 -52
  120. package/dist/render-still.d.ts +12 -8
  121. package/dist/render-still.js +30 -18
  122. package/dist/resolve-asset-src.js +2 -2
  123. package/dist/screenshot-dom-element.d.ts +4 -5
  124. package/dist/screenshot-dom-element.js +6 -3
  125. package/dist/screenshot-task.d.ts +2 -3
  126. package/dist/screenshot-task.js +40 -25
  127. package/dist/serve-handler/index.d.ts +1 -1
  128. package/dist/serve-handler/index.js +21 -19
  129. package/dist/serve-handler/is-path-inside.js +3 -3
  130. package/dist/serve-static.d.ts +2 -3
  131. package/dist/serve-static.js +26 -22
  132. package/dist/stitch-frames-to-video.d.ts +2 -12
  133. package/dist/stitch-frames-to-video.js +37 -46
  134. package/dist/take-frame-and-compose.d.ts +4 -5
  135. package/dist/take-frame-and-compose.js +15 -9
  136. package/dist/tmp-dir.js +7 -8
  137. package/dist/validate-concurrency.d.ts +2 -0
  138. package/dist/validate-concurrency.js +11 -5
  139. package/dist/validate-output-filename.d.ts +1 -1
  140. package/dist/validate-puppeteer-timeout.js +1 -0
  141. package/install-toolchain.mjs +36 -0
  142. package/package.json +11 -10
  143. package/types/ws/index.d.ts +5 -5
package/dist/index.d.ts CHANGED
@@ -1,4 +1,3 @@
1
- /// <reference types="node" />
2
1
  import execa from 'execa';
3
2
  import { SymbolicateableError } from './error-handling/symbolicateable-error';
4
3
  import { mimeContentType, mimeLookup } from './mime-types';
@@ -11,24 +10,21 @@ export { BrowserExecutable } from './browser-executable';
11
10
  export { BrowserLog } from './browser-log';
12
11
  export { Codec, CodecOrUndefined } from './codec';
13
12
  export { Crf } from './crf';
14
- export { ensureFfmpeg, EnsureFfmpegOptions, ensureFfprobe, } from './ensure-ffmpeg';
15
13
  export { ErrorWithStackFrame } from './error-handling/handle-javascript-exception';
16
- export { FfmpegExecutable } from './ffmpeg-executable';
17
- export { FfmpegVersion } from './ffmpeg-flags';
18
14
  export type { FfmpegOverrideFn } from './ffmpeg-override';
19
15
  export { FileExtension } from './file-extensions';
20
16
  export { FrameRange } from './frame-range';
21
- export { getCanExtractFramesFast } from './get-can-extract-frames-fast';
22
17
  export { getCompositions } from './get-compositions';
23
- export { ImageFormat, StillImageFormat, validateSelectedPixelFormatAndImageFormatCombination, validImageFormats, } from './image-format';
18
+ export { ImageFormat, StillImageFormat, validateSelectedPixelFormatAndImageFormatCombination, VideoImageFormat, } from './image-format';
24
19
  export type { LogLevel } from './log-level';
25
20
  export { CancelSignal, makeCancelSignal } from './make-cancel-signal';
26
21
  export { openBrowser } from './open-browser';
27
22
  export type { ChromiumOptions } from './open-browser';
23
+ export { RemotionOption } from './options/option';
28
24
  export { PixelFormat } from './pixel-format';
29
25
  export { ProResProfile } from './prores-profile';
30
26
  export { renderFrames } from './render-frames';
31
- export { OnSlowestFrames, renderMedia, RenderMediaOnProgress, RenderMediaOptions, SlowFrame, StitchingState, } from './render-media';
27
+ export { renderMedia, RenderMediaOnProgress, RenderMediaOptions, SlowFrame, StitchingState, } from './render-media';
32
28
  export { renderStill, RenderStillOptions } from './render-still';
33
29
  export { StitcherOptions, stitchFramesToVideo } from './stitch-frames-to-video';
34
30
  export { SymbolicatedStackFrame } from './symbolicate-stacktrace';
@@ -37,21 +33,15 @@ export { OpenGlRenderer } from './validate-opengl-renderer';
37
33
  export { validateOutputFilename } from './validate-output-filename';
38
34
  export declare const RenderInternals: {
39
35
  ensureLocalBrowser: (browser: import("./browser").Browser, preferredBrowserExecutable: import("./browser-executable").BrowserExecutable) => Promise<void>;
40
- ffmpegHasFeature: ({ ffmpegExecutable, feature, remotionRoot, }: {
41
- ffmpegExecutable: string | null;
42
- feature: "enable-gpl" | "enable-libx265" | "enable-libvpx";
43
- remotionRoot: string;
44
- }) => Promise<boolean>;
45
36
  getActualConcurrency: (userPreference: string | number | null) => number;
46
- validateFfmpeg: (customFfmpegBinary: string | null, remotionRoot: string, binary: "ffmpeg" | "ffprobe") => Promise<void>;
47
37
  serveStatic: (path: string | null, options: {
48
38
  port: number | null;
49
- ffmpegExecutable: import("./ffmpeg-executable").FfmpegExecutable;
50
- ffprobeExecutable: import("./ffmpeg-executable").FfmpegExecutable;
51
39
  onDownload: import("./assets/download-and-map-assets-to-file").RenderMediaOnDownload;
52
40
  onError: (err: Error) => void;
53
41
  downloadMap: import("./assets/download-map").DownloadMap;
54
42
  remotionRoot: string;
43
+ concurrency: number;
44
+ verbose: boolean;
55
45
  }) => Promise<{
56
46
  port: number;
57
47
  close: () => Promise<void>;
@@ -60,16 +50,16 @@ export declare const RenderInternals: {
60
50
  width: number;
61
51
  height: number;
62
52
  scale: number;
63
- codec: "h264" | "h265" | "vp8" | "vp9" | "mp3" | "aac" | "wav" | "prores" | "h264-mkv" | "gif";
53
+ codec: "aac" | "mp3" | "h264" | "h265" | "vp8" | "vp9" | "wav" | "prores" | "h264-mkv" | "gif";
64
54
  }) => void;
65
- 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;
55
+ 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;
66
56
  tmpDir: (str: string) => string;
67
57
  deleteDirectory: (directory: string) => void;
68
58
  isServeUrl: (potentialUrl: string) => boolean;
69
59
  ensureOutputDirectory: (outputLocation: string) => void;
70
60
  getRealFrameRange: (durationInFrames: number, frameRange: import("./frame-range").FrameRange | null) => [number, number];
71
61
  validatePuppeteerTimeout: (timeoutInMilliseconds: unknown) => void;
72
- downloadFile: ({ onProgress, url, to: toFn, }: {
62
+ downloadFile: (options: {
73
63
  url: string;
74
64
  to: (contentDisposition: string | null, contentType: string | null) => string;
75
65
  onProgress: ((progress: {
@@ -77,7 +67,7 @@ export declare const RenderInternals: {
77
67
  downloaded: number;
78
68
  totalSize: number | null;
79
69
  }) => void) | undefined;
80
- }) => Promise<{
70
+ }, retries?: number) => Promise<{
81
71
  sizeInBytes: number;
82
72
  to: string;
83
73
  }>;
@@ -112,24 +102,23 @@ export declare const RenderInternals: {
112
102
  };
113
103
  registerErrorSymbolicationLock: () => number;
114
104
  unlockErrorSymbolicationLock: (id: number) => void;
115
- canUseParallelEncoding: (codec: "h264" | "h265" | "vp8" | "vp9" | "mp3" | "aac" | "wav" | "prores" | "h264-mkv" | "gif") => boolean;
105
+ canUseParallelEncoding: (codec: "aac" | "mp3" | "h264" | "h265" | "vp8" | "vp9" | "wav" | "prores" | "h264-mkv" | "gif") => boolean;
116
106
  mimeContentType: typeof mimeContentType;
117
107
  mimeLookup: typeof mimeLookup;
118
108
  validateConcurrency: (value: unknown, setting: string) => void;
119
109
  validPixelFormats: readonly ["yuv420p", "yuva420p", "yuv422p", "yuv444p", "yuv420p10le", "yuv422p10le", "yuv444p10le", "yuva444p10le"];
120
110
  DEFAULT_BROWSER: import("./browser").Browser;
121
111
  validateFrameRange: (frameRange: import("./frame-range").FrameRange | null) => void;
122
- DEFAULT_OPENGL_RENDERER: "angle" | "swangle" | "egl" | "swiftshader" | null;
123
- validateOpenGlRenderer: (option: "angle" | "swangle" | "egl" | "swiftshader" | null) => "angle" | "swangle" | "egl" | "swiftshader" | null;
124
- validImageFormats: readonly ["png", "jpeg", "none"];
112
+ DEFAULT_OPENGL_RENDERER: "swangle" | "angle" | "egl" | "swiftshader" | null;
113
+ validateOpenGlRenderer: (option: "swangle" | "angle" | "egl" | "swiftshader" | null) => "swangle" | "angle" | "egl" | "swiftshader" | null;
125
114
  validCodecs: readonly ["h264", "h265", "vp8", "vp9", "mp3", "aac", "wav", "prores", "h264-mkv", "gif"];
126
115
  DEFAULT_PIXEL_FORMAT: "yuv420p" | "yuva420p" | "yuv422p" | "yuv444p" | "yuv420p10le" | "yuv422p10le" | "yuv444p10le" | "yuva444p10le";
127
- validateQuality: (q: number | undefined) => void;
116
+ validateJpegQuality: (q: number | undefined) => void;
128
117
  DEFAULT_TIMEOUT: number;
129
- DEFAULT_CODEC: "h264" | "h265" | "vp8" | "vp9" | "mp3" | "aac" | "wav" | "prores" | "h264-mkv" | "gif";
130
- isAudioCodec: (codec: "h264" | "h265" | "vp8" | "vp9" | "mp3" | "aac" | "wav" | "prores" | "h264-mkv" | "gif" | undefined) => boolean;
118
+ DEFAULT_CODEC: "aac" | "mp3" | "h264" | "h265" | "vp8" | "vp9" | "wav" | "prores" | "h264-mkv" | "gif";
119
+ isAudioCodec: (codec: "aac" | "mp3" | "h264" | "h265" | "vp8" | "vp9" | "wav" | "prores" | "h264-mkv" | "gif" | undefined) => boolean;
131
120
  logLevels: readonly ["verbose", "info", "warn", "error"];
132
- isEqualOrBelowLogLevel: (currentLevel: "error" | "verbose" | "info" | "warn", level: "error" | "verbose" | "info" | "warn") => boolean;
121
+ isEqualOrBelowLogLevel: (currentLevel: "verbose" | "info" | "warn" | "error", level: "verbose" | "info" | "warn" | "error") => boolean;
133
122
  isValidLogLevel: (level: string) => boolean;
134
123
  perf: typeof perf;
135
124
  makeDownloadMap: () => import("./assets/download-map").DownloadMap;
@@ -139,104 +128,99 @@ export declare const RenderInternals: {
139
128
  durationInFrames: number;
140
129
  }) => number;
141
130
  findRemotionRoot: () => string;
142
- getExecutableBinary: (ffmpegExecutable: import("./ffmpeg-executable").FfmpegExecutable, remotionRoot: string, binary: "ffmpeg" | "ffprobe") => string | Promise<string>;
143
131
  validateBitrate: (bitrate: unknown, name: string) => void;
144
- getFfmpegVersion: (options: {
145
- ffmpegExecutable: string | null;
146
- remotionRoot: string;
147
- }) => Promise<import("./ffmpeg-flags").FfmpegVersion>;
148
132
  combineVideos: (options: {
149
133
  files: string[];
150
134
  filelistDir: string;
151
135
  output: string;
152
136
  onProgress: (p: number) => void;
153
137
  numberOfFrames: number;
154
- codec: "h264" | "h265" | "vp8" | "vp9" | "mp3" | "aac" | "wav" | "prores" | "h264-mkv" | "gif";
138
+ codec: "aac" | "mp3" | "h264" | "h265" | "vp8" | "vp9" | "wav" | "prores" | "h264-mkv" | "gif";
155
139
  fps: number;
156
140
  numberOfGifLoops: number | null;
157
- remotionRoot: string;
158
- ffmpegExecutable: import("./ffmpeg-executable").FfmpegExecutable;
159
- audioCodec: "mp3" | "aac" | "pcm-16" | "opus" | null;
141
+ audioCodec: "pcm-16" | "aac" | "mp3" | "opus" | null;
160
142
  }) => Promise<void>;
143
+ getMinConcurrency: () => number;
144
+ getMaxConcurrency: () => any;
161
145
  getDefaultAudioCodec: ({ codec, preferLossless, }: {
162
- codec: "h264" | "h265" | "vp8" | "vp9" | "mp3" | "aac" | "wav" | "prores" | "h264-mkv" | "gif";
146
+ codec: "aac" | "mp3" | "h264" | "h265" | "vp8" | "vp9" | "wav" | "prores" | "h264-mkv" | "gif";
163
147
  preferLossless: boolean;
164
- }) => "mp3" | "aac" | "pcm-16" | "opus" | null;
148
+ }) => "pcm-16" | "aac" | "mp3" | "opus" | null;
165
149
  validAudioCodecs: readonly ["pcm-16", "aac", "mp3", "opus"];
166
150
  defaultFileExtensionMap: {
167
- h264: {
151
+ aac: {
168
152
  default: import("./file-extensions").FileExtension;
169
153
  forAudioCodec: {
170
- aac: {
154
+ "pcm-16": {
171
155
  possible: import("./file-extensions").FileExtension[];
172
156
  default: import("./file-extensions").FileExtension;
173
157
  };
174
- "pcm-16": {
158
+ aac: {
175
159
  possible: import("./file-extensions").FileExtension[];
176
160
  default: import("./file-extensions").FileExtension;
177
161
  };
178
162
  };
179
163
  };
180
- h265: {
164
+ mp3: {
181
165
  default: import("./file-extensions").FileExtension;
182
166
  forAudioCodec: {
183
- aac: {
167
+ "pcm-16": {
184
168
  possible: import("./file-extensions").FileExtension[];
185
169
  default: import("./file-extensions").FileExtension;
186
170
  };
187
- "pcm-16": {
171
+ mp3: {
188
172
  possible: import("./file-extensions").FileExtension[];
189
173
  default: import("./file-extensions").FileExtension;
190
174
  };
191
175
  };
192
176
  };
193
- vp8: {
177
+ h264: {
194
178
  default: import("./file-extensions").FileExtension;
195
179
  forAudioCodec: {
196
180
  "pcm-16": {
197
181
  possible: import("./file-extensions").FileExtension[];
198
182
  default: import("./file-extensions").FileExtension;
199
183
  };
200
- opus: {
184
+ aac: {
201
185
  possible: import("./file-extensions").FileExtension[];
202
186
  default: import("./file-extensions").FileExtension;
203
187
  };
204
188
  };
205
189
  };
206
- vp9: {
190
+ h265: {
207
191
  default: import("./file-extensions").FileExtension;
208
192
  forAudioCodec: {
209
193
  "pcm-16": {
210
194
  possible: import("./file-extensions").FileExtension[];
211
195
  default: import("./file-extensions").FileExtension;
212
196
  };
213
- opus: {
197
+ aac: {
214
198
  possible: import("./file-extensions").FileExtension[];
215
199
  default: import("./file-extensions").FileExtension;
216
200
  };
217
201
  };
218
202
  };
219
- mp3: {
203
+ vp8: {
220
204
  default: import("./file-extensions").FileExtension;
221
205
  forAudioCodec: {
222
- mp3: {
206
+ "pcm-16": {
223
207
  possible: import("./file-extensions").FileExtension[];
224
208
  default: import("./file-extensions").FileExtension;
225
209
  };
226
- "pcm-16": {
210
+ opus: {
227
211
  possible: import("./file-extensions").FileExtension[];
228
212
  default: import("./file-extensions").FileExtension;
229
213
  };
230
214
  };
231
215
  };
232
- aac: {
216
+ vp9: {
233
217
  default: import("./file-extensions").FileExtension;
234
218
  forAudioCodec: {
235
- aac: {
219
+ "pcm-16": {
236
220
  possible: import("./file-extensions").FileExtension[];
237
221
  default: import("./file-extensions").FileExtension;
238
222
  };
239
- "pcm-16": {
223
+ opus: {
240
224
  possible: import("./file-extensions").FileExtension[];
241
225
  default: import("./file-extensions").FileExtension;
242
226
  };
@@ -254,11 +238,11 @@ export declare const RenderInternals: {
254
238
  prores: {
255
239
  default: import("./file-extensions").FileExtension;
256
240
  forAudioCodec: {
257
- aac: {
241
+ "pcm-16": {
258
242
  possible: import("./file-extensions").FileExtension[];
259
243
  default: import("./file-extensions").FileExtension;
260
244
  };
261
- "pcm-16": {
245
+ aac: {
262
246
  possible: import("./file-extensions").FileExtension[];
263
247
  default: import("./file-extensions").FileExtension;
264
248
  };
@@ -275,21 +259,56 @@ export declare const RenderInternals: {
275
259
  };
276
260
  gif: {
277
261
  default: import("./file-extensions").FileExtension;
278
- forAudioCodec: {};
262
+ forAudioCodec: {
263
+ "pcm-16": {
264
+ possible: import("./file-extensions").FileExtension[];
265
+ default: import("./file-extensions").FileExtension;
266
+ };
267
+ aac: {
268
+ possible: import("./file-extensions").FileExtension[];
269
+ default: import("./file-extensions").FileExtension;
270
+ };
271
+ mp3: {
272
+ possible: import("./file-extensions").FileExtension[];
273
+ default: import("./file-extensions").FileExtension;
274
+ };
275
+ opus: {
276
+ possible: import("./file-extensions").FileExtension[];
277
+ default: import("./file-extensions").FileExtension;
278
+ };
279
+ };
279
280
  };
280
281
  };
281
282
  supportedAudioCodecs: {
282
283
  readonly h264: readonly ["aac", "pcm-16"];
283
284
  readonly 'h264-mkv': readonly ["pcm-16"];
284
285
  readonly aac: readonly ["aac", "pcm-16"];
285
- readonly gif: readonly [];
286
+ readonly gif: ("pcm-16" | "aac" | "mp3" | "opus")[];
286
287
  readonly h265: readonly ["aac", "pcm-16"];
287
288
  readonly mp3: readonly ["mp3", "pcm-16"];
288
- readonly prores: readonly ["pcm-16", "aac"];
289
+ readonly prores: readonly ["aac", "pcm-16"];
289
290
  readonly vp8: readonly ["opus", "pcm-16"];
290
291
  readonly vp9: readonly ["opus", "pcm-16"];
291
292
  readonly wav: readonly ["pcm-16"];
292
293
  };
293
- makeFileExtensionMap: () => Record<string, ("h264" | "h265" | "vp8" | "vp9" | "mp3" | "aac" | "wav" | "prores" | "h264-mkv" | "gif")[]>;
294
- defaultCodecsForFileExtension: Record<import("./file-extensions").FileExtension, "h264" | "h265" | "vp8" | "vp9" | "mp3" | "aac" | "wav" | "prores" | "h264-mkv" | "gif">;
294
+ makeFileExtensionMap: () => Record<string, ("aac" | "mp3" | "h264" | "h265" | "vp8" | "vp9" | "wav" | "prores" | "h264-mkv" | "gif")[]>;
295
+ defaultCodecsForFileExtension: Record<import("./file-extensions").FileExtension, "aac" | "mp3" | "h264" | "h265" | "vp8" | "vp9" | "wav" | "prores" | "h264-mkv" | "gif">;
296
+ getExecutablePath: (type: "compositor" | "ffmpeg" | "ffprobe" | "ffmpeg-cwd") => string;
297
+ callFf: (bin: "ffmpeg" | "ffprobe", args: (string | null)[], options?: execa.Options<string> | undefined) => execa.ExecaChildProcess<string>;
298
+ dynamicLibraryPathOptions: () => {
299
+ env: {
300
+ DYLD_LIBRARY_PATH: string;
301
+ RUST_BACKTRACE: string;
302
+ } | {
303
+ PATH: string;
304
+ RUST_BACKTRACE: string;
305
+ } | {
306
+ LD_LIBRARY_PATH: string;
307
+ RUST_BACKTRACE: string;
308
+ };
309
+ };
310
+ validStillImageFormats: readonly ["png", "jpeg", "pdf", "webp"];
311
+ validVideoImageFormats: readonly ["png", "jpeg", "none"];
312
+ DEFAULT_STILL_IMAGE_FORMAT: "png" | "jpeg" | "pdf" | "webp";
313
+ DEFAULT_VIDEO_IMAGE_FORMAT: "png" | "jpeg" | "none";
295
314
  };
package/dist/index.js CHANGED
@@ -26,23 +26,24 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
26
26
  return (mod && mod.__esModule) ? mod : { "default": mod };
27
27
  };
28
28
  Object.defineProperty(exports, "__esModule", { value: true });
29
- exports.RenderInternals = exports.validateOutputFilename = exports.stitchFramesToVideo = exports.renderStill = exports.renderMedia = exports.renderFrames = exports.openBrowser = exports.makeCancelSignal = exports.validImageFormats = exports.validateSelectedPixelFormatAndImageFormatCombination = exports.getCompositions = exports.getCanExtractFramesFast = exports.ErrorWithStackFrame = exports.ensureFfprobe = exports.ensureFfmpeg = void 0;
29
+ exports.RenderInternals = exports.validateOutputFilename = exports.stitchFramesToVideo = exports.renderStill = exports.renderMedia = exports.renderFrames = exports.openBrowser = exports.makeCancelSignal = exports.validateSelectedPixelFormatAndImageFormatCombination = exports.getCompositions = exports.ErrorWithStackFrame = void 0;
30
30
  const execa_1 = __importDefault(require("execa"));
31
31
  const download_file_1 = require("./assets/download-file");
32
32
  const download_map_1 = require("./assets/download-map");
33
33
  const audio_codec_1 = require("./audio-codec");
34
34
  const browser_1 = require("./browser");
35
35
  const TimeoutSettings_1 = require("./browser/TimeoutSettings");
36
+ const call_ffmpeg_1 = require("./call-ffmpeg");
36
37
  const can_use_parallel_encoding_1 = require("./can-use-parallel-encoding");
37
38
  const check_apple_silicon_1 = require("./check-apple-silicon");
38
39
  const codec_1 = require("./codec");
39
40
  const combine_videos_1 = require("./combine-videos");
41
+ const get_executable_path_1 = require("./compositor/get-executable-path");
40
42
  const convert_to_positive_frame_index_1 = require("./convert-to-positive-frame-index");
41
43
  const delete_directory_1 = require("./delete-directory");
42
44
  const ensure_output_directory_1 = require("./ensure-output-directory");
43
45
  const symbolicate_error_1 = require("./error-handling/symbolicate-error");
44
46
  const symbolicateable_error_1 = require("./error-handling/symbolicateable-error");
45
- const ffmpeg_flags_1 = require("./ffmpeg-flags");
46
47
  const file_extensions_1 = require("./file-extensions");
47
48
  const find_closest_package_json_1 = require("./find-closest-package-json");
48
49
  const frame_range_1 = require("./frame-range");
@@ -56,35 +57,28 @@ const get_port_1 = require("./get-port");
56
57
  const image_format_1 = require("./image-format");
57
58
  const is_audio_codec_1 = require("./is-audio-codec");
58
59
  const is_serve_url_1 = require("./is-serve-url");
60
+ const jpeg_quality_1 = require("./jpeg-quality");
59
61
  const log_level_1 = require("./log-level");
60
62
  const mime_types_1 = require("./mime-types");
61
63
  const open_browser_1 = require("./open-browser");
62
64
  const parse_browser_error_stack_1 = require("./parse-browser-error-stack");
63
65
  const perf = __importStar(require("./perf"));
64
66
  const pixel_format_1 = require("./pixel-format");
65
- const quality_1 = require("./quality");
66
67
  const is_path_inside_1 = require("./serve-handler/is-path-inside");
67
68
  const serve_static_1 = require("./serve-static");
68
69
  const tmp_dir_1 = require("./tmp-dir");
69
70
  const validate_concurrency_1 = require("./validate-concurrency");
70
71
  const validate_even_dimensions_with_codec_1 = require("./validate-even-dimensions-with-codec");
71
- const validate_ffmpeg_1 = require("./validate-ffmpeg");
72
72
  const validate_opengl_renderer_1 = require("./validate-opengl-renderer");
73
73
  const validate_puppeteer_timeout_1 = require("./validate-puppeteer-timeout");
74
74
  const validate_videobitrate_1 = require("./validate-videobitrate");
75
75
  const wait_for_symbolication_error_to_be_done_1 = require("./wait-for-symbolication-error-to-be-done");
76
- var ensure_ffmpeg_1 = require("./ensure-ffmpeg");
77
- Object.defineProperty(exports, "ensureFfmpeg", { enumerable: true, get: function () { return ensure_ffmpeg_1.ensureFfmpeg; } });
78
- Object.defineProperty(exports, "ensureFfprobe", { enumerable: true, get: function () { return ensure_ffmpeg_1.ensureFfprobe; } });
79
76
  var handle_javascript_exception_1 = require("./error-handling/handle-javascript-exception");
80
77
  Object.defineProperty(exports, "ErrorWithStackFrame", { enumerable: true, get: function () { return handle_javascript_exception_1.ErrorWithStackFrame; } });
81
- var get_can_extract_frames_fast_1 = require("./get-can-extract-frames-fast");
82
- Object.defineProperty(exports, "getCanExtractFramesFast", { enumerable: true, get: function () { return get_can_extract_frames_fast_1.getCanExtractFramesFast; } });
83
78
  var get_compositions_1 = require("./get-compositions");
84
79
  Object.defineProperty(exports, "getCompositions", { enumerable: true, get: function () { return get_compositions_1.getCompositions; } });
85
80
  var image_format_2 = require("./image-format");
86
81
  Object.defineProperty(exports, "validateSelectedPixelFormatAndImageFormatCombination", { enumerable: true, get: function () { return image_format_2.validateSelectedPixelFormatAndImageFormatCombination; } });
87
- Object.defineProperty(exports, "validImageFormats", { enumerable: true, get: function () { return image_format_2.validImageFormats; } });
88
82
  var make_cancel_signal_1 = require("./make-cancel-signal");
89
83
  Object.defineProperty(exports, "makeCancelSignal", { enumerable: true, get: function () { return make_cancel_signal_1.makeCancelSignal; } });
90
84
  var open_browser_2 = require("./open-browser");
@@ -101,9 +95,7 @@ var validate_output_filename_1 = require("./validate-output-filename");
101
95
  Object.defineProperty(exports, "validateOutputFilename", { enumerable: true, get: function () { return validate_output_filename_1.validateOutputFilename; } });
102
96
  exports.RenderInternals = {
103
97
  ensureLocalBrowser: get_local_browser_executable_1.ensureLocalBrowser,
104
- ffmpegHasFeature: ffmpeg_flags_1.ffmpegHasFeature,
105
98
  getActualConcurrency: get_concurrency_1.getActualConcurrency,
106
- validateFfmpeg: validate_ffmpeg_1.validateFfmpeg,
107
99
  serveStatic: serve_static_1.serveStatic,
108
100
  validateEvenDimensionsWithCodec: validate_even_dimensions_with_codec_1.validateEvenDimensionsWithCodec,
109
101
  getFileExtensionFromCodec: get_extension_from_codec_1.getFileExtensionFromCodec,
@@ -134,10 +126,9 @@ exports.RenderInternals = {
134
126
  validateFrameRange: frame_range_1.validateFrameRange,
135
127
  DEFAULT_OPENGL_RENDERER: validate_opengl_renderer_1.DEFAULT_OPENGL_RENDERER,
136
128
  validateOpenGlRenderer: validate_opengl_renderer_1.validateOpenGlRenderer,
137
- validImageFormats: image_format_1.validImageFormats,
138
129
  validCodecs: codec_1.validCodecs,
139
130
  DEFAULT_PIXEL_FORMAT: pixel_format_1.DEFAULT_PIXEL_FORMAT,
140
- validateQuality: quality_1.validateQuality,
131
+ validateJpegQuality: jpeg_quality_1.validateJpegQuality,
141
132
  DEFAULT_TIMEOUT: TimeoutSettings_1.DEFAULT_TIMEOUT,
142
133
  DEFAULT_CODEC: codec_1.DEFAULT_CODEC,
143
134
  isAudioCodec: is_audio_codec_1.isAudioCodec,
@@ -149,16 +140,23 @@ exports.RenderInternals = {
149
140
  cleanDownloadMap: download_map_1.cleanDownloadMap,
150
141
  convertToPositiveFrameIndex: convert_to_positive_frame_index_1.convertToPositiveFrameIndex,
151
142
  findRemotionRoot: find_closest_package_json_1.findRemotionRoot,
152
- getExecutableBinary: ffmpeg_flags_1.getExecutableBinary,
153
143
  validateBitrate: validate_videobitrate_1.validateBitrate,
154
- getFfmpegVersion: ffmpeg_flags_1.getFfmpegVersion,
155
144
  combineVideos: combine_videos_1.combineVideos,
145
+ getMinConcurrency: validate_concurrency_1.getMinConcurrency,
146
+ getMaxConcurrency: validate_concurrency_1.getMaxConcurrency,
156
147
  getDefaultAudioCodec: audio_codec_1.getDefaultAudioCodec,
157
148
  validAudioCodecs: audio_codec_1.validAudioCodecs,
158
149
  defaultFileExtensionMap: file_extensions_1.defaultFileExtensionMap,
159
- supportedAudioCodecs: file_extensions_1.supportedAudioCodecs,
150
+ supportedAudioCodecs: audio_codec_1.supportedAudioCodecs,
160
151
  makeFileExtensionMap: get_extension_from_codec_1.makeFileExtensionMap,
161
152
  defaultCodecsForFileExtension: get_extension_from_codec_1.defaultCodecsForFileExtension,
153
+ getExecutablePath: get_executable_path_1.getExecutablePath,
154
+ callFf: call_ffmpeg_1.callFf,
155
+ dynamicLibraryPathOptions: call_ffmpeg_1.dynamicLibraryPathOptions,
156
+ validStillImageFormats: image_format_1.validStillImageFormats,
157
+ validVideoImageFormats: image_format_1.validVideoImageFormats,
158
+ DEFAULT_STILL_IMAGE_FORMAT: image_format_1.DEFAULT_STILL_IMAGE_FORMAT,
159
+ DEFAULT_VIDEO_IMAGE_FORMAT: image_format_1.DEFAULT_VIDEO_IMAGE_FORMAT,
162
160
  };
163
161
  // Warn of potential performance issues with Apple Silicon (M1 chip under Rosetta)
164
162
  (0, check_apple_silicon_1.checkNodeVersionAndWarnAboutRosetta)();
@@ -0,0 +1 @@
1
+ export declare const validateJpegQuality: (q: number | undefined) => void;
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validateJpegQuality = void 0;
4
+ const validateJpegQuality = (q) => {
5
+ if (typeof q !== 'undefined' && typeof q !== 'number') {
6
+ throw new Error(`JPEG Quality option must be a number or undefined. Got ${typeof q} (${JSON.stringify(q)})`);
7
+ }
8
+ if (typeof q === 'undefined') {
9
+ return;
10
+ }
11
+ if (!Number.isFinite(q)) {
12
+ throw new RangeError(`JPEG Quality must be a finite number, but is ${q}`);
13
+ }
14
+ if (Number.isNaN(q)) {
15
+ throw new RangeError(`JPEG Quality is NaN, but must be a real number`);
16
+ }
17
+ if (q > 100 || q < 0) {
18
+ throw new RangeError('JPEG Quality option must be between 0 and 100.');
19
+ }
20
+ };
21
+ exports.validateJpegQuality = validateJpegQuality;
@@ -1,8 +1,6 @@
1
1
  import type { DownloadMap } from './assets/download-map';
2
- import type { FfmpegExecutable } from './ffmpeg-executable';
3
2
  import type { PreprocessedAudioTrack } from './preprocess-audio-track';
4
3
  declare type Options = {
5
- ffmpegExecutable: FfmpegExecutable;
6
4
  files: PreprocessedAudioTrack[];
7
5
  outName: string;
8
6
  numberOfSeconds: number;
@@ -4,24 +4,21 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.mergeAudioTrack = void 0;
7
- const execa_1 = __importDefault(require("execa"));
8
- const path_1 = __importDefault(require("path"));
7
+ const node_path_1 = __importDefault(require("node:path"));
8
+ const call_ffmpeg_1 = require("./call-ffmpeg");
9
9
  const chunk_1 = require("./chunk");
10
10
  const create_ffmpeg_complex_filter_1 = require("./create-ffmpeg-complex-filter");
11
11
  const create_ffmpeg_merge_filter_1 = require("./create-ffmpeg-merge-filter");
12
12
  const create_silent_audio_1 = require("./create-silent-audio");
13
13
  const delete_directory_1 = require("./delete-directory");
14
- const ffmpeg_flags_1 = require("./ffmpeg-flags");
15
14
  const p_limit_1 = require("./p-limit");
16
15
  const tmp_dir_1 = require("./tmp-dir");
17
16
  const truthy_1 = require("./truthy");
18
- const mergeAudioTrackUnlimited = async ({ ffmpegExecutable, outName, files, numberOfSeconds, downloadMap, remotionRoot, }) => {
17
+ const mergeAudioTrackUnlimited = async ({ outName, files, numberOfSeconds, downloadMap, remotionRoot, }) => {
19
18
  if (files.length === 0) {
20
19
  await (0, create_silent_audio_1.createSilentAudio)({
21
20
  outName,
22
- ffmpegExecutable,
23
21
  numberOfSeconds,
24
- remotionRoot,
25
22
  });
26
23
  return;
27
24
  }
@@ -32,9 +29,8 @@ const mergeAudioTrackUnlimited = async ({ ffmpegExecutable, outName, files, numb
32
29
  const tempPath = (0, tmp_dir_1.tmpDir)('remotion-large-audio-mixing');
33
30
  try {
34
31
  const chunkNames = await Promise.all(chunked.map(async (chunkFiles, i) => {
35
- const chunkOutname = path_1.default.join(tempPath, `chunk-${i}.wav`);
32
+ const chunkOutname = node_path_1.default.join(tempPath, `chunk-${i}.wav`);
36
33
  await (0, exports.mergeAudioTrack)({
37
- ffmpegExecutable,
38
34
  files: chunkFiles,
39
35
  numberOfSeconds,
40
36
  outName: chunkOutname,
@@ -44,7 +40,6 @@ const mergeAudioTrackUnlimited = async ({ ffmpegExecutable, outName, files, numb
44
40
  return chunkOutname;
45
41
  }));
46
42
  await (0, exports.mergeAudioTrack)({
47
- ffmpegExecutable,
48
43
  files: chunkNames.map((c) => ({
49
44
  filter: {
50
45
  pad_end: null,
@@ -66,8 +61,6 @@ const mergeAudioTrackUnlimited = async ({ ffmpegExecutable, outName, files, numb
66
61
  const { complexFilterFlag: mergeFilter, cleanup } = await (0, create_ffmpeg_complex_filter_1.createFfmpegComplexFilter)({
67
62
  filters: files,
68
63
  downloadMap,
69
- ffmpegExecutable,
70
- remotionRoot,
71
64
  });
72
65
  const args = [
73
66
  ...files.map((f) => ['-i', f.outName]),
@@ -78,7 +71,7 @@ const mergeAudioTrackUnlimited = async ({ ffmpegExecutable, outName, files, numb
78
71
  ]
79
72
  .filter(truthy_1.truthy)
80
73
  .flat(2);
81
- const task = (0, execa_1.default)(await (0, ffmpeg_flags_1.getExecutableBinary)(ffmpegExecutable, remotionRoot, 'ffmpeg'), args);
74
+ const task = (0, call_ffmpeg_1.callFf)('ffmpeg', args);
82
75
  await task;
83
76
  cleanup();
84
77
  };
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.mimeContentType = exports.mimeLookup = exports.getExt = void 0;
4
- const path_1 = require("path");
4
+ const node_path_1 = require("node:path");
5
5
  const mime_db_1 = require("./mime-db");
6
6
  const extensions = {};
7
7
  const types = {};
@@ -17,7 +17,7 @@ function mimeLookup(path) {
17
17
  return false;
18
18
  }
19
19
  // get the extension ("ext" or ".ext" or full path)
20
- const ext = (0, path_1.extname)('.' + path)
20
+ const ext = (0, node_path_1.extname)('.' + path)
21
21
  .toLowerCase()
22
22
  .substr(1);
23
23
  if (!ext) {
@@ -1,18 +1,18 @@
1
- import type { RequestListener } from 'http';
2
- import type { OffthreadVideoImageFormat } from 'remotion';
1
+ import type { RequestListener } from 'node:http';
3
2
  import type { RenderMediaOnDownload } from './assets/download-and-map-assets-to-file';
4
3
  import type { DownloadMap } from './assets/download-map';
5
- import type { FfmpegExecutable } from './ffmpeg-executable';
6
4
  export declare const extractUrlAndSourceFromUrl: (url: string) => {
7
5
  src: string;
8
6
  time: number;
9
- imageFormat: OffthreadVideoImageFormat;
7
+ transparent: boolean;
10
8
  };
11
- export declare const startOffthreadVideoServer: ({ ffmpegExecutable, ffprobeExecutable, onDownload, onError, downloadMap, remotionRoot, }: {
12
- ffmpegExecutable: FfmpegExecutable;
13
- ffprobeExecutable: FfmpegExecutable;
9
+ export declare const startOffthreadVideoServer: ({ onDownload, onError, downloadMap, concurrency, verbose, }: {
14
10
  onDownload: RenderMediaOnDownload;
15
11
  onError: (err: Error) => void;
16
12
  downloadMap: DownloadMap;
17
- remotionRoot: string;
18
- }) => RequestListener;
13
+ concurrency: number;
14
+ verbose: boolean;
15
+ }) => {
16
+ listener: RequestListener;
17
+ close: () => Promise<void>;
18
+ };