@remotion/renderer 4.0.0-webhook.27 → 4.0.1

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 (413) 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 +19 -16
  38. package/dist/browser/Browser.js +72 -75
  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 +32 -6
  44. package/dist/browser/BrowserPage.js +90 -26
  45. package/dist/browser/BrowserRunner.d.ts +1 -1
  46. package/dist/browser/BrowserRunner.js +32 -22
  47. package/dist/browser/Connection.d.ts +9 -3
  48. package/dist/browser/Connection.js +12 -4
  49. package/dist/browser/ConsoleMessage.d.ts +9 -2
  50. package/dist/browser/ConsoleMessage.js +2 -1
  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 +4 -4
  61. package/dist/browser/FrameManager.d.ts +0 -2
  62. package/dist/browser/FrameManager.js +15 -19
  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 +4 -2
  70. package/dist/browser/LaunchOptions.js +0 -0
  71. package/dist/browser/Launcher.d.ts +9 -3
  72. package/dist/browser/Launcher.js +17 -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 +4 -1
  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 +5 -3
  90. package/dist/browser/Target.js +10 -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 +151 -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 +80 -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 +55 -0
  130. package/dist/chalk/index.js +130 -0
  131. package/dist/chalk/is-color-supported.d.ts +1 -0
  132. package/dist/chalk/is-color-supported.js +45 -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 +87 -0
  147. package/dist/compositor/compositor.d.ts +12 -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 +20 -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 +3 -5
  170. package/dist/cycle-browser-tabs.js +7 -7
  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/format-logs.d.ts +3 -0
  196. package/dist/format-logs.js +201 -0
  197. package/dist/frame-range.d.ts +1 -1
  198. package/dist/frame-range.js +0 -0
  199. package/dist/get-browser-instance.d.ts +9 -3
  200. package/dist/get-browser-instance.js +10 -5
  201. package/dist/get-codec-name.d.ts +0 -0
  202. package/dist/get-codec-name.js +0 -0
  203. package/dist/get-compositions.d.ts +28 -14
  204. package/dist/get-compositions.js +74 -40
  205. package/dist/get-concurrency.d.ts +1 -1
  206. package/dist/get-concurrency.js +11 -4
  207. package/dist/get-duration-from-frame-range.d.ts +0 -0
  208. package/dist/get-duration-from-frame-range.js +0 -0
  209. package/dist/get-extension-from-codec.d.ts +5 -1
  210. package/dist/get-extension-from-codec.js +56 -32
  211. package/dist/get-extension-of-filename.d.ts +0 -0
  212. package/dist/get-extension-of-filename.js +5 -1
  213. package/dist/get-frame-padded-index.d.ts +3 -2
  214. package/dist/get-frame-padded-index.js +3 -2
  215. package/dist/get-frame-to-render.d.ts +0 -0
  216. package/dist/get-frame-to-render.js +1 -1
  217. package/dist/get-local-browser-executable.d.ts +0 -0
  218. package/dist/get-local-browser-executable.js +7 -15
  219. package/dist/get-port.d.ts +4 -1
  220. package/dist/get-port.js +8 -8
  221. package/dist/get-prores-profile-name.d.ts +0 -0
  222. package/dist/get-prores-profile-name.js +0 -0
  223. package/dist/get-video-threads-flag.d.ts +0 -0
  224. package/dist/get-video-threads-flag.js +3 -3
  225. package/dist/guess-extension-for-media.d.ts +3 -1
  226. package/dist/guess-extension-for-media.js +4 -7
  227. package/dist/image-format.d.ts +12 -6
  228. package/dist/image-format.js +19 -13
  229. package/dist/index.d.ts +369 -49
  230. package/dist/index.js +67 -46
  231. package/dist/is-audio-codec.d.ts +0 -0
  232. package/dist/is-audio-codec.js +0 -0
  233. package/dist/is-serve-url.d.ts +0 -0
  234. package/dist/is-serve-url.js +0 -0
  235. package/dist/jpeg-quality.d.ts +2 -0
  236. package/dist/jpeg-quality.js +22 -0
  237. package/dist/locks.d.ts +7 -0
  238. package/dist/locks.js +44 -0
  239. package/dist/log-level.d.ts +1 -1
  240. package/dist/log-level.js +0 -0
  241. package/dist/logger.d.ts +23 -0
  242. package/dist/logger.js +63 -0
  243. package/dist/make-cancel-signal.d.ts +13 -2
  244. package/dist/make-cancel-signal.js +24 -1
  245. package/dist/merge-audio-track.d.ts +4 -4
  246. package/dist/merge-audio-track.js +38 -33
  247. package/dist/mime-db.d.ts +0 -0
  248. package/dist/mime-db.js +0 -0
  249. package/dist/mime-types.d.ts +0 -0
  250. package/dist/mime-types.js +3 -3
  251. package/dist/normalize-serve-url.d.ts +0 -0
  252. package/dist/normalize-serve-url.js +0 -0
  253. package/dist/offthread-video-server.d.ts +48 -11
  254. package/dist/offthread-video-server.js +112 -58
  255. package/dist/open-browser.d.ts +22 -6
  256. package/dist/open-browser.js +40 -17
  257. package/dist/options/audio-bitrate.d.ts +2 -0
  258. package/dist/options/audio-bitrate.js +11 -0
  259. package/dist/options/crf.d.ts +2 -0
  260. package/dist/options/crf.js +11 -0
  261. package/dist/options/enforce-audio.d.ts +2 -0
  262. package/dist/options/enforce-audio.js +11 -0
  263. package/dist/options/jpeg-quality.d.ts +2 -0
  264. package/dist/options/jpeg-quality.js +11 -0
  265. package/dist/options/mute.d.ts +2 -0
  266. package/dist/options/mute.js +11 -0
  267. package/dist/options/option.d.ts +8 -0
  268. package/dist/options/option.js +2 -0
  269. package/dist/options/scale.d.ts +2 -0
  270. package/dist/options/scale.js +11 -0
  271. package/dist/options/video-bitrate.d.ts +2 -0
  272. package/dist/options/video-bitrate.js +11 -0
  273. package/dist/options/video-codec.d.ts +2 -0
  274. package/dist/options/video-codec.js +11 -0
  275. package/dist/overwrite.d.ts +0 -0
  276. package/dist/overwrite.js +0 -0
  277. package/dist/p-limit.d.ts +0 -0
  278. package/dist/p-limit.js +0 -0
  279. package/dist/parse-browser-error-stack.d.ts +1 -1
  280. package/dist/parse-browser-error-stack.js +0 -0
  281. package/dist/parse-ffmpeg-progress.d.ts +0 -0
  282. package/dist/parse-ffmpeg-progress.js +0 -0
  283. package/dist/perf.d.ts +2 -2
  284. package/dist/perf.js +11 -7
  285. package/dist/pixel-format.d.ts +2 -2
  286. package/dist/pixel-format.js +3 -0
  287. package/dist/pool.d.ts +0 -0
  288. package/dist/pool.js +0 -0
  289. package/dist/prepare-server.d.ts +26 -10
  290. package/dist/prepare-server.js +71 -18
  291. package/dist/preprocess-audio-track.d.ts +7 -5
  292. package/dist/preprocess-audio-track.js +7 -8
  293. package/dist/prespawn-ffmpeg.d.ts +22 -11
  294. package/dist/prespawn-ffmpeg.js +41 -31
  295. package/dist/prestitcher-memory-usage.d.ts +0 -4
  296. package/dist/prestitcher-memory-usage.js +4 -5
  297. package/dist/prores-profile.d.ts +6 -4
  298. package/dist/prores-profile.js +8 -8
  299. package/dist/provide-screenshot.d.ts +8 -4
  300. package/dist/provide-screenshot.js +5 -2
  301. package/dist/puppeteer-evaluate.d.ts +4 -1
  302. package/dist/puppeteer-evaluate.js +23 -15
  303. package/dist/puppeteer-screenshot.d.ts +12 -2
  304. package/dist/puppeteer-screenshot.js +18 -45
  305. package/dist/redirect-status-codes.d.ts +1 -0
  306. package/dist/redirect-status-codes.js +6 -0
  307. package/dist/render-frames.d.ts +59 -35
  308. package/dist/render-frames.js +256 -147
  309. package/dist/render-media.d.ts +82 -28
  310. package/dist/render-media.js +322 -195
  311. package/dist/render-still.d.ts +52 -19
  312. package/dist/render-still.js +132 -74
  313. package/dist/replace-browser.d.ts +7 -0
  314. package/dist/replace-browser.js +47 -0
  315. package/dist/resolve-asset-src.d.ts +0 -0
  316. package/dist/resolve-asset-src.js +2 -2
  317. package/dist/sample-rate.d.ts +0 -0
  318. package/dist/sample-rate.js +0 -0
  319. package/dist/screenshot-dom-element.d.ts +8 -4
  320. package/dist/screenshot-dom-element.js +15 -4
  321. package/dist/screenshot-task.d.ts +11 -2
  322. package/dist/screenshot-task.js +45 -13
  323. package/dist/seek-to-frame.d.ts +3 -1
  324. package/dist/seek-to-frame.js +53 -7
  325. package/dist/select-composition.d.ts +46 -0
  326. package/dist/select-composition.js +157 -0
  327. package/dist/serve-handler/index.d.ts +1 -1
  328. package/dist/serve-handler/index.js +21 -19
  329. package/dist/serve-handler/is-path-inside.d.ts +0 -0
  330. package/dist/serve-handler/is-path-inside.js +3 -3
  331. package/dist/serve-handler/range-parser.d.ts +0 -0
  332. package/dist/serve-handler/range-parser.js +0 -0
  333. package/dist/serve-static.d.ts +9 -6
  334. package/dist/serve-static.js +85 -59
  335. package/dist/set-props-and-env.d.ts +5 -3
  336. package/dist/set-props-and-env.js +20 -12
  337. package/dist/stitch-frames-to-video.d.ts +40 -16
  338. package/dist/stitch-frames-to-video.js +200 -121
  339. package/dist/stringify-ffmpeg-filter.d.ts +10 -2
  340. package/dist/stringify-ffmpeg-filter.js +37 -34
  341. package/dist/symbolicate-stacktrace.d.ts +16 -3
  342. package/dist/symbolicate-stacktrace.js +49 -24
  343. package/dist/take-frame-and-compose.d.ts +22 -0
  344. package/dist/take-frame-and-compose.js +103 -0
  345. package/dist/tmp-dir.d.ts +0 -0
  346. package/dist/tmp-dir.js +7 -8
  347. package/dist/truthy.d.ts +1 -1
  348. package/dist/truthy.js +0 -0
  349. package/dist/types.d.ts +2 -2
  350. package/dist/types.js +0 -0
  351. package/dist/validate-concurrency.d.ts +2 -0
  352. package/dist/validate-concurrency.js +21 -10
  353. package/dist/validate-even-dimensions-with-codec.d.ts +0 -0
  354. package/dist/validate-even-dimensions-with-codec.js +0 -0
  355. package/dist/validate-every-nth-frame.d.ts +2 -1
  356. package/dist/validate-every-nth-frame.js +8 -1
  357. package/dist/validate-ffmpeg-override.d.ts +0 -0
  358. package/dist/validate-ffmpeg-override.js +0 -0
  359. package/dist/validate-number-of-gif-loops.d.ts +2 -0
  360. package/dist/validate-number-of-gif-loops.js +24 -0
  361. package/dist/validate-opengl-renderer.d.ts +1 -1
  362. package/dist/validate-opengl-renderer.js +0 -0
  363. package/dist/validate-output-filename.d.ts +7 -2
  364. package/dist/validate-output-filename.js +20 -51
  365. package/dist/validate-puppeteer-timeout.d.ts +0 -0
  366. package/dist/validate-puppeteer-timeout.js +1 -0
  367. package/dist/validate-scale.d.ts +0 -0
  368. package/dist/validate-scale.js +0 -0
  369. package/dist/validate-videobitrate.d.ts +1 -0
  370. package/dist/validate-videobitrate.js +20 -0
  371. package/dist/wait-for-symbolication-error-to-be-done.d.ts +0 -0
  372. package/dist/wait-for-symbolication-error-to-be-done.js +5 -31
  373. package/dist/ws/ws-types.d.ts +0 -0
  374. package/dist/ws/ws-types.js +2 -1
  375. package/install-toolchain.mjs +36 -0
  376. package/package.json +70 -60
  377. package/types/ws/index.d.ts +5 -5
  378. package/.prettierrc.js +0 -14
  379. package/dist/assets/dl-browser.d.ts +0 -1
  380. package/dist/assets/dl-browser.js +0 -38
  381. package/dist/assets/get-video-stream-duration.d.ts +0 -4
  382. package/dist/assets/get-video-stream-duration.js +0 -59
  383. package/dist/calculate-sar-dar-pixels.d.ts +0 -9
  384. package/dist/calculate-sar-dar-pixels.js +0 -19
  385. package/dist/convert-to-pcm.d.ts +0 -6
  386. package/dist/convert-to-pcm.js +0 -20
  387. package/dist/ensure-presentation-timestamp.d.ts +0 -2
  388. package/dist/ensure-presentation-timestamp.js +0 -69
  389. package/dist/extract-frame-from-video.d.ts +0 -16
  390. package/dist/extract-frame-from-video.js +0 -277
  391. package/dist/ffmpeg-executable.d.ts +0 -1
  392. package/dist/ffmpeg-flags.d.ts +0 -12
  393. package/dist/ffmpeg-flags.js +0 -45
  394. package/dist/frame-to-ffmpeg-timestamp.d.ts +0 -1
  395. package/dist/frame-to-ffmpeg-timestamp.js +0 -8
  396. package/dist/get-audio-codec-name.d.ts +0 -2
  397. package/dist/get-audio-codec-name.js +0 -28
  398. package/dist/get-video-info.d.ts +0 -3
  399. package/dist/get-video-info.js +0 -49
  400. package/dist/is-beyond-last-frame.d.ts +0 -3
  401. package/dist/is-beyond-last-frame.js +0 -12
  402. package/dist/last-frame-from-video-cache.d.ts +0 -17
  403. package/dist/last-frame-from-video-cache.js +0 -55
  404. package/dist/legacy-webpack-config.d.ts +0 -9
  405. package/dist/legacy-webpack-config.js +0 -13
  406. package/dist/quality.d.ts +0 -1
  407. package/dist/quality.js +0 -21
  408. package/dist/validate-ffmpeg.d.ts +0 -2
  409. package/dist/validate-ffmpeg.js +0 -72
  410. package/dist/validate-frame.d.ts +0 -1
  411. package/dist/validate-frame.js +0 -24
  412. package/tsconfig.json +0 -10
  413. 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, logLevel, 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, 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,131 @@ 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, logLevel, 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,
