@remotion/renderer 4.0.0-webhook.27 → 4.1.0-alpha2

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 (411) hide show
  1. package/LICENSE.md +8 -8
  2. package/README.md +9 -0
  3. package/client.d.ts +1 -0
  4. package/client.js +1 -0
  5. package/dist/assets/calculate-asset-positions.d.ts +0 -0
  6. package/dist/assets/calculate-asset-positions.js +1 -0
  7. package/dist/assets/calculate-atempo.d.ts +0 -0
  8. package/dist/assets/calculate-atempo.js +0 -0
  9. package/dist/assets/convert-assets-to-file-urls.d.ts +0 -0
  10. package/dist/assets/convert-assets-to-file-urls.js +0 -0
  11. package/dist/assets/download-and-map-assets-to-file.d.ts +6 -4
  12. package/dist/assets/download-and-map-assets-to-file.js +49 -19
  13. package/dist/assets/download-file.d.ts +8 -5
  14. package/dist/assets/download-file.js +71 -8
  15. package/dist/assets/download-map.d.ts +8 -29
  16. package/dist/assets/download-map.js +15 -16
  17. package/dist/assets/ffmpeg-volume-expression.d.ts +4 -3
  18. package/dist/assets/ffmpeg-volume-expression.js +5 -3
  19. package/dist/assets/flatten-volume-array.d.ts +0 -0
  20. package/dist/assets/flatten-volume-array.js +0 -0
  21. package/dist/assets/get-audio-channels.d.ts +2 -2
  22. package/dist/assets/get-audio-channels.js +14 -12
  23. package/dist/assets/read-file.d.ts +1 -1
  24. package/dist/assets/read-file.js +5 -7
  25. package/dist/assets/round-volume-to-avoid-stack-overflow.d.ts +0 -0
  26. package/dist/assets/round-volume-to-avoid-stack-overflow.js +0 -0
  27. package/dist/assets/sanitize-filename.d.ts +0 -0
  28. package/dist/assets/sanitize-filename.js +0 -0
  29. package/dist/assets/sanitize-filepath.d.ts +0 -0
  30. package/dist/assets/sanitize-filepath.js +2 -2
  31. package/dist/assets/truncate-utf8-bytes.d.ts +0 -0
  32. package/dist/assets/truncate-utf8-bytes.js +0 -0
  33. package/dist/assets/types.d.ts +5 -4
  34. package/dist/assets/types.js +0 -0
  35. package/dist/audio-codec.d.ts +28 -0
  36. package/dist/audio-codec.js +83 -0
  37. package/dist/browser/Browser.d.ts +16 -14
  38. package/dist/browser/Browser.js +69 -72
  39. package/dist/browser/BrowserConnector.d.ts +0 -0
  40. package/dist/browser/BrowserConnector.js +0 -0
  41. package/dist/browser/BrowserFetcher.d.ts +16 -64
  42. package/dist/browser/BrowserFetcher.js +147 -235
  43. package/dist/browser/BrowserPage.d.ts +21 -6
  44. package/dist/browser/BrowserPage.js +54 -22
  45. package/dist/browser/BrowserRunner.d.ts +1 -1
  46. package/dist/browser/BrowserRunner.js +32 -22
  47. package/dist/browser/Connection.d.ts +0 -0
  48. package/dist/browser/Connection.js +1 -1
  49. package/dist/browser/ConsoleMessage.d.ts +1 -1
  50. package/dist/browser/ConsoleMessage.js +0 -0
  51. package/dist/browser/DOMWorld.d.ts +5 -4
  52. package/dist/browser/DOMWorld.js +16 -9
  53. package/dist/browser/Errors.d.ts +0 -0
  54. package/dist/browser/Errors.js +0 -0
  55. package/dist/browser/EvalTypes.d.ts +7 -7
  56. package/dist/browser/EvalTypes.js +0 -0
  57. package/dist/browser/EventEmitter.d.ts +0 -0
  58. package/dist/browser/EventEmitter.js +0 -0
  59. package/dist/browser/ExecutionContext.d.ts +0 -0
  60. package/dist/browser/ExecutionContext.js +0 -0
  61. package/dist/browser/FrameManager.d.ts +0 -2
  62. package/dist/browser/FrameManager.js +13 -17
  63. package/dist/browser/HTTPRequest.d.ts +0 -0
  64. package/dist/browser/HTTPRequest.js +0 -0
  65. package/dist/browser/HTTPResponse.d.ts +0 -0
  66. package/dist/browser/HTTPResponse.js +0 -0
  67. package/dist/browser/JSHandle.d.ts +0 -0
  68. package/dist/browser/JSHandle.js +14 -14
  69. package/dist/browser/LaunchOptions.d.ts +2 -2
  70. package/dist/browser/LaunchOptions.js +0 -0
  71. package/dist/browser/Launcher.d.ts +9 -3
  72. package/dist/browser/Launcher.js +16 -29
  73. package/dist/browser/LifecycleWatcher.d.ts +1 -1
  74. package/dist/browser/LifecycleWatcher.js +0 -0
  75. package/dist/browser/NetworkEventManager.d.ts +4 -4
  76. package/dist/browser/NetworkEventManager.js +0 -0
  77. package/dist/browser/NetworkManager.d.ts +0 -0
  78. package/dist/browser/NetworkManager.js +0 -0
  79. package/dist/browser/NodeWebSocketTransport.d.ts +0 -0
  80. package/dist/browser/NodeWebSocketTransport.js +21 -21
  81. package/dist/browser/Product.d.ts +1 -1
  82. package/dist/browser/Product.js +0 -0
  83. package/dist/browser/PuppeteerNode.d.ts +2 -5
  84. package/dist/browser/PuppeteerNode.js +2 -11
  85. package/dist/browser/PuppeteerViewport.d.ts +0 -0
  86. package/dist/browser/PuppeteerViewport.js +0 -0
  87. package/dist/browser/ScreenshotOptions.d.ts +0 -14
  88. package/dist/browser/ScreenshotOptions.js +0 -1
  89. package/dist/browser/Target.d.ts +4 -3
  90. package/dist/browser/Target.js +8 -2
  91. package/dist/browser/TaskQueue.d.ts +0 -0
  92. package/dist/browser/TaskQueue.js +0 -0
  93. package/dist/browser/TimeoutSettings.d.ts +0 -0
  94. package/dist/browser/TimeoutSettings.js +0 -0
  95. package/dist/browser/assert.d.ts +0 -0
  96. package/dist/browser/assert.js +0 -0
  97. package/dist/browser/create-browser-fetcher.d.ts +0 -0
  98. package/dist/browser/create-browser-fetcher.js +34 -48
  99. package/dist/browser/devtools-commands.d.ts +5 -1
  100. package/dist/browser/devtools-commands.js +0 -0
  101. package/dist/browser/devtools-types.d.ts +92 -10
  102. package/dist/browser/devtools-types.js +0 -0
  103. package/dist/browser/get-download-destination.d.ts +0 -0
  104. package/dist/browser/get-download-destination.js +8 -8
  105. package/dist/browser/is-target-closed-err.d.ts +1 -0
  106. package/dist/browser/is-target-closed-err.js +9 -0
  107. package/dist/browser/mitt/index.d.ts +6 -6
  108. package/dist/browser/mitt/index.js +0 -0
  109. package/dist/browser/node.d.ts +0 -0
  110. package/dist/browser/node.js +0 -0
  111. package/dist/browser/revisions.d.ts +1 -1
  112. package/dist/browser/revisions.js +0 -0
  113. package/dist/browser/should-log-message.d.ts +24 -0
  114. package/dist/browser/should-log-message.js +72 -0
  115. package/dist/browser/util.d.ts +2 -2
  116. package/dist/browser/util.js +0 -0
  117. package/dist/browser-executable.d.ts +1 -1
  118. package/dist/browser-executable.js +0 -0
  119. package/dist/browser-log.d.ts +1 -1
  120. package/dist/browser-log.js +0 -0
  121. package/dist/browser.d.ts +1 -1
  122. package/dist/browser.js +0 -0
  123. package/dist/calculate-ffmpeg-filters.d.ts +2 -1
  124. package/dist/calculate-ffmpeg-filters.js +1 -0
  125. package/dist/call-ffmpeg.d.ts +14 -0
  126. package/dist/call-ffmpeg.js +42 -0
  127. package/dist/can-use-parallel-encoding.d.ts +0 -0
  128. package/dist/can-use-parallel-encoding.js +0 -0
  129. package/dist/chalk/index.d.ts +54 -0
  130. package/dist/chalk/index.js +135 -0
  131. package/dist/chalk/is-color-supported.d.ts +1 -0
  132. package/dist/chalk/is-color-supported.js +37 -0
  133. package/dist/check-apple-silicon.d.ts +1 -1
  134. package/dist/check-apple-silicon.js +8 -47
  135. package/dist/chunk.d.ts +0 -0
  136. package/dist/chunk.js +0 -0
  137. package/dist/client.d.ts +204 -0
  138. package/dist/client.js +49 -0
  139. package/dist/codec-supports-media.d.ts +3 -2
  140. package/dist/codec-supports-media.js +20 -5
  141. package/dist/codec.d.ts +2 -2
  142. package/dist/codec.js +0 -0
  143. package/dist/combine-videos.d.ts +6 -2
  144. package/dist/combine-videos.js +17 -17
  145. package/dist/compositor/compose.d.ts +26 -0
  146. package/dist/compositor/compose.js +82 -0
  147. package/dist/compositor/compositor.d.ts +11 -0
  148. package/dist/compositor/compositor.js +219 -0
  149. package/dist/compositor/get-executable-path.d.ts +1 -0
  150. package/dist/compositor/get-executable-path.js +57 -0
  151. package/dist/compositor/make-nonce.d.ts +1 -0
  152. package/dist/compositor/make-nonce.js +8 -0
  153. package/dist/compositor/payloads.d.ts +68 -0
  154. package/dist/{ffmpeg-executable.js → compositor/payloads.js} +0 -0
  155. package/dist/compress-assets.d.ts +0 -0
  156. package/dist/compress-assets.js +0 -0
  157. package/dist/convert-number-of-gif-loops-to-ffmpeg.d.ts +0 -0
  158. package/dist/convert-number-of-gif-loops-to-ffmpeg.js +0 -0
  159. package/dist/convert-to-positive-frame-index.d.ts +0 -0
  160. package/dist/convert-to-positive-frame-index.js +0 -0
  161. package/dist/create-ffmpeg-complex-filter.d.ts +5 -1
  162. package/dist/create-ffmpeg-complex-filter.js +6 -4
  163. package/dist/create-ffmpeg-merge-filter.d.ts +5 -1
  164. package/dist/create-ffmpeg-merge-filter.js +21 -13
  165. package/dist/create-silent-audio.d.ts +1 -3
  166. package/dist/create-silent-audio.js +3 -6
  167. package/dist/crf.d.ts +6 -2
  168. package/dist/crf.js +41 -8
  169. package/dist/cycle-browser-tabs.d.ts +2 -5
  170. package/dist/cycle-browser-tabs.js +5 -5
  171. package/dist/delay-render-embedded-stack.d.ts +0 -0
  172. package/dist/delay-render-embedded-stack.js +0 -0
  173. package/dist/delete-directory.d.ts +1 -1
  174. package/dist/delete-directory.js +43 -17
  175. package/dist/does-have-m2-bug.d.ts +3 -0
  176. package/dist/does-have-m2-bug.js +12 -0
  177. package/dist/ensure-frames-in-order.d.ts +0 -0
  178. package/dist/ensure-frames-in-order.js +0 -0
  179. package/dist/ensure-output-directory.d.ts +0 -0
  180. package/dist/ensure-output-directory.js +5 -5
  181. package/dist/error-handling/handle-javascript-exception.d.ts +0 -0
  182. package/dist/error-handling/handle-javascript-exception.js +10 -0
  183. package/dist/error-handling/symbolicate-error.d.ts +0 -0
  184. package/dist/error-handling/symbolicate-error.js +6 -3
  185. package/dist/error-handling/symbolicateable-error.d.ts +0 -0
  186. package/dist/error-handling/symbolicateable-error.js +0 -0
  187. package/dist/ffmpeg-filter-file.d.ts +6 -1
  188. package/dist/ffmpeg-filter-file.js +40 -8
  189. package/dist/ffmpeg-override.d.ts +1 -1
  190. package/dist/ffmpeg-override.js +0 -0
  191. package/dist/file-extensions.d.ts +14 -0
  192. package/dist/file-extensions.js +76 -0
  193. package/dist/find-closest-package-json.d.ts +2 -0
  194. package/dist/find-closest-package-json.js +31 -0
  195. package/dist/frame-range.d.ts +1 -1
  196. package/dist/frame-range.js +0 -0
  197. package/dist/get-browser-instance.d.ts +8 -3
  198. package/dist/get-browser-instance.js +10 -5
  199. package/dist/get-codec-name.d.ts +0 -0
  200. package/dist/get-codec-name.js +0 -0
  201. package/dist/get-compositions.d.ts +27 -14
  202. package/dist/get-compositions.js +72 -39
  203. package/dist/get-concurrency.d.ts +1 -1
  204. package/dist/get-concurrency.js +11 -4
  205. package/dist/get-duration-from-frame-range.d.ts +0 -0
  206. package/dist/get-duration-from-frame-range.js +0 -0
  207. package/dist/get-extension-from-codec.d.ts +5 -1
  208. package/dist/get-extension-from-codec.js +56 -32
  209. package/dist/get-extension-of-filename.d.ts +0 -0
  210. package/dist/get-extension-of-filename.js +5 -1
  211. package/dist/get-frame-padded-index.d.ts +3 -2
  212. package/dist/get-frame-padded-index.js +3 -2
  213. package/dist/get-frame-to-render.d.ts +0 -0
  214. package/dist/get-frame-to-render.js +1 -1
  215. package/dist/get-local-browser-executable.d.ts +0 -0
  216. package/dist/get-local-browser-executable.js +7 -15
  217. package/dist/get-port.d.ts +4 -1
  218. package/dist/get-port.js +8 -8
  219. package/dist/get-prores-profile-name.d.ts +0 -0
  220. package/dist/get-prores-profile-name.js +0 -0
  221. package/dist/get-video-threads-flag.d.ts +0 -0
  222. package/dist/get-video-threads-flag.js +3 -3
  223. package/dist/guess-extension-for-media.d.ts +3 -1
  224. package/dist/guess-extension-for-media.js +4 -7
  225. package/dist/image-format.d.ts +12 -6
  226. package/dist/image-format.js +19 -13
  227. package/dist/index.d.ts +368 -49
  228. package/dist/index.js +68 -46
  229. package/dist/is-audio-codec.d.ts +0 -0
  230. package/dist/is-audio-codec.js +0 -0
  231. package/dist/is-serve-url.d.ts +0 -0
  232. package/dist/is-serve-url.js +0 -0
  233. package/dist/jpeg-quality.d.ts +2 -0
  234. package/dist/jpeg-quality.js +22 -0
  235. package/dist/locks.d.ts +7 -0
  236. package/dist/locks.js +44 -0
  237. package/dist/log-level.d.ts +1 -1
  238. package/dist/log-level.js +0 -0
  239. package/dist/logger.d.ts +24 -0
  240. package/dist/logger.js +68 -0
  241. package/dist/make-cancel-signal.d.ts +13 -2
  242. package/dist/make-cancel-signal.js +24 -1
  243. package/dist/merge-audio-track.d.ts +4 -4
  244. package/dist/merge-audio-track.js +38 -33
  245. package/dist/mime-db.d.ts +0 -0
  246. package/dist/mime-db.js +0 -0
  247. package/dist/mime-types.d.ts +0 -0
  248. package/dist/mime-types.js +3 -3
  249. package/dist/normalize-serve-url.d.ts +0 -0
  250. package/dist/normalize-serve-url.js +0 -0
  251. package/dist/offthread-video-server.d.ts +47 -11
  252. package/dist/offthread-video-server.js +111 -58
  253. package/dist/open-browser.d.ts +21 -6
  254. package/dist/open-browser.js +37 -16
  255. package/dist/options/audio-bitrate.d.ts +2 -0
  256. package/dist/options/audio-bitrate.js +11 -0
  257. package/dist/options/crf.d.ts +2 -0
  258. package/dist/options/crf.js +11 -0
  259. package/dist/options/enforce-audio.d.ts +2 -0
  260. package/dist/options/enforce-audio.js +11 -0
  261. package/dist/options/jpeg-quality.d.ts +2 -0
  262. package/dist/options/jpeg-quality.js +11 -0
  263. package/dist/options/mute.d.ts +2 -0
  264. package/dist/options/mute.js +11 -0
  265. package/dist/options/option.d.ts +8 -0
  266. package/dist/options/option.js +2 -0
  267. package/dist/options/scale.d.ts +2 -0
  268. package/dist/options/scale.js +11 -0
  269. package/dist/options/video-bitrate.d.ts +2 -0
  270. package/dist/options/video-bitrate.js +11 -0
  271. package/dist/options/video-codec.d.ts +2 -0
  272. package/dist/options/video-codec.js +11 -0
  273. package/dist/overwrite.d.ts +0 -0
  274. package/dist/overwrite.js +0 -0
  275. package/dist/p-limit.d.ts +0 -0
  276. package/dist/p-limit.js +0 -0
  277. package/dist/parse-browser-error-stack.d.ts +1 -1
  278. package/dist/parse-browser-error-stack.js +0 -0
  279. package/dist/parse-ffmpeg-progress.d.ts +0 -0
  280. package/dist/parse-ffmpeg-progress.js +0 -0
  281. package/dist/perf.d.ts +2 -2
  282. package/dist/perf.js +9 -7
  283. package/dist/pixel-format.d.ts +2 -2
  284. package/dist/pixel-format.js +3 -0
  285. package/dist/pool.d.ts +0 -0
  286. package/dist/pool.js +0 -0
  287. package/dist/prepare-server.d.ts +25 -10
  288. package/dist/prepare-server.js +71 -18
  289. package/dist/preprocess-audio-track.d.ts +7 -5
  290. package/dist/preprocess-audio-track.js +7 -8
  291. package/dist/prespawn-ffmpeg.d.ts +20 -10
  292. package/dist/prespawn-ffmpeg.js +67 -29
  293. package/dist/prestitcher-memory-usage.d.ts +0 -4
  294. package/dist/prestitcher-memory-usage.js +4 -5
  295. package/dist/prores-profile.d.ts +6 -4
  296. package/dist/prores-profile.js +8 -8
  297. package/dist/provide-screenshot.d.ts +8 -4
  298. package/dist/provide-screenshot.js +5 -2
  299. package/dist/puppeteer-evaluate.d.ts +0 -0
  300. package/dist/puppeteer-evaluate.js +20 -12
  301. package/dist/puppeteer-screenshot.d.ts +12 -2
  302. package/dist/puppeteer-screenshot.js +18 -45
  303. package/dist/redirect-status-codes.d.ts +1 -0
  304. package/dist/redirect-status-codes.js +6 -0
  305. package/dist/render-frames.d.ts +52 -35
  306. package/dist/render-frames.js +248 -143
  307. package/dist/render-media.d.ts +76 -29
  308. package/dist/render-media.js +324 -195
  309. package/dist/render-still.d.ts +46 -19
  310. package/dist/render-still.js +128 -69
  311. package/dist/replace-browser.d.ts +6 -0
  312. package/dist/replace-browser.js +47 -0
  313. package/dist/resolve-asset-src.d.ts +0 -0
  314. package/dist/resolve-asset-src.js +2 -2
  315. package/dist/sample-rate.d.ts +0 -0
  316. package/dist/sample-rate.js +0 -0
  317. package/dist/screenshot-dom-element.d.ts +8 -4
  318. package/dist/screenshot-dom-element.js +15 -4
  319. package/dist/screenshot-task.d.ts +11 -2
  320. package/dist/screenshot-task.js +43 -13
  321. package/dist/seek-to-frame.d.ts +1 -0
  322. package/dist/seek-to-frame.js +49 -3
  323. package/dist/select-composition.d.ts +41 -0
  324. package/dist/select-composition.js +156 -0
  325. package/dist/serve-handler/index.d.ts +1 -1
  326. package/dist/serve-handler/index.js +21 -19
  327. package/dist/serve-handler/is-path-inside.d.ts +0 -0
  328. package/dist/serve-handler/is-path-inside.js +3 -3
  329. package/dist/serve-handler/range-parser.d.ts +0 -0
  330. package/dist/serve-handler/range-parser.js +0 -0
  331. package/dist/serve-static.d.ts +8 -6
  332. package/dist/serve-static.js +85 -59
  333. package/dist/set-props-and-env.d.ts +5 -3
  334. package/dist/set-props-and-env.js +18 -10
  335. package/dist/stitch-frames-to-video.d.ts +39 -16
  336. package/dist/stitch-frames-to-video.js +210 -121
  337. package/dist/stringify-ffmpeg-filter.d.ts +10 -2
  338. package/dist/stringify-ffmpeg-filter.js +37 -34
  339. package/dist/symbolicate-stacktrace.d.ts +16 -3
  340. package/dist/symbolicate-stacktrace.js +49 -24
  341. package/dist/take-frame-and-compose.d.ts +22 -0
  342. package/dist/take-frame-and-compose.js +103 -0
  343. package/dist/tmp-dir.d.ts +0 -0
  344. package/dist/tmp-dir.js +7 -8
  345. package/dist/truthy.d.ts +1 -1
  346. package/dist/truthy.js +0 -0
  347. package/dist/types.d.ts +2 -2
  348. package/dist/types.js +0 -0
  349. package/dist/validate-concurrency.d.ts +2 -0
  350. package/dist/validate-concurrency.js +21 -10
  351. package/dist/validate-even-dimensions-with-codec.d.ts +0 -0
  352. package/dist/validate-even-dimensions-with-codec.js +0 -0
  353. package/dist/validate-every-nth-frame.d.ts +2 -1
  354. package/dist/validate-every-nth-frame.js +8 -1
  355. package/dist/validate-ffmpeg-override.d.ts +0 -0
  356. package/dist/validate-ffmpeg-override.js +0 -0
  357. package/dist/validate-number-of-gif-loops.d.ts +2 -0
  358. package/dist/validate-number-of-gif-loops.js +24 -0
  359. package/dist/validate-opengl-renderer.d.ts +2 -3
  360. package/dist/validate-opengl-renderer.js +9 -4
  361. package/dist/validate-output-filename.d.ts +7 -2
  362. package/dist/validate-output-filename.js +20 -51
  363. package/dist/validate-puppeteer-timeout.d.ts +0 -0
  364. package/dist/validate-puppeteer-timeout.js +1 -0
  365. package/dist/validate-scale.d.ts +0 -0
  366. package/dist/validate-scale.js +0 -0
  367. package/dist/validate-videobitrate.d.ts +1 -0
  368. package/dist/validate-videobitrate.js +20 -0
  369. package/dist/wait-for-symbolication-error-to-be-done.d.ts +0 -0
  370. package/dist/wait-for-symbolication-error-to-be-done.js +5 -31
  371. package/dist/ws/ws-types.d.ts +0 -0
  372. package/dist/ws/ws-types.js +2 -1
  373. package/install-toolchain.mjs +36 -0
  374. package/package.json +70 -60
  375. package/types/ws/index.d.ts +5 -5
  376. package/.prettierrc.js +0 -14
  377. package/dist/assets/dl-browser.d.ts +0 -1
  378. package/dist/assets/dl-browser.js +0 -38
  379. package/dist/assets/get-video-stream-duration.d.ts +0 -4
  380. package/dist/assets/get-video-stream-duration.js +0 -59
  381. package/dist/calculate-sar-dar-pixels.d.ts +0 -9
  382. package/dist/calculate-sar-dar-pixels.js +0 -19
  383. package/dist/convert-to-pcm.d.ts +0 -6
  384. package/dist/convert-to-pcm.js +0 -20
  385. package/dist/ensure-presentation-timestamp.d.ts +0 -2
  386. package/dist/ensure-presentation-timestamp.js +0 -69
  387. package/dist/extract-frame-from-video.d.ts +0 -16
  388. package/dist/extract-frame-from-video.js +0 -277
  389. package/dist/ffmpeg-executable.d.ts +0 -1
  390. package/dist/ffmpeg-flags.d.ts +0 -12
  391. package/dist/ffmpeg-flags.js +0 -45
  392. package/dist/frame-to-ffmpeg-timestamp.d.ts +0 -1
  393. package/dist/frame-to-ffmpeg-timestamp.js +0 -8
  394. package/dist/get-audio-codec-name.d.ts +0 -2
  395. package/dist/get-audio-codec-name.js +0 -28
  396. package/dist/get-video-info.d.ts +0 -3
  397. package/dist/get-video-info.js +0 -49
  398. package/dist/is-beyond-last-frame.d.ts +0 -3
  399. package/dist/is-beyond-last-frame.js +0 -12
  400. package/dist/last-frame-from-video-cache.d.ts +0 -17
  401. package/dist/last-frame-from-video-cache.js +0 -55
  402. package/dist/legacy-webpack-config.d.ts +0 -9
  403. package/dist/legacy-webpack-config.js +0 -13
  404. package/dist/quality.d.ts +0 -1
  405. package/dist/quality.js +0 -21
  406. package/dist/validate-ffmpeg.d.ts +0 -2
  407. package/dist/validate-ffmpeg.js +0 -72
  408. package/dist/validate-frame.d.ts +0 -1
  409. package/dist/validate-frame.js +0 -24
  410. package/tsconfig.json +0 -10
  411. package/vitest.config.ts +0 -8
