@remotion/renderer 4.0.0-alpha.4 → 4.0.0-alpha5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (585) 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 +2 -1
  12. package/dist/assets/download-and-map-assets-to-file.js +60 -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 +5 -26
  16. package/dist/assets/download-map.js +8 -9
  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 -2
  22. package/dist/assets/get-audio-channels.js +5 -8
  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 +28 -0
  38. package/dist/audio-codec.js +83 -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 +15 -63
  44. package/dist/browser/BrowserFetcher.js +145 -231
  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 +38 -75
  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 +2 -6
  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 +1 -4
  72. package/dist/browser/LaunchOptions.js +0 -0
  73. package/dist/browser/Launcher.d.ts +7 -1
  74. package/dist/browser/Launcher.js +13 -375
  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 -3
  86. package/dist/browser/PuppeteerNode.js +2 -14
  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 +34 -90
  101. package/dist/browser/devtools-commands.d.ts +5 -1
  102. package/dist/browser/devtools-commands.js +0 -0
  103. package/dist/browser/devtools-types.d.ts +82 -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/is-target-closed-err.d.ts +1 -0
  108. package/dist/browser/is-target-closed-err.js +9 -0
  109. package/dist/browser/mitt/index.d.ts +0 -0
  110. package/dist/browser/mitt/index.js +0 -0
  111. package/dist/browser/node.d.ts +0 -0
  112. package/dist/browser/node.js +0 -0
  113. package/dist/browser/revisions.d.ts +0 -1
  114. package/dist/browser/revisions.js +0 -1
  115. package/dist/browser/util.d.ts +0 -0
  116. package/dist/browser/util.js +0 -0
  117. package/dist/browser-executable.d.ts +0 -0
  118. package/dist/browser-executable.js +0 -0
  119. package/dist/browser-log.d.ts +0 -0
  120. package/dist/browser-log.js +0 -0
  121. package/dist/browser.d.ts +0 -0
  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/calculate-sar-dar-pixels.d.ts +0 -0
  126. package/dist/calculate-sar-dar-pixels.js +0 -0
  127. package/dist/call-ffmpeg.d.ts +14 -0
  128. package/dist/call-ffmpeg.js +37 -0
  129. package/dist/can-use-parallel-encoding.d.ts +0 -0
  130. package/dist/can-use-parallel-encoding.js +0 -0
  131. package/dist/check-apple-silicon.d.ts +1 -0
  132. package/dist/check-apple-silicon.js +12 -0
  133. package/dist/chunk.d.ts +0 -0
  134. package/dist/chunk.js +0 -0
  135. package/dist/client.d.ts +204 -0
  136. package/dist/client.js +49 -0
  137. package/dist/codec-supports-media.d.ts +2 -0
  138. package/dist/codec-supports-media.js +23 -1
  139. package/dist/codec.d.ts +0 -0
  140. package/dist/codec.js +0 -0
  141. package/dist/combine-videos.d.ts +6 -2
  142. package/dist/combine-videos.js +14 -14
  143. package/dist/compositor/compose.d.ts +15 -0
  144. package/dist/compositor/compose.js +67 -0
  145. package/dist/compositor/compositor.d.ts +12 -0
  146. package/dist/compositor/compositor.js +202 -0
  147. package/dist/compositor/get-executable-path.d.ts +1 -0
  148. package/dist/compositor/get-executable-path.js +66 -0
  149. package/dist/compositor/make-nonce.d.ts +1 -0
  150. package/dist/compositor/make-nonce.js +8 -0
  151. package/dist/compositor/payloads.d.ts +68 -0
  152. package/dist/compositor/payloads.js +2 -0
  153. package/dist/compress-assets.d.ts +0 -0
  154. package/dist/compress-assets.js +0 -0
  155. package/dist/convert-number-of-gif-loops-to-ffmpeg.d.ts +0 -0
  156. package/dist/convert-number-of-gif-loops-to-ffmpeg.js +0 -0
  157. package/dist/convert-to-positive-frame-index.d.ts +4 -0
  158. package/dist/convert-to-positive-frame-index.js +8 -0
  159. package/dist/create-ffmpeg-complex-filter.d.ts +5 -1
  160. package/dist/create-ffmpeg-complex-filter.js +6 -4
  161. package/dist/create-ffmpeg-merge-filter.d.ts +5 -1
  162. package/dist/create-ffmpeg-merge-filter.js +21 -13
  163. package/dist/create-silent-audio.d.ts +1 -3
  164. package/dist/create-silent-audio.js +3 -6
  165. package/dist/crf.d.ts +5 -1
  166. package/dist/crf.js +41 -8
  167. package/dist/cycle-browser-tabs.d.ts +2 -5
  168. package/dist/cycle-browser-tabs.js +5 -5
  169. package/dist/delay-render-embedded-stack.d.ts +0 -0
  170. package/dist/delay-render-embedded-stack.js +0 -0
  171. package/dist/delete-directory.d.ts +1 -1
  172. package/dist/delete-directory.js +43 -17
  173. package/dist/determine-resize-params.d.ts +1 -0
  174. package/dist/determine-resize-params.js +10 -0
  175. package/dist/determine-vcodec-ffmpeg-flags.d.ts +2 -0
  176. package/dist/determine-vcodec-ffmpeg-flags.js +13 -0
  177. package/dist/does-have-m2-bug.d.ts +3 -0
  178. package/dist/does-have-m2-bug.js +12 -0
  179. package/dist/ensure-ffmpeg.d.ts +18 -0
  180. package/dist/ensure-ffmpeg.js +58 -0
  181. package/dist/ensure-frames-in-order.d.ts +0 -0
  182. package/dist/ensure-frames-in-order.js +0 -0
  183. package/dist/ensure-output-directory.d.ts +0 -0
  184. package/dist/ensure-output-directory.js +0 -0
  185. package/dist/ensure-presentation-timestamp.d.ts +14 -1
  186. package/dist/ensure-presentation-timestamp.js +36 -17
  187. package/dist/error-handling/handle-javascript-exception.d.ts +0 -0
  188. package/dist/error-handling/handle-javascript-exception.js +10 -0
  189. package/dist/error-handling/symbolicate-error.d.ts +0 -0
  190. package/dist/error-handling/symbolicate-error.js +2 -1
  191. package/dist/error-handling/symbolicateable-error.d.ts +0 -0
  192. package/dist/error-handling/symbolicateable-error.js +0 -0
  193. package/dist/extract-frame-from-video.d.ts +2 -0
  194. package/dist/extract-frame-from-video.js +47 -110
  195. package/dist/ffmpeg-executable.d.ts +0 -0
  196. package/dist/ffmpeg-executable.js +0 -0
  197. package/dist/ffmpeg-filter-file.d.ts +6 -1
  198. package/dist/ffmpeg-filter-file.js +36 -4
  199. package/dist/ffmpeg-flags.d.ts +20 -2
  200. package/dist/ffmpeg-flags.js +205 -9
  201. package/dist/ffmpeg-override.d.ts +4 -0
  202. package/dist/ffmpeg-override.js +2 -0
  203. package/dist/file-extensions.d.ts +14 -0
  204. package/dist/file-extensions.js +76 -0
  205. package/dist/find-closest-package-json.d.ts +2 -0
  206. package/dist/find-closest-package-json.js +31 -0
  207. package/dist/frame-range.d.ts +0 -0
  208. package/dist/frame-range.js +0 -0
  209. package/dist/frame-to-ffmpeg-timestamp.d.ts +0 -0
  210. package/dist/frame-to-ffmpeg-timestamp.js +0 -0
  211. package/dist/get-browser-instance.d.ts +0 -0
  212. package/dist/get-browser-instance.js +1 -1
  213. package/dist/get-can-extract-frames-fast.d.ts +14 -0
  214. package/dist/get-can-extract-frames-fast.js +71 -0
  215. package/dist/get-codec-name.d.ts +0 -0
  216. package/dist/get-codec-name.js +0 -0
  217. package/dist/get-compositions.d.ts +7 -5
  218. package/dist/get-compositions.js +23 -7
  219. package/dist/get-concurrency.d.ts +1 -1
  220. package/dist/get-concurrency.js +8 -1
  221. package/dist/get-duration-from-frame-range.d.ts +0 -0
  222. package/dist/get-duration-from-frame-range.js +0 -0
  223. package/dist/get-extension-from-codec.d.ts +5 -1
  224. package/dist/get-extension-from-codec.js +56 -32
  225. package/dist/get-extension-of-filename.d.ts +0 -0
  226. package/dist/get-extension-of-filename.js +5 -1
  227. package/dist/get-frame-of-video-slow.d.ts +15 -0
  228. package/dist/get-frame-of-video-slow.js +72 -0
  229. package/dist/get-frame-padded-index.d.ts +2 -1
  230. package/dist/get-frame-padded-index.js +3 -2
  231. package/dist/get-frame-to-render.d.ts +0 -0
  232. package/dist/get-frame-to-render.js +1 -1
  233. package/dist/get-local-browser-executable.d.ts +0 -0
  234. package/dist/get-local-browser-executable.js +4 -14
  235. package/dist/get-port.d.ts +4 -1
  236. package/dist/get-port.js +8 -8
  237. package/dist/get-prores-profile-name.d.ts +0 -0
  238. package/dist/get-prores-profile-name.js +0 -0
  239. package/dist/get-video-info.d.ts +6 -1
  240. package/dist/get-video-info.js +19 -9
  241. package/dist/get-video-threads-flag.d.ts +0 -0
  242. package/dist/get-video-threads-flag.js +0 -0
  243. package/dist/guess-extension-for-media.d.ts +3 -1
  244. package/dist/guess-extension-for-media.js +5 -8
  245. package/dist/image-format.d.ts +12 -6
  246. package/dist/image-format.js +19 -13
  247. package/dist/index.d.ts +201 -48
  248. package/dist/index.js +37 -36
  249. package/dist/is-audio-codec.d.ts +0 -0
  250. package/dist/is-audio-codec.js +0 -0
  251. package/dist/is-beyond-last-frame.d.ts +0 -0
  252. package/dist/is-beyond-last-frame.js +0 -0
  253. package/dist/is-serve-url.d.ts +0 -0
  254. package/dist/is-serve-url.js +0 -0
  255. package/dist/jpeg-quality.d.ts +1 -0
  256. package/dist/jpeg-quality.js +21 -0
  257. package/dist/last-frame-from-video-cache.d.ts +2 -0
  258. package/dist/last-frame-from-video-cache.js +0 -0
  259. package/dist/legacy-webpack-config.d.ts +0 -0
  260. package/dist/legacy-webpack-config.js +0 -0
  261. package/dist/locks.d.ts +7 -0
  262. package/dist/locks.js +44 -0
  263. package/dist/log-level.d.ts +0 -0
  264. package/dist/log-level.js +0 -0
  265. package/dist/make-cancel-signal.d.ts +11 -0
  266. package/dist/make-cancel-signal.js +24 -1
  267. package/dist/merge-audio-track.d.ts +3 -3
  268. package/dist/merge-audio-track.js +39 -33
  269. package/dist/mime-db.d.ts +0 -0
  270. package/dist/mime-db.js +0 -0
  271. package/dist/mime-types.d.ts +1 -0
  272. package/dist/mime-types.js +6 -1
  273. package/dist/normalize-serve-url.d.ts +0 -0
  274. package/dist/normalize-serve-url.js +0 -0
  275. package/dist/offthread-video-server.d.ts +8 -7
  276. package/dist/offthread-video-server.js +64 -45
  277. package/dist/open-browser.d.ts +6 -0
  278. package/dist/open-browser.js +16 -18
  279. package/dist/options/audio-bitrate.d.ts +2 -0
  280. package/dist/options/audio-bitrate.js +11 -0
  281. package/dist/options/crf.d.ts +2 -0
  282. package/dist/options/crf.js +11 -0
  283. package/dist/options/enforce-audio.d.ts +2 -0
  284. package/dist/options/enforce-audio.js +11 -0
  285. package/dist/options/jpeg-quality.d.ts +2 -0
  286. package/dist/options/jpeg-quality.js +11 -0
  287. package/dist/options/mute.d.ts +2 -0
  288. package/dist/options/mute.js +11 -0
  289. package/dist/options/option.d.ts +8 -0
  290. package/dist/options/option.js +2 -0
  291. package/dist/options/scale.d.ts +2 -0
  292. package/dist/options/scale.js +11 -0
  293. package/dist/options/video-bitrate.d.ts +2 -0
  294. package/dist/options/video-bitrate.js +11 -0
  295. package/dist/options/video-codec.d.ts +2 -0
  296. package/dist/options/video-codec.js +11 -0
  297. package/dist/overwrite.d.ts +0 -0
  298. package/dist/overwrite.js +0 -0
  299. package/dist/p-limit.d.ts +0 -0
  300. package/dist/p-limit.js +0 -0
  301. package/dist/parse-browser-error-stack.d.ts +0 -0
  302. package/dist/parse-browser-error-stack.js +0 -0
  303. package/dist/parse-ffmpeg-progress.d.ts +0 -0
  304. package/dist/parse-ffmpeg-progress.js +0 -0
  305. package/dist/perf.d.ts +1 -1
  306. package/dist/perf.js +9 -7
  307. package/dist/pixel-format.d.ts +1 -1
  308. package/dist/pixel-format.js +3 -0
  309. package/dist/pool.d.ts +0 -0
  310. package/dist/pool.js +0 -0
  311. package/dist/prepare-server.d.ts +5 -5
  312. package/dist/prepare-server.js +12 -7
  313. package/dist/preprocess-audio-track.d.ts +6 -4
  314. package/dist/preprocess-audio-track.js +7 -8
  315. package/dist/prespawn-ffmpeg.d.ts +9 -9
  316. package/dist/prespawn-ffmpeg.js +17 -17
  317. package/dist/prestitcher-memory-usage.d.ts +0 -4
  318. package/dist/prestitcher-memory-usage.js +2 -3
  319. package/dist/prores-profile.d.ts +5 -3
  320. package/dist/prores-profile.js +8 -8
  321. package/dist/provide-screenshot.d.ts +8 -5
  322. package/dist/provide-screenshot.js +5 -2
  323. package/dist/puppeteer-evaluate.d.ts +0 -0
  324. package/dist/puppeteer-evaluate.js +19 -11
  325. package/dist/puppeteer-screenshot.d.ts +12 -3
  326. package/dist/puppeteer-screenshot.js +18 -44
  327. package/dist/quality.d.ts +0 -0
  328. package/dist/quality.js +0 -0
  329. package/dist/redirect-status-codes.d.ts +1 -0
  330. package/dist/redirect-status-codes.js +6 -0
  331. package/dist/render-frames.d.ts +19 -19
  332. package/dist/render-frames.js +186 -105
  333. package/dist/render-media.d.ts +46 -16
  334. package/dist/render-media.js +128 -42
  335. package/dist/render-still.d.ts +17 -11
  336. package/dist/render-still.js +79 -43
  337. package/dist/replace-browser.d.ts +6 -0
  338. package/dist/replace-browser.js +47 -0
  339. package/dist/resolve-asset-src.d.ts +0 -0
  340. package/dist/resolve-asset-src.js +0 -0
  341. package/dist/sample-rate.d.ts +0 -0
  342. package/dist/sample-rate.js +0 -0
  343. package/dist/screenshot-dom-element.d.ts +8 -5
  344. package/dist/screenshot-dom-element.js +15 -4
  345. package/dist/screenshot-task.d.ts +11 -2
  346. package/dist/screenshot-task.js +43 -13
  347. package/dist/seek-to-frame.d.ts +1 -0
  348. package/dist/seek-to-frame.js +49 -3
  349. package/dist/serve-handler/index.d.ts +0 -0
  350. package/dist/serve-handler/index.js +6 -4
  351. package/dist/serve-handler/is-path-inside.d.ts +0 -0
  352. package/dist/serve-handler/is-path-inside.js +0 -0
  353. package/dist/serve-handler/range-parser.d.ts +0 -0
  354. package/dist/serve-handler/range-parser.js +0 -0
  355. package/dist/serve-static.d.ts +3 -3
  356. package/dist/serve-static.js +84 -44
  357. package/dist/set-props-and-env.d.ts +3 -1
  358. package/dist/set-props-and-env.js +39 -15
  359. package/dist/stitch-frames-to-video.d.ts +15 -12
  360. package/dist/stitch-frames-to-video.js +120 -57
  361. package/dist/stringify-ffmpeg-filter.d.ts +10 -2
  362. package/dist/stringify-ffmpeg-filter.js +37 -34
  363. package/dist/symbolicate-stacktrace.d.ts +0 -0
  364. package/dist/symbolicate-stacktrace.js +0 -0
  365. package/dist/take-frame-and-compose.d.ts +19 -0
  366. package/dist/take-frame-and-compose.js +102 -0
  367. package/dist/tmp-dir.d.ts +0 -0
  368. package/dist/tmp-dir.js +1 -2
  369. package/dist/truthy.d.ts +0 -0
  370. package/dist/truthy.js +0 -0
  371. package/dist/try-to-extract-frame-of-video-fast.d.ts +13 -0
  372. package/dist/try-to-extract-frame-of-video-fast.js +55 -0
  373. package/dist/types.d.ts +0 -0
  374. package/dist/types.js +0 -0
  375. package/dist/validate-concurrency.d.ts +2 -0
  376. package/dist/validate-concurrency.js +21 -10
  377. package/dist/validate-even-dimensions-with-codec.d.ts +0 -0
  378. package/dist/validate-even-dimensions-with-codec.js +0 -0
  379. package/dist/validate-every-nth-frame.d.ts +2 -1
  380. package/dist/validate-every-nth-frame.js +8 -1
  381. package/dist/validate-ffmpeg-override.d.ts +2 -0
  382. package/dist/validate-ffmpeg-override.js +12 -0
  383. package/dist/validate-ffmpeg.d.ts +7 -2
  384. package/dist/validate-ffmpeg.js +48 -43
  385. package/dist/validate-number-of-gif-loops.d.ts +2 -0
  386. package/dist/validate-number-of-gif-loops.js +24 -0
  387. package/dist/validate-opengl-renderer.d.ts +0 -0
  388. package/dist/validate-opengl-renderer.js +0 -0
  389. package/dist/validate-output-filename.d.ts +7 -2
  390. package/dist/validate-output-filename.js +20 -51
  391. package/dist/validate-puppeteer-timeout.d.ts +0 -0
  392. package/dist/validate-puppeteer-timeout.js +2 -1
  393. package/dist/validate-scale.d.ts +0 -0
  394. package/dist/validate-scale.js +0 -0
  395. package/dist/validate-videobitrate.d.ts +1 -0
  396. package/dist/validate-videobitrate.js +20 -0
  397. package/dist/wait-for-symbolication-error-to-be-done.d.ts +0 -0
  398. package/dist/wait-for-symbolication-error-to-be-done.js +5 -31
  399. package/dist/warn-about-ffmpeg-version.d.ts +5 -0
  400. package/dist/warn-about-ffmpeg-version.js +37 -0
  401. package/dist/ws/ws-types.d.ts +0 -0
  402. package/dist/ws/ws-types.js +2 -1
  403. package/install-toolchain.mjs +36 -0
  404. package/package.json +69 -60
  405. package/.prettierrc.js +0 -14
  406. package/dist/add-silent-audio-if-necessary.d.ts +0 -8
  407. package/dist/add-silent-audio-if-necessary.d.ts.map +0 -1
  408. package/dist/add-silent-audio-if-necessary.js +0 -51
  409. package/dist/add-silent-audio-if-necessary.js.map +0 -1
  410. package/dist/assets/asset-is-used-at-time.d.ts +0 -3
  411. package/dist/assets/asset-is-used-at-time.d.ts.map +0 -1
  412. package/dist/assets/asset-is-used-at-time.js +0 -8
  413. package/dist/assets/asset-is-used-at-time.js.map +0 -1
  414. package/dist/assets/calculate-asset-positions.d.ts.map +0 -1
  415. package/dist/assets/calculate-asset-positions.js.map +0 -1
  416. package/dist/assets/calculate-atempo.d.ts.map +0 -1
  417. package/dist/assets/calculate-atempo.js.map +0 -1
  418. package/dist/assets/convert-assets-to-file-urls.d.ts.map +0 -1
  419. package/dist/assets/convert-assets-to-file-urls.js.map +0 -1
  420. package/dist/assets/download-and-map-assets-to-file.d.ts.map +0 -1
  421. package/dist/assets/download-and-map-assets-to-file.js.map +0 -1
  422. package/dist/assets/download-file.d.ts.map +0 -1
  423. package/dist/assets/download-file.js.map +0 -1
  424. package/dist/assets/ffmpeg-volume-expression.d.ts.map +0 -1
  425. package/dist/assets/ffmpeg-volume-expression.js.map +0 -1
  426. package/dist/assets/flatten-volume-array.d.ts.map +0 -1
  427. package/dist/assets/flatten-volume-array.js.map +0 -1
  428. package/dist/assets/get-asset-audio-details.d.ts +0 -5
  429. package/dist/assets/get-asset-audio-details.d.ts.map +0 -1
  430. package/dist/assets/get-asset-audio-details.js +0 -21
  431. package/dist/assets/get-asset-audio-details.js.map +0 -1
  432. package/dist/assets/get-audio-channels.d.ts.map +0 -1
  433. package/dist/assets/get-audio-channels.js.map +0 -1
  434. package/dist/assets/get-simulatenous-assets.d.ts +0 -3
  435. package/dist/assets/get-simulatenous-assets.d.ts.map +0 -1
  436. package/dist/assets/get-simulatenous-assets.js +0 -14
  437. package/dist/assets/get-simulatenous-assets.js.map +0 -1
  438. package/dist/assets/read-file.d.ts.map +0 -1
  439. package/dist/assets/read-file.js.map +0 -1
  440. package/dist/assets/round-volume-to-avoid-stack-overflow.d.ts.map +0 -1
  441. package/dist/assets/round-volume-to-avoid-stack-overflow.js.map +0 -1
  442. package/dist/assets/sanitize-filename.d.ts.map +0 -1
  443. package/dist/assets/sanitize-filename.js.map +0 -1
  444. package/dist/assets/sanitize-filepath.d.ts.map +0 -1
  445. package/dist/assets/sanitize-filepath.js.map +0 -1
  446. package/dist/assets/split-assets-into-segments.d.ts +0 -6
  447. package/dist/assets/split-assets-into-segments.d.ts.map +0 -1
  448. package/dist/assets/split-assets-into-segments.js +0 -89
  449. package/dist/assets/split-assets-into-segments.js.map +0 -1
  450. package/dist/assets/truncate-utf8-bytes.d.ts.map +0 -1
  451. package/dist/assets/truncate-utf8-bytes.js.map +0 -1
  452. package/dist/assets/types.d.ts.map +0 -1
  453. package/dist/assets/types.js.map +0 -1
  454. package/dist/assets-to-ffmpeg-inputs.d.ts +0 -7
  455. package/dist/assets-to-ffmpeg-inputs.d.ts.map +0 -1
  456. package/dist/assets-to-ffmpeg-inputs.js +0 -15
  457. package/dist/assets-to-ffmpeg-inputs.js.map +0 -1
  458. package/dist/browser-log.d.ts.map +0 -1
  459. package/dist/browser-log.js.map +0 -1
  460. package/dist/calculate-ffmpeg-filters.d.ts.map +0 -1
  461. package/dist/calculate-ffmpeg-filters.js.map +0 -1
  462. package/dist/can-use-parallel-encoding.d.ts.map +0 -1
  463. package/dist/can-use-parallel-encoding.js.map +0 -1
  464. package/dist/combine-videos.d.ts.map +0 -1
  465. package/dist/combine-videos.js.map +0 -1
  466. package/dist/convert-to-pcm.d.ts +0 -6
  467. package/dist/convert-to-pcm.js +0 -20
  468. package/dist/create-ffmpeg-complex-filter.d.ts.map +0 -1
  469. package/dist/create-ffmpeg-complex-filter.js.map +0 -1
  470. package/dist/cycle-browser-tabs.d.ts.map +0 -1
  471. package/dist/cycle-browser-tabs.js.map +0 -1
  472. package/dist/delay-render-embedded-stack.d.ts.map +0 -1
  473. package/dist/delay-render-embedded-stack.js.map +0 -1
  474. package/dist/delete-directory.d.ts.map +0 -1
  475. package/dist/delete-directory.js.map +0 -1
  476. package/dist/ensure-frames-in-order.d.ts.map +0 -1
  477. package/dist/ensure-frames-in-order.js.map +0 -1
  478. package/dist/ensure-output-directory.d.ts.map +0 -1
  479. package/dist/ensure-output-directory.js.map +0 -1
  480. package/dist/error-handling/handle-javascript-exception.d.ts.map +0 -1
  481. package/dist/error-handling/handle-javascript-exception.js.map +0 -1
  482. package/dist/error-handling/symbolicate-error.d.ts.map +0 -1
  483. package/dist/error-handling/symbolicate-error.js.map +0 -1
  484. package/dist/error-handling/symbolicateable-error.d.ts.map +0 -1
  485. package/dist/error-handling/symbolicateable-error.js.map +0 -1
  486. package/dist/ffmpeg-flags.d.ts.map +0 -1
  487. package/dist/ffmpeg-flags.js.map +0 -1
  488. package/dist/get-audio-codec-name.d.ts +0 -2
  489. package/dist/get-audio-codec-name.d.ts.map +0 -1
  490. package/dist/get-audio-codec-name.js +0 -28
  491. package/dist/get-audio-codec-name.js.map +0 -1
  492. package/dist/get-browser-instance.d.ts.map +0 -1
  493. package/dist/get-browser-instance.js.map +0 -1
  494. package/dist/get-codec-name.d.ts.map +0 -1
  495. package/dist/get-codec-name.js.map +0 -1
  496. package/dist/get-compositions.d.ts.map +0 -1
  497. package/dist/get-compositions.js.map +0 -1
  498. package/dist/get-concurrency.d.ts.map +0 -1
  499. package/dist/get-concurrency.js.map +0 -1
  500. package/dist/get-extension-from-codec.d.ts.map +0 -1
  501. package/dist/get-extension-from-codec.js.map +0 -1
  502. package/dist/get-frame-to-render.d.ts.map +0 -1
  503. package/dist/get-frame-to-render.js.map +0 -1
  504. package/dist/get-local-browser-executable.d.ts.map +0 -1
  505. package/dist/get-local-browser-executable.js.map +0 -1
  506. package/dist/get-port.d.ts.map +0 -1
  507. package/dist/get-port.js.map +0 -1
  508. package/dist/get-prores-profile-name.d.ts.map +0 -1
  509. package/dist/get-prores-profile-name.js.map +0 -1
  510. package/dist/image-format.d.ts.map +0 -1
  511. package/dist/image-format.js.map +0 -1
  512. package/dist/index.d.ts.map +0 -1
  513. package/dist/index.js.map +0 -1
  514. package/dist/is-serve-url.d.ts.map +0 -1
  515. package/dist/is-serve-url.js.map +0 -1
  516. package/dist/legacy-webpack-config.d.ts.map +0 -1
  517. package/dist/legacy-webpack-config.js.map +0 -1
  518. package/dist/make-assets-download-dir.d.ts +0 -1
  519. package/dist/make-assets-download-dir.d.ts.map +0 -1
  520. package/dist/make-assets-download-dir.js +0 -13
  521. package/dist/make-assets-download-dir.js.map +0 -1
  522. package/dist/normalize-serve-url.d.ts.map +0 -1
  523. package/dist/normalize-serve-url.js.map +0 -1
  524. package/dist/open-browser.d.ts.map +0 -1
  525. package/dist/open-browser.js.map +0 -1
  526. package/dist/parse-browser-error-stack.d.ts.map +0 -1
  527. package/dist/parse-browser-error-stack.js.map +0 -1
  528. package/dist/parse-ffmpeg-progress.d.ts.map +0 -1
  529. package/dist/parse-ffmpeg-progress.js.map +0 -1
  530. package/dist/pool.d.ts.map +0 -1
  531. package/dist/pool.js.map +0 -1
  532. package/dist/prepare-server.d.ts.map +0 -1
  533. package/dist/prepare-server.js.map +0 -1
  534. package/dist/provide-screenshot.d.ts.map +0 -1
  535. package/dist/provide-screenshot.js.map +0 -1
  536. package/dist/puppeteer-evaluate.d.ts.map +0 -1
  537. package/dist/puppeteer-evaluate.js.map +0 -1
  538. package/dist/puppeteer-screenshot.d.ts.map +0 -1
  539. package/dist/puppeteer-screenshot.js.map +0 -1
  540. package/dist/render-media.d.ts.map +0 -1
  541. package/dist/render-media.js.map +0 -1
  542. package/dist/render-still.d.ts.map +0 -1
  543. package/dist/render-still.js.map +0 -1
  544. package/dist/render.d.ts +0 -45
  545. package/dist/render.d.ts.map +0 -1
  546. package/dist/render.js +0 -245
  547. package/dist/render.js.map +0 -1
  548. package/dist/resolve-asset-src.d.ts.map +0 -1
  549. package/dist/resolve-asset-src.js.map +0 -1
  550. package/dist/sample-rate.d.ts.map +0 -1
  551. package/dist/sample-rate.js.map +0 -1
  552. package/dist/screenshot-dom-element.d.ts.map +0 -1
  553. package/dist/screenshot-dom-element.js.map +0 -1
  554. package/dist/screenshot-task.d.ts.map +0 -1
  555. package/dist/screenshot-task.js.map +0 -1
  556. package/dist/seek-to-frame.d.ts.map +0 -1
  557. package/dist/seek-to-frame.js.map +0 -1
  558. package/dist/serve-static.d.ts.map +0 -1
  559. package/dist/serve-static.js.map +0 -1
  560. package/dist/set-props-and-env.d.ts.map +0 -1
  561. package/dist/set-props-and-env.js.map +0 -1
  562. package/dist/stitcher.d.ts +0 -32
  563. package/dist/stitcher.d.ts.map +0 -1
  564. package/dist/stitcher.js +0 -204
  565. package/dist/stitcher.js.map +0 -1
  566. package/dist/stringify-ffmpeg-filter.d.ts.map +0 -1
  567. package/dist/stringify-ffmpeg-filter.js.map +0 -1
  568. package/dist/symbolicate-stacktrace.d.ts.map +0 -1
  569. package/dist/symbolicate-stacktrace.js.map +0 -1
  570. package/dist/tmp-dir.d.ts.map +0 -1
  571. package/dist/tmp-dir.js.map +0 -1
  572. package/dist/types.d.ts.map +0 -1
  573. package/dist/types.js.map +0 -1
  574. package/dist/validate-even-dimensions-with-codec.d.ts.map +0 -1
  575. package/dist/validate-even-dimensions-with-codec.js.map +0 -1
  576. package/dist/validate-ffmpeg.d.ts.map +0 -1
  577. package/dist/validate-ffmpeg.js.map +0 -1
  578. package/dist/validate-frame.d.ts +0 -1
  579. package/dist/validate-frame.js +0 -24
  580. package/dist/validate-puppeteer-timeout.d.ts.map +0 -1
  581. package/dist/validate-puppeteer-timeout.js.map +0 -1
  582. package/dist/validate-scale.d.ts.map +0 -1
  583. package/dist/validate-scale.js.map +0 -1
  584. package/tsconfig.json +0 -10
  585. package/vitest.config.ts +0 -8
