@remotion/renderer 4.0.0-alpha.4 → 4.0.0-audio-mixing.4

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 (554) hide show
  1. package/LICENSE.md +8 -8
  2. package/README.md +47 -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 +2 -1
  12. package/dist/assets/download-and-map-assets-to-file.js +54 -11
  13. package/dist/assets/download-file.d.ts +7 -5
  14. package/dist/assets/download-file.js +49 -6
  15. package/dist/assets/download-map.d.ts +8 -3
  16. package/dist/assets/download-map.js +8 -4
  17. package/dist/assets/ffmpeg-volume-expression.d.ts +2 -1
  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 +1 -1
  22. package/dist/assets/get-audio-channels.js +5 -4
  23. package/dist/assets/get-video-stream-duration.d.ts +7 -1
  24. package/dist/assets/get-video-stream-duration.js +50 -14
  25. package/dist/assets/read-file.d.ts +0 -0
  26. package/dist/assets/read-file.js +2 -4
  27. package/dist/assets/round-volume-to-avoid-stack-overflow.d.ts +0 -0
  28. package/dist/assets/round-volume-to-avoid-stack-overflow.js +0 -0
  29. package/dist/assets/sanitize-filename.d.ts +0 -0
  30. package/dist/assets/sanitize-filename.js +0 -0
  31. package/dist/assets/sanitize-filepath.d.ts +0 -0
  32. package/dist/assets/sanitize-filepath.js +0 -0
  33. package/dist/assets/truncate-utf8-bytes.d.ts +0 -0
  34. package/dist/assets/truncate-utf8-bytes.js +0 -0
  35. package/dist/assets/types.d.ts +1 -0
  36. package/dist/assets/types.js +0 -0
  37. package/dist/audio-codec.d.ts +27 -0
  38. package/dist/audio-codec.js +89 -0
  39. package/dist/browser/Browser.d.ts +4 -2
  40. package/dist/browser/Browser.js +15 -12
  41. package/dist/browser/BrowserConnector.d.ts +0 -0
  42. package/dist/browser/BrowserConnector.js +0 -0
  43. package/dist/browser/BrowserFetcher.d.ts +1 -0
  44. package/dist/browser/BrowserFetcher.js +24 -21
  45. package/dist/browser/BrowserPage.d.ts +8 -2
  46. package/dist/browser/BrowserPage.js +8 -11
  47. package/dist/browser/BrowserRunner.d.ts +1 -4
  48. package/dist/browser/BrowserRunner.js +30 -73
  49. package/dist/browser/Connection.d.ts +0 -0
  50. package/dist/browser/Connection.js +1 -1
  51. package/dist/browser/ConsoleMessage.d.ts +0 -0
  52. package/dist/browser/ConsoleMessage.js +0 -0
  53. package/dist/browser/DOMWorld.d.ts +2 -1
  54. package/dist/browser/DOMWorld.js +8 -1
  55. package/dist/browser/Errors.d.ts +0 -0
  56. package/dist/browser/Errors.js +0 -0
  57. package/dist/browser/EvalTypes.d.ts +0 -0
  58. package/dist/browser/EvalTypes.js +0 -0
  59. package/dist/browser/EventEmitter.d.ts +0 -0
  60. package/dist/browser/EventEmitter.js +0 -0
  61. package/dist/browser/ExecutionContext.d.ts +0 -0
  62. package/dist/browser/ExecutionContext.js +0 -0
  63. package/dist/browser/FrameManager.d.ts +0 -2
  64. package/dist/browser/FrameManager.js +0 -3
  65. package/dist/browser/HTTPRequest.d.ts +0 -0
  66. package/dist/browser/HTTPRequest.js +0 -0
  67. package/dist/browser/HTTPResponse.d.ts +0 -0
  68. package/dist/browser/HTTPResponse.js +0 -0
  69. package/dist/browser/JSHandle.d.ts +0 -0
  70. package/dist/browser/JSHandle.js +0 -0
  71. package/dist/browser/LaunchOptions.d.ts +0 -4
  72. package/dist/browser/LaunchOptions.js +0 -0
  73. package/dist/browser/Launcher.d.ts +7 -1
  74. package/dist/browser/Launcher.js +10 -368
  75. package/dist/browser/LifecycleWatcher.d.ts +0 -0
  76. package/dist/browser/LifecycleWatcher.js +0 -0
  77. package/dist/browser/NetworkEventManager.d.ts +0 -0
  78. package/dist/browser/NetworkEventManager.js +0 -0
  79. package/dist/browser/NetworkManager.d.ts +0 -0
  80. package/dist/browser/NetworkManager.js +0 -0
  81. package/dist/browser/NodeWebSocketTransport.d.ts +0 -0
  82. package/dist/browser/NodeWebSocketTransport.js +1 -1
  83. package/dist/browser/Product.d.ts +0 -0
  84. package/dist/browser/Product.js +0 -0
  85. package/dist/browser/PuppeteerNode.d.ts +0 -0
  86. package/dist/browser/PuppeteerNode.js +2 -9
  87. package/dist/browser/PuppeteerViewport.d.ts +0 -0
  88. package/dist/browser/PuppeteerViewport.js +0 -0
  89. package/dist/browser/ScreenshotOptions.d.ts +0 -14
  90. package/dist/browser/ScreenshotOptions.js +0 -1
  91. package/dist/browser/Target.d.ts +0 -0
  92. package/dist/browser/Target.js +0 -0
  93. package/dist/browser/TaskQueue.d.ts +0 -0
  94. package/dist/browser/TaskQueue.js +0 -0
  95. package/dist/browser/TimeoutSettings.d.ts +0 -0
  96. package/dist/browser/TimeoutSettings.js +0 -0
  97. package/dist/browser/assert.d.ts +0 -0
  98. package/dist/browser/assert.js +0 -0
  99. package/dist/browser/create-browser-fetcher.d.ts +0 -0
  100. package/dist/browser/create-browser-fetcher.js +2 -44
  101. package/dist/browser/devtools-commands.d.ts +0 -0
  102. package/dist/browser/devtools-commands.js +0 -0
  103. package/dist/browser/devtools-types.d.ts +4 -0
  104. package/dist/browser/devtools-types.js +0 -0
  105. package/dist/browser/get-download-destination.d.ts +0 -0
  106. package/dist/browser/get-download-destination.js +0 -0
  107. package/dist/browser/mitt/index.d.ts +0 -0
  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 +0 -1
  112. package/dist/browser/revisions.js +0 -1
  113. package/dist/browser/util.d.ts +0 -0
  114. package/dist/browser/util.js +0 -0
  115. package/dist/browser-executable.d.ts +0 -0
  116. package/dist/browser-executable.js +0 -0
  117. package/dist/browser-log.d.ts +0 -0
  118. package/dist/browser-log.js +0 -0
  119. package/dist/browser.d.ts +0 -0
  120. package/dist/browser.js +0 -0
  121. package/dist/calculate-ffmpeg-filters.d.ts +0 -0
  122. package/dist/calculate-ffmpeg-filters.js +1 -0
  123. package/dist/calculate-sar-dar-pixels.d.ts +0 -0
  124. package/dist/calculate-sar-dar-pixels.js +0 -0
  125. package/dist/can-use-parallel-encoding.d.ts +0 -0
  126. package/dist/can-use-parallel-encoding.js +0 -0
  127. package/dist/check-apple-silicon.d.ts +1 -0
  128. package/dist/check-apple-silicon.js +55 -0
  129. package/dist/chunk.d.ts +0 -0
  130. package/dist/chunk.js +0 -0
  131. package/dist/client.d.ts +179 -0
  132. package/dist/client.js +23 -0
  133. package/dist/codec-supports-media.d.ts +1 -0
  134. package/dist/codec-supports-media.js +8 -1
  135. package/dist/codec.d.ts +0 -0
  136. package/dist/codec.js +0 -0
  137. package/dist/combine-videos.d.ts +9 -2
  138. package/dist/combine-videos.js +12 -8
  139. package/dist/compositor/compose.d.ts +13 -0
  140. package/dist/compositor/compose.js +47 -0
  141. package/dist/compositor/get-executable-path.d.ts +1 -0
  142. package/dist/compositor/get-executable-path.js +47 -0
  143. package/dist/compositor/payloads.d.ts +41 -0
  144. package/dist/compositor/payloads.js +2 -0
  145. package/dist/compress-assets.d.ts +0 -0
  146. package/dist/compress-assets.js +0 -0
  147. package/dist/convert-number-of-gif-loops-to-ffmpeg.d.ts +0 -0
  148. package/dist/convert-number-of-gif-loops-to-ffmpeg.js +0 -0
  149. package/dist/convert-to-pcm.d.ts +2 -1
  150. package/dist/convert-to-pcm.js +3 -2
  151. package/dist/convert-to-positive-frame-index.d.ts +4 -0
  152. package/dist/convert-to-positive-frame-index.js +8 -0
  153. package/dist/create-ffmpeg-complex-filter.d.ts +1 -4
  154. package/dist/create-ffmpeg-complex-filter.js +0 -0
  155. package/dist/create-ffmpeg-merge-filter.d.ts +0 -0
  156. package/dist/create-ffmpeg-merge-filter.js +1 -12
  157. package/dist/create-silent-audio.d.ts +2 -1
  158. package/dist/create-silent-audio.js +3 -2
  159. package/dist/crf.d.ts +5 -1
  160. package/dist/crf.js +33 -6
  161. package/dist/cycle-browser-tabs.d.ts +2 -5
  162. package/dist/cycle-browser-tabs.js +5 -5
  163. package/dist/delay-render-embedded-stack.d.ts +0 -0
  164. package/dist/delay-render-embedded-stack.js +0 -0
  165. package/dist/delete-directory.d.ts +1 -1
  166. package/dist/delete-directory.js +31 -5
  167. package/dist/determine-resize-params.d.ts +1 -0
  168. package/dist/determine-resize-params.js +10 -0
  169. package/dist/determine-vcodec-ffmpeg-flags.d.ts +2 -0
  170. package/dist/determine-vcodec-ffmpeg-flags.js +13 -0
  171. package/dist/ensure-ffmpeg.d.ts +18 -0
  172. package/dist/ensure-ffmpeg.js +58 -0
  173. package/dist/ensure-frames-in-order.d.ts +0 -0
  174. package/dist/ensure-frames-in-order.js +0 -0
  175. package/dist/ensure-output-directory.d.ts +0 -0
  176. package/dist/ensure-output-directory.js +0 -0
  177. package/dist/ensure-presentation-timestamp.d.ts +14 -1
  178. package/dist/ensure-presentation-timestamp.js +36 -17
  179. package/dist/error-handling/handle-javascript-exception.d.ts +0 -0
  180. package/dist/error-handling/handle-javascript-exception.js +10 -0
  181. package/dist/error-handling/symbolicate-error.d.ts +0 -0
  182. package/dist/error-handling/symbolicate-error.js +2 -1
  183. package/dist/error-handling/symbolicateable-error.d.ts +0 -0
  184. package/dist/error-handling/symbolicateable-error.js +0 -0
  185. package/dist/extract-frame-from-video.d.ts +2 -0
  186. package/dist/extract-frame-from-video.js +47 -110
  187. package/dist/ffmpeg-executable.d.ts +0 -0
  188. package/dist/ffmpeg-executable.js +0 -0
  189. package/dist/ffmpeg-filter-file.d.ts +0 -0
  190. package/dist/ffmpeg-filter-file.js +0 -0
  191. package/dist/ffmpeg-flags.d.ts +20 -2
  192. package/dist/ffmpeg-flags.js +205 -9
  193. package/dist/ffmpeg-override.d.ts +4 -0
  194. package/dist/ffmpeg-override.js +2 -0
  195. package/dist/file-extensions.d.ts +25 -0
  196. package/dist/file-extensions.js +88 -0
  197. package/dist/find-closest-package-json.d.ts +2 -0
  198. package/dist/find-closest-package-json.js +31 -0
  199. package/dist/frame-range.d.ts +0 -0
  200. package/dist/frame-range.js +0 -0
  201. package/dist/frame-to-ffmpeg-timestamp.d.ts +0 -0
  202. package/dist/frame-to-ffmpeg-timestamp.js +0 -0
  203. package/dist/get-browser-instance.d.ts +0 -0
  204. package/dist/get-browser-instance.js +1 -1
  205. package/dist/get-can-extract-frames-fast.d.ts +14 -0
  206. package/dist/get-can-extract-frames-fast.js +71 -0
  207. package/dist/get-codec-name.d.ts +0 -0
  208. package/dist/get-codec-name.js +0 -0
  209. package/dist/get-compositions.d.ts +4 -0
  210. package/dist/get-compositions.js +26 -7
  211. package/dist/get-concurrency.d.ts +1 -1
  212. package/dist/get-concurrency.js +8 -1
  213. package/dist/get-duration-from-frame-range.d.ts +0 -0
  214. package/dist/get-duration-from-frame-range.js +0 -0
  215. package/dist/get-extension-from-codec.d.ts +5 -1
  216. package/dist/get-extension-from-codec.js +56 -32
  217. package/dist/get-extension-of-filename.d.ts +0 -0
  218. package/dist/get-extension-of-filename.js +5 -1
  219. package/dist/get-frame-of-video-slow.d.ts +15 -0
  220. package/dist/get-frame-of-video-slow.js +72 -0
  221. package/dist/get-frame-padded-index.d.ts +1 -1
  222. package/dist/get-frame-padded-index.js +3 -2
  223. package/dist/get-frame-to-render.d.ts +0 -0
  224. package/dist/get-frame-to-render.js +0 -0
  225. package/dist/get-local-browser-executable.d.ts +0 -0
  226. package/dist/get-local-browser-executable.js +1 -3
  227. package/dist/get-port.d.ts +4 -1
  228. package/dist/get-port.js +8 -8
  229. package/dist/get-prores-profile-name.d.ts +0 -0
  230. package/dist/get-prores-profile-name.js +0 -0
  231. package/dist/get-video-info.d.ts +6 -1
  232. package/dist/get-video-info.js +19 -9
  233. package/dist/get-video-threads-flag.d.ts +0 -0
  234. package/dist/get-video-threads-flag.js +0 -0
  235. package/dist/guess-extension-for-media.d.ts +5 -1
  236. package/dist/guess-extension-for-media.js +4 -3
  237. package/dist/image-format.d.ts +1 -1
  238. package/dist/image-format.js +3 -0
  239. package/dist/index.d.ts +187 -41
  240. package/dist/index.js +31 -28
  241. package/dist/is-audio-codec.d.ts +0 -0
  242. package/dist/is-audio-codec.js +0 -0
  243. package/dist/is-beyond-last-frame.d.ts +0 -0
  244. package/dist/is-beyond-last-frame.js +0 -0
  245. package/dist/is-serve-url.d.ts +0 -0
  246. package/dist/is-serve-url.js +0 -0
  247. package/dist/last-frame-from-video-cache.d.ts +2 -0
  248. package/dist/last-frame-from-video-cache.js +0 -0
  249. package/dist/legacy-webpack-config.d.ts +0 -0
  250. package/dist/legacy-webpack-config.js +0 -0
  251. package/dist/locks.d.ts +7 -0
  252. package/dist/locks.js +44 -0
  253. package/dist/log-level.d.ts +0 -0
  254. package/dist/log-level.js +0 -0
  255. package/dist/make-cancel-signal.d.ts +11 -0
  256. package/dist/make-cancel-signal.js +24 -1
  257. package/dist/merge-audio-track.d.ts +1 -0
  258. package/dist/merge-audio-track.js +28 -18
  259. package/dist/mime-db.d.ts +0 -0
  260. package/dist/mime-db.js +0 -0
  261. package/dist/mime-types.d.ts +1 -0
  262. package/dist/mime-types.js +6 -1
  263. package/dist/normalize-serve-url.d.ts +0 -0
  264. package/dist/normalize-serve-url.js +0 -0
  265. package/dist/offthread-video-server.d.ts +2 -1
  266. package/dist/offthread-video-server.js +13 -1
  267. package/dist/open-browser.d.ts +4 -0
  268. package/dist/open-browser.js +7 -13
  269. package/dist/overwrite.d.ts +0 -0
  270. package/dist/overwrite.js +0 -0
  271. package/dist/p-limit.d.ts +0 -0
  272. package/dist/p-limit.js +0 -0
  273. package/dist/parse-browser-error-stack.d.ts +0 -0
  274. package/dist/parse-browser-error-stack.js +0 -0
  275. package/dist/parse-ffmpeg-progress.d.ts +0 -0
  276. package/dist/parse-ffmpeg-progress.js +0 -0
  277. package/dist/perf.d.ts +0 -0
  278. package/dist/perf.js +0 -0
  279. package/dist/pixel-format.d.ts +1 -1
  280. package/dist/pixel-format.js +3 -0
  281. package/dist/pool.d.ts +0 -0
  282. package/dist/pool.js +0 -0
  283. package/dist/prepare-server.d.ts +3 -2
  284. package/dist/prepare-server.js +8 -3
  285. package/dist/preprocess-audio-track.d.ts +1 -0
  286. package/dist/preprocess-audio-track.js +4 -3
  287. package/dist/prespawn-ffmpeg.d.ts +4 -1
  288. package/dist/prespawn-ffmpeg.js +17 -12
  289. package/dist/prestitcher-memory-usage.d.ts +0 -0
  290. package/dist/prestitcher-memory-usage.js +0 -0
  291. package/dist/prores-profile.d.ts +4 -1
  292. package/dist/prores-profile.js +6 -6
  293. package/dist/provide-screenshot.d.ts +5 -1
  294. package/dist/provide-screenshot.js +4 -1
  295. package/dist/puppeteer-evaluate.d.ts +0 -0
  296. package/dist/puppeteer-evaluate.js +19 -11
  297. package/dist/puppeteer-screenshot.d.ts +11 -2
  298. package/dist/puppeteer-screenshot.js +11 -14
  299. package/dist/quality.d.ts +0 -0
  300. package/dist/quality.js +0 -0
  301. package/dist/redirect-status-codes.d.ts +1 -0
  302. package/dist/redirect-status-codes.js +6 -0
  303. package/dist/render-frames.d.ts +15 -3
  304. package/dist/render-frames.js +176 -84
  305. package/dist/render-media.d.ts +38 -6
  306. package/dist/render-media.js +123 -27
  307. package/dist/render-still.d.ts +8 -4
  308. package/dist/render-still.js +62 -31
  309. package/dist/replace-browser.d.ts +6 -0
  310. package/dist/replace-browser.js +47 -0
  311. package/dist/resolve-asset-src.d.ts +0 -0
  312. package/dist/resolve-asset-src.js +0 -0
  313. package/dist/sample-rate.d.ts +0 -0
  314. package/dist/sample-rate.js +0 -0
  315. package/dist/screenshot-dom-element.d.ts +5 -1
  316. package/dist/screenshot-dom-element.js +10 -2
  317. package/dist/screenshot-task.d.ts +12 -2
  318. package/dist/screenshot-task.js +24 -9
  319. package/dist/seek-to-frame.d.ts +1 -0
  320. package/dist/seek-to-frame.js +49 -3
  321. package/dist/serve-handler/index.d.ts +0 -0
  322. package/dist/serve-handler/index.js +0 -0
  323. package/dist/serve-handler/is-path-inside.d.ts +0 -0
  324. package/dist/serve-handler/is-path-inside.js +0 -0
  325. package/dist/serve-handler/range-parser.d.ts +0 -0
  326. package/dist/serve-handler/range-parser.js +0 -0
  327. package/dist/serve-static.d.ts +1 -0
  328. package/dist/serve-static.js +77 -41
  329. package/dist/set-props-and-env.d.ts +3 -1
  330. package/dist/set-props-and-env.js +39 -15
  331. package/dist/stitch-frames-to-video.d.ts +14 -1
  332. package/dist/stitch-frames-to-video.js +118 -49
  333. package/dist/stringify-ffmpeg-filter.d.ts +2 -1
  334. package/dist/stringify-ffmpeg-filter.js +4 -2
  335. package/dist/symbolicate-stacktrace.d.ts +0 -0
  336. package/dist/symbolicate-stacktrace.js +0 -0
  337. package/dist/take-frame-and-compose.d.ts +20 -0
  338. package/dist/take-frame-and-compose.js +96 -0
  339. package/dist/tmp-dir.d.ts +0 -0
  340. package/dist/tmp-dir.js +0 -0
  341. package/dist/truthy.d.ts +0 -0
  342. package/dist/truthy.js +0 -0
  343. package/dist/try-to-extract-frame-of-video-fast.d.ts +13 -0
  344. package/dist/try-to-extract-frame-of-video-fast.js +55 -0
  345. package/dist/types.d.ts +0 -0
  346. package/dist/types.js +0 -0
  347. package/dist/validate-concurrency.d.ts +0 -0
  348. package/dist/validate-concurrency.js +14 -9
  349. package/dist/validate-even-dimensions-with-codec.d.ts +0 -0
  350. package/dist/validate-even-dimensions-with-codec.js +0 -0
  351. package/dist/validate-every-nth-frame.d.ts +2 -1
  352. package/dist/validate-every-nth-frame.js +8 -1
  353. package/dist/validate-ffmpeg-override.d.ts +2 -0
  354. package/dist/validate-ffmpeg-override.js +12 -0
  355. package/dist/validate-ffmpeg.d.ts +7 -2
  356. package/dist/validate-ffmpeg.js +48 -43
  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 +0 -0
  360. package/dist/validate-opengl-renderer.js +0 -0
  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 -1
  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/warn-about-ffmpeg-version.d.ts +5 -0
  372. package/dist/warn-about-ffmpeg-version.js +37 -0
  373. package/dist/ws/ws-types.d.ts +0 -0
  374. package/dist/ws/ws-types.js +2 -1
  375. package/package.json +21 -11
  376. package/.prettierrc.js +0 -14
  377. package/dist/add-silent-audio-if-necessary.d.ts +0 -8
  378. package/dist/add-silent-audio-if-necessary.d.ts.map +0 -1
  379. package/dist/add-silent-audio-if-necessary.js +0 -51
  380. package/dist/add-silent-audio-if-necessary.js.map +0 -1
  381. package/dist/assets/asset-is-used-at-time.d.ts +0 -3
  382. package/dist/assets/asset-is-used-at-time.d.ts.map +0 -1
  383. package/dist/assets/asset-is-used-at-time.js +0 -8
  384. package/dist/assets/asset-is-used-at-time.js.map +0 -1
  385. package/dist/assets/calculate-asset-positions.d.ts.map +0 -1
  386. package/dist/assets/calculate-asset-positions.js.map +0 -1
  387. package/dist/assets/calculate-atempo.d.ts.map +0 -1
  388. package/dist/assets/calculate-atempo.js.map +0 -1
  389. package/dist/assets/convert-assets-to-file-urls.d.ts.map +0 -1
  390. package/dist/assets/convert-assets-to-file-urls.js.map +0 -1
  391. package/dist/assets/download-and-map-assets-to-file.d.ts.map +0 -1
  392. package/dist/assets/download-and-map-assets-to-file.js.map +0 -1
  393. package/dist/assets/download-file.d.ts.map +0 -1
  394. package/dist/assets/download-file.js.map +0 -1
  395. package/dist/assets/ffmpeg-volume-expression.d.ts.map +0 -1
  396. package/dist/assets/ffmpeg-volume-expression.js.map +0 -1
  397. package/dist/assets/flatten-volume-array.d.ts.map +0 -1
  398. package/dist/assets/flatten-volume-array.js.map +0 -1
  399. package/dist/assets/get-asset-audio-details.d.ts +0 -5
  400. package/dist/assets/get-asset-audio-details.d.ts.map +0 -1
  401. package/dist/assets/get-asset-audio-details.js +0 -21
  402. package/dist/assets/get-asset-audio-details.js.map +0 -1
  403. package/dist/assets/get-audio-channels.d.ts.map +0 -1
  404. package/dist/assets/get-audio-channels.js.map +0 -1
  405. package/dist/assets/get-simulatenous-assets.d.ts +0 -3
  406. package/dist/assets/get-simulatenous-assets.d.ts.map +0 -1
  407. package/dist/assets/get-simulatenous-assets.js +0 -14
  408. package/dist/assets/get-simulatenous-assets.js.map +0 -1
  409. package/dist/assets/read-file.d.ts.map +0 -1
  410. package/dist/assets/read-file.js.map +0 -1
  411. package/dist/assets/round-volume-to-avoid-stack-overflow.d.ts.map +0 -1
  412. package/dist/assets/round-volume-to-avoid-stack-overflow.js.map +0 -1
  413. package/dist/assets/sanitize-filename.d.ts.map +0 -1
  414. package/dist/assets/sanitize-filename.js.map +0 -1
  415. package/dist/assets/sanitize-filepath.d.ts.map +0 -1
  416. package/dist/assets/sanitize-filepath.js.map +0 -1
  417. package/dist/assets/split-assets-into-segments.d.ts +0 -6
  418. package/dist/assets/split-assets-into-segments.d.ts.map +0 -1
  419. package/dist/assets/split-assets-into-segments.js +0 -89
  420. package/dist/assets/split-assets-into-segments.js.map +0 -1
  421. package/dist/assets/truncate-utf8-bytes.d.ts.map +0 -1
  422. package/dist/assets/truncate-utf8-bytes.js.map +0 -1
  423. package/dist/assets/types.d.ts.map +0 -1
  424. package/dist/assets/types.js.map +0 -1
  425. package/dist/assets-to-ffmpeg-inputs.d.ts +0 -7
  426. package/dist/assets-to-ffmpeg-inputs.d.ts.map +0 -1
  427. package/dist/assets-to-ffmpeg-inputs.js +0 -15
  428. package/dist/assets-to-ffmpeg-inputs.js.map +0 -1
  429. package/dist/browser-log.d.ts.map +0 -1
  430. package/dist/browser-log.js.map +0 -1
  431. package/dist/calculate-ffmpeg-filters.d.ts.map +0 -1
  432. package/dist/calculate-ffmpeg-filters.js.map +0 -1
  433. package/dist/can-use-parallel-encoding.d.ts.map +0 -1
  434. package/dist/can-use-parallel-encoding.js.map +0 -1
  435. package/dist/combine-videos.d.ts.map +0 -1
  436. package/dist/combine-videos.js.map +0 -1
  437. package/dist/create-ffmpeg-complex-filter.d.ts.map +0 -1
  438. package/dist/create-ffmpeg-complex-filter.js.map +0 -1
  439. package/dist/cycle-browser-tabs.d.ts.map +0 -1
  440. package/dist/cycle-browser-tabs.js.map +0 -1
  441. package/dist/delay-render-embedded-stack.d.ts.map +0 -1
  442. package/dist/delay-render-embedded-stack.js.map +0 -1
  443. package/dist/delete-directory.d.ts.map +0 -1
  444. package/dist/delete-directory.js.map +0 -1
  445. package/dist/ensure-frames-in-order.d.ts.map +0 -1
  446. package/dist/ensure-frames-in-order.js.map +0 -1
  447. package/dist/ensure-output-directory.d.ts.map +0 -1
  448. package/dist/ensure-output-directory.js.map +0 -1
  449. package/dist/error-handling/handle-javascript-exception.d.ts.map +0 -1
  450. package/dist/error-handling/handle-javascript-exception.js.map +0 -1
  451. package/dist/error-handling/symbolicate-error.d.ts.map +0 -1
  452. package/dist/error-handling/symbolicate-error.js.map +0 -1
  453. package/dist/error-handling/symbolicateable-error.d.ts.map +0 -1
  454. package/dist/error-handling/symbolicateable-error.js.map +0 -1
  455. package/dist/ffmpeg-flags.d.ts.map +0 -1
  456. package/dist/ffmpeg-flags.js.map +0 -1
  457. package/dist/get-audio-codec-name.d.ts +0 -2
  458. package/dist/get-audio-codec-name.d.ts.map +0 -1
  459. package/dist/get-audio-codec-name.js +0 -28
  460. package/dist/get-audio-codec-name.js.map +0 -1
  461. package/dist/get-browser-instance.d.ts.map +0 -1
  462. package/dist/get-browser-instance.js.map +0 -1
  463. package/dist/get-codec-name.d.ts.map +0 -1
  464. package/dist/get-codec-name.js.map +0 -1
  465. package/dist/get-compositions.d.ts.map +0 -1
  466. package/dist/get-compositions.js.map +0 -1
  467. package/dist/get-concurrency.d.ts.map +0 -1
  468. package/dist/get-concurrency.js.map +0 -1
  469. package/dist/get-extension-from-codec.d.ts.map +0 -1
  470. package/dist/get-extension-from-codec.js.map +0 -1
  471. package/dist/get-frame-to-render.d.ts.map +0 -1
  472. package/dist/get-frame-to-render.js.map +0 -1
  473. package/dist/get-local-browser-executable.d.ts.map +0 -1
  474. package/dist/get-local-browser-executable.js.map +0 -1
  475. package/dist/get-port.d.ts.map +0 -1
  476. package/dist/get-port.js.map +0 -1
  477. package/dist/get-prores-profile-name.d.ts.map +0 -1
  478. package/dist/get-prores-profile-name.js.map +0 -1
  479. package/dist/image-format.d.ts.map +0 -1
  480. package/dist/image-format.js.map +0 -1
  481. package/dist/index.d.ts.map +0 -1
  482. package/dist/index.js.map +0 -1
  483. package/dist/is-serve-url.d.ts.map +0 -1
  484. package/dist/is-serve-url.js.map +0 -1
  485. package/dist/legacy-webpack-config.d.ts.map +0 -1
  486. package/dist/legacy-webpack-config.js.map +0 -1
  487. package/dist/make-assets-download-dir.d.ts +0 -1
  488. package/dist/make-assets-download-dir.d.ts.map +0 -1
  489. package/dist/make-assets-download-dir.js +0 -13
  490. package/dist/make-assets-download-dir.js.map +0 -1
  491. package/dist/normalize-serve-url.d.ts.map +0 -1
  492. package/dist/normalize-serve-url.js.map +0 -1
  493. package/dist/open-browser.d.ts.map +0 -1
  494. package/dist/open-browser.js.map +0 -1
  495. package/dist/parse-browser-error-stack.d.ts.map +0 -1
  496. package/dist/parse-browser-error-stack.js.map +0 -1
  497. package/dist/parse-ffmpeg-progress.d.ts.map +0 -1
  498. package/dist/parse-ffmpeg-progress.js.map +0 -1
  499. package/dist/pool.d.ts.map +0 -1
  500. package/dist/pool.js.map +0 -1
  501. package/dist/prepare-server.d.ts.map +0 -1
  502. package/dist/prepare-server.js.map +0 -1
  503. package/dist/provide-screenshot.d.ts.map +0 -1
  504. package/dist/provide-screenshot.js.map +0 -1
  505. package/dist/puppeteer-evaluate.d.ts.map +0 -1
  506. package/dist/puppeteer-evaluate.js.map +0 -1
  507. package/dist/puppeteer-screenshot.d.ts.map +0 -1
  508. package/dist/puppeteer-screenshot.js.map +0 -1
  509. package/dist/render-media.d.ts.map +0 -1
  510. package/dist/render-media.js.map +0 -1
  511. package/dist/render-still.d.ts.map +0 -1
  512. package/dist/render-still.js.map +0 -1
  513. package/dist/render.d.ts +0 -45
  514. package/dist/render.d.ts.map +0 -1
  515. package/dist/render.js +0 -245
  516. package/dist/render.js.map +0 -1
  517. package/dist/resolve-asset-src.d.ts.map +0 -1
  518. package/dist/resolve-asset-src.js.map +0 -1
  519. package/dist/sample-rate.d.ts.map +0 -1
  520. package/dist/sample-rate.js.map +0 -1
  521. package/dist/screenshot-dom-element.d.ts.map +0 -1
  522. package/dist/screenshot-dom-element.js.map +0 -1
  523. package/dist/screenshot-task.d.ts.map +0 -1
  524. package/dist/screenshot-task.js.map +0 -1
  525. package/dist/seek-to-frame.d.ts.map +0 -1
  526. package/dist/seek-to-frame.js.map +0 -1
  527. package/dist/serve-static.d.ts.map +0 -1
  528. package/dist/serve-static.js.map +0 -1
  529. package/dist/set-props-and-env.d.ts.map +0 -1
  530. package/dist/set-props-and-env.js.map +0 -1
  531. package/dist/stitcher.d.ts +0 -32
  532. package/dist/stitcher.d.ts.map +0 -1
  533. package/dist/stitcher.js +0 -204
  534. package/dist/stitcher.js.map +0 -1
  535. package/dist/stringify-ffmpeg-filter.d.ts.map +0 -1
  536. package/dist/stringify-ffmpeg-filter.js.map +0 -1
  537. package/dist/symbolicate-stacktrace.d.ts.map +0 -1
  538. package/dist/symbolicate-stacktrace.js.map +0 -1
  539. package/dist/tmp-dir.d.ts.map +0 -1
  540. package/dist/tmp-dir.js.map +0 -1
  541. package/dist/types.d.ts.map +0 -1
  542. package/dist/types.js.map +0 -1
  543. package/dist/validate-even-dimensions-with-codec.d.ts.map +0 -1
  544. package/dist/validate-even-dimensions-with-codec.js.map +0 -1
  545. package/dist/validate-ffmpeg.d.ts.map +0 -1
  546. package/dist/validate-ffmpeg.js.map +0 -1
  547. package/dist/validate-frame.d.ts +0 -1
  548. package/dist/validate-frame.js +0 -24
  549. package/dist/validate-puppeteer-timeout.d.ts.map +0 -1
  550. package/dist/validate-puppeteer-timeout.js.map +0 -1
  551. package/dist/validate-scale.d.ts.map +0 -1
  552. package/dist/validate-scale.js.map +0 -1
  553. package/tsconfig.json +0 -10
  554. package/vitest.config.ts +0 -8
