@remotion/renderer 4.0.522 → 4.0.524

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/dist/client.d.ts CHANGED
@@ -422,7 +422,7 @@ export declare const BrowserSafeApis: {
422
422
  enforceAudioOption: {
423
423
  name: string;
424
424
  cliFlag: "enforce-audio-track";
425
- description: () => import("react/jsx-runtime").JSX.Element;
425
+ description: (mode: "cli" | "ssr") => import("react/jsx-runtime").JSX.Element;
426
426
  ssrName: string;
427
427
  docLink: string;
428
428
  type: boolean;
@@ -3973,7 +3973,7 @@ export declare const BrowserSafeApis: {
3973
3973
  readonly enforceAudioTrack: {
3974
3974
  name: string;
3975
3975
  cliFlag: "enforce-audio-track";
3976
- description: () => import("react/jsx-runtime").JSX.Element;
3976
+ description: (mode: "cli" | "ssr") => import("react/jsx-runtime").JSX.Element;
3977
3977
  ssrName: string;
3978
3978
  docLink: string;
3979
3979
  type: boolean;
@@ -7,7 +7,7 @@ export type SeamlessAudioInfo = {
7
7
  trimLeftOffset: number;
8
8
  trimRightOffset: number;
9
9
  };
10
- export declare const createAudio: ({ assets, onDownload, fps, logLevel, onProgress, downloadMap, remotionRoot, indent, binariesDirectory, audioBitrate, audioCodec, cancelSignal, chunkLengthInSeconds, trimLeftOffset, trimRightOffset, forSeamlessAacConcatenation, sampleRate, }: {
10
+ export declare const createAudio: ({ assets, onDownload, fps, logLevel, onProgress, downloadMap, remotionRoot, indent, binariesDirectory, audioBitrate, audioCodec, cancelSignal, chunkLengthInSeconds, trimLeftOffset, trimRightOffset, forSeamlessAacConcatenation, sampleRate, enforceAudioTrack, }: {
11
11
  assets: FrameAndAssets[];
12
12
  onDownload: RenderMediaOnDownload | undefined;
13
13
  fps: number;
@@ -25,4 +25,5 @@ export declare const createAudio: ({ assets, onDownload, fps, logLevel, onProgre
25
25
  trimRightOffset: number;
26
26
  forSeamlessAacConcatenation: boolean;
27
27
  sampleRate: number;
28
- }) => Promise<string>;
28
+ enforceAudioTrack: boolean;
29
+ }) => Promise<string | null>;
@@ -16,7 +16,7 @@ const merge_inline_audio_tracks_1 = require("./merge-inline-audio-tracks");
16
16
  const audio_codec_1 = require("./options/audio-codec");
17
17
  const preprocess_audio_track_1 = require("./preprocess-audio-track");
18
18
  const truthy_1 = require("./truthy");
19
- const createAudio = async ({ assets, onDownload, fps, logLevel, onProgress, downloadMap, remotionRoot, indent, binariesDirectory, audioBitrate, audioCodec, cancelSignal, chunkLengthInSeconds, trimLeftOffset, trimRightOffset, forSeamlessAacConcatenation, sampleRate, }) => {
19
+ const createAudio = async ({ assets, onDownload, fps, logLevel, onProgress, downloadMap, remotionRoot, indent, binariesDirectory, audioBitrate, audioCodec, cancelSignal, chunkLengthInSeconds, trimLeftOffset, trimRightOffset, forSeamlessAacConcatenation, sampleRate, enforceAudioTrack, }) => {
20
20
  const fileUrlAssets = await (0, convert_assets_to_file_urls_1.convertAssetsToFileUrls)({
21
21
  assets,
22
22
  onDownload: onDownload !== null && onDownload !== void 0 ? onDownload : (() => () => undefined),
@@ -98,6 +98,11 @@ const createAudio = async ({ assets, onDownload, fps, logLevel, onProgress, down
98
98
  ]
99
99
  : []),
100
100
  ];
101
+ if (!enforceAudioTrack && preprocessed.length === 0) {
102
+ (0, delete_directory_1.deleteDirectory)(downloadMap.audioMixing);
103
+ onProgress(1);
104
+ return null;
105
+ }
101
106
  const merged = path_1.default.join(downloadMap.audioPreprocessing, 'merged.wav');
102
107
  const extension = (0, audio_codec_1.getExtensionFromAudioCodec)(audioCodec);
103
108
  const outName = path_1.default.join(downloadMap.audioPreprocessing, `audio.${extension}`);
@@ -480,7 +480,7 @@ var DEFAULT = null;
480
480
  var cliFlag5 = "separate-audio-to";
481
481
  var separateAudioOption = {
482
482
  cliFlag: cliFlag5,
483
- description: () => `If set, the audio will not be included in the main output but rendered as a separate file at the location you pass. It is recommended to use an absolute path. If a relative path is passed, it is relative to the Remotion Root.`,
483
+ description: () => `If set, the audio will not be included in the main output but rendered as a separate file at the location you pass. If the render contains no audio, a silent audio file is produced even when enforceAudioTrack is false. The muted option still takes precedence. It is recommended to use an absolute path. If a relative path is passed, it is relative to the Remotion Root.`,
484
484
  docLink: "https://remotion.dev/docs/renderer/render-media",
485
485
  getValue: ({ commandLine }) => {
486
486
  if (commandLine[cliFlag5]) {
@@ -1891,15 +1891,71 @@ var encodingMaxRateOption = {
1891
1891
  };
1892
1892
 
1893
1893
  // src/options/enforce-audio.tsx
1894
- import { jsx as jsx28, Fragment as Fragment28 } from "react/jsx-runtime";
1894
+ import { jsx as jsx28, jsxs as jsxs21, Fragment as Fragment28 } from "react/jsx-runtime";
1895
1895
  var DEFAULT_ENFORCE_AUDIO_TRACK = false;
1896
1896
  var enforceAudioTrackState = DEFAULT_ENFORCE_AUDIO_TRACK;
1897
1897
  var cliFlag31 = "enforce-audio-track";
1898
1898
  var enforceAudioOption = {
1899
1899
  name: "Enforce Audio Track",
1900
1900
  cliFlag: cliFlag31,
1901
- description: () => /* @__PURE__ */ jsx28(Fragment28, {
1902
- children: "Render a silent audio track if there would be none otherwise."
1901
+ description: (mode) => /* @__PURE__ */ jsxs21(Fragment28, {
1902
+ children: [
1903
+ /* @__PURE__ */ jsxs21("p", {
1904
+ children: [
1905
+ "Defaults to ",
1906
+ /* @__PURE__ */ jsx28("code", {
1907
+ children: "false"
1908
+ }),
1909
+ ". If ",
1910
+ /* @__PURE__ */ jsx28("code", {
1911
+ children: "true"
1912
+ }),
1913
+ ", include a silent audio track when the render contains no audio. If ",
1914
+ /* @__PURE__ */ jsx28("code", {
1915
+ children: "false"
1916
+ }),
1917
+ ", omit the audio track when no audio is present. Audio-only exports and",
1918
+ " ",
1919
+ /* @__PURE__ */ jsx28("code", {
1920
+ children: mode === "cli" ? "--separate-audio-to" : "separateAudioTo"
1921
+ }),
1922
+ " ",
1923
+ "still produce an audio file, even when silent."
1924
+ ]
1925
+ }),
1926
+ /* @__PURE__ */ jsxs21("p", {
1927
+ children: [
1928
+ mode === "cli" ? /* @__PURE__ */ jsxs21(Fragment28, {
1929
+ children: [
1930
+ "Pass ",
1931
+ /* @__PURE__ */ jsx28("code", {
1932
+ children: "--enforce-audio-track"
1933
+ })
1934
+ ]
1935
+ }) : /* @__PURE__ */ jsxs21(Fragment28, {
1936
+ children: [
1937
+ "Set this to ",
1938
+ /* @__PURE__ */ jsx28("code", {
1939
+ children: "true"
1940
+ })
1941
+ ]
1942
+ }),
1943
+ " ",
1944
+ "for",
1945
+ " ",
1946
+ /* @__PURE__ */ jsx28("a", {
1947
+ href: "/docs/distributed-rendering",
1948
+ children: "chunks that will later be concatenated"
1949
+ }),
1950
+ ", because other chunks may contain audio.",
1951
+ " ",
1952
+ /* @__PURE__ */ jsx28("code", {
1953
+ children: mode === "cli" ? "--muted" : "muted: true"
1954
+ }),
1955
+ " takes precedence."
1956
+ ]
1957
+ })
1958
+ ]
1903
1959
  }),
1904
1960
  ssrName: "enforceAudioTrack",
1905
1961
  docLink: "https://www.remotion.dev/docs/config#setenforceaudiotrack-",
@@ -1929,13 +1985,13 @@ var enforceAudioOption = {
1929
1985
  };
1930
1986
 
1931
1987
  // src/options/env-file.tsx
1932
- import { jsx as jsx29, jsxs as jsxs21, Fragment as Fragment29 } from "react/jsx-runtime";
1988
+ import { jsx as jsx29, jsxs as jsxs22, Fragment as Fragment29 } from "react/jsx-runtime";
1933
1989
  var cliFlag32 = "env-file";
1934
1990
  var envFileLocation = null;
1935
1991
  var envFileOption = {
1936
1992
  name: "Env File",
1937
1993
  cliFlag: cliFlag32,
1938
- description: () => /* @__PURE__ */ jsxs21(Fragment29, {
1994
+ description: () => /* @__PURE__ */ jsxs22(Fragment29, {
1939
1995
  children: [
1940
1996
  "Specify a location for a dotenv file. Default ",
1941
1997
  /* @__PURE__ */ jsx29("code", {
@@ -1972,14 +2028,14 @@ var envFileOption = {
1972
2028
  };
1973
2029
 
1974
2030
  // src/options/every-nth-frame.tsx
1975
- import { jsx as jsx30, jsxs as jsxs22, Fragment as Fragment30 } from "react/jsx-runtime";
2031
+ import { jsx as jsx30, jsxs as jsxs23, Fragment as Fragment30 } from "react/jsx-runtime";
1976
2032
  var DEFAULT_EVERY_NTH_FRAME = 1;
1977
2033
  var everyNthFrame = DEFAULT_EVERY_NTH_FRAME;
1978
2034
  var cliFlag33 = "every-nth-frame";
1979
2035
  var everyNthFrameOption = {
1980
2036
  name: "Every nth frame",
1981
2037
  cliFlag: cliFlag33,
1982
- description: () => /* @__PURE__ */ jsxs22(Fragment30, {
2038
+ description: () => /* @__PURE__ */ jsxs23(Fragment30, {
1983
2039
  children: [
1984
2040
  "This option may only be set when rendering GIFs. It determines how many frames are rendered, while the other ones get skipped in order to lower the FPS of the GIF. For example, if the ",
1985
2041
  /* @__PURE__ */ jsx30("code", {
@@ -2025,13 +2081,13 @@ var everyNthFrameOption = {
2025
2081
  };
2026
2082
 
2027
2083
  // src/options/experimental-keep-audio-context-alive.tsx
2028
- import { jsx as jsx31, jsxs as jsxs23, Fragment as Fragment31 } from "react/jsx-runtime";
2084
+ import { jsx as jsx31, jsxs as jsxs24, Fragment as Fragment31 } from "react/jsx-runtime";
2029
2085
  var experimentalKeepAudioContextAlive = false;
2030
2086
  var cliFlag34 = "experimental-keep-audio-context-alive";
2031
2087
  var experimentalKeepAudioContextAliveOption = {
2032
2088
  name: "Keep AudioContext alive (experimental)",
2033
2089
  cliFlag: cliFlag34,
2034
- description: () => /* @__PURE__ */ jsxs23(Fragment31, {
2090
+ description: () => /* @__PURE__ */ jsxs24(Fragment31, {
2035
2091
  children: [
2036
2092
  "Keeps the shared ",
2037
2093
  /* @__PURE__ */ jsx31("code", {
@@ -2062,14 +2118,14 @@ var experimentalKeepAudioContextAliveOption = {
2062
2118
  };
2063
2119
 
2064
2120
  // src/options/folder-expiry.tsx
2065
- import { jsx as jsx32, jsxs as jsxs24, Fragment as Fragment32 } from "react/jsx-runtime";
2121
+ import { jsx as jsx32, jsxs as jsxs25, Fragment as Fragment32 } from "react/jsx-runtime";
2066
2122
  var enableFolderExpiry = null;
2067
2123
  var cliFlag35 = "enable-folder-expiry";
2068
2124
  var folderExpiryOption = {
2069
2125
  name: "Lambda render expiration",
2070
2126
  cliFlag: cliFlag35,
2071
2127
  description: () => {
2072
- return /* @__PURE__ */ jsxs24(Fragment32, {
2128
+ return /* @__PURE__ */ jsxs25(Fragment32, {
2073
2129
  children: [
2074
2130
  "When deploying sites, enable or disable S3 Lifecycle policies which allow for renders to auto-delete after a certain time. Default is",
2075
2131
  " ",
@@ -2113,14 +2169,14 @@ var folderExpiryOption = {
2113
2169
  };
2114
2170
 
2115
2171
  // src/options/for-seamless-aac-concatenation.tsx
2116
- import { jsx as jsx33, jsxs as jsxs25, Fragment as Fragment33 } from "react/jsx-runtime";
2172
+ import { jsx as jsx33, jsxs as jsxs26, Fragment as Fragment33 } from "react/jsx-runtime";
2117
2173
  var DEFAULT3 = false;
2118
2174
  var forSeamlessAacConcatenation = DEFAULT3;
2119
2175
  var cliFlag36 = "for-seamless-aac-concatenation";
2120
2176
  var forSeamlessAacConcatenationOption = {
2121
2177
  name: "For seamless AAC concatenation",
2122
2178
  cliFlag: cliFlag36,
2123
- description: () => /* @__PURE__ */ jsxs25(Fragment33, {
2179
+ description: () => /* @__PURE__ */ jsxs26(Fragment33, {
2124
2180
  children: [
2125
2181
  "If enabled, the audio is trimmed to the nearest AAC frame, which is required for seamless concatenation of AAC files. This is a requirement if you later want to combine multiple video snippets seamlessly.",
2126
2182
  /* @__PURE__ */ jsx33("br", {}),
@@ -2302,7 +2358,7 @@ var validateSelectedFrames = ({
2302
2358
  };
2303
2359
 
2304
2360
  // src/options/frames.tsx
2305
- import { jsx as jsx35, jsxs as jsxs26, Fragment as Fragment35 } from "react/jsx-runtime";
2361
+ import { jsx as jsx35, jsxs as jsxs27, Fragment as Fragment35 } from "react/jsx-runtime";
2306
2362
  var cliFlag38 = "frames";
2307
2363
  var frameSelection = null;
2308
2364
  var parseFrameRangeFromCli = (newFrameRange) => {
@@ -2381,7 +2437,7 @@ var parseFrameRangeFromCli = (newFrameRange) => {
2381
2437
  var framesOption = {
2382
2438
  name: "Frame Range",
2383
2439
  cliFlag: cliFlag38,
2384
- description: () => /* @__PURE__ */ jsxs26(Fragment35, {
2440
+ description: () => /* @__PURE__ */ jsxs27(Fragment35, {
2385
2441
  children: [
2386
2442
  "Render a subset of a video. Pass a single number to render a still, or a range (e.g. ",
2387
2443
  /* @__PURE__ */ jsx35("code", {
@@ -2432,7 +2488,7 @@ var framesOption = {
2432
2488
 
2433
2489
  // src/options/gl.tsx
2434
2490
  import { NoReactInternals as NoReactInternals2 } from "remotion/no-react";
2435
- import { jsx as jsx36, jsxs as jsxs27, Fragment as Fragment36 } from "react/jsx-runtime";
2491
+ import { jsx as jsx36, jsxs as jsxs28, Fragment as Fragment36 } from "react/jsx-runtime";
2436
2492
  var validOpenGlRenderers = [
2437
2493
  "swangle",
2438
2494
  "angle",
@@ -2447,15 +2503,15 @@ var getDefaultOpenGlRenderer = (enableV5BreakingChanges) => {
2447
2503
  var DEFAULT_OPENGL_RENDERER = getDefaultOpenGlRenderer(NoReactInternals2.ENABLE_V5_BREAKING_CHANGES);
2448
2504
  var openGlRenderer = DEFAULT_OPENGL_RENDERER;
2449
2505
  var AngleChangelog = () => {
2450
- return /* @__PURE__ */ jsxs27("details", {
2506
+ return /* @__PURE__ */ jsxs28("details", {
2451
2507
  style: { fontSize: "0.9em", marginBottom: "1em" },
2452
2508
  children: [
2453
2509
  /* @__PURE__ */ jsx36("summary", {
2454
2510
  children: "Changelog"
2455
2511
  }),
2456
- /* @__PURE__ */ jsxs27("ul", {
2512
+ /* @__PURE__ */ jsxs28("ul", {
2457
2513
  children: [
2458
- /* @__PURE__ */ jsxs27("li", {
2514
+ /* @__PURE__ */ jsxs28("li", {
2459
2515
  children: [
2460
2516
  "From Remotion v2.6.7 until v3.0.7, the default for Remotion Lambda was",
2461
2517
  " ",
@@ -2470,7 +2526,7 @@ var AngleChangelog = () => {
2470
2526
  " (Swiftshader on Angle) since Chrome 101 added support for it."
2471
2527
  ]
2472
2528
  }),
2473
- /* @__PURE__ */ jsxs27("li", {
2529
+ /* @__PURE__ */ jsxs28("li", {
2474
2530
  children: [
2475
2531
  "From Remotion v2.4.3 until v2.6.6, the default was ",
2476
2532
  /* @__PURE__ */ jsx36("code", {
@@ -2479,7 +2535,7 @@ var AngleChangelog = () => {
2479
2535
  ", however it turns out to have a small memory leak that could crash long Remotion renders."
2480
2536
  ]
2481
2537
  }),
2482
- NoReactInternals2.ENABLE_V5_BREAKING_CHANGES ? /* @__PURE__ */ jsxs27("li", {
2538
+ NoReactInternals2.ENABLE_V5_BREAKING_CHANGES ? /* @__PURE__ */ jsxs28("li", {
2483
2539
  children: [
2484
2540
  "From Remotion v5.0, the default is ",
2485
2541
  /* @__PURE__ */ jsx36("code", {
@@ -2501,17 +2557,17 @@ var glOption = {
2501
2557
  type: "angle",
2502
2558
  ssrName: "gl",
2503
2559
  description: () => {
2504
- return /* @__PURE__ */ jsxs27(Fragment36, {
2560
+ return /* @__PURE__ */ jsxs28(Fragment36, {
2505
2561
  children: [
2506
2562
  /* @__PURE__ */ jsx36(AngleChangelog, {}),
2507
- /* @__PURE__ */ jsxs27("p", {
2563
+ /* @__PURE__ */ jsxs28("p", {
2508
2564
  children: [
2509
2565
  "Select the OpenGL renderer backend for Chromium. ",
2510
2566
  /* @__PURE__ */ jsx36("br", {}),
2511
2567
  "Accepted values:"
2512
2568
  ]
2513
2569
  }),
2514
- /* @__PURE__ */ jsxs27("ul", {
2570
+ /* @__PURE__ */ jsxs28("ul", {
2515
2571
  children: [
2516
2572
  /* @__PURE__ */ jsx36("li", {
2517
2573
  children: /* @__PURE__ */ jsx36("code", {
@@ -2533,7 +2589,7 @@ var glOption = {
2533
2589
  children: '"swangle"'
2534
2590
  })
2535
2591
  }),
2536
- /* @__PURE__ */ jsxs27("li", {
2592
+ /* @__PURE__ */ jsxs28("li", {
2537
2593
  children: [
2538
2594
  /* @__PURE__ */ jsx36("code", {
2539
2595
  children: '"vulkan"'
@@ -2545,7 +2601,7 @@ var glOption = {
2545
2601
  ")"
2546
2602
  ]
2547
2603
  }),
2548
- /* @__PURE__ */ jsxs27("li", {
2604
+ /* @__PURE__ */ jsxs28("li", {
2549
2605
  children: [
2550
2606
  /* @__PURE__ */ jsx36("code", {
2551
2607
  children: '"angle-egl"'
@@ -2559,7 +2615,7 @@ var glOption = {
2559
2615
  })
2560
2616
  ]
2561
2617
  }),
2562
- /* @__PURE__ */ jsxs27("p", {
2618
+ /* @__PURE__ */ jsxs28("p", {
2563
2619
  children: [
2564
2620
  "The default is",
2565
2621
  " ",
@@ -2612,7 +2668,7 @@ var validateOpenGlRenderer = (option2) => {
2612
2668
  };
2613
2669
 
2614
2670
  // src/options/gop-size.tsx
2615
- import { jsx as jsx37, jsxs as jsxs28, Fragment as Fragment37 } from "react/jsx-runtime";
2671
+ import { jsx as jsx37, jsxs as jsxs29, Fragment as Fragment37 } from "react/jsx-runtime";
2616
2672
  var gopSize = null;
2617
2673
  var validateGopSize = (value) => {
2618
2674
  if (value === null) {
@@ -2626,7 +2682,7 @@ var cliFlag40 = "gop";
2626
2682
  var gopSizeOption = {
2627
2683
  name: "GOP size",
2628
2684
  cliFlag: cliFlag40,
2629
- description: () => /* @__PURE__ */ jsxs28(Fragment37, {
2685
+ description: () => /* @__PURE__ */ jsxs29(Fragment37, {
2630
2686
  children: [
2631
2687
  "Set the maximum number of frames between two keyframes. This maps to FFmpeg's ",
2632
2688
  /* @__PURE__ */ jsx37("code", {
@@ -2706,14 +2762,14 @@ var hardwareAccelerationOption = {
2706
2762
  };
2707
2763
 
2708
2764
  // src/options/headless.tsx
2709
- import { jsx as jsx38, jsxs as jsxs29, Fragment as Fragment38 } from "react/jsx-runtime";
2765
+ import { jsx as jsx38, jsxs as jsxs30, Fragment as Fragment38 } from "react/jsx-runtime";
2710
2766
  var DEFAULT4 = true;
2711
2767
  var headlessMode = DEFAULT4;
2712
2768
  var cliFlag42 = "disable-headless";
2713
2769
  var headlessOption = {
2714
2770
  name: "Disable Headless Mode",
2715
2771
  cliFlag: cliFlag42,
2716
- description: () => /* @__PURE__ */ jsxs29(Fragment38, {
2772
+ description: () => /* @__PURE__ */ jsxs30(Fragment38, {
2717
2773
  children: [
2718
2774
  "If disabled, the render will open an actual Chrome window where you can see the render happen. This requires",
2719
2775
  " ",
@@ -2790,13 +2846,13 @@ var ignoreCertificateErrorsOption = {
2790
2846
  };
2791
2847
 
2792
2848
  // src/options/image-sequence.tsx
2793
- import { jsx as jsx40, jsxs as jsxs30, Fragment as Fragment40 } from "react/jsx-runtime";
2849
+ import { jsx as jsx40, jsxs as jsxs31, Fragment as Fragment40 } from "react/jsx-runtime";
2794
2850
  var cliFlag44 = "sequence";
2795
2851
  var imageSequence = false;
2796
2852
  var imageSequenceOption = {
2797
2853
  name: "Image Sequence",
2798
2854
  cliFlag: cliFlag44,
2799
- description: () => /* @__PURE__ */ jsxs30(Fragment40, {
2855
+ description: () => /* @__PURE__ */ jsxs31(Fragment40, {
2800
2856
  children: [
2801
2857
  "Pass this flag to output an image sequence instead of a video. The default image format is JPEG. See",
2802
2858
  " ",
@@ -2832,14 +2888,14 @@ var imageSequenceOption = {
2832
2888
  };
2833
2889
 
2834
2890
  // src/options/image-sequence-pattern.tsx
2835
- import { jsx as jsx41, jsxs as jsxs31, Fragment as Fragment41 } from "react/jsx-runtime";
2891
+ import { jsx as jsx41, jsxs as jsxs32, Fragment as Fragment41 } from "react/jsx-runtime";
2836
2892
  var cliFlag45 = "image-sequence-pattern";
2837
2893
  var currentImageSequencePattern = null;
2838
2894
  var imageSequencePatternOption = {
2839
2895
  name: "Image Sequence Pattern",
2840
2896
  cliFlag: cliFlag45,
2841
2897
  ssrName: "imageSequencePattern",
2842
- description: () => /* @__PURE__ */ jsxs31(Fragment41, {
2898
+ description: () => /* @__PURE__ */ jsxs32(Fragment41, {
2843
2899
  children: [
2844
2900
  "Pattern for naming image sequence files. Supports ",
2845
2901
  /* @__PURE__ */ jsx41("code", {
@@ -2946,13 +3002,13 @@ var ipv4Option = {
2946
3002
  };
2947
3003
 
2948
3004
  // src/options/is-production.tsx
2949
- import { jsx as jsx44, jsxs as jsxs32, Fragment as Fragment44 } from "react/jsx-runtime";
3005
+ import { jsx as jsx44, jsxs as jsxs33, Fragment as Fragment44 } from "react/jsx-runtime";
2950
3006
  var cliFlag48 = "is-production";
2951
3007
  var currentIsProductionKey = null;
2952
3008
  var isProductionOption = {
2953
3009
  name: "Is Production",
2954
3010
  cliFlag: cliFlag48,
2955
- description: () => /* @__PURE__ */ jsxs32(Fragment44, {
3011
+ description: () => /* @__PURE__ */ jsxs33(Fragment44, {
2956
3012
  children: [
2957
3013
  "Pass ",
2958
3014
  /* @__PURE__ */ jsx44("code", {
@@ -3078,13 +3134,13 @@ var keyboardShortcutsOption = {
3078
3134
  };
3079
3135
 
3080
3136
  // src/options/latency-hint.tsx
3081
- import { jsx as jsx47, jsxs as jsxs33, Fragment as Fragment47 } from "react/jsx-runtime";
3137
+ import { jsx as jsx47, jsxs as jsxs34, Fragment as Fragment47 } from "react/jsx-runtime";
3082
3138
  var cliFlag51 = "audio-latency-hint";
3083
3139
  var value = null;
3084
3140
  var audioLatencyHintOption = {
3085
3141
  name: "Audio Latency Hint",
3086
3142
  cliFlag: cliFlag51,
3087
- description: () => /* @__PURE__ */ jsxs33(Fragment47, {
3143
+ description: () => /* @__PURE__ */ jsxs34(Fragment47, {
3088
3144
  children: [
3089
3145
  "Sets the",
3090
3146
  " ",
@@ -3138,13 +3194,13 @@ var audioLatencyHintOption = {
3138
3194
  };
3139
3195
 
3140
3196
  // src/options/license-key.tsx
3141
- import { jsx as jsx48, jsxs as jsxs34, Fragment as Fragment48 } from "react/jsx-runtime";
3197
+ import { jsx as jsx48, jsxs as jsxs35, Fragment as Fragment48 } from "react/jsx-runtime";
3142
3198
  var currentLicenseKey = null;
3143
3199
  var cliFlag52 = "license-key";
3144
3200
  var licenseKeyOption = {
3145
3201
  name: "License key",
3146
3202
  cliFlag: cliFlag52,
3147
- description: () => /* @__PURE__ */ jsxs34(Fragment48, {
3203
+ description: () => /* @__PURE__ */ jsxs35(Fragment48, {
3148
3204
  children: [
3149
3205
  "License key for sending a usage event using",
3150
3206
  " ",
@@ -3176,7 +3232,7 @@ var licenseKeyOption = {
3176
3232
  };
3177
3233
 
3178
3234
  // src/options/log-level.tsx
3179
- import { jsx as jsx49, jsxs as jsxs35, Fragment as Fragment49 } from "react/jsx-runtime";
3235
+ import { jsx as jsx49, jsxs as jsxs36, Fragment as Fragment49 } from "react/jsx-runtime";
3180
3236
  var logLevel = "info";
3181
3237
  var configuredLogLevel = null;
3182
3238
  var cliFlag53 = "log";
@@ -3184,7 +3240,7 @@ var logLevelOption = {
3184
3240
  cliFlag: cliFlag53,
3185
3241
  name: "Log Level",
3186
3242
  ssrName: "logLevel",
3187
- description: () => /* @__PURE__ */ jsxs35(Fragment49, {
3243
+ description: () => /* @__PURE__ */ jsxs36(Fragment49, {
3188
3244
  children: [
3189
3245
  "One of ",
3190
3246
  /* @__PURE__ */ jsx49("code", {
@@ -3246,7 +3302,7 @@ var logLevelOption = {
3246
3302
  };
3247
3303
 
3248
3304
  // src/options/metadata.tsx
3249
- import { jsx as jsx50, jsxs as jsxs36, Fragment as Fragment50 } from "react/jsx-runtime";
3305
+ import { jsx as jsx50, jsxs as jsxs37, Fragment as Fragment50 } from "react/jsx-runtime";
3250
3306
  var metadata = {};
3251
3307
  var cliFlag54 = "metadata";
3252
3308
  var metadataOption = {
@@ -3254,7 +3310,7 @@ var metadataOption = {
3254
3310
  cliFlag: cliFlag54,
3255
3311
  description: (mode) => {
3256
3312
  if (mode === "ssr") {
3257
- return /* @__PURE__ */ jsxs36(Fragment50, {
3313
+ return /* @__PURE__ */ jsxs37(Fragment50, {
3258
3314
  children: [
3259
3315
  "An object containing metadata to be embedded in the video. See",
3260
3316
  " ",
@@ -3266,7 +3322,7 @@ var metadataOption = {
3266
3322
  ]
3267
3323
  });
3268
3324
  }
3269
- return /* @__PURE__ */ jsxs36(Fragment50, {
3325
+ return /* @__PURE__ */ jsxs37(Fragment50, {
3270
3326
  children: [
3271
3327
  "Metadata to be embedded in the video. See",
3272
3328
  " ",
@@ -3393,7 +3449,7 @@ var noOpenOption = {
3393
3449
  };
3394
3450
 
3395
3451
  // src/options/number-of-gif-loops.tsx
3396
- import { jsx as jsx53, jsxs as jsxs37, Fragment as Fragment53 } from "react/jsx-runtime";
3452
+ import { jsx as jsx53, jsxs as jsxs38, Fragment as Fragment53 } from "react/jsx-runtime";
3397
3453
  var currentLoop = null;
3398
3454
  var validate = (newLoop) => {
3399
3455
  if (newLoop !== null && typeof newLoop !== "number") {
@@ -3405,12 +3461,12 @@ var numberOfGifLoopsOption = {
3405
3461
  name: "Number of GIF loops",
3406
3462
  cliFlag: cliFlag57,
3407
3463
  description: () => {
3408
- return /* @__PURE__ */ jsxs37(Fragment53, {
3464
+ return /* @__PURE__ */ jsxs38(Fragment53, {
3409
3465
  children: [
3410
3466
  "Allows you to set the number of loops as follows:",
3411
- /* @__PURE__ */ jsxs37("ul", {
3467
+ /* @__PURE__ */ jsxs38("ul", {
3412
3468
  children: [
3413
- /* @__PURE__ */ jsxs37("li", {
3469
+ /* @__PURE__ */ jsxs38("li", {
3414
3470
  children: [
3415
3471
  /* @__PURE__ */ jsx53("code", {
3416
3472
  children: "null"
@@ -3418,7 +3474,7 @@ var numberOfGifLoopsOption = {
3418
3474
  " (or omitting in the CLI) plays the GIF indefinitely."
3419
3475
  ]
3420
3476
  }),
3421
- /* @__PURE__ */ jsxs37("li", {
3477
+ /* @__PURE__ */ jsxs38("li", {
3422
3478
  children: [
3423
3479
  /* @__PURE__ */ jsx53("code", {
3424
3480
  children: "0"
@@ -3426,7 +3482,7 @@ var numberOfGifLoopsOption = {
3426
3482
  " disables looping"
3427
3483
  ]
3428
3484
  }),
3429
- /* @__PURE__ */ jsxs37("li", {
3485
+ /* @__PURE__ */ jsxs38("li", {
3430
3486
  children: [
3431
3487
  /* @__PURE__ */ jsx53("code", {
3432
3488
  children: "1"
@@ -3434,7 +3490,7 @@ var numberOfGifLoopsOption = {
3434
3490
  " loops the GIF once (plays twice in total)"
3435
3491
  ]
3436
3492
  }),
3437
- /* @__PURE__ */ jsxs37("li", {
3493
+ /* @__PURE__ */ jsxs38("li", {
3438
3494
  children: [
3439
3495
  /* @__PURE__ */ jsx53("code", {
3440
3496
  children: "2"
@@ -3477,14 +3533,14 @@ var numberOfGifLoopsOption = {
3477
3533
  };
3478
3534
 
3479
3535
  // src/options/number-of-shared-audio-tags.tsx
3480
- import { jsx as jsx54, jsxs as jsxs38, Fragment as Fragment54 } from "react/jsx-runtime";
3536
+ import { jsx as jsx54, jsxs as jsxs39, Fragment as Fragment54 } from "react/jsx-runtime";
3481
3537
  var numberOfSharedAudioTags = 0;
3482
3538
  var configuredNumberOfSharedAudioTags = null;
3483
3539
  var cliFlag58 = "number-of-shared-audio-tags";
3484
3540
  var numberOfSharedAudioTagsOption = {
3485
3541
  name: "Number of shared audio tags",
3486
3542
  cliFlag: cliFlag58,
3487
- description: () => /* @__PURE__ */ jsxs38(Fragment54, {
3543
+ description: () => /* @__PURE__ */ jsxs39(Fragment54, {
3488
3544
  children: [
3489
3545
  "Set number of shared audio tags. See",
3490
3546
  " ",
@@ -3524,13 +3580,13 @@ var numberOfSharedAudioTagsOption = {
3524
3580
  };
3525
3581
 
3526
3582
  // src/options/offthreadvideo-cache-size.tsx
3527
- import { jsx as jsx55, jsxs as jsxs39, Fragment as Fragment55 } from "react/jsx-runtime";
3583
+ import { jsx as jsx55, jsxs as jsxs40, Fragment as Fragment55 } from "react/jsx-runtime";
3528
3584
  var offthreadVideoCacheSizeInBytes = null;
3529
3585
  var cliFlag59 = "offthreadvideo-cache-size-in-bytes";
3530
3586
  var offthreadVideoCacheSizeInBytesOption = {
3531
3587
  name: "OffthreadVideo cache size",
3532
3588
  cliFlag: cliFlag59,
3533
- description: () => /* @__PURE__ */ jsxs39(Fragment55, {
3589
+ description: () => /* @__PURE__ */ jsxs40(Fragment55, {
3534
3590
  children: [
3535
3591
  "From v4.0, Remotion has a cache for",
3536
3592
  " ",
@@ -3585,13 +3641,13 @@ var offthreadVideoCacheSizeInBytesOption = {
3585
3641
  };
3586
3642
 
3587
3643
  // src/options/offthreadvideo-threads.tsx
3588
- import { jsx as jsx56, jsxs as jsxs40, Fragment as Fragment56 } from "react/jsx-runtime";
3644
+ import { jsx as jsx56, jsxs as jsxs41, Fragment as Fragment56 } from "react/jsx-runtime";
3589
3645
  var value2 = null;
3590
3646
  var cliFlag60 = "offthreadvideo-video-threads";
3591
3647
  var offthreadVideoThreadsOption = {
3592
3648
  name: "OffthreadVideo threads",
3593
3649
  cliFlag: cliFlag60,
3594
- description: () => /* @__PURE__ */ jsxs40(Fragment56, {
3650
+ description: () => /* @__PURE__ */ jsxs41(Fragment56, {
3595
3651
  children: [
3596
3652
  "The number of threads that",
3597
3653
  /* @__PURE__ */ jsx56("a", {
@@ -3636,12 +3692,12 @@ var offthreadVideoThreadsOption = {
3636
3692
  var DEFAULT_RENDER_FRAMES_OFFTHREAD_VIDEO_THREADS = 2;
3637
3693
 
3638
3694
  // src/options/on-browser-download.tsx
3639
- import { jsx as jsx57, jsxs as jsxs41, Fragment as Fragment57 } from "react/jsx-runtime";
3695
+ import { jsx as jsx57, jsxs as jsxs42, Fragment as Fragment57 } from "react/jsx-runtime";
3640
3696
  var cliFlag61 = "on-browser-download";
3641
3697
  var onBrowserDownloadOption = {
3642
3698
  name: "Browser download callback function",
3643
3699
  cliFlag: cliFlag61,
3644
- description: () => /* @__PURE__ */ jsxs41(Fragment57, {
3700
+ description: () => /* @__PURE__ */ jsxs42(Fragment57, {
3645
3701
  children: [
3646
3702
  "Gets called when no compatible local browser is detected on the system and this API needs to download a browser. Return a callback to observe progress.",
3647
3703
  " ",
@@ -3664,14 +3720,14 @@ var onBrowserDownloadOption = {
3664
3720
  };
3665
3721
 
3666
3722
  // src/options/out-dir.tsx
3667
- import { jsx as jsx58, jsxs as jsxs42, Fragment as Fragment58 } from "react/jsx-runtime";
3723
+ import { jsx as jsx58, jsxs as jsxs43, Fragment as Fragment58 } from "react/jsx-runtime";
3668
3724
  var cliFlag62 = "out-dir";
3669
3725
  var currentOutDir = null;
3670
3726
  var outDirOption = {
3671
3727
  name: "Output Directory",
3672
3728
  cliFlag: cliFlag62,
3673
3729
  description: () => {
3674
- return /* @__PURE__ */ jsxs42(Fragment58, {
3730
+ return /* @__PURE__ */ jsxs43(Fragment58, {
3675
3731
  children: [
3676
3732
  "Define the location of the resulting bundle. By default it is a folder called ",
3677
3733
  /* @__PURE__ */ jsx58("code", {
@@ -3899,7 +3955,7 @@ var overrideWidthOption = {
3899
3955
  };
3900
3956
 
3901
3957
  // src/options/overwrite.tsx
3902
- import { jsx as jsx63, jsxs as jsxs43, Fragment as Fragment63 } from "react/jsx-runtime";
3958
+ import { jsx as jsx63, jsxs as jsxs44, Fragment as Fragment63 } from "react/jsx-runtime";
3903
3959
  var shouldOverwrite = null;
3904
3960
  var cliFlag67 = "overwrite";
3905
3961
  var validate2 = (value3) => {
@@ -3910,7 +3966,7 @@ var validate2 = (value3) => {
3910
3966
  var overwriteOption = {
3911
3967
  name: "Overwrite output",
3912
3968
  cliFlag: cliFlag67,
3913
- description: () => /* @__PURE__ */ jsxs43(Fragment63, {
3969
+ description: () => /* @__PURE__ */ jsxs44(Fragment63, {
3914
3970
  children: [
3915
3971
  "If set to ",
3916
3972
  /* @__PURE__ */ jsx63("code", {
@@ -3956,14 +4012,14 @@ var overwriteOption = {
3956
4012
  };
3957
4013
 
3958
4014
  // src/options/package-manager.tsx
3959
- import { jsx as jsx64, jsxs as jsxs44, Fragment as Fragment64 } from "react/jsx-runtime";
4015
+ import { jsx as jsx64, jsxs as jsxs45, Fragment as Fragment64 } from "react/jsx-runtime";
3960
4016
  var cliFlag68 = "package-manager";
3961
4017
  var currentPackageManager = null;
3962
4018
  var packageManagerOption = {
3963
4019
  name: "Package Manager",
3964
4020
  cliFlag: cliFlag68,
3965
4021
  description: () => {
3966
- return /* @__PURE__ */ jsxs44(Fragment64, {
4022
+ return /* @__PURE__ */ jsxs45(Fragment64, {
3967
4023
  children: [
3968
4024
  "Forces a specific package manager to be used. By default, Remotion will auto-detect the package manager based on your lockfile.",
3969
4025
  /* @__PURE__ */ jsx64("br", {}),
@@ -4039,13 +4095,13 @@ var validPixelFormatsForCodec = (codec) => {
4039
4095
  };
4040
4096
 
4041
4097
  // src/options/pixel-format.tsx
4042
- import { jsx as jsx65, jsxs as jsxs45, Fragment as Fragment65 } from "react/jsx-runtime";
4098
+ import { jsx as jsx65, jsxs as jsxs46, Fragment as Fragment65 } from "react/jsx-runtime";
4043
4099
  var currentPixelFormat = DEFAULT_PIXEL_FORMAT;
4044
4100
  var cliFlag69 = "pixel-format";
4045
4101
  var pixelFormatOption = {
4046
4102
  name: "Pixel format",
4047
4103
  cliFlag: cliFlag69,
4048
- description: () => /* @__PURE__ */ jsxs45(Fragment65, {
4104
+ description: () => /* @__PURE__ */ jsxs46(Fragment65, {
4049
4105
  children: [
4050
4106
  "Sets the pixel format in FFmpeg. See",
4051
4107
  " ",
@@ -4138,13 +4194,13 @@ var portOption = {
4138
4194
  };
4139
4195
 
4140
4196
  // src/options/prefer-lossless.tsx
4141
- import { jsx as jsx67, jsxs as jsxs46, Fragment as Fragment67 } from "react/jsx-runtime";
4197
+ import { jsx as jsx67, jsxs as jsxs47, Fragment as Fragment67 } from "react/jsx-runtime";
4142
4198
  var cliFlag71 = "prefer-lossless";
4143
4199
  var input = false;
4144
4200
  var preferLosslessAudioOption = {
4145
4201
  name: "Prefer lossless",
4146
4202
  cliFlag: cliFlag71,
4147
- description: () => /* @__PURE__ */ jsxs46(Fragment67, {
4203
+ description: () => /* @__PURE__ */ jsxs47(Fragment67, {
4148
4204
  children: [
4149
4205
  "Uses a lossless audio codec, if one is available for the codec. If you set",
4150
4206
  /* @__PURE__ */ jsx67("code", {
@@ -4177,13 +4233,13 @@ var preferLosslessAudioOption = {
4177
4233
  };
4178
4234
 
4179
4235
  // src/options/preview-sample-rate.tsx
4180
- import { jsx as jsx68, jsxs as jsxs47, Fragment as Fragment68 } from "react/jsx-runtime";
4236
+ import { jsx as jsx68, jsxs as jsxs48, Fragment as Fragment68 } from "react/jsx-runtime";
4181
4237
  var cliFlag72 = "preview-sample-rate";
4182
4238
  var currentPreviewSampleRate = null;
4183
4239
  var previewSampleRateOption = {
4184
4240
  name: "Preview Sample Rate",
4185
4241
  cliFlag: cliFlag72,
4186
- description: () => /* @__PURE__ */ jsxs47(Fragment68, {
4242
+ description: () => /* @__PURE__ */ jsxs48(Fragment68, {
4187
4243
  children: [
4188
4244
  "Controls the sample rate used for audio playback during preview. When unset, Remotion uses ",
4189
4245
  /* @__PURE__ */ jsx68("code", {
@@ -4211,15 +4267,15 @@ var previewSampleRateOption = {
4211
4267
  };
4212
4268
 
4213
4269
  // src/options/props.tsx
4214
- import { jsx as jsx69, jsxs as jsxs48, Fragment as Fragment69 } from "react/jsx-runtime";
4270
+ import { jsx as jsx69, jsxs as jsxs49, Fragment as Fragment69 } from "react/jsx-runtime";
4215
4271
  var cliFlag73 = "props";
4216
4272
  var propsOption = {
4217
4273
  name: "Input Props",
4218
4274
  cliFlag: cliFlag73,
4219
- description: () => /* @__PURE__ */ jsxs48(Fragment69, {
4275
+ description: () => /* @__PURE__ */ jsxs49(Fragment69, {
4220
4276
  children: [
4221
4277
  "Input Props to pass to the selected composition of your video. Must be a serialized JSON string (",
4222
- /* @__PURE__ */ jsxs48("code", {
4278
+ /* @__PURE__ */ jsxs49("code", {
4223
4279
  children: [
4224
4280
  "--props='",
4225
4281
  "{",
@@ -4257,7 +4313,7 @@ var propsOption = {
4257
4313
  };
4258
4314
 
4259
4315
  // src/options/prores-profile.tsx
4260
- import { jsx as jsx70, jsxs as jsxs49, Fragment as Fragment70 } from "react/jsx-runtime";
4316
+ import { jsx as jsx70, jsxs as jsxs50, Fragment as Fragment70 } from "react/jsx-runtime";
4261
4317
  var validProResProfiles = [
4262
4318
  "4444-xq",
4263
4319
  "4444",
@@ -4271,7 +4327,7 @@ var cliFlag74 = "prores-profile";
4271
4327
  var proResProfileOption = {
4272
4328
  name: "ProRes profile",
4273
4329
  cliFlag: cliFlag74,
4274
- description: () => /* @__PURE__ */ jsxs49(Fragment70, {
4330
+ description: () => /* @__PURE__ */ jsxs50(Fragment70, {
4275
4331
  children: [
4276
4332
  "Set the ProRes profile. This option is only valid if the codec has been set to ",
4277
4333
  /* @__PURE__ */ jsx70("code", {
@@ -4334,14 +4390,14 @@ var proResProfileOption = {
4334
4390
  };
4335
4391
 
4336
4392
  // src/options/public-dir.tsx
4337
- import { jsx as jsx71, jsxs as jsxs50, Fragment as Fragment71 } from "react/jsx-runtime";
4393
+ import { jsx as jsx71, jsxs as jsxs51, Fragment as Fragment71 } from "react/jsx-runtime";
4338
4394
  var cliFlag75 = "public-dir";
4339
4395
  var currentPublicDir = null;
4340
4396
  var publicDirOption = {
4341
4397
  name: "Public Directory",
4342
4398
  cliFlag: cliFlag75,
4343
4399
  description: () => {
4344
- return /* @__PURE__ */ jsxs50(Fragment71, {
4400
+ return /* @__PURE__ */ jsxs51(Fragment71, {
4345
4401
  children: [
4346
4402
  "Define the location of the",
4347
4403
  " ",
@@ -4383,13 +4439,13 @@ var publicDirOption = {
4383
4439
  };
4384
4440
 
4385
4441
  // src/options/public-license-key.tsx
4386
- import { jsx as jsx72, jsxs as jsxs51, Fragment as Fragment72 } from "react/jsx-runtime";
4442
+ import { jsx as jsx72, jsxs as jsxs52, Fragment as Fragment72 } from "react/jsx-runtime";
4387
4443
  var cliFlag76 = "public-license-key";
4388
4444
  var currentPublicLicenseKey = null;
4389
4445
  var publicLicenseKeyOption = {
4390
4446
  name: "Public License Key",
4391
4447
  cliFlag: cliFlag76,
4392
- description: () => /* @__PURE__ */ jsxs51(Fragment72, {
4448
+ description: () => /* @__PURE__ */ jsxs52(Fragment72, {
4393
4449
  children: [
4394
4450
  "The public license key for your company license, obtained from the License keys page on ",
4395
4451
  /* @__PURE__ */ jsx72("a", {
@@ -4430,14 +4486,14 @@ var publicLicenseKeyOption = {
4430
4486
  };
4431
4487
 
4432
4488
  // src/options/public-path.tsx
4433
- import { jsx as jsx73, jsxs as jsxs52, Fragment as Fragment73 } from "react/jsx-runtime";
4489
+ import { jsx as jsx73, jsxs as jsxs53, Fragment as Fragment73 } from "react/jsx-runtime";
4434
4490
  var cliFlag77 = "public-path";
4435
4491
  var currentPublicPath = null;
4436
4492
  var publicPathOption = {
4437
4493
  name: "Public Path",
4438
4494
  cliFlag: cliFlag77,
4439
4495
  description: () => {
4440
- return /* @__PURE__ */ jsxs52(Fragment73, {
4496
+ return /* @__PURE__ */ jsxs53(Fragment73, {
4441
4497
  children: [
4442
4498
  "The path of the URL where the bundle is going to be hosted. By default it is ",
4443
4499
  /* @__PURE__ */ jsx73("code", {
@@ -4555,14 +4611,14 @@ var rspackOption = {
4555
4611
  };
4556
4612
 
4557
4613
  // src/options/runs.tsx
4558
- import { jsx as jsx76, jsxs as jsxs53, Fragment as Fragment76 } from "react/jsx-runtime";
4614
+ import { jsx as jsx76, jsxs as jsxs54, Fragment as Fragment76 } from "react/jsx-runtime";
4559
4615
  var DEFAULT_RUNS = 3;
4560
4616
  var currentRuns = DEFAULT_RUNS;
4561
4617
  var cliFlag80 = "runs";
4562
4618
  var runsOption = {
4563
4619
  name: "Benchmark runs",
4564
4620
  cliFlag: cliFlag80,
4565
- description: () => /* @__PURE__ */ jsxs53(Fragment76, {
4621
+ description: () => /* @__PURE__ */ jsxs54(Fragment76, {
4566
4622
  children: [
4567
4623
  "Specify how many times the video should be rendered during a benchmark. Default ",
4568
4624
  /* @__PURE__ */ jsx76("code", {
@@ -4597,13 +4653,13 @@ var runsOption = {
4597
4653
  };
4598
4654
 
4599
4655
  // src/options/sample-rate.tsx
4600
- import { jsx as jsx77, jsxs as jsxs54, Fragment as Fragment77 } from "react/jsx-runtime";
4656
+ import { jsx as jsx77, jsxs as jsxs55, Fragment as Fragment77 } from "react/jsx-runtime";
4601
4657
  var cliFlag81 = "sample-rate";
4602
4658
  var currentSampleRate = 48000;
4603
4659
  var sampleRateOption = {
4604
4660
  name: "Sample Rate",
4605
4661
  cliFlag: cliFlag81,
4606
- description: () => /* @__PURE__ */ jsxs54(Fragment77, {
4662
+ description: () => /* @__PURE__ */ jsxs55(Fragment77, {
4607
4663
  children: [
4608
4664
  "Controls the sample rate of the output audio. The default is",
4609
4665
  " ",
@@ -4638,7 +4694,7 @@ var sampleRateOption = {
4638
4694
  };
4639
4695
 
4640
4696
  // src/options/scale.tsx
4641
- import { jsx as jsx78, jsxs as jsxs55, Fragment as Fragment78 } from "react/jsx-runtime";
4697
+ import { jsx as jsx78, jsxs as jsxs56, Fragment as Fragment78 } from "react/jsx-runtime";
4642
4698
  var currentScale = 1;
4643
4699
  var cliFlag82 = "scale";
4644
4700
  var validateScale = (value3) => {
@@ -4649,7 +4705,7 @@ var validateScale = (value3) => {
4649
4705
  var scaleOption = {
4650
4706
  name: "Scale",
4651
4707
  cliFlag: cliFlag82,
4652
- description: () => /* @__PURE__ */ jsxs55(Fragment78, {
4708
+ description: () => /* @__PURE__ */ jsxs56(Fragment78, {
4653
4709
  children: [
4654
4710
  "Scales the output dimensions by a factor. For example, a 1280x720px frame will become a 1920x1080px frame with a scale factor of ",
4655
4711
  /* @__PURE__ */ jsx78("code", {
@@ -4723,7 +4779,7 @@ var skipSkillsOption = {
4723
4779
 
4724
4780
  // src/options/still-frame.tsx
4725
4781
  import { NoReactInternals as NoReactInternals4 } from "remotion/no-react";
4726
- import { jsx as jsx80, jsxs as jsxs56, Fragment as Fragment80 } from "react/jsx-runtime";
4782
+ import { jsx as jsx80, jsxs as jsxs57, Fragment as Fragment80 } from "react/jsx-runtime";
4727
4783
  var cliFlag84 = "frame";
4728
4784
  var currentFrame = null;
4729
4785
  var validate3 = (frame) => {
@@ -4736,7 +4792,7 @@ var validate3 = (frame) => {
4736
4792
  var stillFrameOption = {
4737
4793
  name: "Frame",
4738
4794
  cliFlag: cliFlag84,
4739
- description: () => /* @__PURE__ */ jsxs56(Fragment80, {
4795
+ description: () => /* @__PURE__ */ jsxs57(Fragment80, {
4740
4796
  children: [
4741
4797
  "Which frame should be rendered when rendering a still. Default",
4742
4798
  " ",
@@ -4784,13 +4840,13 @@ var stillFrameOption = {
4784
4840
  };
4785
4841
 
4786
4842
  // src/options/still-image-format.tsx
4787
- import { jsx as jsx81, jsxs as jsxs57, Fragment as Fragment81 } from "react/jsx-runtime";
4843
+ import { jsx as jsx81, jsxs as jsxs58, Fragment as Fragment81 } from "react/jsx-runtime";
4788
4844
  var currentStillImageFormat = null;
4789
4845
  var cliFlag85 = "image-format";
4790
4846
  var stillImageFormatOption = {
4791
4847
  name: "Still Image Format",
4792
4848
  cliFlag: cliFlag85,
4793
- description: () => /* @__PURE__ */ jsxs57(Fragment81, {
4849
+ description: () => /* @__PURE__ */ jsxs58(Fragment81, {
4794
4850
  children: [
4795
4851
  "The image format to use when rendering a still. Must be one of",
4796
4852
  " ",
@@ -4873,7 +4929,7 @@ var throwIfSiteExistsOption = {
4873
4929
  };
4874
4930
 
4875
4931
  // src/options/timeout.tsx
4876
- import { jsx as jsx82, jsxs as jsxs58, Fragment as Fragment82 } from "react/jsx-runtime";
4932
+ import { jsx as jsx82, jsxs as jsxs59, Fragment as Fragment82 } from "react/jsx-runtime";
4877
4933
  var currentTimeout = DEFAULT_TIMEOUT;
4878
4934
  var validate4 = (value3) => {
4879
4935
  if (typeof value3 !== "number") {
@@ -4884,7 +4940,7 @@ var cliFlag87 = "timeout";
4884
4940
  var delayRenderTimeoutInMillisecondsOption = {
4885
4941
  name: "delayRender() timeout",
4886
4942
  cliFlag: cliFlag87,
4887
- description: () => /* @__PURE__ */ jsxs58(Fragment82, {
4943
+ description: () => /* @__PURE__ */ jsxs59(Fragment82, {
4888
4944
  children: [
4889
4945
  "A number describing how long the render may take to resolve all",
4890
4946
  " ",
@@ -5005,13 +5061,13 @@ var versionFlagOption = {
5005
5061
  };
5006
5062
 
5007
5063
  // src/options/video-bitrate.tsx
5008
- import { jsx as jsx85, jsxs as jsxs59, Fragment as Fragment85 } from "react/jsx-runtime";
5064
+ import { jsx as jsx85, jsxs as jsxs60, Fragment as Fragment85 } from "react/jsx-runtime";
5009
5065
  var videoBitrate = null;
5010
5066
  var cliFlag90 = "video-bitrate";
5011
5067
  var videoBitrateOption = {
5012
5068
  name: "Video Bitrate",
5013
5069
  cliFlag: cliFlag90,
5014
- description: () => /* @__PURE__ */ jsxs59(Fragment85, {
5070
+ description: () => /* @__PURE__ */ jsxs60(Fragment85, {
5015
5071
  children: [
5016
5072
  "Specify the target bitrate for the generated video. The syntax for FFmpeg",
5017
5073
  "'",
@@ -5058,13 +5114,13 @@ var videoBitrateOption = {
5058
5114
  };
5059
5115
 
5060
5116
  // src/options/video-cache-size.tsx
5061
- import { jsx as jsx86, jsxs as jsxs60, Fragment as Fragment86 } from "react/jsx-runtime";
5117
+ import { jsx as jsx86, jsxs as jsxs61, Fragment as Fragment86 } from "react/jsx-runtime";
5062
5118
  var mediaCacheSizeInBytes = null;
5063
5119
  var cliFlag91 = "media-cache-size-in-bytes";
5064
5120
  var mediaCacheSizeInBytesOption = {
5065
5121
  name: "@remotion/media cache size",
5066
5122
  cliFlag: cliFlag91,
5067
- description: () => /* @__PURE__ */ jsxs60(Fragment86, {
5123
+ description: () => /* @__PURE__ */ jsxs61(Fragment86, {
5068
5124
  children: [
5069
5125
  "Specify the memory budget for decoded media cached by",
5070
5126
  " ",
@@ -5332,13 +5388,13 @@ var videoCodecOption = {
5332
5388
  };
5333
5389
 
5334
5390
  // src/options/video-image-format.tsx
5335
- import { jsx as jsx88, jsxs as jsxs61, Fragment as Fragment88 } from "react/jsx-runtime";
5391
+ import { jsx as jsx88, jsxs as jsxs62, Fragment as Fragment88 } from "react/jsx-runtime";
5336
5392
  var currentVideoImageFormat = null;
5337
5393
  var cliFlag93 = "image-format";
5338
5394
  var videoImageFormatOption = {
5339
5395
  name: "Video Image Format",
5340
5396
  cliFlag: cliFlag93,
5341
- description: () => /* @__PURE__ */ jsxs61(Fragment88, {
5397
+ description: () => /* @__PURE__ */ jsxs62(Fragment88, {
5342
5398
  children: [
5343
5399
  "The image format to use when rendering frames for a video. Must be one of",
5344
5400
  " ",
@@ -5426,12 +5482,12 @@ var videoImageFormatOption = {
5426
5482
  };
5427
5483
 
5428
5484
  // src/options/webhook-custom-data.tsx
5429
- import { jsxs as jsxs62, Fragment as Fragment89 } from "react/jsx-runtime";
5485
+ import { jsxs as jsxs63, Fragment as Fragment89 } from "react/jsx-runtime";
5430
5486
  var cliFlag94 = "webhook-custom-data";
5431
5487
  var webhookCustomDataOption = {
5432
5488
  name: "Webhook custom data",
5433
5489
  cliFlag: cliFlag94,
5434
- description: (type) => /* @__PURE__ */ jsxs62(Fragment89, {
5490
+ description: (type) => /* @__PURE__ */ jsxs63(Fragment89, {
5435
5491
  children: [
5436
5492
  "Pass up to 1,024 bytes of a JSON-serializable object to the webhook. This data will be included in the webhook payload.",
5437
5493
  " ",
@@ -5495,7 +5551,7 @@ var webpackPollOption = {
5495
5551
  };
5496
5552
 
5497
5553
  // src/options/x264-preset.tsx
5498
- import { jsx as jsx90, jsxs as jsxs63, Fragment as Fragment91 } from "react/jsx-runtime";
5554
+ import { jsx as jsx90, jsxs as jsxs64, Fragment as Fragment91 } from "react/jsx-runtime";
5499
5555
  var x264PresetOptions = [
5500
5556
  "ultrafast",
5501
5557
  "superfast",
@@ -5514,7 +5570,7 @@ var DEFAULT_PRESET = "medium";
5514
5570
  var x264Option = {
5515
5571
  name: "x264 Preset",
5516
5572
  cliFlag: cliFlag96,
5517
- description: () => /* @__PURE__ */ jsxs63(Fragment91, {
5573
+ description: () => /* @__PURE__ */ jsxs64(Fragment91, {
5518
5574
  children: [
5519
5575
  "Sets a x264 preset profile. Only applies to videos rendered with",
5520
5576
  " ",
@@ -19493,7 +19493,7 @@ var DEFAULT = null;
19493
19493
  var cliFlag = "separate-audio-to";
19494
19494
  var separateAudioOption = {
19495
19495
  cliFlag,
19496
- description: () => `If set, the audio will not be included in the main output but rendered as a separate file at the location you pass. It is recommended to use an absolute path. If a relative path is passed, it is relative to the Remotion Root.`,
19496
+ description: () => `If set, the audio will not be included in the main output but rendered as a separate file at the location you pass. If the render contains no audio, a silent audio file is produced even when enforceAudioTrack is false. The muted option still takes precedence. It is recommended to use an absolute path. If a relative path is passed, it is relative to the Remotion Root.`,
19497
19497
  docLink: "https://remotion.dev/docs/renderer/render-media",
19498
19498
  getValue: ({ commandLine }) => {
19499
19499
  if (commandLine[cliFlag]) {
@@ -23284,7 +23284,8 @@ var createAudio = async ({
23284
23284
  trimLeftOffset,
23285
23285
  trimRightOffset,
23286
23286
  forSeamlessAacConcatenation,
23287
- sampleRate
23287
+ sampleRate,
23288
+ enforceAudioTrack
23288
23289
  }) => {
23289
23290
  const fileUrlAssets = await convertAssetsToFileUrls({
23290
23291
  assets,
@@ -23363,6 +23364,11 @@ var createAudio = async ({
23363
23364
  })
23364
23365
  ] : []
23365
23366
  ];
23367
+ if (!enforceAudioTrack && preprocessed.length === 0) {
23368
+ deleteDirectory(downloadMap.audioMixing);
23369
+ onProgress(1);
23370
+ return null;
23371
+ }
23366
23372
  const merged = path27.join(downloadMap.audioPreprocessing, "merged.wav");
23367
23373
  const extension = getExtensionFromAudioCodec(audioCodec);
23368
23374
  const outName = path27.join(downloadMap.audioPreprocessing, `audio.${extension}`);
@@ -23524,7 +23530,10 @@ var getShouldRenderAudio = ({
23524
23530
  if (assetsInfo === null) {
23525
23531
  return "maybe";
23526
23532
  }
23527
- return assetsInfo.assets.flat(1).length > 0 ? "yes" : "no";
23533
+ if (!codecSupportsMedia(codec).video) {
23534
+ return "yes";
23535
+ }
23536
+ return assetsInfo.assets.some((frame) => frame.audioAndVideoAssets.length > 0 || frame.inlineAudioAssets.length > 0) ? "yes" : "no";
23528
23537
  };
23529
23538
 
23530
23539
  // src/validate-videobitrate.ts
@@ -23605,10 +23614,11 @@ var innerStitchFramesToVideo = async ({
23605
23614
  assetsInfo.downloadMap.preventCleanup();
23606
23615
  const proResProfileName = getProResProfileName(codec, proResProfile);
23607
23616
  const mediaSupport = codecSupportsMedia(codec);
23617
+ const enforceAudioTrackForOutput = enforceAudioTrack || Boolean(separateAudioTo);
23608
23618
  const renderAudioEvaluation = getShouldRenderAudio({
23609
23619
  assetsInfo,
23610
23620
  codec,
23611
- enforceAudioTrack,
23621
+ enforceAudioTrack: enforceAudioTrackForOutput,
23612
23622
  muted
23613
23623
  });
23614
23624
  if (renderAudioEvaluation === "maybe") {
@@ -23690,7 +23700,8 @@ var innerStitchFramesToVideo = async ({
23690
23700
  trimLeftOffset: assetsInfo.trimLeftOffset,
23691
23701
  trimRightOffset: assetsInfo.trimRightOffset,
23692
23702
  forSeamlessAacConcatenation: assetsInfo.forSeamlessAacConcatenation,
23693
- sampleRate
23703
+ sampleRate,
23704
+ enforceAudioTrack: enforceAudioTrackForOutput || !shouldRenderVideo
23694
23705
  }) : null;
23695
23706
  if (mediaSupport.audio && !mediaSupport.video) {
23696
23707
  if (!resolvedAudioCodec) {
@@ -23718,6 +23729,9 @@ var innerStitchFramesToVideo = async ({
23718
23729
  assetsInfo.downloadMap.allowCleanup();
23719
23730
  return Promise.resolve(file);
23720
23731
  }
23732
+ if (separateAudioTo && !audio) {
23733
+ throw new Error(`\`separateAudioTo\` was set to ${JSON.stringify(separateAudioTo)}, but this render included no audio. Audio output is disabled by the muted option or selected codec.`);
23734
+ }
23721
23735
  const resolvedHardwareAcceleration = preEncodedFileLocation ? "disable" : resolveHardwareAcceleration({
23722
23736
  codec,
23723
23737
  hardwareAcceleration,
@@ -23801,10 +23815,7 @@ var innerStitchFramesToVideo = async ({
23801
23815
  }
23802
23816
  }
23803
23817
  });
23804
- if (separateAudioTo) {
23805
- if (!audio) {
23806
- throw new Error(`\`separateAudioTo\` was set to ${JSON.stringify(separateAudioTo)}, but this render included no audio`);
23807
- }
23818
+ if (separateAudioTo && audio) {
23808
23819
  const finalDestination = path29.resolve(remotionRoot, separateAudioTo);
23809
23820
  cpSync2(audio, finalDestination);
23810
23821
  rmSync4(audio);
package/dist/esm/pure.mjs CHANGED
@@ -315,7 +315,7 @@ var DEFAULT = null;
315
315
  var cliFlag = "separate-audio-to";
316
316
  var separateAudioOption = {
317
317
  cliFlag,
318
- description: () => `If set, the audio will not be included in the main output but rendered as a separate file at the location you pass. It is recommended to use an absolute path. If a relative path is passed, it is relative to the Remotion Root.`,
318
+ description: () => `If set, the audio will not be included in the main output but rendered as a separate file at the location you pass. If the render contains no audio, a silent audio file is produced even when enforceAudioTrack is false. The muted option still takes precedence. It is recommended to use an absolute path. If a relative path is passed, it is relative to the Remotion Root.`,
319
319
  docLink: "https://remotion.dev/docs/renderer/render-media",
320
320
  getValue: ({ commandLine }) => {
321
321
  if (commandLine[cliFlag]) {
@@ -1,7 +1,7 @@
1
1
  export declare const enforceAudioOption: {
2
2
  name: string;
3
3
  cliFlag: "enforce-audio-track";
4
- description: () => import("react/jsx-runtime").JSX.Element;
4
+ description: (mode: "cli" | "ssr") => import("react/jsx-runtime").JSX.Element;
5
5
  ssrName: string;
6
6
  docLink: string;
7
7
  type: boolean;
@@ -8,7 +8,21 @@ const cliFlag = 'enforce-audio-track';
8
8
  exports.enforceAudioOption = {
9
9
  name: 'Enforce Audio Track',
10
10
  cliFlag,
11
- description: () => (jsx_runtime_1.jsx(jsx_runtime_1.Fragment, { children: "Render a silent audio track if there would be none otherwise." })),
11
+ description: (mode) => (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
12
+ jsx_runtime_1.jsxs("p", { children: ["Defaults to ",
13
+ jsx_runtime_1.jsx("code", { children: "false" }),
14
+ ". If ",
15
+ jsx_runtime_1.jsx("code", { children: "true" }),
16
+ ", include a silent audio track when the render contains no audio. If ",
17
+ jsx_runtime_1.jsx("code", { children: "false" }),
18
+ ", omit the audio track when no audio is present. Audio-only exports and", ' ', jsx_runtime_1.jsx("code", { children: mode === 'cli' ? '--separate-audio-to' : 'separateAudioTo' }), ' ', "still produce an audio file, even when silent."] }), jsx_runtime_1.jsxs("p", { children: [mode === 'cli' ? (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: ["Pass ",
19
+ jsx_runtime_1.jsx("code", { children: "--enforce-audio-track" })
20
+ ] })) : (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: ["Set this to ",
21
+ jsx_runtime_1.jsx("code", { children: "true" })
22
+ ] })), ' ', "for", ' ', jsx_runtime_1.jsx("a", { href: "/docs/distributed-rendering", children: "chunks that will later be concatenated" }),
23
+ ", because other chunks may contain audio.", ' ', jsx_runtime_1.jsx("code", { children: mode === 'cli' ? '--muted' : 'muted: true' }),
24
+ " takes precedence."] })
25
+ ] })),
12
26
  ssrName: 'enforceAudioTrack',
13
27
  docLink: 'https://www.remotion.dev/docs/config#setenforceaudiotrack-',
14
28
  type: false,
@@ -172,7 +172,7 @@ export declare const allOptions: {
172
172
  enforceAudioOption: {
173
173
  name: string;
174
174
  cliFlag: "enforce-audio-track";
175
- description: () => import("react/jsx-runtime").JSX.Element;
175
+ description: (mode: "cli" | "ssr") => import("react/jsx-runtime").JSX.Element;
176
176
  ssrName: string;
177
177
  docLink: string;
178
178
  type: boolean;
@@ -2031,7 +2031,7 @@ export declare const optionsMap: {
2031
2031
  readonly enforceAudioTrack: {
2032
2032
  name: string;
2033
2033
  cliFlag: "enforce-audio-track";
2034
- description: () => import("react/jsx-runtime").JSX.Element;
2034
+ description: (mode: "cli" | "ssr") => import("react/jsx-runtime").JSX.Element;
2035
2035
  ssrName: string;
2036
2036
  docLink: string;
2037
2037
  type: boolean;
@@ -5,7 +5,7 @@ const DEFAULT = null;
5
5
  const cliFlag = 'separate-audio-to';
6
6
  exports.separateAudioOption = {
7
7
  cliFlag,
8
- description: () => `If set, the audio will not be included in the main output but rendered as a separate file at the location you pass. It is recommended to use an absolute path. If a relative path is passed, it is relative to the Remotion Root.`,
8
+ description: () => `If set, the audio will not be included in the main output but rendered as a separate file at the location you pass. If the render contains no audio, a silent audio file is produced even when enforceAudioTrack is false. The muted option still takes precedence. It is recommended to use an absolute path. If a relative path is passed, it is relative to the Remotion Root.`,
9
9
  docLink: 'https://remotion.dev/docs/renderer/render-media',
10
10
  getValue: ({ commandLine }) => {
11
11
  if (commandLine[cliFlag]) {
@@ -15,6 +15,12 @@ const getShouldRenderAudio = ({ codec, assetsInfo, enforceAudioTrack, muted, })
15
15
  if (assetsInfo === null) {
16
16
  return 'maybe';
17
17
  }
18
- return assetsInfo.assets.flat(1).length > 0 ? 'yes' : 'no';
18
+ if (!(0, codec_supports_media_1.codecSupportsMedia)(codec).video) {
19
+ return 'yes';
20
+ }
21
+ return assetsInfo.assets.some((frame) => frame.audioAndVideoAssets.length > 0 ||
22
+ frame.inlineAudioAssets.length > 0)
23
+ ? 'yes'
24
+ : 'no';
19
25
  };
20
26
  exports.getShouldRenderAudio = getShouldRenderAudio;
@@ -64,10 +64,11 @@ const innerStitchFramesToVideo = async ({ assetsInfo, audioBitrate, audioCodec:
64
64
  assetsInfo.downloadMap.preventCleanup();
65
65
  const proResProfileName = (0, get_prores_profile_name_1.getProResProfileName)(codec, proResProfile);
66
66
  const mediaSupport = (0, codec_supports_media_1.codecSupportsMedia)(codec);
67
+ const enforceAudioTrackForOutput = enforceAudioTrack || Boolean(separateAudioTo);
67
68
  const renderAudioEvaluation = (0, render_has_audio_1.getShouldRenderAudio)({
68
69
  assetsInfo,
69
70
  codec,
70
- enforceAudioTrack,
71
+ enforceAudioTrack: enforceAudioTrackForOutput,
71
72
  muted,
72
73
  });
73
74
  if (renderAudioEvaluation === 'maybe') {
@@ -158,6 +159,7 @@ const innerStitchFramesToVideo = async ({ assetsInfo, audioBitrate, audioCodec:
158
159
  trimRightOffset: assetsInfo.trimRightOffset,
159
160
  forSeamlessAacConcatenation: assetsInfo.forSeamlessAacConcatenation,
160
161
  sampleRate,
162
+ enforceAudioTrack: enforceAudioTrackForOutput || !shouldRenderVideo,
161
163
  })
162
164
  : null;
163
165
  if (mediaSupport.audio && !mediaSupport.video) {
@@ -190,6 +192,9 @@ const innerStitchFramesToVideo = async ({ assetsInfo, audioBitrate, audioCodec:
190
192
  assetsInfo.downloadMap.allowCleanup();
191
193
  return Promise.resolve(file);
192
194
  }
195
+ if (separateAudioTo && !audio) {
196
+ throw new Error(`\`separateAudioTo\` was set to ${JSON.stringify(separateAudioTo)}, but this render included no audio. Audio output is disabled by the muted option or selected codec.`);
197
+ }
193
198
  // Parallel encoding already resolved the encoder in the pre-stitcher.
194
199
  const resolvedHardwareAcceleration = preEncodedFileLocation
195
200
  ? 'disable'
@@ -290,10 +295,7 @@ const innerStitchFramesToVideo = async ({ assetsInfo, audioBitrate, audioCodec:
290
295
  }
291
296
  }
292
297
  });
293
- if (separateAudioTo) {
294
- if (!audio) {
295
- throw new Error(`\`separateAudioTo\` was set to ${JSON.stringify(separateAudioTo)}, but this render included no audio`);
296
- }
298
+ if (separateAudioTo && audio) {
297
299
  const finalDestination = node_path_1.default.resolve(remotionRoot, separateAudioTo);
298
300
  (0, node_fs_1.cpSync)(audio, finalDestination);
299
301
  (0, node_fs_1.rmSync)(audio);
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "url": "https://github.com/remotion-dev/remotion/tree/main/packages/renderer"
4
4
  },
5
5
  "name": "@remotion/renderer",
6
- "version": "4.0.522",
6
+ "version": "4.0.524",
7
7
  "description": "Render Remotion videos using Node.js or Bun",
8
8
  "main": "dist/index.js",
9
9
  "types": "dist/index.d.ts",
@@ -22,11 +22,11 @@
22
22
  },
23
23
  "dependencies": {
24
24
  "execa": "5.1.1",
25
- "remotion": "4.0.522",
26
- "@remotion/streaming": "4.0.522",
25
+ "remotion": "4.0.524",
26
+ "@remotion/streaming": "4.0.524",
27
27
  "source-map": "0.8.0",
28
28
  "ws": "8.21.0",
29
- "@remotion/licensing": "4.0.522"
29
+ "@remotion/licensing": "4.0.524"
30
30
  },
31
31
  "peerDependencies": {
32
32
  "react": ">=16.8.0",
@@ -40,19 +40,19 @@
40
40
  "react-dom": "19.2.3",
41
41
  "@typescript/native-preview": "7.0.0-dev.20260217.1",
42
42
  "@types/ws": "8.5.10",
43
- "@remotion/example-videos": "4.0.522",
44
- "@remotion/eslint-config-internal": "4.0.522",
43
+ "@remotion/example-videos": "4.0.524",
44
+ "@remotion/eslint-config-internal": "4.0.524",
45
45
  "eslint": "9.19.0",
46
46
  "@types/node": "20.12.14"
47
47
  },
48
48
  "optionalDependencies": {
49
- "@remotion/compositor-darwin-arm64": "4.0.522",
50
- "@remotion/compositor-darwin-x64": "4.0.522",
51
- "@remotion/compositor-linux-arm64-gnu": "4.0.522",
52
- "@remotion/compositor-linux-arm64-musl": "4.0.522",
53
- "@remotion/compositor-linux-x64-gnu": "4.0.522",
54
- "@remotion/compositor-linux-x64-musl": "4.0.522",
55
- "@remotion/compositor-win32-x64-msvc": "4.0.522"
49
+ "@remotion/compositor-darwin-arm64": "4.0.524",
50
+ "@remotion/compositor-darwin-x64": "4.0.524",
51
+ "@remotion/compositor-linux-arm64-gnu": "4.0.524",
52
+ "@remotion/compositor-linux-arm64-musl": "4.0.524",
53
+ "@remotion/compositor-linux-x64-gnu": "4.0.524",
54
+ "@remotion/compositor-linux-x64-musl": "4.0.524",
55
+ "@remotion/compositor-win32-x64-msvc": "4.0.524"
56
56
  },
57
57
  "keywords": [
58
58
  "remotion",