@remotion/renderer 4.0.0-webhook.26 → 4.1.0-alpha1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (411) hide show
  1. package/LICENSE.md +8 -8
  2. package/README.md +9 -0
  3. package/client.d.ts +1 -0
  4. package/client.js +1 -0
  5. package/dist/assets/calculate-asset-positions.d.ts +0 -0
  6. package/dist/assets/calculate-asset-positions.js +1 -0
  7. package/dist/assets/calculate-atempo.d.ts +0 -0
  8. package/dist/assets/calculate-atempo.js +0 -0
  9. package/dist/assets/convert-assets-to-file-urls.d.ts +0 -0
  10. package/dist/assets/convert-assets-to-file-urls.js +0 -0
  11. package/dist/assets/download-and-map-assets-to-file.d.ts +6 -4
  12. package/dist/assets/download-and-map-assets-to-file.js +49 -19
  13. package/dist/assets/download-file.d.ts +8 -5
  14. package/dist/assets/download-file.js +71 -8
  15. package/dist/assets/download-map.d.ts +8 -29
  16. package/dist/assets/download-map.js +15 -16
  17. package/dist/assets/ffmpeg-volume-expression.d.ts +4 -3
  18. package/dist/assets/ffmpeg-volume-expression.js +5 -3
  19. package/dist/assets/flatten-volume-array.d.ts +0 -0
  20. package/dist/assets/flatten-volume-array.js +0 -0
  21. package/dist/assets/get-audio-channels.d.ts +2 -2
  22. package/dist/assets/get-audio-channels.js +14 -12
  23. package/dist/assets/read-file.d.ts +1 -1
  24. package/dist/assets/read-file.js +5 -7
  25. package/dist/assets/round-volume-to-avoid-stack-overflow.d.ts +0 -0
  26. package/dist/assets/round-volume-to-avoid-stack-overflow.js +0 -0
  27. package/dist/assets/sanitize-filename.d.ts +0 -0
  28. package/dist/assets/sanitize-filename.js +0 -0
  29. package/dist/assets/sanitize-filepath.d.ts +0 -0
  30. package/dist/assets/sanitize-filepath.js +2 -2
  31. package/dist/assets/truncate-utf8-bytes.d.ts +0 -0
  32. package/dist/assets/truncate-utf8-bytes.js +0 -0
  33. package/dist/assets/types.d.ts +5 -4
  34. package/dist/assets/types.js +0 -0
  35. package/dist/audio-codec.d.ts +28 -0
  36. package/dist/audio-codec.js +83 -0
  37. package/dist/browser/Browser.d.ts +16 -14
  38. package/dist/browser/Browser.js +69 -72
  39. package/dist/browser/BrowserConnector.d.ts +0 -0
  40. package/dist/browser/BrowserConnector.js +0 -0
  41. package/dist/browser/BrowserFetcher.d.ts +16 -64
  42. package/dist/browser/BrowserFetcher.js +147 -235
  43. package/dist/browser/BrowserPage.d.ts +21 -6
  44. package/dist/browser/BrowserPage.js +54 -22
  45. package/dist/browser/BrowserRunner.d.ts +1 -1
  46. package/dist/browser/BrowserRunner.js +32 -22
  47. package/dist/browser/Connection.d.ts +0 -0
  48. package/dist/browser/Connection.js +1 -1
  49. package/dist/browser/ConsoleMessage.d.ts +1 -1
  50. package/dist/browser/ConsoleMessage.js +0 -0
  51. package/dist/browser/DOMWorld.d.ts +5 -4
  52. package/dist/browser/DOMWorld.js +16 -9
  53. package/dist/browser/Errors.d.ts +0 -0
  54. package/dist/browser/Errors.js +0 -0
  55. package/dist/browser/EvalTypes.d.ts +7 -7
  56. package/dist/browser/EvalTypes.js +0 -0
  57. package/dist/browser/EventEmitter.d.ts +0 -0
  58. package/dist/browser/EventEmitter.js +0 -0
  59. package/dist/browser/ExecutionContext.d.ts +0 -0
  60. package/dist/browser/ExecutionContext.js +0 -0
  61. package/dist/browser/FrameManager.d.ts +0 -2
  62. package/dist/browser/FrameManager.js +13 -17
  63. package/dist/browser/HTTPRequest.d.ts +0 -0
  64. package/dist/browser/HTTPRequest.js +0 -0
  65. package/dist/browser/HTTPResponse.d.ts +0 -0
  66. package/dist/browser/HTTPResponse.js +0 -0
  67. package/dist/browser/JSHandle.d.ts +0 -0
  68. package/dist/browser/JSHandle.js +14 -14
  69. package/dist/browser/LaunchOptions.d.ts +2 -2
  70. package/dist/browser/LaunchOptions.js +0 -0
  71. package/dist/browser/Launcher.d.ts +9 -3
  72. package/dist/browser/Launcher.js +16 -29
  73. package/dist/browser/LifecycleWatcher.d.ts +1 -1
  74. package/dist/browser/LifecycleWatcher.js +0 -0
  75. package/dist/browser/NetworkEventManager.d.ts +4 -4
  76. package/dist/browser/NetworkEventManager.js +0 -0
  77. package/dist/browser/NetworkManager.d.ts +0 -0
  78. package/dist/browser/NetworkManager.js +0 -0
  79. package/dist/browser/NodeWebSocketTransport.d.ts +0 -0
  80. package/dist/browser/NodeWebSocketTransport.js +21 -21
  81. package/dist/browser/Product.d.ts +1 -1
  82. package/dist/browser/Product.js +0 -0
  83. package/dist/browser/PuppeteerNode.d.ts +2 -5
  84. package/dist/browser/PuppeteerNode.js +2 -11
  85. package/dist/browser/PuppeteerViewport.d.ts +0 -0
  86. package/dist/browser/PuppeteerViewport.js +0 -0
  87. package/dist/browser/ScreenshotOptions.d.ts +0 -14
  88. package/dist/browser/ScreenshotOptions.js +0 -1
  89. package/dist/browser/Target.d.ts +4 -3
  90. package/dist/browser/Target.js +8 -2
  91. package/dist/browser/TaskQueue.d.ts +0 -0
  92. package/dist/browser/TaskQueue.js +0 -0
  93. package/dist/browser/TimeoutSettings.d.ts +0 -0
  94. package/dist/browser/TimeoutSettings.js +0 -0
  95. package/dist/browser/assert.d.ts +0 -0
  96. package/dist/browser/assert.js +0 -0
  97. package/dist/browser/create-browser-fetcher.d.ts +0 -0
  98. package/dist/browser/create-browser-fetcher.js +34 -48
  99. package/dist/browser/devtools-commands.d.ts +5 -1
  100. package/dist/browser/devtools-commands.js +0 -0
  101. package/dist/browser/devtools-types.d.ts +92 -10
  102. package/dist/browser/devtools-types.js +0 -0
  103. package/dist/browser/get-download-destination.d.ts +0 -0
  104. package/dist/browser/get-download-destination.js +8 -8
  105. package/dist/browser/is-target-closed-err.d.ts +1 -0
  106. package/dist/browser/is-target-closed-err.js +9 -0
  107. package/dist/browser/mitt/index.d.ts +6 -6
  108. package/dist/browser/mitt/index.js +0 -0
  109. package/dist/browser/node.d.ts +0 -0
  110. package/dist/browser/node.js +0 -0
  111. package/dist/browser/revisions.d.ts +1 -1
  112. package/dist/browser/revisions.js +0 -0
  113. package/dist/browser/should-log-message.d.ts +24 -0
  114. package/dist/browser/should-log-message.js +72 -0
  115. package/dist/browser/util.d.ts +2 -2
  116. package/dist/browser/util.js +0 -0
  117. package/dist/browser-executable.d.ts +1 -1
  118. package/dist/browser-executable.js +0 -0
  119. package/dist/browser-log.d.ts +1 -1
  120. package/dist/browser-log.js +0 -0
  121. package/dist/browser.d.ts +1 -1
  122. package/dist/browser.js +0 -0
  123. package/dist/calculate-ffmpeg-filters.d.ts +2 -1
  124. package/dist/calculate-ffmpeg-filters.js +1 -0
  125. package/dist/call-ffmpeg.d.ts +14 -0
  126. package/dist/call-ffmpeg.js +42 -0
  127. package/dist/can-use-parallel-encoding.d.ts +0 -0
  128. package/dist/can-use-parallel-encoding.js +0 -0
  129. package/dist/chalk/index.d.ts +54 -0
  130. package/dist/chalk/index.js +135 -0
  131. package/dist/chalk/is-color-supported.d.ts +1 -0
  132. package/dist/chalk/is-color-supported.js +37 -0
  133. package/dist/check-apple-silicon.d.ts +1 -1
  134. package/dist/check-apple-silicon.js +8 -47
  135. package/dist/chunk.d.ts +0 -0
  136. package/dist/chunk.js +0 -0
  137. package/dist/client.d.ts +204 -0
  138. package/dist/client.js +49 -0
  139. package/dist/codec-supports-media.d.ts +3 -2
  140. package/dist/codec-supports-media.js +20 -5
  141. package/dist/codec.d.ts +2 -2
  142. package/dist/codec.js +0 -0
  143. package/dist/combine-videos.d.ts +6 -2
  144. package/dist/combine-videos.js +17 -17
  145. package/dist/compositor/compose.d.ts +26 -0
  146. package/dist/compositor/compose.js +82 -0
  147. package/dist/compositor/compositor.d.ts +11 -0
  148. package/dist/compositor/compositor.js +219 -0
  149. package/dist/compositor/get-executable-path.d.ts +1 -0
  150. package/dist/compositor/get-executable-path.js +57 -0
  151. package/dist/compositor/make-nonce.d.ts +1 -0
  152. package/dist/compositor/make-nonce.js +8 -0
  153. package/dist/compositor/payloads.d.ts +68 -0
  154. package/dist/{ffmpeg-executable.js → compositor/payloads.js} +0 -0
  155. package/dist/compress-assets.d.ts +0 -0
  156. package/dist/compress-assets.js +0 -0
  157. package/dist/convert-number-of-gif-loops-to-ffmpeg.d.ts +0 -0
  158. package/dist/convert-number-of-gif-loops-to-ffmpeg.js +0 -0
  159. package/dist/convert-to-positive-frame-index.d.ts +0 -0
  160. package/dist/convert-to-positive-frame-index.js +0 -0
  161. package/dist/create-ffmpeg-complex-filter.d.ts +5 -1
  162. package/dist/create-ffmpeg-complex-filter.js +6 -4
  163. package/dist/create-ffmpeg-merge-filter.d.ts +5 -1
  164. package/dist/create-ffmpeg-merge-filter.js +21 -13
  165. package/dist/create-silent-audio.d.ts +1 -3
  166. package/dist/create-silent-audio.js +3 -6
  167. package/dist/crf.d.ts +6 -2
  168. package/dist/crf.js +41 -8
  169. package/dist/cycle-browser-tabs.d.ts +2 -5
  170. package/dist/cycle-browser-tabs.js +5 -5
  171. package/dist/delay-render-embedded-stack.d.ts +0 -0
  172. package/dist/delay-render-embedded-stack.js +0 -0
  173. package/dist/delete-directory.d.ts +1 -1
  174. package/dist/delete-directory.js +43 -17
  175. package/dist/does-have-m2-bug.d.ts +3 -0
  176. package/dist/does-have-m2-bug.js +12 -0
  177. package/dist/ensure-frames-in-order.d.ts +0 -0
  178. package/dist/ensure-frames-in-order.js +0 -0
  179. package/dist/ensure-output-directory.d.ts +0 -0
  180. package/dist/ensure-output-directory.js +5 -5
  181. package/dist/error-handling/handle-javascript-exception.d.ts +0 -0
  182. package/dist/error-handling/handle-javascript-exception.js +10 -0
  183. package/dist/error-handling/symbolicate-error.d.ts +0 -0
  184. package/dist/error-handling/symbolicate-error.js +6 -3
  185. package/dist/error-handling/symbolicateable-error.d.ts +0 -0
  186. package/dist/error-handling/symbolicateable-error.js +0 -0
  187. package/dist/ffmpeg-filter-file.d.ts +6 -1
  188. package/dist/ffmpeg-filter-file.js +40 -8
  189. package/dist/ffmpeg-override.d.ts +1 -1
  190. package/dist/ffmpeg-override.js +0 -0
  191. package/dist/file-extensions.d.ts +14 -0
  192. package/dist/file-extensions.js +76 -0
  193. package/dist/find-closest-package-json.d.ts +2 -0
  194. package/dist/find-closest-package-json.js +31 -0
  195. package/dist/frame-range.d.ts +1 -1
  196. package/dist/frame-range.js +0 -0
  197. package/dist/get-browser-instance.d.ts +8 -3
  198. package/dist/get-browser-instance.js +10 -5
  199. package/dist/get-codec-name.d.ts +0 -0
  200. package/dist/get-codec-name.js +0 -0
  201. package/dist/get-compositions.d.ts +27 -14
  202. package/dist/get-compositions.js +72 -39
  203. package/dist/get-concurrency.d.ts +1 -1
  204. package/dist/get-concurrency.js +11 -4
  205. package/dist/get-duration-from-frame-range.d.ts +0 -0
  206. package/dist/get-duration-from-frame-range.js +0 -0
  207. package/dist/get-extension-from-codec.d.ts +5 -1
  208. package/dist/get-extension-from-codec.js +56 -32
  209. package/dist/get-extension-of-filename.d.ts +0 -0
  210. package/dist/get-extension-of-filename.js +5 -1
  211. package/dist/get-frame-padded-index.d.ts +3 -2
  212. package/dist/get-frame-padded-index.js +3 -2
  213. package/dist/get-frame-to-render.d.ts +0 -0
  214. package/dist/get-frame-to-render.js +1 -1
  215. package/dist/get-local-browser-executable.d.ts +0 -0
  216. package/dist/get-local-browser-executable.js +7 -15
  217. package/dist/get-port.d.ts +4 -1
  218. package/dist/get-port.js +8 -8
  219. package/dist/get-prores-profile-name.d.ts +0 -0
  220. package/dist/get-prores-profile-name.js +0 -0
  221. package/dist/get-video-threads-flag.d.ts +0 -0
  222. package/dist/get-video-threads-flag.js +3 -3
  223. package/dist/guess-extension-for-media.d.ts +3 -1
  224. package/dist/guess-extension-for-media.js +4 -7
  225. package/dist/image-format.d.ts +12 -6
  226. package/dist/image-format.js +19 -13
  227. package/dist/index.d.ts +368 -49
  228. package/dist/index.js +68 -46
  229. package/dist/is-audio-codec.d.ts +0 -0
  230. package/dist/is-audio-codec.js +0 -0
  231. package/dist/is-serve-url.d.ts +0 -0
  232. package/dist/is-serve-url.js +0 -0
  233. package/dist/jpeg-quality.d.ts +2 -0
  234. package/dist/jpeg-quality.js +22 -0
  235. package/dist/locks.d.ts +7 -0
  236. package/dist/locks.js +44 -0
  237. package/dist/log-level.d.ts +1 -1
  238. package/dist/log-level.js +0 -0
  239. package/dist/logger.d.ts +24 -0
  240. package/dist/logger.js +68 -0
  241. package/dist/make-cancel-signal.d.ts +13 -2
  242. package/dist/make-cancel-signal.js +24 -1
  243. package/dist/merge-audio-track.d.ts +4 -4
  244. package/dist/merge-audio-track.js +38 -33
  245. package/dist/mime-db.d.ts +0 -0
  246. package/dist/mime-db.js +0 -0
  247. package/dist/mime-types.d.ts +0 -0
  248. package/dist/mime-types.js +3 -3
  249. package/dist/normalize-serve-url.d.ts +0 -0
  250. package/dist/normalize-serve-url.js +0 -0
  251. package/dist/offthread-video-server.d.ts +47 -11
  252. package/dist/offthread-video-server.js +111 -58
  253. package/dist/open-browser.d.ts +21 -6
  254. package/dist/open-browser.js +37 -16
  255. package/dist/options/audio-bitrate.d.ts +2 -0
  256. package/dist/options/audio-bitrate.js +11 -0
  257. package/dist/options/crf.d.ts +2 -0
  258. package/dist/options/crf.js +11 -0
  259. package/dist/options/enforce-audio.d.ts +2 -0
  260. package/dist/options/enforce-audio.js +11 -0
  261. package/dist/options/jpeg-quality.d.ts +2 -0
  262. package/dist/options/jpeg-quality.js +11 -0
  263. package/dist/options/mute.d.ts +2 -0
  264. package/dist/options/mute.js +11 -0
  265. package/dist/options/option.d.ts +8 -0
  266. package/dist/options/option.js +2 -0
  267. package/dist/options/scale.d.ts +2 -0
  268. package/dist/options/scale.js +11 -0
  269. package/dist/options/video-bitrate.d.ts +2 -0
  270. package/dist/options/video-bitrate.js +11 -0
  271. package/dist/options/video-codec.d.ts +2 -0
  272. package/dist/options/video-codec.js +11 -0
  273. package/dist/overwrite.d.ts +0 -0
  274. package/dist/overwrite.js +0 -0
  275. package/dist/p-limit.d.ts +0 -0
  276. package/dist/p-limit.js +0 -0
  277. package/dist/parse-browser-error-stack.d.ts +1 -1
  278. package/dist/parse-browser-error-stack.js +0 -0
  279. package/dist/parse-ffmpeg-progress.d.ts +0 -0
  280. package/dist/parse-ffmpeg-progress.js +0 -0
  281. package/dist/perf.d.ts +2 -2
  282. package/dist/perf.js +9 -7
  283. package/dist/pixel-format.d.ts +2 -2
  284. package/dist/pixel-format.js +3 -0
  285. package/dist/pool.d.ts +0 -0
  286. package/dist/pool.js +0 -0
  287. package/dist/prepare-server.d.ts +25 -10
  288. package/dist/prepare-server.js +71 -18
  289. package/dist/preprocess-audio-track.d.ts +7 -5
  290. package/dist/preprocess-audio-track.js +7 -8
  291. package/dist/prespawn-ffmpeg.d.ts +20 -10
  292. package/dist/prespawn-ffmpeg.js +67 -29
  293. package/dist/prestitcher-memory-usage.d.ts +0 -4
  294. package/dist/prestitcher-memory-usage.js +4 -5
  295. package/dist/prores-profile.d.ts +6 -4
  296. package/dist/prores-profile.js +8 -8
  297. package/dist/provide-screenshot.d.ts +8 -4
  298. package/dist/provide-screenshot.js +5 -2
  299. package/dist/puppeteer-evaluate.d.ts +0 -0
  300. package/dist/puppeteer-evaluate.js +20 -12
  301. package/dist/puppeteer-screenshot.d.ts +12 -2
  302. package/dist/puppeteer-screenshot.js +18 -45
  303. package/dist/redirect-status-codes.d.ts +1 -0
  304. package/dist/redirect-status-codes.js +6 -0
  305. package/dist/render-frames.d.ts +52 -35
  306. package/dist/render-frames.js +248 -143
  307. package/dist/render-media.d.ts +76 -29
  308. package/dist/render-media.js +324 -195
  309. package/dist/render-still.d.ts +46 -19
  310. package/dist/render-still.js +128 -69
  311. package/dist/replace-browser.d.ts +6 -0
  312. package/dist/replace-browser.js +47 -0
  313. package/dist/resolve-asset-src.d.ts +0 -0
  314. package/dist/resolve-asset-src.js +2 -2
  315. package/dist/sample-rate.d.ts +0 -0
  316. package/dist/sample-rate.js +0 -0
  317. package/dist/screenshot-dom-element.d.ts +8 -4
  318. package/dist/screenshot-dom-element.js +15 -4
  319. package/dist/screenshot-task.d.ts +11 -2
  320. package/dist/screenshot-task.js +43 -13
  321. package/dist/seek-to-frame.d.ts +1 -0
  322. package/dist/seek-to-frame.js +49 -3
  323. package/dist/select-composition.d.ts +41 -0
  324. package/dist/select-composition.js +156 -0
  325. package/dist/serve-handler/index.d.ts +1 -1
  326. package/dist/serve-handler/index.js +21 -19
  327. package/dist/serve-handler/is-path-inside.d.ts +0 -0
  328. package/dist/serve-handler/is-path-inside.js +3 -3
  329. package/dist/serve-handler/range-parser.d.ts +0 -0
  330. package/dist/serve-handler/range-parser.js +0 -0
  331. package/dist/serve-static.d.ts +8 -6
  332. package/dist/serve-static.js +85 -59
  333. package/dist/set-props-and-env.d.ts +5 -3
  334. package/dist/set-props-and-env.js +18 -10
  335. package/dist/stitch-frames-to-video.d.ts +39 -16
  336. package/dist/stitch-frames-to-video.js +210 -121
  337. package/dist/stringify-ffmpeg-filter.d.ts +10 -2
  338. package/dist/stringify-ffmpeg-filter.js +37 -34
  339. package/dist/symbolicate-stacktrace.d.ts +16 -3
  340. package/dist/symbolicate-stacktrace.js +49 -24
  341. package/dist/take-frame-and-compose.d.ts +22 -0
  342. package/dist/take-frame-and-compose.js +103 -0
  343. package/dist/tmp-dir.d.ts +0 -0
  344. package/dist/tmp-dir.js +7 -8
  345. package/dist/truthy.d.ts +1 -1
  346. package/dist/truthy.js +0 -0
  347. package/dist/types.d.ts +2 -2
  348. package/dist/types.js +0 -0
  349. package/dist/validate-concurrency.d.ts +2 -0
  350. package/dist/validate-concurrency.js +21 -10
  351. package/dist/validate-even-dimensions-with-codec.d.ts +0 -0
  352. package/dist/validate-even-dimensions-with-codec.js +0 -0
  353. package/dist/validate-every-nth-frame.d.ts +2 -1
  354. package/dist/validate-every-nth-frame.js +8 -1
  355. package/dist/validate-ffmpeg-override.d.ts +0 -0
  356. package/dist/validate-ffmpeg-override.js +0 -0
  357. package/dist/validate-number-of-gif-loops.d.ts +2 -0
  358. package/dist/validate-number-of-gif-loops.js +24 -0
  359. package/dist/validate-opengl-renderer.d.ts +2 -3
  360. package/dist/validate-opengl-renderer.js +9 -4
  361. package/dist/validate-output-filename.d.ts +7 -2
  362. package/dist/validate-output-filename.js +20 -51
  363. package/dist/validate-puppeteer-timeout.d.ts +0 -0
  364. package/dist/validate-puppeteer-timeout.js +1 -0
  365. package/dist/validate-scale.d.ts +0 -0
  366. package/dist/validate-scale.js +0 -0
  367. package/dist/validate-videobitrate.d.ts +1 -0
  368. package/dist/validate-videobitrate.js +20 -0
  369. package/dist/wait-for-symbolication-error-to-be-done.d.ts +0 -0
  370. package/dist/wait-for-symbolication-error-to-be-done.js +5 -31
  371. package/dist/ws/ws-types.d.ts +0 -0
  372. package/dist/ws/ws-types.js +2 -1
  373. package/install-toolchain.mjs +36 -0
  374. package/package.json +70 -60
  375. package/types/ws/index.d.ts +5 -5
  376. package/.prettierrc.js +0 -14
  377. package/dist/assets/dl-browser.d.ts +0 -1
  378. package/dist/assets/dl-browser.js +0 -38
  379. package/dist/assets/get-video-stream-duration.d.ts +0 -4
  380. package/dist/assets/get-video-stream-duration.js +0 -59
  381. package/dist/calculate-sar-dar-pixels.d.ts +0 -9
  382. package/dist/calculate-sar-dar-pixels.js +0 -19
  383. package/dist/convert-to-pcm.d.ts +0 -6
  384. package/dist/convert-to-pcm.js +0 -20
  385. package/dist/ensure-presentation-timestamp.d.ts +0 -2
  386. package/dist/ensure-presentation-timestamp.js +0 -69
  387. package/dist/extract-frame-from-video.d.ts +0 -16
  388. package/dist/extract-frame-from-video.js +0 -277
  389. package/dist/ffmpeg-executable.d.ts +0 -1
  390. package/dist/ffmpeg-flags.d.ts +0 -12
  391. package/dist/ffmpeg-flags.js +0 -45
  392. package/dist/frame-to-ffmpeg-timestamp.d.ts +0 -1
  393. package/dist/frame-to-ffmpeg-timestamp.js +0 -8
  394. package/dist/get-audio-codec-name.d.ts +0 -2
  395. package/dist/get-audio-codec-name.js +0 -28
  396. package/dist/get-video-info.d.ts +0 -3
  397. package/dist/get-video-info.js +0 -49
  398. package/dist/is-beyond-last-frame.d.ts +0 -3
  399. package/dist/is-beyond-last-frame.js +0 -12
  400. package/dist/last-frame-from-video-cache.d.ts +0 -17
  401. package/dist/last-frame-from-video-cache.js +0 -55
  402. package/dist/legacy-webpack-config.d.ts +0 -9
  403. package/dist/legacy-webpack-config.js +0 -13
  404. package/dist/quality.d.ts +0 -1
  405. package/dist/quality.js +0 -21
  406. package/dist/validate-ffmpeg.d.ts +0 -2
  407. package/dist/validate-ffmpeg.js +0 -72
  408. package/dist/validate-frame.d.ts +0 -1
  409. package/dist/validate-frame.js +0 -24
  410. package/tsconfig.json +0 -10
  411. package/vitest.config.ts +0 -8
