@remotion/renderer 4.0.0-oops.3 → 4.0.0-prefetch.11

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