@@ -1,13 +1,15 @@
1
- /// <reference types="node" />
2
1
  import type { RenderMediaOnDownload } from './assets/download-and-map-assets-to-file';
3
2
  import type { RenderAssetInfo } from './assets/download-map';
3
+ import type { AudioCodec } from './audio-codec';
4
4
  import type { Codec } from './codec';
5
- import type { FfmpegExecutable } from './ffmpeg-executable';
6
- import type { ImageFormat } from './image-format';
5
+ import type { FfmpegOverrideFn } from './ffmpeg-override';
6
+ import type { VideoImageFormat } from './image-format';
7
7
  import type { CancelSignal } from './make-cancel-signal';
8
8
  import type { PixelFormat } from './pixel-format';
9
9
  import type { ProResProfile } from './prores-profile';
10
10
  export declare type StitcherOptions = {
11
+ audioBitrate?: string | null;
12
+ videoBitrate?: string | null;
11
13
  fps: number;
12
14
  width: number;
13
15
  height: number;
@@ -17,24 +19,25 @@ export declare type StitcherOptions = {
17
19
  pixelFormat?: PixelFormat;
18
20
  numberOfGifLoops?: number | null;
19
21
  codec?: Codec;
22
+ audioCodec?: AudioCodec | null;
20
23
  crf?: number | null;
21
24
  onProgress?: (progress: number) => void;
22
25
  onDownload?: RenderMediaOnDownload;
23
26
  proResProfile?: ProResProfile;
24
27
  verbose?: boolean;
25
- ffmpegExecutable?: FfmpegExecutable;
26
- ffprobeExecutable?: FfmpegExecutable;
27
28
  dir?: string;
28
29
  cancelSignal?: CancelSignal;
29
30
  internalOptions?: {
30
31
  preEncodedFileLocation: string | null;
31
- imageFormat: ImageFormat;
32
+ imageFormat: VideoImageFormat;
33
+ preferLossless: boolean;
32
34
  };
35
+ muted?: boolean;
36
+ enforceAudioTrack?: boolean;
37
+ ffmpegOverride?: FfmpegOverrideFn;
33
38
  };
34
- declare type ReturnType = {
35
- task: Promise<Buffer | null>;
36
- getLogs: () => string;
37
- };
38
- export declare const spawnFfmpeg: (options: StitcherOptions) => Promise<ReturnType>;
39
+ /**
40
+ * @description Takes a series of images and audio information generated by renderFrames() and encodes it to a video.
41
+ * @see [Documentation](https://www.remotion.dev/docs/renderer/stitch-frames-to-video)
42
+ */
39
43
  export declare const stitchFramesToVideo: (options: StitcherOptions) => Promise<Buffer | null>;
40
- export {};
@@ -1,38 +1,65 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
2
25
  var __importDefault = (this && this.__importDefault) || function (mod) {
3
26
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
27
  };
5
28
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.stitchFramesToVideo = exports.spawnFfmpeg = void 0;
7
- const execa_1 = __importDefault(require("execa"));
8
- const fs_1 = __importDefault(require("fs"));
9
- const promises_1 = require("fs/promises");
29
+ exports.stitchFramesToVideo = void 0;
30
+ const fs_1 = __importStar(require("fs"));
10
31
  const path_1 = __importDefault(require("path"));
11
32
  const remotion_1 = require("remotion");
12
33
  const calculate_asset_positions_1 = require("./assets/calculate-asset-positions");
13
34
  const convert_assets_to_file_urls_1 = require("./assets/convert-assets-to-file-urls");
14
35
  const download_and_map_assets_to_file_1 = require("./assets/download-and-map-assets-to-file");
36
+ const audio_codec_1 = require("./audio-codec");
37
+ const call_ffmpeg_1 = require("./call-ffmpeg");
15
38
  const codec_1 = require("./codec");
16
39
  const codec_supports_media_1 = require("./codec-supports-media");
40
+ const get_executable_path_1 = require("./compositor/get-executable-path");
17
41
  const convert_number_of_gif_loops_to_ffmpeg_1 = require("./convert-number-of-gif-loops-to-ffmpeg");
18
42
  const crf_1 = require("./crf");
19
43
  const delete_directory_1 = require("./delete-directory");
20
- const get_audio_codec_name_1 = require("./get-audio-codec-name");
44
+ const does_have_m2_bug_1 = require("./does-have-m2-bug");
45
+ const find_closest_package_json_1 = require("./find-closest-package-json");
21
46
  const get_codec_name_1 = require("./get-codec-name");
22
47
  const get_extension_from_codec_1 = require("./get-extension-from-codec");
23
48
  const get_prores_profile_name_1 = require("./get-prores-profile-name");
49
+ const make_cancel_signal_1 = require("./make-cancel-signal");
24
50
  const merge_audio_track_1 = require("./merge-audio-track");
25
51
  const parse_ffmpeg_progress_1 = require("./parse-ffmpeg-progress");
26
52
  const pixel_format_1 = require("./pixel-format");
27
53
  const preprocess_audio_track_1 = require("./preprocess-audio-track");
54
+ const prores_profile_1 = require("./prores-profile");
28
55
  const truthy_1 = require("./truthy");
29
56
  const validate_even_dimensions_with_codec_1 = require("./validate-even-dimensions-with-codec");
30
- const validate_ffmpeg_1 = require("./validate-ffmpeg");
57
+ const validate_videobitrate_1 = require("./validate-videobitrate");
31
58
  const packageJsonPath = path_1.default.join(__dirname, '..', 'package.json');
32
59
  const packageJson = fs_1.default.existsSync(packageJsonPath)
33
60
  ? JSON.parse(fs_1.default.readFileSync(packageJsonPath, 'utf-8'))
34
61
  : null;
35
- const getAssetsData = async ({ assets, onDownload, fps, expectedFrames, verbose, ffmpegExecutable, ffprobeExecutable, onProgress, downloadMap, }) => {
62
+ const getAssetsData = async ({ assets, onDownload, fps, expectedFrames, verbose, onProgress, downloadMap, remotionRoot, }) => {
36
63
  const fileUrlAssets = await (0, convert_assets_to_file_urls_1.convertAssetsToFileUrls)({
37
64
  assets,
38
65
  onDownload: onDownload !== null && onDownload !== void 0 ? onDownload : (() => () => undefined),
@@ -50,8 +77,6 @@ const getAssetsData = async ({ assets, onDownload, fps, expectedFrames, verbose,
50
77
  const preprocessed = (await Promise.all(assetPositions.map(async (asset, index) => {
51
78
  const filterFile = path_1.default.join(downloadMap.audioMixing, `${index}.wav`);
52
79
  const result = await (0, preprocess_audio_track_1.preprocessAudioTrack)({
53
- ffmpegExecutable: ffmpegExecutable !== null && ffmpegExecutable !== void 0 ? ffmpegExecutable : null,
54
- ffprobeExecutable: ffprobeExecutable !== null && ffprobeExecutable !== void 0 ? ffprobeExecutable : null,
55
80
  outName: filterFile,
56
81
  asset,
57
82
  expectedFrames,
@@ -64,21 +89,21 @@ const getAssetsData = async ({ assets, onDownload, fps, expectedFrames, verbose,
64
89
  }))).filter(truthy_1.truthy);
65
90
  const outName = path_1.default.join(downloadMap.audioPreprocessing, `audio.wav`);
66
91
  await (0, merge_audio_track_1.mergeAudioTrack)({
67
- ffmpegExecutable: ffmpegExecutable !== null && ffmpegExecutable !== void 0 ? ffmpegExecutable : null,
68
92
  files: preprocessed,
69
93
  outName,
70
94
  numberOfSeconds: Number((expectedFrames / fps).toFixed(3)),
71
95
  downloadMap,
96
+ remotionRoot,
72
97
  });
73
- (0, delete_directory_1.deleteDirectory)(downloadMap.audioMixing);
74
98
  onProgress(1);
99
+ (0, delete_directory_1.deleteDirectory)(downloadMap.audioMixing);
75
100
  preprocessed.forEach((p) => {
76
- (0, delete_directory_1.deleteDirectory)(p);
101
+ (0, delete_directory_1.deleteDirectory)(p.outName);
77
102
  });
78
103
  return outName;
79
104
  };
80
- const spawnFfmpeg = async (options) => {
81
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v;
105
+ const spawnFfmpeg = async (options, remotionRoot) => {
106
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s;
82
107
  remotion_1.Internals.validateDimension(options.height, 'height', 'passed to `stitchFramesToVideo()`');
83
108
  remotion_1.Internals.validateDimension(options.width, 'width', 'passed to `stitchFramesToVideo()`');
84
109
  const codec = (_a = options.codec) !== null && _a !== void 0 ? _a : codec_1.DEFAULT_CODEC;
@@ -88,31 +113,50 @@ const spawnFfmpeg = async (options) => {
88
113
  codec,
89
114
  scale: 1,
90
115
  });
116
+ (0, prores_profile_1.validateSelectedCodecAndProResCombination)({
117
+ codec,
118
+ proResProfile: options.proResProfile,
119
+ });
120
+ (0, validate_videobitrate_1.validateBitrate)(options.audioBitrate, 'audioBitrate');
121
+ (0, validate_videobitrate_1.validateBitrate)(options.videoBitrate, 'videoBitrate');
91
122
  remotion_1.Internals.validateFps(options.fps, 'in `stitchFramesToVideo()`', false);
92
- const crf = (_b = options.crf) !== null && _b !== void 0 ? _b : (0, crf_1.getDefaultCrfForCodec)(codec);
93
- const pixelFormat = (_c = options.pixelFormat) !== null && _c !== void 0 ? _c : pixel_format_1.DEFAULT_PIXEL_FORMAT;
94
- await (0, validate_ffmpeg_1.validateFfmpeg)((_d = options.ffmpegExecutable) !== null && _d !== void 0 ? _d : null);
123
+ const pixelFormat = (_b = options.pixelFormat) !== null && _b !== void 0 ? _b : pixel_format_1.DEFAULT_PIXEL_FORMAT;
95
124
  const encoderName = (0, get_codec_name_1.getCodecName)(codec);
96
- const audioCodecName = (0, get_audio_codec_name_1.getAudioCodecName)(codec);
97
125
  const proResProfileName = (0, get_prores_profile_name_1.getProResProfileName)(codec, options.proResProfile);
98
126
  const mediaSupport = (0, codec_supports_media_1.codecSupportsMedia)(codec);
99
- const supportsCrf = encoderName && codec !== 'prores';
127
+ const shouldRenderAudio = mediaSupport.audio &&
128
+ (options.assetsInfo.assets.flat(1).length > 0 ||
129
+ options.enforceAudioTrack) &&
130
+ !options.muted;
131
+ const shouldRenderVideo = mediaSupport.video;
132
+ if (!shouldRenderAudio && !shouldRenderVideo) {
133
+ throw new Error('The output format has neither audio nor video. This can happen if you are rendering an audio codec and the output file has no audio or the muted flag was passed.');
134
+ }
135
+ // Explanation: https://github.com/remotion-dev/remotion/issues/1647
136
+ const resolvedAudioCodec = ((_c = options.internalOptions) === null || _c === void 0 ? void 0 : _c.preferLossless)
137
+ ? (0, audio_codec_1.getDefaultAudioCodec)({ codec, preferLossless: true })
138
+ : (_d = options.audioCodec) !== null && _d !== void 0 ? _d : (0, audio_codec_1.getDefaultAudioCodec)({ codec, preferLossless: false });
100
139
  const tempFile = options.outputLocation
101
140
  ? null
102
- : path_1.default.join(options.assetsInfo.downloadMap.stitchFrames, `out.${(0, get_extension_from_codec_1.getFileExtensionFromCodec)(codec, 'final')}`);
141
+ : path_1.default.join(options.assetsInfo.downloadMap.stitchFrames, `out.${(0, get_extension_from_codec_1.getFileExtensionFromCodec)(codec, resolvedAudioCodec)}`);
103
142
  if (options.verbose) {
104
- console.log('[verbose] ffmpeg', (_e = options.ffmpegExecutable) !== null && _e !== void 0 ? _e : 'ffmpeg in PATH');
143
+ console.log('[verbose] ffmpeg', (0, get_executable_path_1.getExecutablePath)('ffmpeg'));
105
144
  console.log('[verbose] encoder', encoderName);
106
- console.log('[verbose] audioCodec', audioCodecName);
145
+ console.log('[verbose] audioCodec', resolvedAudioCodec);
107
146
  console.log('[verbose] pixelFormat', pixelFormat);
108
- if (supportsCrf) {
109
- console.log('[verbose] crf', crf);
147
+ if (options.ffmpegOverride) {
148
+ console.log('[verbose] ffmpegOverride', options.ffmpegOverride);
110
149
  }
111
150
  console.log('[verbose] codec', codec);
112
- console.log('[verbose] isAudioOnly', mediaSupport.audio && !mediaSupport.video);
151
+ console.log('[verbose] shouldRenderAudio', shouldRenderAudio);
152
+ console.log('[verbose] shouldRenderVideo', shouldRenderVideo);
113
153
  console.log('[verbose] proResProfileName', proResProfileName);
114
154
  }
115
- (0, crf_1.validateSelectedCrfAndCodecCombination)(crf, codec);
155
+ (0, crf_1.validateQualitySettings)({
156
+ crf: options.crf,
157
+ codec,
158
+ videoBitrate: options.videoBitrate,
159
+ });
116
160
  (0, pixel_format_1.validateSelectedPixelFormatAndCodecCombination)(pixelFormat, codec);
117
161
  const expectedFrames = options.assetsInfo.assets.length;
118
162
  const updateProgress = (preStitchProgress, muxProgress) => {
@@ -120,45 +164,45 @@ const spawnFfmpeg = async (options) => {
120
164
  const totalFrameProgress = 0.5 * preStitchProgress * expectedFrames + muxProgress * 0.5;
121
165
  (_a = options.onProgress) === null || _a === void 0 ? void 0 : _a.call(options, Math.round(totalFrameProgress));
122
166
  };
123
- const audio = mediaSupport.audio
167
+ const audio = shouldRenderAudio
124
168
  ? await getAssetsData({
125
169
  assets: options.assetsInfo.assets,
126
170
  onDownload: options.onDownload,
127
171
  fps: options.fps,
128
172
  expectedFrames,
129
- verbose: (_f = options.verbose) !== null && _f !== void 0 ? _f : false,
130
- ffmpegExecutable: (_g = options.ffmpegExecutable) !== null && _g !== void 0 ? _g : null,
131
- ffprobeExecutable: (_h = options.ffprobeExecutable) !== null && _h !== void 0 ? _h : null,
173
+ verbose: (_e = options.verbose) !== null && _e !== void 0 ? _e : false,
132
174
  onProgress: (prog) => updateProgress(prog, 0),
133
175
  downloadMap: options.assetsInfo.downloadMap,
176
+ remotionRoot,
134
177
  })
135
178
  : null;
136
179
  if (mediaSupport.audio && !mediaSupport.video) {
137
- if (!audioCodecName) {
180
+ if (!resolvedAudioCodec) {
138
181
  throw new TypeError('exporting audio but has no audio codec name. Report this in the Remotion repo.');
139
182
  }
140
- const ffmpegTask = (0, execa_1.default)('ffmpeg', [
183
+ const ffmpegTask = (0, call_ffmpeg_1.callFf)('ffmpeg', [
141
184
  '-i',
142
185
  audio,
143
186
  '-c:a',
144
- audioCodecName,
187
+ (0, audio_codec_1.mapAudioCodecToFfmpegAudioCodecName)(resolvedAudioCodec),
145
188
  // Set bitrate up to 320k, for aac it might effectively be lower
146
189
  '-b:a',
147
- '320k',
190
+ (_f = options.audioBitrate) !== null && _f !== void 0 ? _f : '320k',
148
191
  options.force ? '-y' : null,
149
- (_j = options.outputLocation) !== null && _j !== void 0 ? _j : tempFile,
192
+ (_g = options.outputLocation) !== null && _g !== void 0 ? _g : tempFile,
150
193
  ].filter(remotion_1.Internals.truthy));
151
- (_k = options.cancelSignal) === null || _k === void 0 ? void 0 : _k.call(options, () => {
194
+ (_h = options.cancelSignal) === null || _h === void 0 ? void 0 : _h.call(options, () => {
152
195
  ffmpegTask.kill();
153
196
  });
154
197
  await ffmpegTask;
155
- (_l = options.onProgress) === null || _l === void 0 ? void 0 : _l.call(options, expectedFrames);
198
+ (_j = options.onProgress) === null || _j === void 0 ? void 0 : _j.call(options, expectedFrames);
156
199
  if (audio) {
157
- await (0, delete_directory_1.deleteDirectory)(path_1.default.dirname(audio));
200
+ (0, delete_directory_1.deleteDirectory)(path_1.default.dirname(audio));
158
201
  }
159
202
  const file = await new Promise((resolve, reject) => {
160
203
  if (tempFile) {
161
- (0, promises_1.readFile)(tempFile)
204
+ fs_1.promises
205
+ .readFile(tempFile)
162
206
  .then((f) => {
163
207
  return resolve(f);
164
208
  })
@@ -168,7 +212,7 @@ const spawnFfmpeg = async (options) => {
168
212
  resolve(null);
169
213
  }
170
214
  });
171
- await (0, delete_directory_1.deleteDirectory)(options.assetsInfo.downloadMap.stitchFrames);
215
+ (0, delete_directory_1.deleteDirectory)(options.assetsInfo.downloadMap.stitchFrames);
172
216
  return {
173
217
  getLogs: () => '',
174
218
  task: Promise.resolve(file),
@@ -176,8 +220,8 @@ const spawnFfmpeg = async (options) => {
176
220
  }
177
221
  const ffmpegArgs = [
178
222
  ['-r', String(options.fps)],
179
- ...(((_m = options.internalOptions) === null || _m === void 0 ? void 0 : _m.preEncodedFileLocation)
180
- ? [['-i', (_o = options.internalOptions) === null || _o === void 0 ? void 0 : _o.preEncodedFileLocation]]
223
+ ...(((_k = options.internalOptions) === null || _k === void 0 ? void 0 : _k.preEncodedFileLocation)
224
+ ? [['-i', (_l = options.internalOptions) === null || _l === void 0 ? void 0 : _l.preEncodedFileLocation]]
181
225
  : [
182
226
  ['-f', 'image2'],
183
227
  ['-s', `${options.width}x${options.height}`],
@@ -185,30 +229,35 @@ const spawnFfmpeg = async (options) => {
185
229
  ['-i', options.assetsInfo.imageSequenceName],
186
230
  ]),
187
231
  audio ? ['-i', audio] : null,
188
- ((_p = options.numberOfGifLoops) !== null && _p !== void 0 ? _p : null) === null
232
+ ((_m = options.numberOfGifLoops) !== null && _m !== void 0 ? _m : null) === null
189
233
  ? null
190
234
  : [
191
235
  '-loop',
192
- (0, convert_number_of_gif_loops_to_ffmpeg_1.convertNumberOfGifLoopsToFfmpegSyntax)((_q = options.numberOfGifLoops) !== null && _q !== void 0 ? _q : null),
236
+ (0, convert_number_of_gif_loops_to_ffmpeg_1.convertNumberOfGifLoopsToFfmpegSyntax)((_o = options.numberOfGifLoops) !== null && _o !== void 0 ? _o : null),
193
237
  ],
194
238
  // -c:v is the same as -vcodec as -codec:video
195
239
  // and specified the video codec.
196
240
  ['-c:v', encoderName],
197
- ...(((_r = options.internalOptions) === null || _r === void 0 ? void 0 : _r.preEncodedFileLocation)
241
+ ...(((_p = options.internalOptions) === null || _p === void 0 ? void 0 : _p.preEncodedFileLocation)
198
242
  ? []
199
243
  : [
200
244
  proResProfileName ? ['-profile:v', proResProfileName] : null,
201
- supportsCrf ? ['-crf', String(crf)] : null,
202
245
  ['-pix_fmt', pixelFormat],
203
246
  // Without explicitly disabling auto-alt-ref,
204
247
  // transparent WebM generation doesn't work
205
248
  pixelFormat === 'yuva420p' ? ['-auto-alt-ref', '0'] : null,
206
- ['-b:v', '1M'],
249
+ ...(0, crf_1.validateQualitySettings)({
250
+ crf: options.crf,
251
+ videoBitrate: options.videoBitrate,
252
+ codec,
253
+ }),
207
254
  ]),
208
255
  codec === 'h264' ? ['-movflags', 'faststart'] : null,
209
- audioCodecName ? ['-c:a', audioCodecName] : null,
256
+ resolvedAudioCodec
257
+ ? ['-c:a', (0, audio_codec_1.mapAudioCodecToFfmpegAudioCodecName)(resolvedAudioCodec)]
258
+ : null,
210
259
  // Set max bitrate up to 1024kbps, will choose lower if that's too much
211
- audioCodecName ? ['-b:a', '512K'] : null,
260
+ resolvedAudioCodec ? ['-b:a', options.audioBitrate || '512K'] : null,
212
261
  // Ignore metadata that may come from remote media
213
262
  ['-map_metadata', '-1'],
214
263
  [
@@ -217,22 +266,29 @@ const spawnFfmpeg = async (options) => {
217
266
  [`Made with Remotion`, packageJson ? packageJson.version : null].join(' '),
218
267
  ],
219
268
  options.force ? '-y' : null,
220
- (_s = options.outputLocation) !== null && _s !== void 0 ? _s : tempFile,
269
+ (_q = options.outputLocation) !== null && _q !== void 0 ? _q : tempFile,
221
270
  ];
222
271
  if (options.verbose) {
223
272
  console.log('Generated FFMPEG command:');
224
273
  console.log(ffmpegArgs);
225
274
  }
226
275
  const ffmpegString = ffmpegArgs.flat(2).filter(Boolean);
227
- const task = (0, execa_1.default)((_t = options.ffmpegExecutable) !== null && _t !== void 0 ? _t : 'ffmpeg', ffmpegString, {
276
+ const finalFfmpegString = options.ffmpegOverride
277
+ ? options.ffmpegOverride({ type: 'stitcher', args: ffmpegString })
278
+ : ffmpegString;
279
+ if (options.verbose && options.ffmpegOverride) {
280
+ console.log('Generated final FFMPEG command:');
281
+ console.log(finalFfmpegString);
282
+ }
283
+ const task = (0, call_ffmpeg_1.callFf)('ffmpeg', finalFfmpegString, {
228
284
  cwd: options.dir,
229
285
  });
230
- (_u = options.cancelSignal) === null || _u === void 0 ? void 0 : _u.call(options, () => {
286
+ (_r = options.cancelSignal) === null || _r === void 0 ? void 0 : _r.call(options, () => {
231
287
  task.kill();
232
288
  });
233
289
  let ffmpegOutput = '';
234
290
  let isFinished = false;
235
- (_v = task.stderr) === null || _v === void 0 ? void 0 : _v.on('data', (data) => {
291
+ (_s = task.stderr) === null || _s === void 0 ? void 0 : _s.on('data', (data) => {
236
292
  var _a;
237
293
  const str = data.toString();
238
294
  ffmpegOutput += str;
@@ -261,7 +317,8 @@ const spawnFfmpeg = async (options) => {
261
317
  (0, delete_directory_1.deleteDirectory)(options.assetsInfo.downloadMap.stitchFrames);
262
318
  return null;
263
319
  }
264
- return (0, promises_1.readFile)(tempFile)
320
+ return fs_1.promises
321
+ .readFile(tempFile)
265
322
  .then((file) => {
266
323
  return Promise.all([
267
324
  file,
@@ -274,18 +331,24 @@ const spawnFfmpeg = async (options) => {
274
331
  getLogs: () => ffmpegOutput,
275
332
  };
276
333
  };
277
- exports.spawnFfmpeg = spawnFfmpeg;
334
+ /**
335
+ * @description Takes a series of images and audio information generated by renderFrames() and encodes it to a video.
336
+ * @see [Documentation](https://www.remotion.dev/docs/renderer/stitch-frames-to-video)
337
+ */
278
338
  const stitchFramesToVideo = async (options) => {
279
- const { task, getLogs } = await (0, exports.spawnFfmpeg)(options);
339
+ var _a, _b;
340
+ const remotionRoot = (0, find_closest_package_json_1.findRemotionRoot)();
341
+ const { task, getLogs } = await spawnFfmpeg(options, remotionRoot);
280
342
  const happyPath = task.catch(() => {
281
343
  throw new Error(getLogs());
282
344
  });
345
+ (0, does_have_m2_bug_1.warnAboutM2Bug)((_a = options.codec) !== null && _a !== void 0 ? _a : null, (_b = options.pixelFormat) !== null && _b !== void 0 ? _b : null);
283
346
  return Promise.race([
284
347
  happyPath,
285
348
  new Promise((_resolve, reject) => {
286
349
  var _a;
287
350
  (_a = options.cancelSignal) === null || _a === void 0 ? void 0 : _a.call(options, () => {
288
- reject(new Error('stitchFramesToVideo() got cancelled'));
351
+ reject(new Error(make_cancel_signal_1.cancelErrorMessages.stitchFramesToVideo));
289
352
  });
290
353
  }),
291
354
  ]);
@@ -1,5 +1,12 @@
1
1
  import type { AssetVolume } from './assets/types';
2
- export declare const stringifyFfmpegFilter: ({ trimLeft, trimRight, channels, startInVideo, volume, fps, playbackRate, durationInFrames, assetDuration, }: {
2
+ export declare type FilterWithoutPaddingApplied = ProcessedTrack & {
3
+ filter: string;
4
+ };
5
+ export declare type ProcessedTrack = {
6
+ pad_start: string | null;
7
+ pad_end: string | null;
8
+ };
9
+ export declare const stringifyFfmpegFilter: ({ trimLeft, trimRight, channels, startInVideo, volume, fps, playbackRate, durationInFrames, assetDuration, allowAmplificationDuringRender, }: {
3
10
  trimLeft: number;
4
11
  trimRight: number;
5
12
  channels: number;
@@ -9,4 +16,5 @@ export declare const stringifyFfmpegFilter: ({ trimLeft, trimRight, channels, st
9
16
  durationInFrames: number;
10
17
  playbackRate: number;
11
18
  assetDuration: number | null;
12
- }) => string | null;
19
+ allowAmplificationDuringRender: boolean;
20
+ }) => FilterWithoutPaddingApplied | null;
@@ -5,7 +5,7 @@ const calculate_atempo_1 = require("./assets/calculate-atempo");
5
5
  const ffmpeg_volume_expression_1 = require("./assets/ffmpeg-volume-expression");
6
6
  const sample_rate_1 = require("./sample-rate");
7
7
  const truthy_1 = require("./truthy");
8
- const stringifyFfmpegFilter = ({ trimLeft, trimRight, channels, startInVideo, volume, fps, playbackRate, durationInFrames, assetDuration, }) => {
8
+ const stringifyFfmpegFilter = ({ trimLeft, trimRight, channels, startInVideo, volume, fps, playbackRate, durationInFrames, assetDuration, allowAmplificationDuringRender, }) => {
9
9
  const startInVideoSeconds = startInVideo / fps;
10
10
  if (assetDuration && trimLeft >= assetDuration) {
11
11
  return null;
@@ -14,44 +14,47 @@ const stringifyFfmpegFilter = ({ trimLeft, trimRight, channels, startInVideo, vo
14
14
  volume,
15
15
  fps,
16
16
  trimLeft,
17
+ allowAmplificationDuringRender,
17
18
  });
18
19
  // Avoid setting filters if possible, as combining them can create noise
19
20
  const chunkLength = durationInFrames / fps;
20
21
  const actualTrimRight = assetDuration
21
22
  ? Math.min(trimRight, assetDuration)
22
23
  : trimRight;
23
- const padAtEnd = chunkLength - (actualTrimRight - trimLeft) - startInVideoSeconds;
24
- return (`[0:a]` +
25
- [
26
- `aformat=sample_fmts=s32:sample_rates=${sample_rate_1.DEFAULT_SAMPLE_RATE}`,
27
- // Order matters! First trim the audio
28
- `atrim=${trimLeft.toFixed(6)}:${actualTrimRight.toFixed(6)}`,
29
- // then set the tempo
30
- (0, calculate_atempo_1.calculateATempo)(playbackRate),
31
- // set the volume if needed
32
- // The timings for volume must include whatever is in atrim, unless the volume
33
- // filter gets applied before atrim
34
- volumeFilter.value === '1'
35
- ? null
36
- : `volume=${volumeFilter.value}:eval=${volumeFilter.eval}`,
37
- // For n channels, we delay n + 1 channels.
38
- // This is because `ffprobe` for some audio files reports the wrong amount
39
- // of channels.
40
- // This should be fine because FFMPEG documentation states:
41
- // "Unused delays will be silently ignored."
42
- // https://ffmpeg.org/ffmpeg-filters.html#adelay
43
- startInVideoSeconds === 0
44
- ? null
45
- : `adelay=${new Array(channels + 1)
46
- .fill((startInVideoSeconds * 1000).toFixed(0))
47
- .join('|')}`,
48
- // Only in the end, we pad to the full length.
49
- padAtEnd > 0.0000001
50
- ? 'apad=pad_len=' + Math.round(padAtEnd * sample_rate_1.DEFAULT_SAMPLE_RATE)
51
- : null,
52
- ]
53
- .filter(truthy_1.truthy)
54
- .join(',') +
55
- `[a0]`);
24
+ const audibleDuration = (actualTrimRight - trimLeft) / playbackRate;
25
+ const padAtEnd = chunkLength - audibleDuration - startInVideoSeconds;
26
+ return {
27
+ filter: `[0:a]` +
28
+ [
29
+ `aformat=sample_fmts=s32:sample_rates=${sample_rate_1.DEFAULT_SAMPLE_RATE}`,
30
+ // Order matters! First trim the audio
31
+ `atrim=${trimLeft.toFixed(6)}:${actualTrimRight.toFixed(6)}`,
32
+ // then set the tempo
33
+ (0, calculate_atempo_1.calculateATempo)(playbackRate),
34
+ // set the volume if needed
35
+ // The timings for volume must include whatever is in atrim, unless the volume
36
+ // filter gets applied before atrim
37
+ volumeFilter.value === '1'
38
+ ? null
39
+ : `volume=${volumeFilter.value}:eval=${volumeFilter.eval}`,
40
+ // For n channels, we delay n + 1 channels.
41
+ // This is because `ffprobe` for some audio files reports the wrong amount
42
+ // of channels.
43
+ // This should be fine because FFMPEG documentation states:
44
+ // "Unused delays will be silently ignored."
45
+ // https://ffmpeg.org/ffmpeg-filters.html#adelay
46
+ ]
47
+ .filter(truthy_1.truthy)
48
+ .join(',') +
49
+ `[a0]`,
50
+ pad_end: padAtEnd > 0.0000001
51
+ ? 'apad=pad_len=' + Math.round(padAtEnd * sample_rate_1.DEFAULT_SAMPLE_RATE)
52
+ : null,
53
+ pad_start: startInVideoSeconds === 0
54
+ ? null
55
+ : `adelay=${new Array(channels + 1)
56
+ .fill((startInVideoSeconds * 1000).toFixed(0))
57
+ .join('|')}`,
58
+ };
56
59
  };
57
60
  exports.stringifyFfmpegFilter = stringifyFfmpegFilter;
File without changes
File without changes
@@ -0,0 +1,19 @@
1
+ import type { TAsset } from 'remotion';
2
+ import type { DownloadMap } from './assets/download-map';
3
+ import type { Page } from './browser/BrowserPage';
4
+ import type { StillImageFormat, VideoImageFormat } from './image-format';
5
+ export declare const takeFrameAndCompose: ({ freePage, imageFormat, jpegQuality, frame, width, height, output, scale, downloadMap, wantsBuffer, }: {
6
+ freePage: Page;
7
+ imageFormat: VideoImageFormat | StillImageFormat;
8
+ jpegQuality: number | undefined;
9
+ frame: number;
10
+ height: number;
11
+ width: number;
12
+ output: string | null;
13
+ scale: number;
14
+ downloadMap: DownloadMap;
15
+ wantsBuffer: boolean;
16
+ }) => Promise<{
17
+ buffer: Buffer | null;
18
+ collectedAssets: TAsset[];
19
+ }>;