@@ -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");
10
- const path_1 = __importDefault(require("path"));
29
+ exports.stitchFramesToVideo = exports.internalStitchFramesToVideo = void 0;
30
+ const node_fs_1 = __importStar(require("node:fs"));
31
+ const node_path_1 = __importDefault(require("node: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");
17
40
  const convert_number_of_gif_loops_to_ffmpeg_1 = require("./convert-number-of-gif-loops-to-ffmpeg");
18
41
  const crf_1 = require("./crf");
19
42
  const delete_directory_1 = require("./delete-directory");
20
- const get_audio_codec_name_1 = require("./get-audio-codec-name");
43
+ const does_have_m2_bug_1 = require("./does-have-m2-bug");
44
+ const find_closest_package_json_1 = require("./find-closest-package-json");
21
45
  const get_codec_name_1 = require("./get-codec-name");
22
46
  const get_extension_from_codec_1 = require("./get-extension-from-codec");
23
47
  const get_prores_profile_name_1 = require("./get-prores-profile-name");
48
+ const logger_1 = require("./logger");
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");
31
- const packageJsonPath = path_1.default.join(__dirname, '..', 'package.json');
32
- const packageJson = fs_1.default.existsSync(packageJsonPath)
33
- ? JSON.parse(fs_1.default.readFileSync(packageJsonPath, 'utf-8'))
57
+ const validate_videobitrate_1 = require("./validate-videobitrate");
58
+ const packageJsonPath = node_path_1.default.join(__dirname, '..', 'package.json');
59
+ const packageJson = node_fs_1.default.existsSync(packageJsonPath)
60
+ ? JSON.parse(node_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, indent, }) => {
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),
@@ -40,18 +67,14 @@ const getAssetsData = async ({ assets, onDownload, fps, expectedFrames, verbose,
40
67
  });
