@remotion/renderer 4.0.0-webhook.27 → 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.
- package/LICENSE.md +8 -8
- package/README.md +9 -0
- package/client.d.ts +1 -0
- package/client.js +1 -0
- package/dist/assets/calculate-asset-positions.d.ts +0 -0
- package/dist/assets/calculate-asset-positions.js +1 -0
- package/dist/assets/calculate-atempo.d.ts +0 -0
- package/dist/assets/calculate-atempo.js +0 -0
- package/dist/assets/convert-assets-to-file-urls.d.ts +0 -0
- package/dist/assets/convert-assets-to-file-urls.js +0 -0
- package/dist/assets/download-and-map-assets-to-file.d.ts +6 -4
- package/dist/assets/download-and-map-assets-to-file.js +49 -19
- package/dist/assets/download-file.d.ts +8 -5
- package/dist/assets/download-file.js +71 -8
- package/dist/assets/download-map.d.ts +8 -29
- package/dist/assets/download-map.js +15 -16
- package/dist/assets/ffmpeg-volume-expression.d.ts +4 -3
- package/dist/assets/ffmpeg-volume-expression.js +5 -3
- package/dist/assets/flatten-volume-array.d.ts +0 -0
- package/dist/assets/flatten-volume-array.js +0 -0
- package/dist/assets/get-audio-channels.d.ts +2 -2
- package/dist/assets/get-audio-channels.js +14 -12
- package/dist/assets/read-file.d.ts +1 -1
- package/dist/assets/read-file.js +5 -7
- package/dist/assets/round-volume-to-avoid-stack-overflow.d.ts +0 -0
- package/dist/assets/round-volume-to-avoid-stack-overflow.js +0 -0
- package/dist/assets/sanitize-filename.d.ts +0 -0
- package/dist/assets/sanitize-filename.js +0 -0
- package/dist/assets/sanitize-filepath.d.ts +0 -0
- package/dist/assets/sanitize-filepath.js +2 -2
- package/dist/assets/truncate-utf8-bytes.d.ts +0 -0
- package/dist/assets/truncate-utf8-bytes.js +0 -0
- package/dist/assets/types.d.ts +5 -4
- package/dist/assets/types.js +0 -0
- package/dist/audio-codec.d.ts +28 -0
- package/dist/audio-codec.js +83 -0
- package/dist/browser/Browser.d.ts +16 -14
- package/dist/browser/Browser.js +69 -72
- package/dist/browser/BrowserConnector.d.ts +0 -0
- package/dist/browser/BrowserConnector.js +0 -0
- package/dist/browser/BrowserFetcher.d.ts +16 -64
- package/dist/browser/BrowserFetcher.js +147 -235
- package/dist/browser/BrowserPage.d.ts +21 -6
- package/dist/browser/BrowserPage.js +54 -22
- package/dist/browser/BrowserRunner.d.ts +1 -1
- package/dist/browser/BrowserRunner.js +32 -22
- package/dist/browser/Connection.d.ts +0 -0
- package/dist/browser/Connection.js +1 -1
- package/dist/browser/ConsoleMessage.d.ts +1 -1
- package/dist/browser/ConsoleMessage.js +0 -0
- package/dist/browser/DOMWorld.d.ts +5 -4
- package/dist/browser/DOMWorld.js +16 -9
- package/dist/browser/Errors.d.ts +0 -0
- package/dist/browser/Errors.js +0 -0
- package/dist/browser/EvalTypes.d.ts +7 -7
- package/dist/browser/EvalTypes.js +0 -0
- package/dist/browser/EventEmitter.d.ts +0 -0
- package/dist/browser/EventEmitter.js +0 -0
- package/dist/browser/ExecutionContext.d.ts +0 -0
- package/dist/browser/ExecutionContext.js +0 -0
- package/dist/browser/FrameManager.d.ts +0 -2
- package/dist/browser/FrameManager.js +13 -17
- package/dist/browser/HTTPRequest.d.ts +0 -0
- package/dist/browser/HTTPRequest.js +0 -0
- package/dist/browser/HTTPResponse.d.ts +0 -0
- package/dist/browser/HTTPResponse.js +0 -0
- package/dist/browser/JSHandle.d.ts +0 -0
- package/dist/browser/JSHandle.js +14 -14
- package/dist/browser/LaunchOptions.d.ts +2 -2
- package/dist/browser/LaunchOptions.js +0 -0
- package/dist/browser/Launcher.d.ts +9 -3
- package/dist/browser/Launcher.js +16 -29
- package/dist/browser/LifecycleWatcher.d.ts +1 -1
- package/dist/browser/LifecycleWatcher.js +0 -0
- package/dist/browser/NetworkEventManager.d.ts +4 -4
- package/dist/browser/NetworkEventManager.js +0 -0
- package/dist/browser/NetworkManager.d.ts +0 -0
- package/dist/browser/NetworkManager.js +0 -0
- package/dist/browser/NodeWebSocketTransport.d.ts +0 -0
- package/dist/browser/NodeWebSocketTransport.js +21 -21
- package/dist/browser/Product.d.ts +1 -1
- package/dist/browser/Product.js +0 -0
- package/dist/browser/PuppeteerNode.d.ts +2 -5
- package/dist/browser/PuppeteerNode.js +2 -11
- package/dist/browser/PuppeteerViewport.d.ts +0 -0
- package/dist/browser/PuppeteerViewport.js +0 -0
- package/dist/browser/ScreenshotOptions.d.ts +0 -14
- package/dist/browser/ScreenshotOptions.js +0 -1
- package/dist/browser/Target.d.ts +4 -3
- package/dist/browser/Target.js +8 -2
- package/dist/browser/TaskQueue.d.ts +0 -0
- package/dist/browser/TaskQueue.js +0 -0
- package/dist/browser/TimeoutSettings.d.ts +0 -0
- package/dist/browser/TimeoutSettings.js +0 -0
- package/dist/browser/assert.d.ts +0 -0
- package/dist/browser/assert.js +0 -0
- package/dist/browser/create-browser-fetcher.d.ts +0 -0
- package/dist/browser/create-browser-fetcher.js +34 -48
- package/dist/browser/devtools-commands.d.ts +5 -1
- package/dist/browser/devtools-commands.js +0 -0
- package/dist/browser/devtools-types.d.ts +92 -10
- package/dist/browser/devtools-types.js +0 -0
- package/dist/browser/get-download-destination.d.ts +0 -0
- package/dist/browser/get-download-destination.js +8 -8
- package/dist/browser/is-target-closed-err.d.ts +1 -0
- package/dist/browser/is-target-closed-err.js +9 -0
- package/dist/browser/mitt/index.d.ts +6 -6
- package/dist/browser/mitt/index.js +0 -0
- package/dist/browser/node.d.ts +0 -0
- package/dist/browser/node.js +0 -0
- package/dist/browser/revisions.d.ts +1 -1
- package/dist/browser/revisions.js +0 -0
- package/dist/browser/should-log-message.d.ts +24 -0
- package/dist/browser/should-log-message.js +72 -0
- package/dist/browser/util.d.ts +2 -2
- package/dist/browser/util.js +0 -0
- package/dist/browser-executable.d.ts +1 -1
- package/dist/browser-executable.js +0 -0
- package/dist/browser-log.d.ts +1 -1
- package/dist/browser-log.js +0 -0
- package/dist/browser.d.ts +1 -1
- package/dist/browser.js +0 -0
- package/dist/calculate-ffmpeg-filters.d.ts +2 -1
- package/dist/calculate-ffmpeg-filters.js +1 -0
- package/dist/call-ffmpeg.d.ts +14 -0
- package/dist/call-ffmpeg.js +42 -0
- package/dist/can-use-parallel-encoding.d.ts +0 -0
- package/dist/can-use-parallel-encoding.js +0 -0
- package/dist/chalk/index.d.ts +54 -0
- package/dist/chalk/index.js +135 -0
- package/dist/chalk/is-color-supported.d.ts +1 -0
- package/dist/chalk/is-color-supported.js +37 -0
- package/dist/check-apple-silicon.d.ts +1 -1
- package/dist/check-apple-silicon.js +8 -47
- package/dist/chunk.d.ts +0 -0
- package/dist/chunk.js +0 -0
- package/dist/client.d.ts +204 -0
- package/dist/client.js +49 -0
- package/dist/codec-supports-media.d.ts +3 -2
- package/dist/codec-supports-media.js +20 -5
- package/dist/codec.d.ts +2 -2
- package/dist/codec.js +0 -0
- package/dist/combine-videos.d.ts +6 -2
- package/dist/combine-videos.js +17 -17
- package/dist/compositor/compose.d.ts +26 -0
- package/dist/compositor/compose.js +82 -0
- package/dist/compositor/compositor.d.ts +11 -0
- package/dist/compositor/compositor.js +219 -0
- package/dist/compositor/get-executable-path.d.ts +1 -0
- package/dist/compositor/get-executable-path.js +57 -0
- package/dist/compositor/make-nonce.d.ts +1 -0
- package/dist/compositor/make-nonce.js +8 -0
- package/dist/compositor/payloads.d.ts +68 -0
- package/dist/{ffmpeg-executable.js → compositor/payloads.js} +0 -0
- package/dist/compress-assets.d.ts +0 -0
- package/dist/compress-assets.js +0 -0
- package/dist/convert-number-of-gif-loops-to-ffmpeg.d.ts +0 -0
- package/dist/convert-number-of-gif-loops-to-ffmpeg.js +0 -0
- package/dist/convert-to-positive-frame-index.d.ts +0 -0
- package/dist/convert-to-positive-frame-index.js +0 -0
- package/dist/create-ffmpeg-complex-filter.d.ts +5 -1
- package/dist/create-ffmpeg-complex-filter.js +6 -4
- package/dist/create-ffmpeg-merge-filter.d.ts +5 -1
- package/dist/create-ffmpeg-merge-filter.js +21 -13
- package/dist/create-silent-audio.d.ts +1 -3
- package/dist/create-silent-audio.js +3 -6
- package/dist/crf.d.ts +6 -2
- package/dist/crf.js +41 -8
- package/dist/cycle-browser-tabs.d.ts +2 -5
- package/dist/cycle-browser-tabs.js +5 -5
- package/dist/delay-render-embedded-stack.d.ts +0 -0
- package/dist/delay-render-embedded-stack.js +0 -0
- package/dist/delete-directory.d.ts +1 -1
- package/dist/delete-directory.js +43 -17
- package/dist/does-have-m2-bug.d.ts +3 -0
- package/dist/does-have-m2-bug.js +12 -0
- package/dist/ensure-frames-in-order.d.ts +0 -0
- package/dist/ensure-frames-in-order.js +0 -0
- package/dist/ensure-output-directory.d.ts +0 -0
- package/dist/ensure-output-directory.js +5 -5
- package/dist/error-handling/handle-javascript-exception.d.ts +0 -0
- package/dist/error-handling/handle-javascript-exception.js +10 -0
- package/dist/error-handling/symbolicate-error.d.ts +0 -0
- package/dist/error-handling/symbolicate-error.js +6 -3
- package/dist/error-handling/symbolicateable-error.d.ts +0 -0
- package/dist/error-handling/symbolicateable-error.js +0 -0
- package/dist/ffmpeg-filter-file.d.ts +6 -1
- package/dist/ffmpeg-filter-file.js +40 -8
- package/dist/ffmpeg-override.d.ts +1 -1
- package/dist/ffmpeg-override.js +0 -0
- package/dist/file-extensions.d.ts +14 -0
- package/dist/file-extensions.js +76 -0
- package/dist/find-closest-package-json.d.ts +2 -0
- package/dist/find-closest-package-json.js +31 -0
- package/dist/frame-range.d.ts +1 -1
- package/dist/frame-range.js +0 -0
- package/dist/get-browser-instance.d.ts +8 -3
- package/dist/get-browser-instance.js +10 -5
- package/dist/get-codec-name.d.ts +0 -0
- package/dist/get-codec-name.js +0 -0
- package/dist/get-compositions.d.ts +27 -14
- package/dist/get-compositions.js +72 -39
- package/dist/get-concurrency.d.ts +1 -1
- package/dist/get-concurrency.js +11 -4
- package/dist/get-duration-from-frame-range.d.ts +0 -0
- package/dist/get-duration-from-frame-range.js +0 -0
- package/dist/get-extension-from-codec.d.ts +5 -1
- package/dist/get-extension-from-codec.js +56 -32
- package/dist/get-extension-of-filename.d.ts +0 -0
- package/dist/get-extension-of-filename.js +5 -1
- package/dist/get-frame-padded-index.d.ts +3 -2
- package/dist/get-frame-padded-index.js +3 -2
- package/dist/get-frame-to-render.d.ts +0 -0
- package/dist/get-frame-to-render.js +1 -1
- package/dist/get-local-browser-executable.d.ts +0 -0
- package/dist/get-local-browser-executable.js +7 -15
- package/dist/get-port.d.ts +4 -1
- package/dist/get-port.js +8 -8
- package/dist/get-prores-profile-name.d.ts +0 -0
- package/dist/get-prores-profile-name.js +0 -0
- package/dist/get-video-threads-flag.d.ts +0 -0
- package/dist/get-video-threads-flag.js +3 -3
- package/dist/guess-extension-for-media.d.ts +3 -1
- package/dist/guess-extension-for-media.js +4 -7
- package/dist/image-format.d.ts +12 -6
- package/dist/image-format.js +19 -13
- package/dist/index.d.ts +368 -49
- package/dist/index.js +68 -46
- package/dist/is-audio-codec.d.ts +0 -0
- package/dist/is-audio-codec.js +0 -0
- package/dist/is-serve-url.d.ts +0 -0
- package/dist/is-serve-url.js +0 -0
- package/dist/jpeg-quality.d.ts +2 -0
- package/dist/jpeg-quality.js +22 -0
- package/dist/locks.d.ts +7 -0
- package/dist/locks.js +44 -0
- package/dist/log-level.d.ts +1 -1
- package/dist/log-level.js +0 -0
- package/dist/logger.d.ts +24 -0
- package/dist/logger.js +68 -0
- package/dist/make-cancel-signal.d.ts +13 -2
- package/dist/make-cancel-signal.js +24 -1
- package/dist/merge-audio-track.d.ts +4 -4
- package/dist/merge-audio-track.js +38 -33
- package/dist/mime-db.d.ts +0 -0
- package/dist/mime-db.js +0 -0
- package/dist/mime-types.d.ts +0 -0
- package/dist/mime-types.js +3 -3
- package/dist/normalize-serve-url.d.ts +0 -0
- package/dist/normalize-serve-url.js +0 -0
- package/dist/offthread-video-server.d.ts +47 -11
- package/dist/offthread-video-server.js +111 -58
- package/dist/open-browser.d.ts +21 -6
- package/dist/open-browser.js +37 -16
- package/dist/options/audio-bitrate.d.ts +2 -0
- package/dist/options/audio-bitrate.js +11 -0
- package/dist/options/crf.d.ts +2 -0
- package/dist/options/crf.js +11 -0
- package/dist/options/enforce-audio.d.ts +2 -0
- package/dist/options/enforce-audio.js +11 -0
- package/dist/options/jpeg-quality.d.ts +2 -0
- package/dist/options/jpeg-quality.js +11 -0
- package/dist/options/mute.d.ts +2 -0
- package/dist/options/mute.js +11 -0
- package/dist/options/option.d.ts +8 -0
- package/dist/options/option.js +2 -0
- package/dist/options/scale.d.ts +2 -0
- package/dist/options/scale.js +11 -0
- package/dist/options/video-bitrate.d.ts +2 -0
- package/dist/options/video-bitrate.js +11 -0
- package/dist/options/video-codec.d.ts +2 -0
- package/dist/options/video-codec.js +11 -0
- package/dist/overwrite.d.ts +0 -0
- package/dist/overwrite.js +0 -0
- package/dist/p-limit.d.ts +0 -0
- package/dist/p-limit.js +0 -0
- package/dist/parse-browser-error-stack.d.ts +1 -1
- package/dist/parse-browser-error-stack.js +0 -0
- package/dist/parse-ffmpeg-progress.d.ts +0 -0
- package/dist/parse-ffmpeg-progress.js +0 -0
- package/dist/perf.d.ts +2 -2
- package/dist/perf.js +9 -7
- package/dist/pixel-format.d.ts +2 -2
- package/dist/pixel-format.js +3 -0
- package/dist/pool.d.ts +0 -0
- package/dist/pool.js +0 -0
- package/dist/prepare-server.d.ts +25 -10
- package/dist/prepare-server.js +71 -18
- package/dist/preprocess-audio-track.d.ts +7 -5
- package/dist/preprocess-audio-track.js +7 -8
- package/dist/prespawn-ffmpeg.d.ts +20 -10
- package/dist/prespawn-ffmpeg.js +67 -29
- package/dist/prestitcher-memory-usage.d.ts +0 -4
- package/dist/prestitcher-memory-usage.js +4 -5
- package/dist/prores-profile.d.ts +6 -4
- package/dist/prores-profile.js +8 -8
- package/dist/provide-screenshot.d.ts +8 -4
- package/dist/provide-screenshot.js +5 -2
- package/dist/puppeteer-evaluate.d.ts +0 -0
- package/dist/puppeteer-evaluate.js +20 -12
- package/dist/puppeteer-screenshot.d.ts +12 -2
- package/dist/puppeteer-screenshot.js +18 -45
- package/dist/redirect-status-codes.d.ts +1 -0
- package/dist/redirect-status-codes.js +6 -0
- package/dist/render-frames.d.ts +52 -35
- package/dist/render-frames.js +248 -143
- package/dist/render-media.d.ts +76 -29
- package/dist/render-media.js +324 -195
- package/dist/render-still.d.ts +46 -19
- package/dist/render-still.js +128 -69
- package/dist/replace-browser.d.ts +6 -0
- package/dist/replace-browser.js +47 -0
- package/dist/resolve-asset-src.d.ts +0 -0
- package/dist/resolve-asset-src.js +2 -2
- package/dist/sample-rate.d.ts +0 -0
- package/dist/sample-rate.js +0 -0
- package/dist/screenshot-dom-element.d.ts +8 -4
- package/dist/screenshot-dom-element.js +15 -4
- package/dist/screenshot-task.d.ts +11 -2
- package/dist/screenshot-task.js +43 -13
- package/dist/seek-to-frame.d.ts +1 -0
- package/dist/seek-to-frame.js +49 -3
- package/dist/select-composition.d.ts +41 -0
- package/dist/select-composition.js +156 -0
- package/dist/serve-handler/index.d.ts +1 -1
- package/dist/serve-handler/index.js +21 -19
- package/dist/serve-handler/is-path-inside.d.ts +0 -0
- package/dist/serve-handler/is-path-inside.js +3 -3
- package/dist/serve-handler/range-parser.d.ts +0 -0
- package/dist/serve-handler/range-parser.js +0 -0
- package/dist/serve-static.d.ts +8 -6
- package/dist/serve-static.js +85 -59
- package/dist/set-props-and-env.d.ts +5 -3
- package/dist/set-props-and-env.js +18 -10
- package/dist/stitch-frames-to-video.d.ts +39 -16
- package/dist/stitch-frames-to-video.js +210 -121
- package/dist/stringify-ffmpeg-filter.d.ts +10 -2
- package/dist/stringify-ffmpeg-filter.js +37 -34
- package/dist/symbolicate-stacktrace.d.ts +16 -3
- package/dist/symbolicate-stacktrace.js +49 -24
- package/dist/take-frame-and-compose.d.ts +22 -0
- package/dist/take-frame-and-compose.js +103 -0
- package/dist/tmp-dir.d.ts +0 -0
- package/dist/tmp-dir.js +7 -8
- package/dist/truthy.d.ts +1 -1
- package/dist/truthy.js +0 -0
- package/dist/types.d.ts +2 -2
- package/dist/types.js +0 -0
- package/dist/validate-concurrency.d.ts +2 -0
- package/dist/validate-concurrency.js +21 -10
- package/dist/validate-even-dimensions-with-codec.d.ts +0 -0
- package/dist/validate-even-dimensions-with-codec.js +0 -0
- package/dist/validate-every-nth-frame.d.ts +2 -1
- package/dist/validate-every-nth-frame.js +8 -1
- package/dist/validate-ffmpeg-override.d.ts +0 -0
- package/dist/validate-ffmpeg-override.js +0 -0
- package/dist/validate-number-of-gif-loops.d.ts +2 -0
- package/dist/validate-number-of-gif-loops.js +24 -0
- package/dist/validate-opengl-renderer.d.ts +2 -3
- package/dist/validate-opengl-renderer.js +9 -4
- package/dist/validate-output-filename.d.ts +7 -2
- package/dist/validate-output-filename.js +20 -51
- package/dist/validate-puppeteer-timeout.d.ts +0 -0
- package/dist/validate-puppeteer-timeout.js +1 -0
- package/dist/validate-scale.d.ts +0 -0
- package/dist/validate-scale.js +0 -0
- package/dist/validate-videobitrate.d.ts +1 -0
- package/dist/validate-videobitrate.js +20 -0
- package/dist/wait-for-symbolication-error-to-be-done.d.ts +0 -0
- package/dist/wait-for-symbolication-error-to-be-done.js +5 -31
- package/dist/ws/ws-types.d.ts +0 -0
- package/dist/ws/ws-types.js +2 -1
- package/install-toolchain.mjs +36 -0
- package/package.json +70 -60
- package/types/ws/index.d.ts +5 -5
- package/.prettierrc.js +0 -14
- package/dist/assets/dl-browser.d.ts +0 -1
- package/dist/assets/dl-browser.js +0 -38
- package/dist/assets/get-video-stream-duration.d.ts +0 -4
- package/dist/assets/get-video-stream-duration.js +0 -59
- package/dist/calculate-sar-dar-pixels.d.ts +0 -9
- package/dist/calculate-sar-dar-pixels.js +0 -19
- package/dist/convert-to-pcm.d.ts +0 -6
- package/dist/convert-to-pcm.js +0 -20
- package/dist/ensure-presentation-timestamp.d.ts +0 -2
- package/dist/ensure-presentation-timestamp.js +0 -69
- package/dist/extract-frame-from-video.d.ts +0 -16
- package/dist/extract-frame-from-video.js +0 -277
- package/dist/ffmpeg-executable.d.ts +0 -1
- package/dist/ffmpeg-flags.d.ts +0 -12
- package/dist/ffmpeg-flags.js +0 -45
- package/dist/frame-to-ffmpeg-timestamp.d.ts +0 -1
- package/dist/frame-to-ffmpeg-timestamp.js +0 -8
- package/dist/get-audio-codec-name.d.ts +0 -2
- package/dist/get-audio-codec-name.js +0 -28
- package/dist/get-video-info.d.ts +0 -3
- package/dist/get-video-info.js +0 -49
- package/dist/is-beyond-last-frame.d.ts +0 -3
- package/dist/is-beyond-last-frame.js +0 -12
- package/dist/last-frame-from-video-cache.d.ts +0 -17
- package/dist/last-frame-from-video-cache.js +0 -55
- package/dist/legacy-webpack-config.d.ts +0 -9
- package/dist/legacy-webpack-config.js +0 -13
- package/dist/quality.d.ts +0 -1
- package/dist/quality.js +0 -21
- package/dist/validate-ffmpeg.d.ts +0 -2
- package/dist/validate-ffmpeg.js +0 -72
- package/dist/validate-frame.d.ts +0 -1
- package/dist/validate-frame.js +0 -24
- package/tsconfig.json +0 -10
- 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.
|
|
7
|
-
const
|
|
8
|
-
const
|
|
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
|
|
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
|
|
31
|
-
const packageJsonPath =
|
|
32
|
-
const packageJson =
|
|
33
|
-
? JSON.parse(
|
|
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,
|
|
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
|
-
|
|
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 =
|
|
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 =
|
|
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
|
|
81
|
-
var _a
|
|
82
|
-
remotion_1.Internals.validateDimension(
|
|
83
|
-
remotion_1.Internals.validateDimension(
|
|
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
|
|
87
|
-
height
|
|
108
|
+
width,
|
|
109
|
+
height,
|
|
88
110
|
codec,
|
|
89
111
|
scale: 1,
|
|
90
112
|
});
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
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
|
|
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
|
-
(
|
|
105
|
-
|
|
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
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
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 =
|
|
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
|
-
|
|
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:
|
|
138
|
-
onDownload
|
|
139
|
-
fps
|
|
185
|
+
assets: assetsInfo.assets,
|
|
186
|
+
onDownload,
|
|
187
|
+
fps,
|
|
140
188
|
expectedFrames,
|
|
141
|
-
verbose
|
|
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:
|
|
191
|
+
downloadMap: assetsInfo.downloadMap,
|
|
192
|
+
remotionRoot,
|
|
193
|
+
indent,
|
|
146
194
|
})
|
|
147
195
|
: null;
|
|
148
196
|
if (mediaSupport.audio && !mediaSupport.video) {
|
|
149
|
-
if (!
|
|
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,
|
|
200
|
+
const ffmpegTask = (0, call_ffmpeg_1.callFf)('ffmpeg', [
|
|
153
201
|
'-i',
|
|
154
202
|
audio,
|
|
155
203
|
'-c:a',
|
|
156
|
-
|
|
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
|
-
|
|
161
|
-
|
|
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
|
-
|
|
211
|
+
cancelSignal === null || cancelSignal === void 0 ? void 0 : cancelSignal(() => {
|
|
164
212
|
ffmpegTask.kill();
|
|
165
213
|
});
|
|
166
214
|
await ffmpegTask;
|
|
167
|
-
|
|
215
|
+
onProgress === null || onProgress === void 0 ? void 0 : onProgress(expectedFrames);
|
|
168
216
|
if (audio) {
|
|
169
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
191
|
-
|
|
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', `${
|
|
196
|
-
['-start_number', String(
|
|
197
|
-
['-i',
|
|
244
|
+
['-s', `${width}x${height}`],
|
|
245
|
+
['-start_number', String(assetsInfo.firstFrameIndex)],
|
|
246
|
+
['-i', assetsInfo.imageSequenceName],
|
|
198
247
|
]),
|
|
199
248
|
audio ? ['-i', audio] : null,
|
|
200
|
-
|
|
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
|
-
...(
|
|
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
|
-
|
|
263
|
+
...(0, crf_1.validateQualitySettings)({
|
|
264
|
+
crf,
|
|
265
|
+
videoBitrate,
|
|
266
|
+
codec,
|
|
267
|
+
}),
|
|
219
268
|
]),
|
|
220
269
|
codec === 'h264' ? ['-movflags', 'faststart'] : null,
|
|
221
|
-
|
|
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
|
-
|
|
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
|
-
|
|
232
|
-
|
|
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 =
|
|
240
|
-
?
|
|
286
|
+
const finalFfmpegString = ffmpegOverride
|
|
287
|
+
? ffmpegOverride({ type: 'stitcher', args: ffmpegString })
|
|
241
288
|
: ffmpegString;
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
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
|
-
|
|
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
|
-
(
|
|
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 (
|
|
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)(
|
|
331
|
+
(0, delete_directory_1.deleteDirectory)(assetsInfo.downloadMap.audioPreprocessing);
|
|
279
332
|
if (tempFile === null) {
|
|
280
|
-
(0, delete_directory_1.deleteDirectory)(
|
|
333
|
+
(0, delete_directory_1.deleteDirectory)(assetsInfo.downloadMap.stitchFrames);
|
|
281
334
|
return null;
|
|
282
335
|
}
|
|
283
|
-
return
|
|
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)(
|
|
288
|
-
(0, delete_directory_1.deleteDirectory)(
|
|
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
|
-
|
|
297
|
-
const
|
|
298
|
-
|
|
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(
|
|
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
|
|
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
|
-
|
|
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
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
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;
|