@@ -1,11 +1,14 @@
1
+ /// <reference types="node" />
1
2
  import type { SmallTCompMetadata } from 'remotion';
2
3
  import type { RenderMediaOnDownload } from './assets/download-and-map-assets-to-file';
3
4
  import type { DownloadMap } from './assets/download-map';
5
+ import type { AudioCodec } from './audio-codec';
4
6
  import type { BrowserExecutable } from './browser-executable';
5
7
  import type { BrowserLog } from './browser-log';
6
8
  import type { Browser as PuppeteerBrowser } from './browser/Browser';
7
9
  import type { Codec } from './codec';
8
10
  import type { FfmpegExecutable } from './ffmpeg-executable';
11
+ import type { FfmpegOverrideFn } from './ffmpeg-override';
9
12
  import type { FrameRange } from './frame-range';
10
13
  import type { ServeUrlOrWebpackBundle } from './legacy-webpack-config';
11
14
  import type { CancelSignal } from './make-cancel-signal';
@@ -14,11 +17,17 @@ import type { PixelFormat } from './pixel-format';
14
17
  import type { ProResProfile } from './prores-profile';
15
18
  import type { OnStartData } from './types';
16
19
  export declare type StitchingState = 'encoding' | 'muxing';
20
+ export declare type SlowFrame = {
21
+ frame: number;
22
+ time: number;
23
+ };
24
+ export declare type OnSlowestFrames = (frames: SlowFrame[]) => void;
17
25
  export declare type RenderMediaOnProgress = (progress: {
18
26
  renderedFrames: number;
19
27
  encodedFrames: number;
20
28
  encodedDoneIn: number | null;
21
29
  renderedDoneIn: number | null;
30
+ progress: number;
22
31
  stitchStage: StitchingState;
23
32
  }) => void;