41
68
  (0, download_and_map_assets_to_file_1.markAllAssetsAsDownloaded)(downloadMap);
42
69
  const assetPositions = (0, calculate_asset_positions_1.calculateAssetPositions)(fileUrlAssets);
43
- if (verbose) {
44
- console.log('asset positions', assetPositions);
45
- }
70
+ logger_1.Log.verboseAdvanced({ indent, logLevel: verbose ? 'verbose' : 'info', tag: 'audio' }, 'asset positions', JSON.stringify(assetPositions));
46
71
  const preprocessProgress = new Array(assetPositions.length).fill(0);
47
72
  const updateProgress = () => {
48
73
  onProgress(preprocessProgress.reduce((a, b) => a + b, 0) / assetPositions.length);
49
74
  };
50
75
  const preprocessed = (await Promise.all(assetPositions.map(async (asset, index) => {
51
- const filterFile = path_1.default.join(downloadMap.audioMixing, `${index}.wav`);
76
+ const filterFile = node_path_1.default.join(downloadMap.audioMixing, `${index}.wav`);
52
77
  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
78
  outName: filterFile,
56
79
  asset,
57
80
  expectedFrames,
@@ -62,115 +85,141 @@ const getAssetsData = async ({ assets, onDownload, fps, expectedFrames, verbose,
62
85
  updateProgress();
63
86
  return result;
64
87
  }))).filter(truthy_1.truthy);
65
- const outName = path_1.default.join(downloadMap.audioPreprocessing, `audio.wav`);
88
+ const outName = node_path_1.default.join(downloadMap.audioPreprocessing, `audio.wav`);
66
89
  await (0, merge_audio_track_1.mergeAudioTrack)({
67
- ffmpegExecutable: ffmpegExecutable !== null && ffmpegExecutable !== void 0 ? ffmpegExecutable : null,
68
90
  files: preprocessed,
69
91
  outName,
70
92
  numberOfSeconds: Number((expectedFrames / fps).toFixed(3)),
71
93
  downloadMap,
94
+ remotionRoot,
72
95
  });
73
- (0, delete_directory_1.deleteDirectory)(downloadMap.audioMixing);
74
96
  onProgress(1);
97
+ (0, delete_directory_1.deleteDirectory)(downloadMap.audioMixing);
75
98
  preprocessed.forEach((p) => {
76
- (0, delete_directory_1.deleteDirectory)(p);
99
+ (0, delete_directory_1.deleteDirectory)(p.outName);
77
100
  });
78
101
  return outName;
79
102
  };
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;
82
- remotion_1.Internals.validateDimension(options.height, 'height', 'passed to `stitchFramesToVideo()`');
83
- remotion_1.Internals.validateDimension(options.width, 'width', 'passed to `stitchFramesToVideo()`');
84
- const codec = (_a = options.codec) !== null && _a !== void 0 ? _a : codec_1.DEFAULT_CODEC;
103
+ const innerStitchFramesToVideo = async ({ assetsInfo, audioBitrate, audioCodec, cancelSignal, codec, crf, dir, enforceAudioTrack, ffmpegOverride, force, fps, height, indent, muted, onDownload, outputLocation, pixelFormat, preEncodedFileLocation, preferLossless, proResProfile, verbose, videoBitrate, width, numberOfGifLoops, onProgress, }, remotionRoot) => {
104
+ var _a;
105
+ remotion_1.Internals.validateDimension(height, 'height', 'passed to `stitchFramesToVideo()`');
106
+ remotion_1.Internals.validateDimension(width, 'width', 'passed to `stitchFramesToVideo()`');
85
107
  (0, validate_even_dimensions_with_codec_1.validateEvenDimensionsWithCodec)({
86
- width: options.width,
87
- height: options.height,
108
+ width,
109
+ height,
88
110
  codec,
89
111
  scale: 1,
90
112
  });
91
- 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);
113
+ (0, prores_profile_1.validateSelectedCodecAndProResCombination)({
114
+ codec,
115
+ proResProfile,
116
+ });
117
+ (0, validate_videobitrate_1.validateBitrate)(audioBitrate, 'audioBitrate');
118
+ (0, validate_videobitrate_1.validateBitrate)(videoBitrate, 'videoBitrate');
119
+ remotion_1.Internals.validateFps(fps, 'in `stitchFramesToVideo()`', false);
95
120
  const encoderName = (0, get_codec_name_1.getCodecName)(codec);
96
- const audioCodecName = (0, get_audio_codec_name_1.getAudioCodecName)(codec);
97
- const proResProfileName = (0, get_prores_profile_name_1.getProResProfileName)(codec, options.proResProfile);
121
+ const proResProfileName = (0, get_prores_profile_name_1.getProResProfileName)(codec, proResProfile);
98
122
  const mediaSupport = (0, codec_supports_media_1.codecSupportsMedia)(codec);
99
- const supportsCrf = (0, codec_supports_media_1.codecSupportsCrf)(codec);
100
- const tempFile = options.outputLocation
101
- ? null
102
- : path_1.default.join(options.assetsInfo.downloadMap.stitchFrames, `out.${(0, get_extension_from_codec_1.getFileExtensionFromCodec)(codec, 'final')}`);
103
123
  const shouldRenderAudio = mediaSupport.audio &&
104
- (options.assetsInfo.assets.flat(1).length > 0 ||
105
- options.enforceAudioTrack) &&
106
- !options.muted;
124
+ (assetsInfo.assets.flat(1).length > 0 || enforceAudioTrack) &&
125
+ !muted;
107
126
  const shouldRenderVideo = mediaSupport.video;
108
127
  if (!shouldRenderAudio && !shouldRenderVideo) {
109
128
  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.');
110
129
  }
111
- if (options.verbose) {
112
- console.log('[verbose] ffmpeg', (_e = options.ffmpegExecutable) !== null && _e !== void 0 ? _e : 'ffmpeg in PATH');
113
- console.log('[verbose] encoder', encoderName);
114
- console.log('[verbose] audioCodec', audioCodecName);
115
- console.log('[verbose] pixelFormat', pixelFormat);
116
- if (supportsCrf) {
117
- console.log('[verbose] crf', crf);
118
- }
119
- if (options.ffmpegOverride) {
120
- console.log('[verbose] ffmpegOverride', options.ffmpegOverride);
121
- }
122
- console.log('[verbose] codec', codec);
123
- console.log('[verbose] shouldRenderAudio', shouldRenderAudio);
124
- console.log('[verbose] shouldRenderVideo', shouldRenderVideo);
125
- console.log('[verbose] proResProfileName', proResProfileName);
126
- }
127
- (0, crf_1.validateSelectedCrfAndCodecCombination)(crf, codec);
130
+ // Explanation: https://github.com/remotion-dev/remotion/issues/1647
131
+ const resolvedAudioCodec = preferLossless
132
+ ? (0, audio_codec_1.getDefaultAudioCodec)({ codec, preferLossless: true })
133
+ : audioCodec !== null && audioCodec !== void 0 ? audioCodec : (0, audio_codec_1.getDefaultAudioCodec)({ codec, preferLossless: false });
134
+ const tempFile = outputLocation
135
+ ? null
136
+ : node_path_1.default.join(assetsInfo.downloadMap.stitchFrames, `out.${(0, get_extension_from_codec_1.getFileExtensionFromCodec)(codec, resolvedAudioCodec)}`);
137
+ logger_1.Log.verboseAdvanced({
138
+ indent,
139
+ logLevel: verbose ? 'verbose' : 'info',
140
+ tag: 'stitchFramesToVideo()',
141
+ }, 'encoder', encoderName);
142
+ logger_1.Log.verboseAdvanced({
143
+ indent,
144
+ logLevel: verbose ? 'verbose' : 'info',
145
+ tag: 'stitchFramesToVideo()',
146
+ }, 'audioCodec', resolvedAudioCodec);
147
+ logger_1.Log.verboseAdvanced({
148
+ indent,
149
+ logLevel: verbose ? 'verbose' : 'info',
150
+ tag: 'stitchFramesToVideo()',
151
+ }, 'pixelFormat', pixelFormat);
152
+ logger_1.Log.verboseAdvanced({
153
+ indent,
154
+ logLevel: verbose ? 'verbose' : 'info',
155
+ tag: 'stitchFramesToVideo()',
156
+ }, 'codec', codec);
157
+ logger_1.Log.verboseAdvanced({
158
+ indent,
159
+ logLevel: verbose ? 'verbose' : 'info',
160
+ tag: 'stitchFramesToVideo()',
161
+ }, 'shouldRenderAudio', shouldRenderAudio);
162
+ logger_1.Log.verboseAdvanced({
163
+ indent,
164
+ logLevel: verbose ? 'verbose' : 'info',
165
+ tag: 'stitchFramesToVideo()',
166
+ }, 'shouldRenderVideo', shouldRenderVideo);
167
+ logger_1.Log.verboseAdvanced({
168
+ indent,
169
+ logLevel: verbose ? 'verbose' : 'info',
170
+ tag: 'stitchFramesToVideo()',
171
+ }, 'proResProfileName', proResProfileName);
172
+ (0, crf_1.validateQualitySettings)({
173
+ crf,
174
+ codec,
175
+ videoBitrate,
176
+ });
128
177
  (0, pixel_format_1.validateSelectedPixelFormatAndCodecCombination)(pixelFormat, codec);
129
- const expectedFrames = options.assetsInfo.assets.length;
178
+ const expectedFrames = assetsInfo.assets.length;
130
179
  const updateProgress = (preStitchProgress, muxProgress) => {
131
- var _a;
132
180
  const totalFrameProgress = 0.5 * preStitchProgress * expectedFrames + muxProgress * 0.5;
133
- (_a = options.onProgress) === null || _a === void 0 ? void 0 : _a.call(options, Math.round(totalFrameProgress));
181
+ onProgress === null || onProgress === void 0 ? void 0 : onProgress(Math.round(totalFrameProgress));
134
182
  };
135
183
  const audio = shouldRenderAudio
136
184
  ? await getAssetsData({
137
- assets: options.assetsInfo.assets,
138
- onDownload: options.onDownload,
139
- fps: options.fps,
185
+ assets: assetsInfo.assets,
186
+ onDownload,
187
+ fps,
140
188
  expectedFrames,
141
- verbose: (_f = options.verbose) !== null && _f !== void 0 ? _f : false,
142
- ffmpegExecutable: (_g = options.ffmpegExecutable) !== null && _g !== void 0 ? _g : null,
143
- ffprobeExecutable: (_h = options.ffprobeExecutable) !== null && _h !== void 0 ? _h : null,
189
+ verbose,
144
190
  onProgress: (prog) => updateProgress(prog, 0),
145
- downloadMap: options.assetsInfo.downloadMap,
191
+ downloadMap: assetsInfo.downloadMap,
192
+ remotionRoot,
193
+ indent,
146
194
  })
147
195
  : null;
148
196
  if (mediaSupport.audio && !mediaSupport.video) {
149
- if (!audioCodecName) {
197
+ if (!resolvedAudioCodec) {
150
198
  throw new TypeError('exporting audio but has no audio codec name. Report this in the Remotion repo.');
151
199
  }
152
- const ffmpegTask = (0, execa_1.default)('ffmpeg', [
200
+ const ffmpegTask = (0, call_ffmpeg_1.callFf)('ffmpeg', [
153
201
  '-i',
154
202
  audio,
155
203
  '-c:a',
156
- audioCodecName,
204
+ (0, audio_codec_1.mapAudioCodecToFfmpegAudioCodecName)(resolvedAudioCodec),
157
205
  // Set bitrate up to 320k, for aac it might effectively be lower
158
206
  '-b:a',
159
- '320k',
160
- options.force ? '-y' : null,
161
- (_j = options.outputLocation) !== null && _j !== void 0 ? _j : tempFile,
207
+ audioBitrate !== null && audioBitrate !== void 0 ? audioBitrate : '320k',
208
+ force ? '-y' : null,
209
+ outputLocation !== null && outputLocation !== void 0 ? outputLocation : tempFile,
162
210
  ].filter(remotion_1.Internals.truthy));
163
- (_k = options.cancelSignal) === null || _k === void 0 ? void 0 : _k.call(options, () => {
211
+ cancelSignal === null || cancelSignal === void 0 ? void 0 : cancelSignal(() => {
164
212
  ffmpegTask.kill();
165
213
  });
166
214
  await ffmpegTask;
167
- (_l = options.onProgress) === null || _l === void 0 ? void 0 : _l.call(options, expectedFrames);
215
+ onProgress === null || onProgress === void 0 ? void 0 : onProgress(expectedFrames);
168
216
  if (audio) {
169
- await (0, delete_directory_1.deleteDirectory)(path_1.default.dirname(audio));
217
+ (0, delete_directory_1.deleteDirectory)(node_path_1.default.dirname(audio));
170
218
  }
171
219
  const file = await new Promise((resolve, reject) => {
172
220
  if (tempFile) {
173
- (0, promises_1.readFile)(tempFile)
221
+ node_fs_1.promises
222
+ .readFile(tempFile)
174
223
  .then((f) => {
175
224
  return resolve(f);
176
225
  })
@@ -180,47 +229,49 @@ const spawnFfmpeg = async (options) => {
180
229
  resolve(null);
181
230
  }
182
231
  });
183
- await (0, delete_directory_1.deleteDirectory)(options.assetsInfo.downloadMap.stitchFrames);
232
+ (0, delete_directory_1.deleteDirectory)(assetsInfo.downloadMap.stitchFrames);
184
233
  return {
185
234
  getLogs: () => '',
186
235
  task: Promise.resolve(file),
187
236
  };
188
237
  }
189
238
  const ffmpegArgs = [
190
- ['-r', String(options.fps)],
191
- ...(((_m = options.internalOptions) === null || _m === void 0 ? void 0 : _m.preEncodedFileLocation)
192
- ? [['-i', (_o = options.internalOptions) === null || _o === void 0 ? void 0 : _o.preEncodedFileLocation]]
239
+ ...(preEncodedFileLocation
240
+ ? [['-i', preEncodedFileLocation]]
193
241
  : [
242
+ ['-r', String(fps)],
194
243
  ['-f', 'image2'],
195
- ['-s', `${options.width}x${options.height}`],
196
- ['-start_number', String(options.assetsInfo.firstFrameIndex)],
197
- ['-i', options.assetsInfo.imageSequenceName],
244
+ ['-s', `${width}x${height}`],
245
+ ['-start_number', String(assetsInfo.firstFrameIndex)],
246
+ ['-i', assetsInfo.imageSequenceName],
198
247
  ]),
199
248
  audio ? ['-i', audio] : null,
200
- ((_p = options.numberOfGifLoops) !== null && _p !== void 0 ? _p : null) === null
249
+ numberOfGifLoops === null
201
250
  ? null
202
- : [
203
- '-loop',
204
- (0, convert_number_of_gif_loops_to_ffmpeg_1.convertNumberOfGifLoopsToFfmpegSyntax)((_q = options.numberOfGifLoops) !== null && _q !== void 0 ? _q : null),
205
- ],
251
+ : ['-loop', (0, convert_number_of_gif_loops_to_ffmpeg_1.convertNumberOfGifLoopsToFfmpegSyntax)(numberOfGifLoops)],
206
252
  // -c:v is the same as -vcodec as -codec:video
207
253
  // and specified the video codec.
208
254
  ['-c:v', encoderName],
209
- ...(((_r = options.internalOptions) === null || _r === void 0 ? void 0 : _r.preEncodedFileLocation)
255
+ ...(preEncodedFileLocation
210
256
  ? []
211
257
  : [
212
258
  proResProfileName ? ['-profile:v', proResProfileName] : null,
213
- supportsCrf ? ['-crf', String(crf)] : null,
214
259
  ['-pix_fmt', pixelFormat],
215
260
  // Without explicitly disabling auto-alt-ref,
216
261
  // transparent WebM generation doesn't work
217
262
  pixelFormat === 'yuva420p' ? ['-auto-alt-ref', '0'] : null,
218
- ['-b:v', '1M'],
263
+ ...(0, crf_1.validateQualitySettings)({
264
+ crf,
265
+ videoBitrate,
266
+ codec,
267
+ }),
219
268
  ]),
220
269
  codec === 'h264' ? ['-movflags', 'faststart'] : null,
221
- audioCodecName ? ['-c:a', audioCodecName] : null,
270
+ resolvedAudioCodec
271
+ ? ['-c:a', (0, audio_codec_1.mapAudioCodecToFfmpegAudioCodecName)(resolvedAudioCodec)]
272
+ : null,
222
273
  // Set max bitrate up to 1024kbps, will choose lower if that's too much
223
- audioCodecName ? ['-b:a', '512K'] : null,
274
+ resolvedAudioCodec ? ['-b:a', audioBitrate || '512K'] : null,
224
275
  // Ignore metadata that may come from remote media
225
276
  ['-map_metadata', '-1'],
226
277
  [
@@ -228,34 +279,36 @@ const spawnFfmpeg = async (options) => {
228
279
  `comment=` +
229
280
  [`Made with Remotion`, packageJson ? packageJson.version : null].join(' '),
230
281
  ],
231
- options.force ? '-y' : null,
232
- (_s = options.outputLocation) !== null && _s !== void 0 ? _s : tempFile,
282
+ force ? '-y' : null,
283
+ outputLocation !== null && outputLocation !== void 0 ? outputLocation : tempFile,
233
284
  ];
234
- if (options.verbose) {
235
- console.log('Generated FFMPEG command:');
236
- console.log(ffmpegArgs);
237
- }
238
285
  const ffmpegString = ffmpegArgs.flat(2).filter(Boolean);
239
- const finalFfmpegString = options.ffmpegOverride
240
- ? options.ffmpegOverride({ type: 'stitcher', args: ffmpegString })
286
+ const finalFfmpegString = ffmpegOverride
287
+ ? ffmpegOverride({ type: 'stitcher', args: ffmpegString })
241
288
  : ffmpegString;
242
- if (options.verbose && options.ffmpegOverride) {
243
- console.log('Generated final FFMPEG command:');
244
- console.log(finalFfmpegString);
245
- }
246
- const task = (0, execa_1.default)((_t = options.ffmpegExecutable) !== null && _t !== void 0 ? _t : 'ffmpeg', finalFfmpegString, {
247
- cwd: options.dir,
289
+ logger_1.Log.verboseAdvanced({
290
+ indent: indent !== null && indent !== void 0 ? indent : false,
291
+ logLevel: verbose ? 'verbose' : 'info',
292
+ tag: 'stitchFramesToVideo()',
293
+ }, 'Generated final FFMPEG command:');
294
+ logger_1.Log.verboseAdvanced({
295
+ indent,
296
+ logLevel: verbose ? 'verbose' : 'info',
297
+ tag: 'stitchFramesToVideo()',
298
+ }, finalFfmpegString.join(' '));
299
+ const task = (0, call_ffmpeg_1.callFf)('ffmpeg', finalFfmpegString, {
300
+ cwd: dir,
248
301
  });
249
- (_u = options.cancelSignal) === null || _u === void 0 ? void 0 : _u.call(options, () => {
302
+ cancelSignal === null || cancelSignal === void 0 ? void 0 : cancelSignal(() => {
250
303
  task.kill();
251
304
  });
252
305
  let ffmpegOutput = '';
253
306
  let isFinished = false;
254
- (_v = task.stderr) === null || _v === void 0 ? void 0 : _v.on('data', (data) => {
307
+ (_a = task.stderr) === null || _a === void 0 ? void 0 : _a.on('data', (data) => {
255
308
  var _a;
256
309
  const str = data.toString();
257
310
  ffmpegOutput += str;
258
- if (options.onProgress) {
311
+ if (onProgress) {
259
312
  const parsed = (0, parse_ffmpeg_progress_1.parseFfmpegProgress)(str);
260
313
  // FFMPEG bug: In some cases, FFMPEG does hang after it is finished with it's job
261
314
  // Example repo: https://github.com/JonnyBurger/ffmpeg-repro (access can be given upon request)
@@ -275,17 +328,18 @@ const spawnFfmpeg = async (options) => {
275
328
  });
276
329
  return {
277
330
  task: task.then(() => {
278
- (0, delete_directory_1.deleteDirectory)(options.assetsInfo.downloadMap.audioPreprocessing);
331
+ (0, delete_directory_1.deleteDirectory)(assetsInfo.downloadMap.audioPreprocessing);
279
332
  if (tempFile === null) {
280
- (0, delete_directory_1.deleteDirectory)(options.assetsInfo.downloadMap.stitchFrames);
333
+ (0, delete_directory_1.deleteDirectory)(assetsInfo.downloadMap.stitchFrames);
281
334
  return null;
282
335
  }
283
- return (0, promises_1.readFile)(tempFile)
336
+ return node_fs_1.promises
337
+ .readFile(tempFile)
284
338
  .then((file) => {
285
339
  return Promise.all([
286
340
  file,
287
- (0, delete_directory_1.deleteDirectory)(path_1.default.dirname(tempFile)),
288
- (0, delete_directory_1.deleteDirectory)(options.assetsInfo.downloadMap.stitchFrames),
341
+ (0, delete_directory_1.deleteDirectory)(node_path_1.default.dirname(tempFile)),
342
+ (0, delete_directory_1.deleteDirectory)(assetsInfo.downloadMap.stitchFrames),
289
343
  ]);
290
344
  })
291
345
  .then(([file]) => file);
@@ -293,9 +347,10 @@ const spawnFfmpeg = async (options) => {
293
347
  getLogs: () => ffmpegOutput,
294
348
  };
295
349
  };
296
- exports.spawnFfmpeg = spawnFfmpeg;
297
- const stitchFramesToVideo = async (options) => {
298
- const { task, getLogs } = await (0, exports.spawnFfmpeg)(options);
350
+ const internalStitchFramesToVideo = async (options) => {
351
+ const remotionRoot = (0, find_closest_package_json_1.findRemotionRoot)();
352
+ (0, does_have_m2_bug_1.warnAboutM2Bug)(options.codec, options.pixelFormat);
353
+ const { task, getLogs } = await innerStitchFramesToVideo(options, remotionRoot);
299
354
  const happyPath = task.catch(() => {
300
355
  throw new Error(getLogs());
301
356
  });
@@ -304,9 +359,43 @@ const stitchFramesToVideo = async (options) => {
304
359
  new Promise((_resolve, reject) => {
305
360
  var _a;
306
361
  (_a = options.cancelSignal) === null || _a === void 0 ? void 0 : _a.call(options, () => {
307
- reject(new Error('stitchFramesToVideo() got cancelled'));
362
+ reject(new Error(make_cancel_signal_1.cancelErrorMessages.stitchFramesToVideo));
308
363
  });
309
364
  }),
310
365
  ]);
311
366
  };
367
+ exports.internalStitchFramesToVideo = internalStitchFramesToVideo;
368
+ /**
369
+ * @description Takes a series of images and audio information generated by renderFrames() and encodes it to a video.
370
+ * @see [Documentation](https://www.remotion.dev/docs/renderer/stitch-frames-to-video)
371
+ */
372
+ const stitchFramesToVideo = ({ assetsInfo, force, fps, height, width, audioBitrate, audioCodec, cancelSignal, codec, crf, dir, enforceAudioTrack, ffmpegOverride, muted, numberOfGifLoops, onDownload, onProgress, outputLocation, pixelFormat, proResProfile, verbose, videoBitrate, }) => {
373
+ return (0, exports.internalStitchFramesToVideo)({
374
+ assetsInfo,
375
+ audioBitrate: audioBitrate !== null && audioBitrate !== void 0 ? audioBitrate : null,
376
+ audioCodec: audioCodec !== null && audioCodec !== void 0 ? audioCodec : null,
377
+ cancelSignal: cancelSignal !== null && cancelSignal !== void 0 ? cancelSignal : null,
378
+ codec: codec !== null && codec !== void 0 ? codec : codec_1.DEFAULT_CODEC,
379
+ crf: crf !== null && crf !== void 0 ? crf : null,
380
+ dir,
381
+ enforceAudioTrack: enforceAudioTrack !== null && enforceAudioTrack !== void 0 ? enforceAudioTrack : false,
382
+ ffmpegOverride: ffmpegOverride !== null && ffmpegOverride !== void 0 ? ffmpegOverride : null,
383
+ force,
384
+ fps,
385
+ height,
386
+ indent: false,
387
+ muted: muted !== null && muted !== void 0 ? muted : false,
388
+ numberOfGifLoops: numberOfGifLoops !== null && numberOfGifLoops !== void 0 ? numberOfGifLoops : null,
389
+ onDownload: onDownload !== null && onDownload !== void 0 ? onDownload : undefined,
390
+ onProgress,
391
+ outputLocation: outputLocation !== null && outputLocation !== void 0 ? outputLocation : null,
392
+ pixelFormat: pixelFormat !== null && pixelFormat !== void 0 ? pixelFormat : pixel_format_1.DEFAULT_PIXEL_FORMAT,
393
+ proResProfile,
394
+ verbose: verbose !== null && verbose !== void 0 ? verbose : false,
395
+ videoBitrate: videoBitrate !== null && videoBitrate !== void 0 ? videoBitrate : null,
396
+ width,
397
+ preEncodedFileLocation: null,
398
+ preferLossless: false,
399
+ });
400
+ };
312
401
  exports.stitchFramesToVideo = stitchFramesToVideo;
@@ -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 type FilterWithoutPaddingApplied = ProcessedTrack & {
3
+ filter: string;
4
+ };
5
+ export 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;