140
+ tag: 'stitchFramesToVideo()',
141
+ }, 'audioCodec', resolvedAudioCodec);
142
+ logger_1.Log.verboseAdvanced({
143
+ indent,
144
+ logLevel,
145
+ tag: 'stitchFramesToVideo()',
146
+ }, 'pixelFormat', pixelFormat);
147
+ logger_1.Log.verboseAdvanced({
148
+ indent,
149
+ logLevel,
150
+ tag: 'stitchFramesToVideo()',
151
+ }, 'codec', codec);
152
+ logger_1.Log.verboseAdvanced({
153
+ indent,
154
+ logLevel,
155
+ tag: 'stitchFramesToVideo()',
156
+ }, 'shouldRenderAudio', shouldRenderAudio);
157
+ logger_1.Log.verboseAdvanced({
158
+ indent,
159
+ logLevel,
160
+ tag: 'stitchFramesToVideo()',
161
+ }, 'shouldRenderVideo', shouldRenderVideo);
162
+ (0, crf_1.validateQualitySettings)({
163
+ crf,
164
+ codec,
165
+ videoBitrate,
166
+ });
128
167
  (0, pixel_format_1.validateSelectedPixelFormatAndCodecCombination)(pixelFormat, codec);
129
- const expectedFrames = options.assetsInfo.assets.length;
168
+ const expectedFrames = assetsInfo.assets.length;
130
169
  const updateProgress = (preStitchProgress, muxProgress) => {
131
- var _a;
132
170
  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));