24
33
  export declare type RenderMediaOptions = {
@@ -26,7 +35,6 @@ export declare type RenderMediaOptions = {
26
35
  codec: Codec;
27
36
  composition: SmallTCompMetadata;
28
37
  inputProps?: unknown;
29
- parallelism?: number | null;
30
38
  crf?: number | null;
31
39
  imageFormat?: 'png' | 'jpeg' | 'none';
32
40
  ffmpegExecutable?: FfmpegExecutable;
@@ -52,14 +60,38 @@ export declare type RenderMediaOptions = {
52
60
  cancelSignal?: CancelSignal;
53
61
  browserExecutable?: BrowserExecutable;
54
62
  verbose?: boolean;
63
+ internal?: {
64
+ /**
65
+ * @deprecated Only for Remotion internal usage
66
+ */
67
+ downloadMap?: DownloadMap;
68
+ /**
69
+ * @deprecated Only for Remotion internal usage
70
+ */
71
+ onCtrlCExit?: (fn: () => void) => void;
72
+ };
73
+ preferLossless?: boolean;
74
+ muted?: boolean;
75
+ enforceAudioTrack?: boolean;
76
+ ffmpegOverride?: FfmpegOverrideFn;
77
+ audioBitrate?: string | null;
78
+ videoBitrate?: string | null;
79
+ onSlowestFrames?: OnSlowestFrames;
80
+ disallowParallelEncoding?: boolean;
81
+ audioCodec?: AudioCodec | null;
82
+ } & ServeUrlOrWebpackBundle & ConcurrencyOrParallelism;
83
+ declare type ConcurrencyOrParallelism = {
84
+ concurrency?: number | string | null;
85
+ } | {
55
86
  /**
56
- * @deprecated Only for Remotion internal usage
87
+ * @deprecated This field has been renamed to `concurrency`
57
88
  */
58
- downloadMap?: DownloadMap;
59
- } & ServeUrlOrWebpackBundle;
89
+ parallelism?: number | null;
90
+ };
60
91
  /**
61
92
  *
62
93
  * @description Render a video from a composition
63
- * @link https://www.remotion.dev/docs/renderer/render-media
94
+ * @see [Documentation](https://www.remotion.dev/docs/renderer/render-media)
64
95
  */
65
- export declare const renderMedia: ({ parallelism, proResProfile, crf, composition, imageFormat, ffmpegExecutable, ffprobeExecutable, inputProps, pixelFormat, codec, envVariables, quality, frameRange, puppeteerInstance, outputLocation, onProgress, overwrite, onDownload, dumpBrowserLogs, onBrowserLog, onStart, timeoutInMilliseconds, chromiumOptions, scale, browserExecutable, port, cancelSignal, ...options }: RenderMediaOptions) => Promise<Buffer | null>;
96
+ export declare 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, audioBitrate, videoBitrate, onSlowestFrames, audioCodec, ...options }: RenderMediaOptions) => Promise<Buffer | null>;
97
+ export {};
@@ -10,43 +10,81 @@ const path_1 = __importDefault(require("path"));
10
10
  const remotion_1 = require("remotion");