@@ -3,68 +3,71 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.renderMedia = void 0;
7
- const fs_1 = __importDefault(require("fs"));
8
- const os_1 = __importDefault(require("os"));
9
- const path_1 = __importDefault(require("path"));
6
+ exports.renderMedia = exports.internalRenderMedia = void 0;
7
+ const node_fs_1 = __importDefault(require("node:fs"));
8
+ const node_os_1 = __importDefault(require("node:os"));
9
+ const node_path_1 = __importDefault(require("node:path"));
10
10
  const remotion_1 = require("remotion");
11
- const download_map_1 = require("./assets/download-map");
11
+ const TimeoutSettings_1 = require("./browser/TimeoutSettings");
12
12
  const can_use_parallel_encoding_1 = require("./can-use-parallel-encoding");
13
13
  const codec_supports_media_1 = require("./codec-supports-media");
14
14
  const crf_1 = require("./crf");
15
15
  const delete_directory_1 = require("./delete-directory");
16
16
  const ensure_frames_in_order_1 = require("./ensure-frames-in-order");
17
17
  const ensure_output_directory_1 = require("./ensure-output-directory");
18
+ const find_closest_package_json_1 = require("./find-closest-package-json");
19
+ const get_concurrency_1 = require("./get-concurrency");
18
20
  const get_duration_from_frame_range_1 = require("./get-duration-from-frame-range");