171
+ onProgress === null || onProgress === void 0 ? void 0 : onProgress(Math.round(totalFrameProgress));
134
172
  };
135
173
  const audio = shouldRenderAudio
136
174
  ? await getAssetsData({
137
- assets: options.assetsInfo.assets,
138
- onDownload: options.onDownload,
139
- fps: options.fps,
175
+ assets: assetsInfo.assets,
176
+ onDownload,
177
+ fps,
140
178
  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,
179
+ logLevel,
144
180
  onProgress: (prog) => updateProgress(prog, 0),
145
- downloadMap: options.assetsInfo.downloadMap,
181
+ downloadMap: assetsInfo.downloadMap,
182
+ remotionRoot,
183
+ indent,
146
184
  })
147
185
  : null;
148
186
  if (mediaSupport.audio && !mediaSupport.video) {
149
- if (!audioCodecName) {
187
+ if (!resolvedAudioCodec) {
150
188
  throw new TypeError('exporting audio but has no audio codec name. Report this in the Remotion repo.');
151
189
  }
152
- const ffmpegTask = (0, execa_1.default)('ffmpeg', [
190
+ const ffmpegTask = (0, call_ffmpeg_1.callFf)('ffmpeg', [
153
191
  '-i',
154
192
  audio,
155
193
  '-c:a',
156
- audioCodecName,
194
+ (0, audio_codec_1.mapAudioCodecToFfmpegAudioCodecName)(resolvedAudioCodec),
157
195
  // Set bitrate up to 320k, for aac it might effectively be lower
158
196
  '-b:a',
159
- '320k',
160
- options.force ? '-y' : null,
161
- (_j = options.outputLocation) !== null && _j !== void 0 ? _j : tempFile,
197
+ audioBitrate !== null && audioBitrate !== void 0 ? audioBitrate : '320k',
198
+ force ? '-y' : null,
199
+ outputLocation !== null && outputLocation !== void 0 ? outputLocation : tempFile,
162
200
  ].filter(remotion_1.Internals.truthy));
163
- (_k = options.cancelSignal) === null || _k === void 0 ? void 0 : _k.call(options, () => {
201
+ cancelSignal === null || cancelSignal === void 0 ? void 0 : cancelSignal(() => {
164
202
  ffmpegTask.kill();
165
203
  });
166
204
  await ffmpegTask;
167
- (_l = options.onProgress) === null || _l === void 0 ? void 0 : _l.call(options, expectedFrames);
205
+ onProgress === null || onProgress === void 0 ? void 0 : onProgress(expectedFrames);
168
206
  if (audio) {
169
- await (0, delete_directory_1.deleteDirectory)(path_1.default.dirname(audio));
207
+ (0, delete_directory_1.deleteDirectory)(node_path_1.default.dirname(audio));
170
208
  }
171
209
  const file = await new Promise((resolve, reject) => {
172
210
  if (tempFile) {
173
- (0, promises_1.readFile)(tempFile)
211
+ node_fs_1.promises
212
+ .readFile(tempFile)
174
213
  .then((f) => {
175
214
  return resolve(f);
176
215
  })
@@ -180,47 +219,49 @@ const spawnFfmpeg = async (options) => {
180
219
  resolve(null);
181
220
  }
182
221
  });
183
- await (0, delete_directory_1.deleteDirectory)(options.assetsInfo.downloadMap.stitchFrames);
222
+ (0, delete_directory_1.deleteDirectory)(assetsInfo.downloadMap.stitchFrames);
184
223
  return {
185
224
  getLogs: () => '',
186
225
  task: Promise.resolve(file),
187
226
  };
188
227
  }
189
228
  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]]
229
+ ...(preEncodedFileLocation
230
+ ? [['-i', preEncodedFileLocation]]
193
231
  : [
232
+ ['-r', String(fps)],
194
233
  ['-f', 'image2'],
195
- ['-s', `${options.width}x${options.height}`],
196
- ['-start_number', String(options.assetsInfo.firstFrameIndex)],
197
- ['-i', options.assetsInfo.imageSequenceName],
234
+ ['-s', `${width}x${height}`],
235
+ ['-start_number', String(assetsInfo.firstFrameIndex)],
236
+ ['-i', assetsInfo.imageSequenceName],
198
237
  ]),
199
238
  audio ? ['-i', audio] : null,
200
- ((_p = options.numberOfGifLoops) !== null && _p !== void 0 ? _p : null) === null
239
+ numberOfGifLoops === null
201
240
  ? 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
- ],
241
+ : ['-loop', (0, convert_number_of_gif_loops_to_ffmpeg_1.convertNumberOfGifLoopsToFfmpegSyntax)(numberOfGifLoops)],
206
242
  // -c:v is the same as -vcodec as -codec:video
207
243
  // and specified the video codec.
208
244
  ['-c:v', encoderName],
209
- ...(((_r = options.internalOptions) === null || _r === void 0 ? void 0 : _r.preEncodedFileLocation)
245
+ ...(preEncodedFileLocation
210
246
  ? []
211
247
  : [
212
248
  proResProfileName ? ['-profile:v', proResProfileName] : null,
213
- supportsCrf ? ['-crf', String(crf)] : null,
214
249
  ['-pix_fmt', pixelFormat],
215
250
  // Without explicitly disabling auto-alt-ref,
216
251
  // transparent WebM generation doesn't work
217
252
  pixelFormat === 'yuva420p' ? ['-auto-alt-ref', '0'] : null,
218
- ['-b:v', '1M'],
253
+ ...(0, crf_1.validateQualitySettings)({
254
+ crf,
255
+ videoBitrate,
256
+ codec,
257
+ }),
219
258
  ]),
220
259
  codec === 'h264' ? ['-movflags', 'faststart'] : null,
221
- audioCodecName ? ['-c:a', audioCodecName] : null,
260
+ resolvedAudioCodec
261
+ ? ['-c:a', (0, audio_codec_1.mapAudioCodecToFfmpegAudioCodecName)(resolvedAudioCodec)]
262
+ : null,
222
263
  // Set max bitrate up to 1024kbps, will choose lower if that's too much
223
- audioCodecName ? ['-b:a', '512K'] : null,
264
+ resolvedAudioCodec ? ['-b:a', audioBitrate || '512K'] : null,
224
265
  // Ignore metadata that may come from remote media
225
266
  ['-map_metadata', '-1'],
226
267
  [
@@ -228,34 +269,36 @@ const spawnFfmpeg = async (options) => {
228
269
  `comment=` +
229
270
  [`Made with Remotion`, packageJson ? packageJson.version : null].join(' '),
230
271
  ],
231
- options.force ? '-y' : null,
232
- (_s = options.outputLocation) !== null && _s !== void 0 ? _s : tempFile,
272
+ force ? '-y' : null,
273
+ outputLocation !== null && outputLocation !== void 0 ? outputLocation : tempFile,
233
274
  ];
234
- if (options.verbose) {
235
- console.log('Generated FFMPEG command:');
236
- console.log(ffmpegArgs);
237
- }
238
275
  const ffmpegString = ffmpegArgs.flat(2).filter(Boolean);
239
- const finalFfmpegString = options.ffmpegOverride
240
- ? options.ffmpegOverride({ type: 'stitcher', args: ffmpegString })
276
+ const finalFfmpegString = ffmpegOverride
277
+ ? ffmpegOverride({ type: 'stitcher', args: ffmpegString })
241
278
  : 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,
279
+ logger_1.Log.verboseAdvanced({
280
+ indent: indent !== null && indent !== void 0 ? indent : false,
281
+ logLevel,
282
+ tag: 'stitchFramesToVideo()',
283
+ }, 'Generated final FFMPEG command:');
284
+ logger_1.Log.verboseAdvanced({
285
+ indent,
286
+ logLevel,
287
+ tag: 'stitchFramesToVideo()',
288
+ }, finalFfmpegString.join(' '));
289
+ const task = (0, call_ffmpeg_1.callFf)('ffmpeg', finalFfmpegString, {
290
+ cwd: dir,
248
291
  });
249
- (_u = options.cancelSignal) === null || _u === void 0 ? void 0 : _u.call(options, () => {
292
+ cancelSignal === null || cancelSignal === void 0 ? void 0 : cancelSignal(() => {
250
293
  task.kill();
251
294
  });
252
295
  let ffmpegOutput = '';
253
296
  let isFinished = false;
254
- (_v = task.stderr) === null || _v === void 0 ? void 0 : _v.on('data', (data) => {
297
+ (_a = task.stderr) === null || _a === void 0 ? void 0 : _a.on('data', (data) => {
255
298
  var _a;
256
299
  const str = data.toString();
257
300
  ffmpegOutput += str;
258
- if (options.onProgress) {
301
+ if (onProgress) {
259
302
  const parsed = (0, parse_ffmpeg_progress_1.parseFfmpegProgress)(str);
260
303
  // FFMPEG bug: In some cases, FFMPEG does hang after it is finished with it's job
261
304
  // Example repo: https://github.com/JonnyBurger/ffmpeg-repro (access can be given upon request)
@@ -275,17 +318,18 @@ const spawnFfmpeg = async (options) => {
275
318
  });
276
319
  return {
277
320
  task: task.then(() => {
278
- (0, delete_directory_1.deleteDirectory)(options.assetsInfo.downloadMap.audioPreprocessing);
321
+ (0, delete_directory_1.deleteDirectory)(assetsInfo.downloadMap.audioPreprocessing);
279
322
  if (tempFile === null) {
280
- (0, delete_directory_1.deleteDirectory)(options.assetsInfo.downloadMap.stitchFrames);
323
+ (0, delete_directory_1.deleteDirectory)(assetsInfo.downloadMap.stitchFrames);
281
324
  return null;
282
325
  }
283
- return (0, promises_1.readFile)(tempFile)
326
+ return node_fs_1.promises
327
+ .readFile(tempFile)
284
328
  .then((file) => {
285
329
  return Promise.all([
286
330
  file,
287
- (0, delete_directory_1.deleteDirectory)(path_1.default.dirname(tempFile)),
288
- (0, delete_directory_1.deleteDirectory)(options.assetsInfo.downloadMap.stitchFrames),
331
+ (0, delete_directory_1.deleteDirectory)(node_path_1.default.dirname(tempFile)),
332
+ (0, delete_directory_1.deleteDirectory)(assetsInfo.downloadMap.stitchFrames),
289
333
  ]);
290
334
  })
291
335
  .then(([file]) => file);
@@ -293,9 +337,10 @@ const spawnFfmpeg = async (options) => {
293
337
  getLogs: () => ffmpegOutput,
294
338
  };
295
339
  };
296
- exports.spawnFfmpeg = spawnFfmpeg;
297
- const stitchFramesToVideo = async (options) => {
298
- const { task, getLogs } = await (0, exports.spawnFfmpeg)(options);
340
+ const internalStitchFramesToVideo = async (options) => {
341
+ const remotionRoot = (0, find_closest_package_json_1.findRemotionRoot)();
342
+ (0, does_have_m2_bug_1.warnAboutM2Bug)(options.codec, options.pixelFormat);
343
+ const { task, getLogs } = await innerStitchFramesToVideo(options, remotionRoot);
299
344
  const happyPath = task.catch(() => {
300
345
  throw new Error(getLogs());
301
346
  });
@@ -304,9 +349,43 @@ const stitchFramesToVideo = async (options) => {
304
349
  new Promise((_resolve, reject) => {
305
350
  var _a;
306
351
  (_a = options.cancelSignal) === null || _a === void 0 ? void 0 : _a.call(options, () => {
307
- reject(new Error('stitchFramesToVideo() got cancelled'));
352
+ reject(new Error(make_cancel_signal_1.cancelErrorMessages.stitchFramesToVideo));
308
353
  });
309
354
  }),
310
355
  ]);
311
356
  };
357
+ exports.internalStitchFramesToVideo = internalStitchFramesToVideo;
358
+ /**
359
+ * @description Takes a series of images and audio information generated by renderFrames() and encodes it to a video.
360
+ * @see [Documentation](https://www.remotion.dev/docs/renderer/stitch-frames-to-video)
361
+ */
362
+ const stitchFramesToVideo = ({ assetsInfo, force, fps, height, width, audioBitrate, audioCodec, cancelSignal, codec, crf, dir, enforceAudioTrack, ffmpegOverride, muted, numberOfGifLoops, onDownload, onProgress, outputLocation, pixelFormat, proResProfile, verbose, videoBitrate, }) => {
363
+ return (0, exports.internalStitchFramesToVideo)({
364
+ assetsInfo,
365
+ audioBitrate: audioBitrate !== null && audioBitrate !== void 0 ? audioBitrate : null,
366
+ audioCodec: audioCodec !== null && audioCodec !== void 0 ? audioCodec : null,
367
+ cancelSignal: cancelSignal !== null && cancelSignal !== void 0 ? cancelSignal : null,
368
+ codec: codec !== null && codec !== void 0 ? codec : codec_1.DEFAULT_CODEC,
369
+ crf: crf !== null && crf !== void 0 ? crf : null,
370
+ dir,
371
+ enforceAudioTrack: enforceAudioTrack !== null && enforceAudioTrack !== void 0 ? enforceAudioTrack : false,
372
+ ffmpegOverride: ffmpegOverride !== null && ffmpegOverride !== void 0 ? ffmpegOverride : null,
373
+ force,
374
+ fps,
375
+ height,
376
+ indent: false,
377
+ muted: muted !== null && muted !== void 0 ? muted : false,
378
+ numberOfGifLoops: numberOfGifLoops !== null && numberOfGifLoops !== void 0 ? numberOfGifLoops : null,
379
+ onDownload: onDownload !== null && onDownload !== void 0 ? onDownload : undefined,
380
+ onProgress,
381
+ outputLocation: outputLocation !== null && outputLocation !== void 0 ? outputLocation : null,
382
+ pixelFormat: pixelFormat !== null && pixelFormat !== void 0 ? pixelFormat : pixel_format_1.DEFAULT_PIXEL_FORMAT,
383
+ proResProfile,
384
+ logLevel: verbose ? 'verbose' : 'info',
385
+ videoBitrate: videoBitrate !== null && videoBitrate !== void 0 ? videoBitrate : null,
386
+ width,
387
+ preEncodedFileLocation: null,
388
+ preferLossless: false,
389
+ });
390
+ };
312
391
  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;
@@ -1,15 +1,28 @@
1
+ import type { BasicSourceMapConsumer, IndexedSourceMapConsumer } from 'source-map';
2
+ import { SourceMapConsumer } from 'source-map';
1
3
  import type { UnsymbolicatedStackFrame } from './parse-browser-error-stack';
2
- declare type ScriptLine = {
4
+ type ScriptLine = {
3
5
  lineNumber: number;
4
6
  content: string;
5
7
  highlight: boolean;
6
8
  };
7
- export declare type SymbolicatedStackFrame = {
9
+ export type SymbolicatedStackFrame = {
8
10
  originalFunctionName: string | null;
9
11
  originalFileName: string | null;
10
12
  originalLineNumber: number | null;
11
13
  originalColumnNumber: number | null;
12
14
  originalScriptCode: ScriptLine[] | null;
13
15
  };
14
- export declare const symbolicateStackTrace: (frames: UnsymbolicatedStackFrame[]) => Promise<SymbolicatedStackFrame[]>;
16
+ export declare const symbolicateStackTraceFromRemoteFrames: (frames: UnsymbolicatedStackFrame[]) => Promise<SymbolicatedStackFrame[]>;
17
+ export declare const symbolicateFromSources: (frames: UnsymbolicatedStackFrame[], mapValues: Record<string, SourceMapConsumer | null>) => SymbolicatedStackFrame[];
18
+ export declare const symbolicateStackFrame: (frame: UnsymbolicatedStackFrame, map: SourceMapConsumer) => {
19
+ originalColumnNumber: number | null;
20
+ originalFileName: string | null;
21
+ originalFunctionName: string | null;
22
+ originalLineNumber: number | null;
23
+ originalScriptCode: ScriptLine[] | null;
24
+ };
25
+ export declare const getSourceMapFromRemoteFile: (fileName: string) => Promise<IndexedSourceMapConsumer | null>;
26
+ export declare const getSourceMapFromLocalFile: (fileName: string) => Promise<IndexedSourceMapConsumer | null>;
27
+ export type AnySourceMapConsumer = BasicSourceMapConsumer | IndexedSourceMapConsumer;
15
28
  export {};