11
11
  const download_map_1 = require("./assets/download-map");
12
12
  const can_use_parallel_encoding_1 = require("./can-use-parallel-encoding");
13
+ const codec_supports_media_1 = require("./codec-supports-media");
13
14
  const crf_1 = require("./crf");
14
15
  const delete_directory_1 = require("./delete-directory");
15
16
  const ensure_frames_in_order_1 = require("./ensure-frames-in-order");
16
17
  const ensure_output_directory_1 = require("./ensure-output-directory");
18
+ const find_closest_package_json_1 = require("./find-closest-package-json");
17
19
  const get_duration_from_frame_range_1 = require("./get-duration-from-frame-range");
18
20
  const get_extension_from_codec_1 = require("./get-extension-from-codec");
19
21
  const get_extension_of_filename_1 = require("./get-extension-of-filename");
20
22
  const get_frame_to_render_1 = require("./get-frame-to-render");
23
+ const image_format_1 = require("./image-format");
24
+ const is_audio_codec_1 = require("./is-audio-codec");
21
25
  const legacy_webpack_config_1 = require("./legacy-webpack-config");
22
26
  const make_cancel_signal_1 = require("./make-cancel-signal");
23
27
  const overwrite_1 = require("./overwrite");
24
28
  const perf_1 = require("./perf");