19
21
  const get_extension_from_codec_1 = require("./get-extension-from-codec");
20
22
  const get_extension_of_filename_1 = require("./get-extension-of-filename");
21
23
  const get_frame_to_render_1 = require("./get-frame-to-render");
24
+ const image_format_1 = require("./image-format");
22
25
  const is_audio_codec_1 = require("./is-audio-codec");
23
- const legacy_webpack_config_1 = require("./legacy-webpack-config");
26
+ const jpeg_quality_1 = require("./jpeg-quality");
27
+ const logger_1 = require("./logger");
24
28
  const make_cancel_signal_1 = require("./make-cancel-signal");
25
29
  const overwrite_1 = require("./overwrite");
26
30
  const perf_1 = require("./perf");
31
+ const pixel_format_1 = require("./pixel-format");
32
+ const prepare_server_1 = require("./prepare-server");
27
33
  const prespawn_ffmpeg_1 = require("./prespawn-ffmpeg");
28
34
  const prestitcher_memory_usage_1 = require("./prestitcher-memory-usage");
29
- const quality_1 = require("./quality");
35
+ const prores_profile_1 = require("./prores-profile");
30
36
  const render_frames_1 = require("./render-frames");
31
37
  const stitch_frames_to_video_1 = require("./stitch-frames-to-video");