29
+ const pixel_format_1 = require("./pixel-format");
25
30
  const prespawn_ffmpeg_1 = require("./prespawn-ffmpeg");
26
31
  const prestitcher_memory_usage_1 = require("./prestitcher-memory-usage");
32
+ const prores_profile_1 = require("./prores-profile");
27
33
  const quality_1 = require("./quality");
28
34
  const render_frames_1 = require("./render-frames");
29
35
  const stitch_frames_to_video_1 = require("./stitch-frames-to-video");
30
36
  const validate_even_dimensions_with_codec_1 = require("./validate-even-dimensions-with-codec");
37
+ const validate_every_nth_frame_1 = require("./validate-every-nth-frame");
38
+ const validate_ffmpeg_1 = require("./validate-ffmpeg");
39
+ const validate_ffmpeg_override_1 = require("./validate-ffmpeg-override");
31
40
  const validate_output_filename_1 = require("./validate-output-filename");
32
41
  const validate_scale_1 = require("./validate-scale");
42
+ const validate_videobitrate_1 = require("./validate-videobitrate");
43
+ const SLOWEST_FRAME_COUNT = 10;
44
+ const getConcurrency = (others) => {
45
+ if ('concurrency' in others) {
46
+ return others.concurrency;
47
+ }
48
+ if ('parallelism' in others) {
49
+ return others.parallelism;
50
+ }
51
+ return null;
52
+ };
33
53
  /**
34
54
  *
35
55
  * @description Render a video from a composition
36
- * @link https://www.remotion.dev/docs/renderer/render-media
56
+ * @see [Documentation](https://www.remotion.dev/docs/renderer/render-media)
37
57
  */
38
- const renderMedia = ({ parallelism, proResProfile, crf, composition, imageFormat, ffmpegExecutable, ffprobeExecutable, inputProps, pixelFormat, codec, envVariables, quality, frameRange, puppeteerInstance, outputLocation, onProgress, overwrite, onDownload, dumpBrowserLogs, onBrowserLog, onStart, timeoutInMilliseconds, chromiumOptions, scale, browserExecutable, port, cancelSignal, ...options }) => {
39
- var _a, _b, _c;
40
- (0, quality_1.validateQuality)(quality);
41
- if (typeof crf !== 'undefined' && crf !== null) {
42
- (0, crf_1.validateSelectedCrfAndCodecCombination)(crf, codec);
43
- }
58
+ 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, audioBitrate, videoBitrate, onSlowestFrames, audioCodec, ...options }) => {
59
+ var _a, _b, _c, _d, _e, _f, _g;
60
+ const remotionRoot = (0, find_closest_package_json_1.findRemotionRoot)();
61
+ (0, validate_ffmpeg_1.validateFfmpeg)(ffmpegExecutable !== null && ffmpegExecutable !== void 0 ? ffmpegExecutable : null, remotionRoot, 'ffmpeg');
62
+ (0, quality_1.validateQuality)(options.quality);
63
+ (0, crf_1.validateQualitySettings)({ crf, codec, videoBitrate });
64
+ (0, validate_videobitrate_1.validateBitrate)(audioBitrate, 'audioBitrate');
65
+ (0, validate_videobitrate_1.validateBitrate)(videoBitrate, 'videoBitrate');
66
+ (0, prores_profile_1.validateSelectedCodecAndProResCombination)({
67
+ codec,
68
+ proResProfile,
69
+ });
70
+ (0, pixel_format_1.validateSelectedPixelFormatAndCodecCombination)(pixelFormat, codec);
44
71
  if (outputLocation) {
45
- (0, validate_output_filename_1.validateOutputFilename)(codec, (0, get_extension_of_filename_1.getExtensionOfFilename)(outputLocation));
72
+ (0, validate_output_filename_1.validateOutputFilename)({
73
+ codec,
74
+ audioCodec: audioCodec !== null && audioCodec !== void 0 ? audioCodec : null,
75
+ extension: (0, get_extension_of_filename_1.getExtensionOfFilename)(outputLocation),
76
+ preferLossless: (_a = options.preferLossless) !== null && _a !== void 0 ? _a : false,
77
+ });
46
78
  }
79
+ const absoluteOutputLocation = outputLocation
80
+ ? path_1.default.resolve(process.cwd(), outputLocation)
81
+ : null;
47
82
  (0, validate_scale_1.validateScale)(scale);
48
- const everyNthFrame = (_a = options.everyNthFrame) !== null && _a !== void 0 ? _a : 1;
49
- const numberOfGifLoops = (_b = options.numberOfGifLoops) !== null && _b !== void 0 ? _b : null;
83
+ const concurrency = getConcurrency(options);
84
+ (0, validate_ffmpeg_override_1.validateFfmpegOverride)(ffmpegOverride);
85
+ const everyNthFrame = (_b = options.everyNthFrame) !== null && _b !== void 0 ? _b : 1;
86
+ (0, validate_every_nth_frame_1.validateEveryNthFrame)(everyNthFrame, codec);
87
+ const numberOfGifLoops = (_c = options.numberOfGifLoops) !== null && _c !== void 0 ? _c : null;
50
88
  const serveUrl = (0, legacy_webpack_config_1.getServeUrlWithFallback)(options);
51
89
  let stitchStage = 'encoding';
52
90
  let stitcherFfmpeg;
@@ -57,29 +95,39 @@ const renderMedia = ({ parallelism, proResProfile, crf, composition, imageFormat
57
95
  let encodedDoneIn = null;
58
96
  let cancelled = false;
59
97
  const renderStart = Date.now();
60
- const downloadMap = (_c = options.downloadMap) !== null && _c !== void 0 ? _c : (0, download_map_1.makeDownloadMap)();
98
+ const downloadMap = (_e = (_d = options.internal) === null || _d === void 0 ? void 0 : _d.downloadMap) !== null && _e !== void 0 ? _e : (0, download_map_1.makeDownloadMap)();
61
99
  const { estimatedUsage, freeMemory, hasEnoughMemory } = (0, prestitcher_memory_usage_1.shouldUseParallelEncoding)({
62
100
  height: composition.height,
63
101
  width: composition.width,
64
102
  });
65
- const parallelEncoding = hasEnoughMemory && (0, can_use_parallel_encoding_1.canUseParallelEncoding)(codec);
103
+ const parallelEncoding = !options.disallowParallelEncoding &&
104
+ hasEnoughMemory &&
105
+ (0, can_use_parallel_encoding_1.canUseParallelEncoding)(codec);
66
106
  if (options.verbose) {
67
107
  console.log('[PRESTITCHER] Free memory:', freeMemory, 'Estimated usage parallel encoding', estimatedUsage);
68
- console.log('[PRESTICHER]: Codec supports parallel rendering:', (0, can_use_parallel_encoding_1.canUseParallelEncoding)(codec));
108
+ console.log('[PRESTITCHER]: Codec supports parallel rendering:', (0, can_use_parallel_encoding_1.canUseParallelEncoding)(codec));
109
+ console.log('[PRESTITCHER]: User disallowed parallel encoding:', Boolean(options.disallowParallelEncoding));
69
110
  if (parallelEncoding) {
70
- console.log('[PRESTICHER] Parallel encoding is enabled.');
111
+ console.log('[PRESTITCHER] Parallel encoding is enabled.');
71
112
  }
72
113
  else {
73
114
  console.log('[PRESTITCHER] Parallel encoding is disabled.');
74
115
  }
75
116
  }
76
- const actualImageFormat = imageFormat !== null && imageFormat !== void 0 ? imageFormat : 'jpeg';
117
+ const imageFormat = (0, is_audio_codec_1.isAudioCodec)(codec)
118
+ ? 'none'
119
+ : (_f = options.imageFormat) !== null && _f !== void 0 ? _f : 'jpeg';
120
+ const quality = imageFormat === 'jpeg' ? options.quality : undefined;
121
+ (0, image_format_1.validateSelectedPixelFormatAndImageFormatCombination)(pixelFormat, imageFormat);
77
122
  const preEncodedFileLocation = parallelEncoding
78
- ? path_1.default.join(downloadMap.preEncode, 'pre-encode.' + (0, get_extension_from_codec_1.getFileExtensionFromCodec)(codec, 'chunk'))
123
+ ? path_1.default.join(downloadMap.preEncode, 'pre-encode.' + (0, get_extension_from_codec_1.getFileExtensionFromCodec)(codec, audioCodec !== null && audioCodec !== void 0 ? audioCodec : null))
79
124
  : null;
80
125
  const outputDir = parallelEncoding
81
126
  ? null
82
127
  : fs_1.default.mkdtempSync(path_1.default.join(os_1.default.tmpdir(), 'react-motion-render'));
128
+ if (((_g = options.internal) === null || _g === void 0 ? void 0 : _g.onCtrlCExit) && outputDir) {
129
+ options.internal.onCtrlCExit(() => (0, delete_directory_1.deleteDirectory)(outputDir));
130
+ }
83
131
  (0, validate_even_dimensions_with_codec_1.validateEvenDimensionsWithCodec)({
84
132
  codec,
85
133
  height: composition.height,
@@ -93,6 +141,9 @@ const renderMedia = ({ parallelism, proResProfile, crf, composition, imageFormat
93
141
  renderedDoneIn,
94
142
  renderedFrames,
95
143
  stitchStage,
144
+ progress: Math.round(((0.7 * renderedFrames + 0.3 * encodedFrames) /
145
+ composition.durationInFrames) *
146
+ 100) / 100,
96
147
  });
97
148
  };
98
149
  const realFrameRange = (0, get_frame_to_render_1.getRealFrameRange)(composition.durationInFrames, frameRange !== null && frameRange !== void 0 ? frameRange : null);
@@ -123,9 +174,11 @@ const renderMedia = ({ parallelism, proResProfile, crf, composition, imageFormat
123
174
  },
124
175
  verbose: (_a = options.verbose) !== null && _a !== void 0 ? _a : false,
125
176
  ffmpegExecutable,
126
- imageFormat: actualImageFormat,
177
+ imageFormat,
127
178
  signal: cancelPrestitcher.cancelSignal,
128
- });
179
+ ffmpegOverride: ffmpegOverride !== null && ffmpegOverride !== void 0 ? ffmpegOverride : (({ args }) => args),
180
+ videoBitrate: videoBitrate !== null && videoBitrate !== void 0 ? videoBitrate : null,
181
+ }, remotionRoot);
129
182
  stitcherFfmpeg = preStitcher.task;
130
183
  }
131
184
  };
@@ -142,15 +195,42 @@ const renderMedia = ({ parallelism, proResProfile, crf, composition, imageFormat
142
195
  }
143
196
  }
144
197
  };
198
+ const mediaSupport = (0, codec_supports_media_1.codecSupportsMedia)(codec);
199
+ const disableAudio = !mediaSupport.audio || muted;
200
+ const slowestFrames = [];
201
+ let maxTime = 0;
202
+ let minTime = 0;
203
+ const recordFrameTime = (frameIndex, time) => {
204
+ var _a, _b;
205
+ const frameTime = { frame: frameIndex, time };
206
+ if (time < minTime && slowestFrames.length === SLOWEST_FRAME_COUNT) {
207
+ return;
208
+ }
209
+ if (time > maxTime) {
210
+ // add at starting;
211
+ slowestFrames.unshift(frameTime);
212
+ maxTime = time;
213
+ }
214
+ else {
215
+ // add frame at appropriate position
216
+ const index = slowestFrames.findIndex(({ time: indexTime }) => indexTime < time);
217
+ slowestFrames.splice(index, 0, frameTime);
218
+ }
219
+ if (slowestFrames.length > SLOWEST_FRAME_COUNT) {
220
+ slowestFrames.pop();
221
+ }
222
+ minTime = (_b = (_a = slowestFrames[slowestFrames.length - 1]) === null || _a === void 0 ? void 0 : _a.time) !== null && _b !== void 0 ? _b : minTime;
223
+ };
145
224
  const happyPath = createPrestitcherIfNecessary()