32
38
  const validate_even_dimensions_with_codec_1 = require("./validate-even-dimensions-with-codec");
39
+ const validate_every_nth_frame_1 = require("./validate-every-nth-frame");
33
40
  const validate_ffmpeg_override_1 = require("./validate-ffmpeg-override");
41
+ const validate_number_of_gif_loops_1 = require("./validate-number-of-gif-loops");
34
42
  const validate_output_filename_1 = require("./validate-output-filename");
35
43
  const validate_scale_1 = require("./validate-scale");
36
- const getConcurrency = (others) => {
37
- if ('concurrency' in others) {
38
- return others.concurrency;
39
- }
40
- if ('parallelism' in others) {
41
- return others.parallelism;
42
- }
43
- return null;
44
- };
45
- /**
46
- *
47
- * @description Render a video from a composition
48
- * @link https://www.remotion.dev/docs/renderer/render-media
49
- */
50
- const renderMedia = ({ 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, ffmpegOverride, ...options }) => {
51
- var _a, _b, _c, _d;
52
- (0, quality_1.validateQuality)(options.quality);
53
- if (typeof crf !== 'undefined' && crf !== null) {
54
- (0, crf_1.validateSelectedCrfAndCodecCombination)(crf, codec);
55
- }
44
+ const validate_videobitrate_1 = require("./validate-videobitrate");
45
+ const SLOWEST_FRAME_COUNT = 10;
46
+ const internalRenderMedia = ({ proResProfile, crf, composition, inputProps, pixelFormat, codec, envVariables, frameRange, puppeteerInstance, outputLocation, onProgress, overwrite, onDownload, dumpBrowserLogs, onBrowserLog, onStart, timeoutInMilliseconds, chromiumOptions, scale, browserExecutable, port, cancelSignal, muted, enforceAudioTrack, ffmpegOverride, audioBitrate, videoBitrate, audioCodec, concurrency, disallowParallelEncoding, everyNthFrame, imageFormat: provisionalImageFormat, indent, jpegQuality, numberOfGifLoops, onCtrlCExit, preferLossless, serveUrl, server: reusedServer, verbose, }) => {
47
+ (0, jpeg_quality_1.validateJpegQuality)(jpegQuality);
48
+ (0, crf_1.validateQualitySettings)({ crf, codec, videoBitrate });
49
+ (0, validate_videobitrate_1.validateBitrate)(audioBitrate, 'audioBitrate');
50
+ (0, validate_videobitrate_1.validateBitrate)(videoBitrate, 'videoBitrate');
51
+ (0, prores_profile_1.validateSelectedCodecAndProResCombination)({
52
+ codec,
53
+ proResProfile,
54
+ });
55
+ (0, pixel_format_1.validateSelectedPixelFormatAndCodecCombination)(pixelFormat, codec);
56
56
  if (outputLocation) {
57
- (0, validate_output_filename_1.validateOutputFilename)(codec, (0, get_extension_of_filename_1.getExtensionOfFilename)(outputLocation));
57
+ (0, validate_output_filename_1.validateOutputFilename)({
58
+ codec,
59
+ audioCodec,
60
+ extension: (0, get_extension_of_filename_1.getExtensionOfFilename)(outputLocation),
61
+ preferLossless,
62
+ });
58
63
  }
59
64
  const absoluteOutputLocation = outputLocation
60
- ? path_1.default.resolve(process.cwd(), outputLocation)
65
+ ? node_path_1.default.resolve(process.cwd(), outputLocation)
61
66
  : null;
62
67
  (0, validate_scale_1.validateScale)(scale);
63
- const concurrency = getConcurrency(options);
64
68
  (0, validate_ffmpeg_override_1.validateFfmpegOverride)(ffmpegOverride);
65
- const everyNthFrame = (_a = options.everyNthFrame) !== null && _a !== void 0 ? _a : 1;
66
- const numberOfGifLoops = (_b = options.numberOfGifLoops) !== null && _b !== void 0 ? _b : null;
67
- const serveUrl = (0, legacy_webpack_config_1.getServeUrlWithFallback)(options);
69
+ (0, validate_every_nth_frame_1.validateEveryNthFrame)(everyNthFrame, codec);
70
+ (0, validate_number_of_gif_loops_1.validateNumberOfGifLoops)(numberOfGifLoops, codec);
68
71
  let stitchStage = 'encoding';
69
72
  let stitcherFfmpeg;
70
73
  let preStitcher = null;
@@ -74,39 +77,57 @@ const renderMedia = ({ proResProfile, crf, composition, ffmpegExecutable, ffprob
74
77
  let encodedDoneIn = null;
75
78
  let cancelled = false;
76
79
  const renderStart = Date.now();
77
- const downloadMap = (_c = options.downloadMap) !== null && _c !== void 0 ? _c : (0, download_map_1.makeDownloadMap)();
78
80
  const { estimatedUsage, freeMemory, hasEnoughMemory } = (0, prestitcher_memory_usage_1.shouldUseParallelEncoding)({
79
81
  height: composition.height,
80
82
  width: composition.width,
81
83
  });
82
- const parallelEncoding = !options.disallowParallelEncoding &&
84
+ const parallelEncoding = !disallowParallelEncoding &&
83
85
  hasEnoughMemory &&
84
86
  (0, can_use_parallel_encoding_1.canUseParallelEncoding)(codec);
85
- if (options.verbose) {
86
- console.log('[PRESTITCHER] Free memory:', freeMemory, 'Estimated usage parallel encoding', estimatedUsage);
87
- console.log('[PRESTITCHER]: Codec supports parallel rendering:', (0, can_use_parallel_encoding_1.canUseParallelEncoding)(codec));
88
- console.log('[PRESTITCHER]: User disallowed parallel encoding:', Boolean(options.disallowParallelEncoding));
89
- if (parallelEncoding) {
90
- console.log('[PRESTITCHER] Parallel encoding is enabled.');
91
- }
92
- else {
93
- console.log('[PRESTITCHER] Parallel encoding is disabled.');
94
- }
87
+ logger_1.Log.verboseAdvanced({
88
+ indent,
89
+ logLevel: verbose ? 'verbose' : 'info',
90
+ tag: 'renderMedia()',
91
+ }, 'Free memory:', freeMemory, 'Estimated usage parallel encoding', estimatedUsage);
92
+ logger_1.Log.verboseAdvanced({
93
+ indent,
94
+ logLevel: verbose ? 'verbose' : 'info',
95
+ tag: 'renderMedia()',
96
+ }, 'Codec supports parallel rendering:', (0, can_use_parallel_encoding_1.canUseParallelEncoding)(codec));
97
+ logger_1.Log.verboseAdvanced({
98
+ indent,
99
+ logLevel: verbose ? 'verbose' : 'info',
100
+ tag: 'renderMedia()',
101
+ }, 'User disallowed parallel encoding:', Boolean(disallowParallelEncoding));
102
+ if (parallelEncoding) {
103
+ logger_1.Log.verboseAdvanced({
104
+ indent,
105
+ logLevel: verbose ? 'verbose' : 'info',
106
+ tag: 'renderMedia()',
107
+ }, 'Parallel encoding is enabled.');
108
+ }
109
+ else {
110
+ logger_1.Log.verboseAdvanced({
111
+ indent,
112
+ logLevel: verbose ? 'verbose' : 'info',
113
+ tag: 'renderMedia()',
114
+ }, 'Parallel encoding is disabled.');
95
115
  }
96
116
  const imageFormat = (0, is_audio_codec_1.isAudioCodec)(codec)
97
117
  ? 'none'
98
- : (_d = options.imageFormat) !== null && _d !== void 0 ? _d : 'jpeg';
99
- const quality = imageFormat === 'jpeg' ? options.quality : undefined;
118
+ : provisionalImageFormat;
119
+ (0, image_format_1.validateSelectedPixelFormatAndImageFormatCombination)(pixelFormat, imageFormat);
120
+ const workingDir = node_fs_1.default.mkdtempSync(node_path_1.default.join(node_os_1.default.tmpdir(), 'react-motion-render'));
100
121
  const preEncodedFileLocation = parallelEncoding
101
- ? path_1.default.join(downloadMap.preEncode, 'pre-encode.' + (0, get_extension_from_codec_1.getFileExtensionFromCodec)(codec, 'chunk'))
122
+ ? node_path_1.default.join(workingDir, 'pre-encode.' + (0, get_extension_from_codec_1.getFileExtensionFromCodec)(codec, audioCodec))
102
123
  : null;
103
- const outputDir = parallelEncoding
104
- ? null
105
- : fs_1.default.mkdtempSync(path_1.default.join(os_1.default.tmpdir(), 'react-motion-render'));
124
+ if (onCtrlCExit && workingDir) {
125
+ onCtrlCExit(() => (0, delete_directory_1.deleteDirectory)(workingDir));
126
+ }
106
127
  (0, validate_even_dimensions_with_codec_1.validateEvenDimensionsWithCodec)({
107
128
  codec,
108
129
  height: composition.height,
109
- scale: scale !== null && scale !== void 0 ? scale : 1,
130
+ scale,
110
131
  width: composition.width,
111
132
  });
112
133
  const callUpdate = () => {
@@ -121,7 +142,7 @@ const renderMedia = ({ proResProfile, crf, composition, ffmpegExecutable, ffprob
121
142
  100) / 100,
122
143
  });
123
144
  };
124
- const realFrameRange = (0, get_frame_to_render_1.getRealFrameRange)(composition.durationInFrames, frameRange !== null && frameRange !== void 0 ? frameRange : null);
145
+ const realFrameRange = (0, get_frame_to_render_1.getRealFrameRange)(composition.durationInFrames, frameRange);
125
146
  const cancelRenderFrames = (0, make_cancel_signal_1.makeCancelSignal)();
126
147
  const cancelPrestitcher = (0, make_cancel_signal_1.makeCancelSignal)();
127
148
  const cancelStitcher = (0, make_cancel_signal_1.makeCancelSignal)();
@@ -129,14 +150,13 @@ const renderMedia = ({ proResProfile, crf, composition, ffmpegExecutable, ffprob
129
150
  cancelRenderFrames.cancel();
130
151
  });
131
152
  const { waitForRightTimeOfFrameToBeInserted, setFrameToStitch, waitForFinish } = (0, ensure_frames_in_order_1.ensureFramesInOrder)(realFrameRange);
132
- const fps = composition.fps / (everyNthFrame !== null && everyNthFrame !== void 0 ? everyNthFrame : 1);
153
+ const fps = composition.fps / everyNthFrame;
133
154
  remotion_1.Internals.validateFps(fps, 'in "renderMedia()"', codec === 'gif');
134
- const createPrestitcherIfNecessary = async () => {
135
- var _a;
155
+ const createPrestitcherIfNecessary = () => {
136
156
  if (preEncodedFileLocation) {
137
- preStitcher = await (0, prespawn_ffmpeg_1.prespawnFfmpeg)({
138
- width: composition.width * (scale !== null && scale !== void 0 ? scale : 1),
139
- height: composition.height * (scale !== null && scale !== void 0 ? scale : 1),
157
+ preStitcher = (0, prespawn_ffmpeg_1.prespawnFfmpeg)({
158
+ width: composition.width * scale,
159
+ height: composition.height * scale,
140
160
  fps,
141
161
  outputLocation: preEncodedFileLocation,
142
162
  pixelFormat,
@@ -147,11 +167,12 @@ const renderMedia = ({ proResProfile, crf, composition, ffmpegExecutable, ffprob
147
167
  encodedFrames = frame;
148
168
  callUpdate();
149
169
  },
150
- verbose: (_a = options.verbose) !== null && _a !== void 0 ? _a : false,
151
- ffmpegExecutable,
170
+ verbose,
152
171
  imageFormat,
153
172
  signal: cancelPrestitcher.cancelSignal,
154
- ffmpegOverride,
173
+ ffmpegOverride: ffmpegOverride !== null && ffmpegOverride !== void 0 ? ffmpegOverride : (({ args }) => args),
174
+ videoBitrate,
175
+ indent,
155
176
  });
156
177
  stitcherFfmpeg = preStitcher.task;
157
178
  }
@@ -171,153 +192,261 @@ const renderMedia = ({ proResProfile, crf, composition, ffmpegExecutable, ffprob
171
192
  };
172
193
  const mediaSupport = (0, codec_supports_media_1.codecSupportsMedia)(codec);
173
194
  const disableAudio = !mediaSupport.audio || muted;
174
- const happyPath = createPrestitcherIfNecessary()
175
- .then(() => {
176
- const renderFramesProc = (0, render_frames_1.renderFrames)({
177
- config: composition,
178
- onFrameUpdate: (frame) => {
179
- renderedFrames = frame;
180
- callUpdate();
181
- },
182
- concurrency,
183
- outputDir,
184
- onStart: (data) => {
185
- renderedFrames = 0;
186
- callUpdate();
187
- onStart === null || onStart === void 0 ? void 0 : onStart(data);
188
- },
189
- inputProps,
190
- envVariables,
191
- imageFormat,
192
- quality,
193
- frameRange: frameRange !== null && frameRange !== void 0 ? frameRange : null,
194
- puppeteerInstance,
195
- everyNthFrame,
196
- onFrameBuffer: parallelEncoding
197
- ? async (buffer, frame) => {
198
- var _a;
199
- await waitForRightTimeOfFrameToBeInserted(frame);
200
- if (cancelled) {
201
- return;
202
- }
203
- const id = (0, perf_1.startPerfMeasure)('piping');
204
- (_a = stitcherFfmpeg === null || stitcherFfmpeg === void 0 ? void 0 : stitcherFfmpeg.stdin) === null || _a === void 0 ? void 0 : _a.write(buffer);
205
- (0, perf_1.stopPerfMeasure)(id);
206
- setFrameToStitch(Math.min(realFrameRange[1] + 1, frame + everyNthFrame));
207
- }
208
- : undefined,
209
- serveUrl,
210
- dumpBrowserLogs,
211
- onBrowserLog,
212
- onDownload,
213
- timeoutInMilliseconds,
214
- chromiumOptions,
215
- scale,
216
- ffmpegExecutable,
217
- ffprobeExecutable,
218
- browserExecutable,
219
- port,
220
- cancelSignal: cancelRenderFrames.cancelSignal,
221
- downloadMap,
222
- muted: disableAudio,
223
- });
224
- return renderFramesProc;
225
- })
226
- .then((renderFramesReturn) => {
227
- return Promise.all([renderFramesReturn, waitForPrestitcherIfNecessary()]);
228
- })
229
- .then(([{ assetsInfo }]) => {
230
- renderedDoneIn = Date.now() - renderStart;
231
- callUpdate();
232
- if (absoluteOutputLocation) {
233
- (0, ensure_output_directory_1.ensureOutputDirectory)(absoluteOutputLocation);
195
+ const slowestFrames = [];
196
+ let maxTime = 0;
197
+ let minTime = 0;
198
+ const recordFrameTime = (frameIndex, time) => {
199
+ var _a, _b;
200
+ const frameTime = { frame: frameIndex, time };
201
+ if (time < minTime && slowestFrames.length === SLOWEST_FRAME_COUNT) {
202
+ return;
234
203
  }
235
- const stitchStart = Date.now();
236
- return Promise.all([
237
- (0, stitch_frames_to_video_1.stitchFramesToVideo)({
238
- width: composition.width * (scale !== null && scale !== void 0 ? scale : 1),
239
- height: composition.height * (scale !== null && scale !== void 0 ? scale : 1),
240
- fps,
241
- outputLocation: absoluteOutputLocation,
242
- internalOptions: {
243
- preEncodedFileLocation,
244
- imageFormat,
204
+ if (time > maxTime) {
205
+ // add at starting;
206
+ slowestFrames.unshift(frameTime);
207
+ maxTime = time;
208
+ }
209
+ else {
210
+ // add frame at appropriate position
211
+ const index = slowestFrames.findIndex(({ time: indexTime }) => indexTime < time);
212
+ slowestFrames.splice(index, 0, frameTime);
213
+ }
214
+ if (slowestFrames.length > SLOWEST_FRAME_COUNT) {
215
+ slowestFrames.pop();
216
+ }
217
+ minTime = (_b = (_a = slowestFrames[slowestFrames.length - 1]) === null || _a === void 0 ? void 0 : _a.time) !== null && _b !== void 0 ? _b : minTime;
218
+ };
219
+ let cleanupServerFn = () => Promise.resolve(undefined);
220
+ const happyPath = new Promise((resolve, reject) => {
221
+ Promise.resolve(createPrestitcherIfNecessary())
222
+ .then(() => {
223
+ return (0, prepare_server_1.makeOrReuseServer)(reusedServer, {
224
+ concurrency: (0, get_concurrency_1.getActualConcurrency)(concurrency),
225
+ indent,
226
+ port,
227
+ remotionRoot: (0, find_closest_package_json_1.findRemotionRoot)(),
228
+ verbose,
229
+ webpackConfigOrServeUrl: serveUrl,
230
+ }, {
231
+ onDownload,
232
+ onError: (err) => reject(err),
233
+ });
234
+ })
235
+ .then(({ server, cleanupServer }) => {
236
+ cleanupServerFn = cleanupServer;
237
+ const renderFramesProc = (0, render_frames_1.internalRenderFrames)({
238
+ composition,
239
+ onFrameUpdate: (frame, frameIndex, timeToRenderInMilliseconds) => {
240
+ renderedFrames = frame;
241
+ callUpdate();
242
+ recordFrameTime(frameIndex, timeToRenderInMilliseconds);
245
243
  },
246
- force: overwrite !== null && overwrite !== void 0 ? overwrite : overwrite_1.DEFAULT_OVERWRITE,
247
- pixelFormat,
248
- codec,
249
- proResProfile,
250
- crf,
251
- assetsInfo,
252
- ffmpegExecutable,
253
- ffprobeExecutable,
254
- onProgress: (frame) => {
255
- stitchStage = 'muxing';
256
- encodedFrames = frame;
244
+ concurrency,
245
+ outputDir: parallelEncoding ? null : workingDir,
246
+ onStart: (data) => {
247
+ renderedFrames = 0;
257
248
  callUpdate();
249
+ onStart === null || onStart === void 0 ? void 0 : onStart(data);
258
250
  },
251
+ inputProps,
252
+ envVariables,
253
+ imageFormat,
254
+ jpegQuality,
255
+ frameRange,
256
+ puppeteerInstance,
257
+ everyNthFrame,
258
+ onFrameBuffer: parallelEncoding
259
+ ? async (buffer, frame) => {
260
+ var _a;
261
+ await waitForRightTimeOfFrameToBeInserted(frame);
262
+ if (cancelled) {
263
+ return;
264
+ }
265
+ const id = (0, perf_1.startPerfMeasure)('piping');
266
+ const exitStatus = preStitcher === null || preStitcher === void 0 ? void 0 : preStitcher.getExitStatus();
267
+ if ((exitStatus === null || exitStatus === void 0 ? void 0 : exitStatus.type) === 'quit-successfully') {
268
+ throw new Error(`FFmpeg already quit while trying to pipe frame ${frame} to it. Stderr: ${exitStatus.stderr}}`);
269
+ }
270
+ if ((exitStatus === null || exitStatus === void 0 ? void 0 : exitStatus.type) === 'quit-with-error') {
271
+ throw new Error(`FFmpeg quit with code ${exitStatus.exitCode} while piping frame ${frame}. Stderr: ${exitStatus.stderr}}`);
272
+ }
273
+ (_a = stitcherFfmpeg === null || stitcherFfmpeg === void 0 ? void 0 : stitcherFfmpeg.stdin) === null || _a === void 0 ? void 0 : _a.write(buffer);
274
+ (0, perf_1.stopPerfMeasure)(id);
275
+ setFrameToStitch(Math.min(realFrameRange[1] + 1, frame + everyNthFrame));
276
+ }
277
+ : null,
278
+ webpackBundleOrServeUrl: serveUrl,
279
+ dumpBrowserLogs,
280
+ onBrowserLog,
259
281
  onDownload,
260
- numberOfGifLoops,
261
- verbose: options.verbose,
262
- dir: outputDir !== null && outputDir !== void 0 ? outputDir : undefined,
263
- cancelSignal: cancelStitcher.cancelSignal,
282
+ timeoutInMilliseconds,
283
+ chromiumOptions,
284
+ scale,
285
+ browserExecutable,
286
+ port,
287
+ cancelSignal: cancelRenderFrames.cancelSignal,
264
288
  muted: disableAudio,
265
- enforceAudioTrack,
266
- ffmpegOverride,
267
- }),
268
- stitchStart,
269
- ]);
270
- })
271
- .then(([buffer, stitchStart]) => {
272
- encodedFrames = (0, get_duration_from_frame_range_1.getFramesToRender)(realFrameRange, everyNthFrame).length;
273
- encodedDoneIn = Date.now() - stitchStart;
274
- callUpdate();
275
- return buffer;
276
- })
277
- .catch((err) => {
278
- /**
279
- * When an error is thrown in renderFrames(...) (e.g., when delayRender() is used incorrectly), fs.unlinkSync(...) throws an error that the file is locked because ffmpeg is still running, and renderMedia returns it.
280
- * Therefore we first kill the FFMPEG process before deleting the file
281
- */
282
- cancelled = true;
283
- cancelRenderFrames.cancel();
284
- cancelStitcher.cancel();
285
- cancelPrestitcher.cancel();
286
- if (stitcherFfmpeg !== undefined && stitcherFfmpeg.exitCode === null) {
287
- const promise = new Promise((resolve) => {
288
- setTimeout(() => {
289
- resolve();
290
- }, 2000);
291
- stitcherFfmpeg.on('close', resolve);
292
- });
293
- stitcherFfmpeg.kill();
294
- return promise.then(() => {
295
- throw err;
289
+ verbose,
290
+ indent,
291
+ server,
296
292
  });
297
- }
298
- throw err;
299
- })
300
- .finally(() => {
301
- if (preEncodedFileLocation !== null &&
302
- fs_1.default.existsSync(preEncodedFileLocation)) {
303
- (0, delete_directory_1.deleteDirectory)(path_1.default.dirname(preEncodedFileLocation));
304
- }
305
- // Clean download map if it was not passed in
306
- if (!(options === null || options === void 0 ? void 0 : options.downloadMap)) {
307
- (0, download_map_1.cleanDownloadMap)(downloadMap);
308
- }
309
- // Clean temporary image frames when rendering ends or fails
310
- if (outputDir && fs_1.default.existsSync(outputDir)) {
311
- (0, delete_directory_1.deleteDirectory)(outputDir);
312
- }
293
+ return renderFramesProc;
294
+ })
295
+ .then((renderFramesReturn) => {
296
+ return Promise.all([
297
+ renderFramesReturn,
298
+ waitForPrestitcherIfNecessary(),
299
+ ]);
300
+ })
301
+ .then(([{ assetsInfo }]) => {
302
+ renderedDoneIn = Date.now() - renderStart;
303
+ callUpdate();
304
+ if (absoluteOutputLocation) {
305
+ (0, ensure_output_directory_1.ensureOutputDirectory)(absoluteOutputLocation);
306
+ }
307
+ const stitchStart = Date.now();
308
+ return Promise.all([
309
+ (0, stitch_frames_to_video_1.internalStitchFramesToVideo)({
310
+ width: composition.width * scale,
311
+ height: composition.height * scale,
312
+ fps,
313
+ outputLocation: absoluteOutputLocation,
314
+ preEncodedFileLocation,
315
+ preferLossless,
316
+ indent,
317
+ force: overwrite,
318
+ pixelFormat,
319
+ codec,
320
+ proResProfile,
321
+ crf,
322
+ assetsInfo,
323
+ onProgress: (frame) => {
324
+ stitchStage = 'muxing';
325
+ encodedFrames = frame;
326
+ callUpdate();
327
+ },
328
+ onDownload,
329
+ numberOfGifLoops,
330
+ verbose,
331
+ dir: workingDir,
332
+ cancelSignal: cancelStitcher.cancelSignal,
333
+ muted: disableAudio,
334
+ enforceAudioTrack,
335
+ ffmpegOverride: ffmpegOverride !== null && ffmpegOverride !== void 0 ? ffmpegOverride : null,
336
+ audioBitrate,
337
+ videoBitrate,
338
+ audioCodec,
339
+ }),
340
+ stitchStart,
341
+ ]);
342
+ })
343
+ .then(([buffer, stitchStart]) => {
344
+ encodedFrames = (0, get_duration_from_frame_range_1.getFramesToRender)(realFrameRange, everyNthFrame).length;
345
+ encodedDoneIn = Date.now() - stitchStart;
346
+ callUpdate();
347
+ slowestFrames.sort((a, b) => b.time - a.time);
348
+ const result = {
349
+ buffer,
350
+ slowestFrames,
351
+ };
352
+ resolve(result);
353
+ })
354
+ .catch((err) => {
355
+ /**
356
+ * When an error is thrown in renderFrames(...) (e.g., when delayRender() is used incorrectly), fs.unlinkSync(...) throws an error that the file is locked because ffmpeg is still running, and renderMedia returns it.
357
+ * Therefore we first kill the FFMPEG process before deleting the file
358
+ */
359
+ cancelled = true;
360
+ cancelRenderFrames.cancel();
361
+ cancelStitcher.cancel();
362
+ cancelPrestitcher.cancel();
363
+ if (stitcherFfmpeg !== undefined && stitcherFfmpeg.exitCode === null) {
364
+ const promise = new Promise((res) => {
365
+ setTimeout(() => {
366
+ res();
367
+ }, 2000);
368
+ stitcherFfmpeg.on('close', res);
369
+ });
370
+ stitcherFfmpeg.kill();
371
+ return promise.then(() => {
372
+ reject(err);
373
+ });
374
+ }
375
+ reject(err);
376
+ })
377
+ .finally(() => {
378
+ if (preEncodedFileLocation !== null &&
379
+ node_fs_1.default.existsSync(preEncodedFileLocation)) {
380
+ (0, delete_directory_1.deleteDirectory)(node_path_1.default.dirname(preEncodedFileLocation));
381
+ }
382
+ // Clean temporary image frames when rendering ends or fails
383
+ if (workingDir && node_fs_1.default.existsSync(workingDir)) {
384
+ (0, delete_directory_1.deleteDirectory)(workingDir);
385
+ }
386
+ cleanupServerFn === null || cleanupServerFn === void 0 ? void 0 : cleanupServerFn(false);
387
+ });
313
388
  });
314
389
  return Promise.race([
315
390
  happyPath,
316
391
  new Promise((_resolve, reject) => {
317
392
  cancelSignal === null || cancelSignal === void 0 ? void 0 : cancelSignal(() => {
318
- reject(new Error('renderMedia() got cancelled'));
393
+ reject(new Error(make_cancel_signal_1.cancelErrorMessages.renderMedia));
319
394
  });
320
395
  }),
321
396
  ]);
322
397
  };
398
+ exports.internalRenderMedia = internalRenderMedia;
399
+ /**
400
+ *
401
+ * @description Render a video from a composition
402
+ * @see [Documentation](https://www.remotion.dev/docs/renderer/render-media)
403
+ */
404
+ const renderMedia = ({ proResProfile, crf, composition, inputProps, pixelFormat, codec, envVariables, frameRange, puppeteerInstance, outputLocation, onProgress, overwrite, onDownload, dumpBrowserLogs, onBrowserLog, onStart, timeoutInMilliseconds, chromiumOptions, scale, browserExecutable, port, cancelSignal, muted, enforceAudioTrack, ffmpegOverride, audioBitrate, videoBitrate, audioCodec, jpegQuality, concurrency, serveUrl, disallowParallelEncoding, everyNthFrame, imageFormat, numberOfGifLoops, preferLossless, verbose, quality, }) => {
405
+ var _a;
406
+ if (quality !== undefined) {
407
+ console.warn(`The "quality" option has been renamed. Please use "jpegQuality" instead.`);
408
+ }
409
+ return (0, exports.internalRenderMedia)({
410
+ proResProfile: proResProfile !== null && proResProfile !== void 0 ? proResProfile : undefined,
411
+ codec,
412
+ composition,
413
+ serveUrl,
414
+ audioBitrate: audioBitrate !== null && audioBitrate !== void 0 ? audioBitrate : null,
415
+ audioCodec: audioCodec !== null && audioCodec !== void 0 ? audioCodec : null,
416
+ browserExecutable: browserExecutable !== null && browserExecutable !== void 0 ? browserExecutable : null,
417
+ cancelSignal,
418
+ chromiumOptions: chromiumOptions !== null && chromiumOptions !== void 0 ? chromiumOptions : {},
419
+ concurrency: concurrency !== null && concurrency !== void 0 ? concurrency : null,
420
+ crf: crf !== null && crf !== void 0 ? crf : null,
421
+ disallowParallelEncoding: disallowParallelEncoding !== null && disallowParallelEncoding !== void 0 ? disallowParallelEncoding : false,
422
+ dumpBrowserLogs: dumpBrowserLogs !== null && dumpBrowserLogs !== void 0 ? dumpBrowserLogs : false,
423
+ enforceAudioTrack: enforceAudioTrack !== null && enforceAudioTrack !== void 0 ? enforceAudioTrack : false,
424
+ envVariables: envVariables !== null && envVariables !== void 0 ? envVariables : {},
425
+ everyNthFrame: everyNthFrame !== null && everyNthFrame !== void 0 ? everyNthFrame : 1,
426
+ ffmpegOverride: ffmpegOverride !== null && ffmpegOverride !== void 0 ? ffmpegOverride : undefined,
427
+ frameRange: frameRange !== null && frameRange !== void 0 ? frameRange : null,
428
+ imageFormat: imageFormat !== null && imageFormat !== void 0 ? imageFormat : image_format_1.DEFAULT_VIDEO_IMAGE_FORMAT,
429
+ inputProps: inputProps !== null && inputProps !== void 0 ? inputProps : {},
430
+ jpegQuality: (_a = jpegQuality !== null && jpegQuality !== void 0 ? jpegQuality : quality) !== null && _a !== void 0 ? _a : jpeg_quality_1.DEFAULT_JPEG_QUALITY,
431
+ muted: muted !== null && muted !== void 0 ? muted : false,
432
+ numberOfGifLoops: numberOfGifLoops !== null && numberOfGifLoops !== void 0 ? numberOfGifLoops : null,
433
+ onBrowserLog: onBrowserLog !== null && onBrowserLog !== void 0 ? onBrowserLog : null,
434
+ onDownload: onDownload !== null && onDownload !== void 0 ? onDownload : (() => undefined),
435
+ onProgress: onProgress !== null && onProgress !== void 0 ? onProgress : (() => undefined),
436
+ onStart: onStart !== null && onStart !== void 0 ? onStart : (() => undefined),
437
+ outputLocation: outputLocation !== null && outputLocation !== void 0 ? outputLocation : null,
438
+ overwrite: overwrite !== null && overwrite !== void 0 ? overwrite : overwrite_1.DEFAULT_OVERWRITE,
439
+ pixelFormat: pixelFormat !== null && pixelFormat !== void 0 ? pixelFormat : pixel_format_1.DEFAULT_PIXEL_FORMAT,
440
+ port: port !== null && port !== void 0 ? port : null,
441
+ puppeteerInstance: puppeteerInstance !== null && puppeteerInstance !== void 0 ? puppeteerInstance : undefined,
442
+ scale: scale !== null && scale !== void 0 ? scale : 1,
443
+ timeoutInMilliseconds: timeoutInMilliseconds !== null && timeoutInMilliseconds !== void 0 ? timeoutInMilliseconds : TimeoutSettings_1.DEFAULT_TIMEOUT,
444
+ videoBitrate: videoBitrate !== null && videoBitrate !== void 0 ? videoBitrate : null,
445
+ verbose: verbose !== null && verbose !== void 0 ? verbose : false,
446
+ preferLossless: preferLossless !== null && preferLossless !== void 0 ? preferLossless : false,
447
+ indent: false,
448
+ onCtrlCExit: () => undefined,
449
+ server: undefined,
450
+ });
451
+ };
323
452
  exports.renderMedia = renderMedia;