146
225
  .then(() => {
147
226
  const renderFramesProc = (0, render_frames_1.renderFrames)({
148
227
  config: composition,
149
- onFrameUpdate: (frame) => {
228
+ onFrameUpdate: (frame, frameIndex, timeToRenderInMilliseconds) => {
150
229
  renderedFrames = frame;
151
230
  callUpdate();
231
+ recordFrameTime(frameIndex, timeToRenderInMilliseconds);
152
232
  },
153
- parallelism,
233
+ concurrency,
154
234
  outputDir,
155
235
  onStart: (data) => {
156
236
  renderedFrames = 0;
@@ -159,7 +239,7 @@ const renderMedia = ({ parallelism, proResProfile, crf, composition, imageFormat
159
239
  },
160
240
  inputProps,
161
241
  envVariables,
162
- imageFormat: actualImageFormat,
242
+ imageFormat,
163
243
  quality,
164
244
  frameRange: frameRange !== null && frameRange !== void 0 ? frameRange : null,
165
245
  puppeteerInstance,
@@ -190,6 +270,7 @@ const renderMedia = ({ parallelism, proResProfile, crf, composition, imageFormat
190
270
  port,
191
271
  cancelSignal: cancelRenderFrames.cancelSignal,
192
272
  downloadMap,
273
+ muted: disableAudio,
193
274
  });
194
275
  return renderFramesProc;
195
276
  })
@@ -197,10 +278,11 @@ const renderMedia = ({ parallelism, proResProfile, crf, composition, imageFormat
197
278
  return Promise.all([renderFramesReturn, waitForPrestitcherIfNecessary()]);
198
279
  })
199
280
  .then(([{ assetsInfo }]) => {
281
+ var _a;
200
282
  renderedDoneIn = Date.now() - renderStart;
201
283
  callUpdate();
202
- if (outputLocation) {
203
- (0, ensure_output_directory_1.ensureOutputDirectory)(outputLocation);
284
+ if (absoluteOutputLocation) {
285
+ (0, ensure_output_directory_1.ensureOutputDirectory)(absoluteOutputLocation);
204
286
  }
205
287
  const stitchStart = Date.now();
206
288
  return Promise.all([
@@ -208,10 +290,11 @@ const renderMedia = ({ parallelism, proResProfile, crf, composition, imageFormat
208
290
  width: composition.width * (scale !== null && scale !== void 0 ? scale : 1),
209
291
  height: composition.height * (scale !== null && scale !== void 0 ? scale : 1),
210
292
  fps,
211
- outputLocation,
293
+ outputLocation: absoluteOutputLocation,
212
294
  internalOptions: {
213
295
  preEncodedFileLocation,
214
- imageFormat: actualImageFormat,
296
+ imageFormat,
297
+ preferLossless: (_a = options.preferLossless) !== null && _a !== void 0 ? _a : false,
215
298
  },
216
299
  force: overwrite !== null && overwrite !== void 0 ? overwrite : overwrite_1.DEFAULT_OVERWRITE,
217
300
  pixelFormat,
@@ -231,6 +314,12 @@ const renderMedia = ({ parallelism, proResProfile, crf, composition, imageFormat
231
314
  verbose: options.verbose,
232
315
  dir: outputDir !== null && outputDir !== void 0 ? outputDir : undefined,
233
316
  cancelSignal: cancelStitcher.cancelSignal,
317
+ muted: disableAudio,
318
+ enforceAudioTrack,
319
+ ffmpegOverride,
320
+ audioBitrate,
321
+ videoBitrate,
322
+ audioCodec: audioCodec !== null && audioCodec !== void 0 ? audioCodec : null,
234
323
  }),
235
324
  stitchStart,
236
325
  ]);
@@ -239,6 +328,8 @@ const renderMedia = ({ parallelism, proResProfile, crf, composition, imageFormat
239
328
  encodedFrames = (0, get_duration_from_frame_range_1.getFramesToRender)(realFrameRange, everyNthFrame).length;
240
329
  encodedDoneIn = Date.now() - stitchStart;
241
330
  callUpdate();
331
+ slowestFrames.sort((a, b) => b.time - a.time);
332
+ onSlowestFrames === null || onSlowestFrames === void 0 ? void 0 : onSlowestFrames(slowestFrames);
242
333
  return buffer;
243
334
  })
244
335
  .catch((err) => {
@@ -265,20 +356,25 @@ const renderMedia = ({ parallelism, proResProfile, crf, composition, imageFormat
265
356
  throw err;
266
357
  })
267
358
  .finally(() => {
359
+ var _a;
268
360
  if (preEncodedFileLocation !== null &&
269
361
  fs_1.default.existsSync(preEncodedFileLocation)) {
270
362
  (0, delete_directory_1.deleteDirectory)(path_1.default.dirname(preEncodedFileLocation));
271
363
  }
272
364
  // Clean download map if it was not passed in
273
- if (!(options === null || options === void 0 ? void 0 : options.downloadMap)) {
365
+ if (!((_a = options.internal) === null || _a === void 0 ? void 0 : _a.downloadMap)) {
274
366
  (0, download_map_1.cleanDownloadMap)(downloadMap);
275
367
  }
368
+ // Clean temporary image frames when rendering ends or fails
369
+ if (outputDir && fs_1.default.existsSync(outputDir)) {
370
+ (0, delete_directory_1.deleteDirectory)(outputDir);
371
+ }
276
372
  });
277
373
  return Promise.race([
278
374
  happyPath,
279
375
  new Promise((_resolve, reject) => {
280
376
  cancelSignal === null || cancelSignal === void 0 ? void 0 : cancelSignal(() => {
281
- reject(new Error('renderMedia() got cancelled'));
377
+ reject(new Error(make_cancel_signal_1.cancelErrorMessages.renderMedia));
282
378
  });
283
379
  }),
284
380
  ]);
@@ -1,3 +1,4 @@
1
+ /// <reference types="node" />
1
2
  import type { SmallTCompMetadata } from 'remotion';
2
3
  import type { RenderMediaOnDownload } from './assets/download-and-map-assets-to-file';
3
4
  import type { DownloadMap } from './assets/download-map';
@@ -10,7 +11,7 @@ import type { CancelSignal } from './make-cancel-signal';
10
11
  import type { ChromiumOptions } from './open-browser';
11
12
  declare type InnerStillOptions = {
12
13
  composition: SmallTCompMetadata;
13
- output: string;
14
+ output?: string | null;
14
15
  frame?: number;
15
16
  inputProps?: unknown;
16
17
  imageFormat?: StillImageFormat;
@@ -32,13 +33,16 @@ declare type InnerStillOptions = {
32
33
  */
33
34
  downloadMap?: DownloadMap;
34
35
  };
35
- declare type RenderStillOptions = InnerStillOptions & ServeUrlOrWebpackBundle & {
36
+ declare type RenderStillReturnValue = {
37
+ buffer: Buffer | null;
38
+ };
39
+ export declare type RenderStillOptions = InnerStillOptions & ServeUrlOrWebpackBundle & {
36
40
  port?: number | null;
37
41
  };
38
42
  /**
39
43
  *
40
44
  * @description Render a still frame from a composition
41
- * @link https://www.remotion.dev/docs/renderer/render-still
45
+ * @see [Documentation](https://www.remotion.dev/docs/renderer/render-still)
42
46
  */
43
- export declare const renderStill: (options: RenderStillOptions) => Promise<void>;
47
+ export declare const renderStill: (options: RenderStillOptions) => Promise<RenderStillReturnValue>;
44
48
  export {};
@@ -32,47 +32,57 @@ const path_1 = __importDefault(require("path"));
32
32
  const remotion_1 = require("remotion");
33
33
  const download_map_1 = require("./assets/download-map");
34
34
  const browser_1 = require("./browser");
35
+ const convert_to_positive_frame_index_1 = require("./convert-to-positive-frame-index");
35
36
  const ensure_output_directory_1 = require("./ensure-output-directory");
36
37
  const handle_javascript_exception_1 = require("./error-handling/handle-javascript-exception");
38
+ const find_closest_package_json_1 = require("./find-closest-package-json");
37
39
  const image_format_1 = require("./image-format");
38
40
  const legacy_webpack_config_1 = require("./legacy-webpack-config");
41
+ const make_cancel_signal_1 = require("./make-cancel-signal");
39
42
  const open_browser_1 = require("./open-browser");
40
43
  const prepare_server_1 = require("./prepare-server");
41
- const provide_screenshot_1 = require("./provide-screenshot");
42
44
  const puppeteer_evaluate_1 = require("./puppeteer-evaluate");
43
45
  const quality_1 = require("./quality");
44
46
  const seek_to_frame_1 = require("./seek-to-frame");
45
47
  const set_props_and_env_1 = require("./set-props-and-env");
46
- const validate_frame_1 = require("./validate-frame");
48
+ const take_frame_and_compose_1 = require("./take-frame-and-compose");
47
49
  const validate_puppeteer_timeout_1 = require("./validate-puppeteer-timeout");
48
50
  const validate_scale_1 = require("./validate-scale");
49
- const innerRenderStill = async ({ composition, quality, imageFormat = 'png', serveUrl, puppeteerInstance, dumpBrowserLogs = false, onError, inputProps, envVariables, output, frame = 0, overwrite = true, browserExecutable, timeoutInMilliseconds, chromiumOptions, scale, proxyPort, cancelSignal, }) => {
51
+ const innerRenderStill = async ({ composition, quality, imageFormat = 'png', serveUrl, puppeteerInstance, dumpBrowserLogs = false, onError, inputProps, envVariables, output, frame = 0, overwrite = true, browserExecutable, timeoutInMilliseconds, chromiumOptions, scale = 1, proxyPort, cancelSignal, downloadMap, }) => {
50
52
  remotion_1.Internals.validateDimension(composition.height, 'height', 'in the `config` object passed to `renderStill()`');
51
53
  remotion_1.Internals.validateDimension(composition.width, 'width', 'in the `config` object passed to `renderStill()`');
52
54
  remotion_1.Internals.validateFps(composition.fps, 'in the `config` object of `renderStill()`', false);
53
- remotion_1.Internals.validateDurationInFrames(composition.durationInFrames, 'in the `config` object passed to `renderStill()`');
55
+ remotion_1.Internals.validateDurationInFrames({
56
+ durationInFrames: composition.durationInFrames,
57
+ component: 'in the `config` object passed to `renderStill()`',
58
+ allowFloats: false,
59
+ });
54
60
  (0, image_format_1.validateNonNullImageFormat)(imageFormat);
55
- (0, validate_frame_1.validateFrame)(frame, composition.durationInFrames);
61
+ remotion_1.Internals.validateFrame(frame, composition.durationInFrames);
62
+ const stillFrame = (0, convert_to_positive_frame_index_1.convertToPositiveFrameIndex)({
63
+ durationInFrames: composition.durationInFrames,
64
+ frame,
65
+ });
56
66
  (0, validate_puppeteer_timeout_1.validatePuppeteerTimeout)(timeoutInMilliseconds);
57
67
  (0, validate_scale_1.validateScale)(scale);
58
- if (typeof output !== 'string') {
59
- throw new TypeError('`output` parameter was not passed or is not a string');
60
- }
61
- output = path_1.default.resolve(process.cwd(), output);
68
+ output =
69
+ typeof output === 'string' ? path_1.default.resolve(process.cwd(), output) : null;
62
70
  if (quality !== undefined && imageFormat !== 'jpeg') {
63
71
  throw new Error("You can only pass the `quality` option if `imageFormat` is 'jpeg'.");
64
72
  }
65
73
  (0, quality_1.validateQuality)(quality);
66
- if (fs_1.default.existsSync(output)) {
67
- if (!overwrite) {
68
- throw new Error(`Cannot render still - "overwrite" option was set to false, but the output destination ${output} already exists.`);
69
- }
70
- const stat = (0, fs_1.statSync)(output);
71
- if (!stat.isFile()) {
72
- throw new Error(`The output location ${output} already exists, but is not a file, but something else (e.g. folder). Cannot save to it.`);
74
+ if (output) {
75
+ if (fs_1.default.existsSync(output)) {
76
+ if (!overwrite) {
77
+ throw new Error(`Cannot render still - "overwrite" option was set to false, but the output destination ${output} already exists.`);
78
+ }
79
+ const stat = (0, fs_1.statSync)(output);
80
+ if (!stat.isFile()) {
81
+ throw new Error(`The output location ${output} already exists, but is not a file, but something else (e.g. folder). Cannot save to it.`);
82
+ }
73
83
  }
84
+ (0, ensure_output_directory_1.ensureOutputDirectory)(output);
74
85
  }
75
- (0, ensure_output_directory_1.ensureOutputDirectory)(output);
76
86
  const browserInstance = puppeteerInstance !== null && puppeteerInstance !== void 0 ? puppeteerInstance : (await (0, open_browser_1.openBrowser)(browser_1.DEFAULT_BROWSER, {
77
87
  browserExecutable,
78
88
  shouldDumpIo: dumpBrowserLogs,
@@ -100,7 +110,7 @@ const innerRenderStill = async ({ composition, quality, imageFormat = 'png', ser
100
110
  await page.close();
101
111
  }
102
112
  else {
103
- browserInstance.close().catch((err) => {
113
+ browserInstance.close(true).catch((err) => {
104
114
  console.log('Unable to close browser', err);
105
115
  });
106
116
  }
@@ -113,38 +123,57 @@ const innerRenderStill = async ({ composition, quality, imageFormat = 'png', ser
113
123
  envVariables,
114
124
  page,
115
125
  serveUrl,
116
- initialFrame: frame,
126
+ initialFrame: stillFrame,
117
127
  timeoutInMilliseconds,
118
128
  proxyPort,
119
129
  retriesRemaining: 2,
130
+ audioEnabled: false,
131
+ videoEnabled: true,
120
132
  });
121
133
  await (0, puppeteer_evaluate_1.puppeteerEvaluateWithCatch)({
122
- pageFunction: (id) => {
134
+ // eslint-disable-next-line max-params
135
+ pageFunction: (id, defaultProps, durationInFrames, fps, height, width) => {
123
136
  window.setBundleMode({
124
137
  type: 'composition',
125
138
  compositionName: id,
139
+ compositionDefaultProps: defaultProps,
140
+ compositionDurationInFrames: durationInFrames,
141
+ compositionFps: fps,
142
+ compositionHeight: height,
143
+ compositionWidth: width,
126
144
  });
127
145
  },
128
- args: [composition.id],
146
+ args: [
147
+ composition.id,
148
+ composition.defaultProps,
149
+ composition.durationInFrames,
150
+ composition.fps,
151
+ composition.height,
152
+ composition.width,
153
+ ],
129
154
  frame: null,
130
155
  page,
131
156
  });
132
- await (0, seek_to_frame_1.seekToFrame)({ frame, page });
133
- await (0, provide_screenshot_1.provideScreenshot)({
134
- page,
157
+ await (0, seek_to_frame_1.seekToFrame)({ frame: stillFrame, page });
158
+ const { buffer } = await (0, take_frame_and_compose_1.takeFrameAndCompose)({
159
+ downloadMap,
160
+ frame: stillFrame,
161
+ freePage: page,
162
+ height: composition.height,
163
+ width: composition.width,
135
164
  imageFormat,
165
+ scale,
166
+ output,
136
167
  quality,
137
- options: {
138
- frame,
139
- output,
140
- },
168
+ wantsBuffer: !output,
141
169
  });
142
170
  await cleanup();
171
+ return { buffer: output ? null : buffer };
143
172
  };
144
173
  /**
145
174
  *
146
175
  * @description Render a still frame from a composition
147
- * @link https://www.remotion.dev/docs/renderer/render-still
176
+ * @see [Documentation](https://www.remotion.dev/docs/renderer/render-still)
148
177
  */
149
178
  const renderStill = (options) => {
150
179
  var _a, _b;
@@ -163,6 +192,7 @@ const renderStill = (options) => {
163
192
  ffprobeExecutable: (_b = options.ffprobeExecutable) !== null && _b !== void 0 ? _b : null,
164
193
  port: (_c = options.port) !== null && _c !== void 0 ? _c : null,
165
194
  downloadMap,
195
+ remotionRoot: (0, find_closest_package_json_1.findRemotionRoot)(),
166
196
  })
167
197
  .then(({ serveUrl, closeServer, offthreadPort }) => {
168
198
  close = closeServer;
@@ -171,6 +201,7 @@ const renderStill = (options) => {
171
201
  serveUrl,
172
202
  onError: (err) => reject(err),
173
203
  proxyPort: offthreadPort,
204
+ downloadMap,
174
205
  });
175
206
  })
176
207
  .then((res) => resolve(res))
@@ -180,7 +211,7 @@ const renderStill = (options) => {
180
211
  if (!(options === null || options === void 0 ? void 0 : options.downloadMap)) {
181
212
  (0, download_map_1.cleanDownloadMap)(downloadMap);
182
213
  }
183
- return close === null || close === void 0 ? void 0 : close();
214
+ return close === null || close === void 0 ? void 0 : close(false);
184
215
  });
185
216
  });
186
217
  return Promise.race([
@@ -188,7 +219,7 @@ const renderStill = (options) => {
188
219
  new Promise((_resolve, reject) => {
189
220
  var _a;
190
221
  (_a = options.cancelSignal) === null || _a === void 0 ? void 0 : _a.call(options, () => {
191
- reject(new Error('renderStill() got cancelled'));
222
+ reject(new Error(make_cancel_signal_1.cancelErrorMessages.renderStill));
192
223
  });
193
224
  }),
194
225
  ]);
@@ -0,0 +1,6 @@
1
+ import type { Browser } from './browser/Browser';
2
+ export declare type BrowserReplacer = {
3
+ getBrowser: () => Browser;
4
+ replaceBrowser: (make: () => Promise<Browser>, makeNewPages: () => Promise<void>) => Promise<Browser>;
5
+ };
6
+ export declare const handleBrowserCrash: (instance: Browser) => BrowserReplacer;
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.handleBrowserCrash = void 0;
4
+ const handleBrowserCrash = (instance) => {
5
+ let _instance = instance;
6
+ const waiters = [];
7
+ let replacing = false;
8
+ return {
9
+ getBrowser: () => _instance,
10
+ replaceBrowser: async (make, makeNewPages) => {
11
+ if (replacing) {
12
+ const waiter = new Promise((resolve, reject) => {
13
+ waiters.push({
14
+ resolve,
15
+ reject,
16
+ });
17
+ });
18
+ return waiter;
19
+ }
20
+ try {
21
+ replacing = true;
22
+ await _instance
23
+ .close(true)
24
+ .then(() => {
25
+ console.log('Killed previous browser and making new one');
26
+ })
27
+ .catch(() => {
28
+ // Ignore as browser crashed
29
+ });
30
+ const browser = await make();
31
+ _instance = browser;
32
+ await makeNewPages();
33
+ waiters.forEach((w) => w.resolve(browser));
34
+ console.log('Made new browser');
35
+ return browser;
36
+ }
37
+ catch (err) {
38
+ waiters.forEach((w) => w.reject(err));
39
+ throw err;
40
+ }
41
+ finally {
42
+ replacing = false;
43
+ }
44
+ },
45
+ };
46
+ };
47
+ exports.handleBrowserCrash = handleBrowserCrash;
File without changes