@remotion/renderer 4.0.464 → 4.0.466

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.
@@ -21442,8 +21442,19 @@ var validV5ColorSpaces = ["bt601", "bt709", "bt2020-ncl"];
21442
21442
  var validColorSpaces = NoReactInternals13.ENABLE_V5_BREAKING_CHANGES ? validV5ColorSpaces : validV4ColorSpaces;
21443
21443
  var DEFAULT_COLOR_SPACE = NoReactInternals13.ENABLE_V5_BREAKING_CHANGES ? "bt709" : "default";
21444
21444
 
21445
- // src/options/x264-preset.tsx
21445
+ // src/options/gop-size.tsx
21446
21446
  import { jsx as jsx5, jsxs as jsxs5, Fragment as Fragment5 } from "react/jsx-runtime";
21447
+ var validateGopSize = (value) => {
21448
+ if (value === null) {
21449
+ return;
21450
+ }
21451
+ if (typeof value !== "number" || !Number.isFinite(value) || !Number.isInteger(value) || value <= 0) {
21452
+ throw new TypeError("The GOP size must be an integer greater than 0 or null.");
21453
+ }
21454
+ };
21455
+
21456
+ // src/options/x264-preset.tsx
21457
+ import { jsx as jsx6, jsxs as jsxs6, Fragment as Fragment6 } from "react/jsx-runtime";
21447
21458
  var x264PresetOptions = [
21448
21459
  "ultrafast",
21449
21460
  "superfast",
@@ -21570,6 +21581,7 @@ var firstEncodingStepOnly = ({
21570
21581
  proResProfileName,
21571
21582
  pixelFormat,
21572
21583
  x264Preset,
21584
+ gopSize,
21573
21585
  codec,
21574
21586
  crf,
21575
21587
  videoBitrate,
@@ -21580,11 +21592,13 @@ var firstEncodingStepOnly = ({
21580
21592
  if (hasPreencoded || codec === "gif") {
21581
21593
  return [];
21582
21594
  }
21595
+ validateGopSize(gopSize);
21583
21596
  return [
21584
21597
  proResProfileName ? ["-profile:v", proResProfileName] : null,
21585
21598
  ["-pix_fmt", pixelFormat],
21586
21599
  pixelFormat === "yuva420p" ? ["-auto-alt-ref", "0"] : null,
21587
21600
  x264Preset ? ["-preset", x264Preset] : null,
21601
+ gopSize === null ? null : ["-g", String(gopSize)],
21588
21602
  ["-video_track_timescale", "90000"],
21589
21603
  validateQualitySettings({
21590
21604
  crf,
@@ -21601,6 +21615,7 @@ var generateFfmpegArgs = ({
21601
21615
  proResProfileName,
21602
21616
  pixelFormat,
21603
21617
  x264Preset,
21618
+ gopSize,
21604
21619
  codec,
21605
21620
  crf,
21606
21621
  videoBitrate,
@@ -21659,6 +21674,7 @@ var generateFfmpegArgs = ({
21659
21674
  encodingMaxRate,
21660
21675
  encodingBufferSize,
21661
21676
  x264Preset,
21677
+ gopSize,
21662
21678
  hardwareAcceleration
21663
21679
  })
21664
21680
  ].filter(truthy);
@@ -21760,6 +21776,7 @@ var prespawnFfmpeg = (options2) => {
21760
21776
  proResProfileName,
21761
21777
  pixelFormat,
21762
21778
  x264Preset: options2.x264Preset,
21779
+ gopSize: options2.gopSize,
21763
21780
  codec,
21764
21781
  crf: options2.crf,
21765
21782
  videoBitrate: options2.videoBitrate,
@@ -22854,6 +22871,7 @@ var innerStitchFramesToVideo = async ({
22854
22871
  cancelSignal,
22855
22872
  codec,
22856
22873
  crf,
22874
+ gopSize,
22857
22875
  enforceAudioTrack,
22858
22876
  ffmpegOverride,
22859
22877
  force,
@@ -22901,6 +22919,7 @@ var innerStitchFramesToVideo = async ({
22901
22919
  validateBitrate(videoBitrate, "videoBitrate");
22902
22920
  validateBitrate(maxRate, "maxRate");
22903
22921
  validateBitrate(bufferSize, "bufferSize");
22922
+ validateGopSize(gopSize);
22904
22923
  validateFps(fps, "in `stitchFramesToVideo()`", false);
22905
22924
  assetsInfo.downloadMap.preventCleanup();
22906
22925
  const proResProfileName = getProResProfileName(codec, proResProfile);
@@ -23035,6 +23054,7 @@ var innerStitchFramesToVideo = async ({
23035
23054
  proResProfileName,
23036
23055
  pixelFormat,
23037
23056
  x264Preset,
23057
+ gopSize,
23038
23058
  colorSpace,
23039
23059
  hardwareAcceleration,
23040
23060
  indent,
@@ -23138,6 +23158,7 @@ var stitchFramesToVideo = ({
23138
23158
  cancelSignal,
23139
23159
  codec,
23140
23160
  crf,
23161
+ gopSize,
23141
23162
  enforceAudioTrack,
23142
23163
  ffmpegOverride,
23143
23164
  muted,
@@ -23168,6 +23189,7 @@ var stitchFramesToVideo = ({
23168
23189
  cancelSignal: cancelSignal ?? null,
23169
23190
  codec: codec ?? DEFAULT_CODEC,
23170
23191
  crf: crf ?? null,
23192
+ gopSize: gopSize ?? null,
23171
23193
  enforceAudioTrack: enforceAudioTrack ?? false,
23172
23194
  ffmpegOverride: ffmpegOverride ?? null,
23173
23195
  force: force ?? true,
@@ -23316,6 +23338,7 @@ var MAX_RECENT_FRAME_TIMINGS = 150;
23316
23338
  var internalRenderMediaRaw = ({
23317
23339
  proResProfile,
23318
23340
  x264Preset,
23341
+ gopSize,
23319
23342
  crf,
23320
23343
  composition: compositionWithPossibleUnevenDimensions,
23321
23344
  serializedInputPropsWithCustomSchema,
@@ -23396,6 +23419,7 @@ var internalRenderMediaRaw = ({
23396
23419
  encodingBufferSize,
23397
23420
  hardwareAcceleration
23398
23421
  });
23422
+ validateGopSize(gopSize);
23399
23423
  validateBitrate(audioBitrate, "audioBitrate");
23400
23424
  validateBitrate(videoBitrate, "videoBitrate");
23401
23425
  validateBitrate(encodingMaxRate, "encodingMaxRate");
@@ -23553,6 +23577,7 @@ var internalRenderMediaRaw = ({
23553
23577
  encodingBufferSize,
23554
23578
  indent,
23555
23579
  x264Preset: x264Preset ?? null,
23580
+ gopSize,
23556
23581
  colorSpace,
23557
23582
  binariesDirectory,
23558
23583
  hardwareAcceleration
@@ -23717,6 +23742,7 @@ var internalRenderMediaRaw = ({
23717
23742
  codec,
23718
23743
  proResProfile,
23719
23744
  crf,
23745
+ gopSize,
23720
23746
  assetsInfo,
23721
23747
  onProgress: (frame) => {
23722
23748
  if (preEncodedFileLocation) {
@@ -23834,6 +23860,7 @@ var internalRenderMedia = wrapWithErrorHandling(internalRenderMediaRaw);
23834
23860
  var renderMedia = ({
23835
23861
  proResProfile,
23836
23862
  x264Preset,
23863
+ gopSize,
23837
23864
  crf,
23838
23865
  composition,
23839
23866
  inputProps,
@@ -23902,6 +23929,7 @@ var renderMedia = ({
23902
23929
  return internalRenderMedia({
23903
23930
  proResProfile: proResProfile ?? undefined,
23904
23931
  x264Preset: x264Preset ?? null,
23932
+ gopSize: gopSize ?? null,
23905
23933
  codec,
23906
23934
  composition,
23907
23935
  serveUrl,
@@ -25121,11 +25149,11 @@ var getVideoMetadata = async (videoSource, options2) => {
25121
25149
  return JSON.parse(new TextDecoder("utf-8").decode(metadataResponse));
25122
25150
  };
25123
25151
  // src/options/chrome-mode.tsx
25124
- import { jsx as jsx6, jsxs as jsxs6, Fragment as Fragment6 } from "react/jsx-runtime";
25125
- // src/options/number-of-gif-loops.tsx
25126
25152
  import { jsx as jsx7, jsxs as jsxs7, Fragment as Fragment7 } from "react/jsx-runtime";
25127
- // src/options/on-browser-download.tsx
25153
+ // src/options/number-of-gif-loops.tsx
25128
25154
  import { jsx as jsx8, jsxs as jsxs8, Fragment as Fragment8 } from "react/jsx-runtime";
25155
+ // src/options/on-browser-download.tsx
25156
+ import { jsx as jsx9, jsxs as jsxs9, Fragment as Fragment9 } from "react/jsx-runtime";
25129
25157
  // src/index.ts
25130
25158
  var RenderInternals = {
25131
25159
  resolveConcurrency,
@@ -1,8 +1,9 @@
1
- export declare const generateFfmpegArgs: ({ hasPreencoded, proResProfileName, pixelFormat, x264Preset, codec, crf, videoBitrate, encodingMaxRate, encodingBufferSize, colorSpace, hardwareAcceleration, indent, logLevel, }: {
1
+ export declare const generateFfmpegArgs: ({ hasPreencoded, proResProfileName, pixelFormat, x264Preset, gopSize, codec, crf, videoBitrate, encodingMaxRate, encodingBufferSize, colorSpace, hardwareAcceleration, indent, logLevel, }: {
2
2
  hasPreencoded: boolean;
3
3
  proResProfileName: string | null;
4
4
  pixelFormat: "yuv420p" | "yuv420p10le" | "yuv422p" | "yuv422p10le" | "yuv444p" | "yuv444p10le" | "yuva420p" | "yuva444p10le";
5
5
  x264Preset: "fast" | "faster" | "medium" | "placebo" | "slow" | "slower" | "superfast" | "ultrafast" | "veryfast" | "veryslow" | null;
6
+ gopSize: number | null;
6
7
  crf: unknown;
7
8
  codec: "aac" | "av1" | "gif" | "h264" | "h264-mkv" | "h264-ts" | "h265" | "mp3" | "prores" | "vp8" | "vp9" | "wav";
8
9
  videoBitrate: string | null;
@@ -5,11 +5,13 @@ const crf_1 = require("./crf");
5
5
  const get_codec_name_1 = require("./get-codec-name");
6
6
  const logger_1 = require("./logger");
7
7
  const color_space_1 = require("./options/color-space");
8
+ const gop_size_1 = require("./options/gop-size");
8
9
  const truthy_1 = require("./truthy");
9
- const firstEncodingStepOnly = ({ hasPreencoded, proResProfileName, pixelFormat, x264Preset, codec, crf, videoBitrate, encodingMaxRate, encodingBufferSize, hardwareAcceleration, }) => {
10
+ const firstEncodingStepOnly = ({ hasPreencoded, proResProfileName, pixelFormat, x264Preset, gopSize, codec, crf, videoBitrate, encodingMaxRate, encodingBufferSize, hardwareAcceleration, }) => {
10
11
  if (hasPreencoded || codec === 'gif') {
11
12
  return [];
12
13
  }
14
+ (0, gop_size_1.validateGopSize)(gopSize);
13
15
  return [
14
16
  proResProfileName ? ['-profile:v', proResProfileName] : null,
15
17
  ['-pix_fmt', pixelFormat],
@@ -17,6 +19,7 @@ const firstEncodingStepOnly = ({ hasPreencoded, proResProfileName, pixelFormat,
17
19
  // transparent WebM generation doesn't work
18
20
  pixelFormat === 'yuva420p' ? ['-auto-alt-ref', '0'] : null,
19
21
  x264Preset ? ['-preset', x264Preset] : null,
22
+ gopSize === null ? null : ['-g', String(gopSize)],
20
23
  // Apply a fixed a timescale across all environments:
21
24
  // https://discord.com/channels/809501355504959528/817306238811111454/1437471619089170613
22
25
  ['-video_track_timescale', '90000'],
@@ -30,7 +33,7 @@ const firstEncodingStepOnly = ({ hasPreencoded, proResProfileName, pixelFormat,
30
33
  }),
31
34
  ].filter(truthy_1.truthy);
32
35
  };
33
- const generateFfmpegArgs = ({ hasPreencoded, proResProfileName, pixelFormat, x264Preset, codec, crf, videoBitrate, encodingMaxRate, encodingBufferSize, colorSpace, hardwareAcceleration, indent, logLevel, }) => {
36
+ const generateFfmpegArgs = ({ hasPreencoded, proResProfileName, pixelFormat, x264Preset, gopSize, codec, crf, videoBitrate, encodingMaxRate, encodingBufferSize, colorSpace, hardwareAcceleration, indent, logLevel, }) => {
34
37
  const encoderSettings = (0, get_codec_name_1.getCodecName)({
35
38
  codec,
36
39
  encodingMaxRate,
@@ -92,6 +95,7 @@ const generateFfmpegArgs = ({ hasPreencoded, proResProfileName, pixelFormat, x26
92
95
  encodingMaxRate,
93
96
  encodingBufferSize,
94
97
  x264Preset,
98
+ gopSize,
95
99
  hardwareAcceleration,
96
100
  }),
97
101
  ].filter(truthy_1.truthy);
@@ -0,0 +1,17 @@
1
+ export declare const validateGopSize: (value: number | null) => void;
2
+ export declare const gopSizeOption: {
3
+ name: string;
4
+ cliFlag: "gop";
5
+ description: () => import("react/jsx-runtime").JSX.Element;
6
+ ssrName: string;
7
+ docLink: string;
8
+ type: number | null;
9
+ getValue: ({ commandLine }: {
10
+ commandLine: Record<string, unknown>;
11
+ }) => {
12
+ value: number | null;
13
+ source: string;
14
+ };
15
+ setConfig: (value: number | null) => void;
16
+ id: "gop";
17
+ };
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.gopSizeOption = exports.validateGopSize = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ let gopSize = null;
6
+ const validateGopSize = (value) => {
7
+ if (value === null) {
8
+ return;
9
+ }
10
+ if (typeof value !== 'number' ||
11
+ !Number.isFinite(value) ||
12
+ !Number.isInteger(value) ||
13
+ value <= 0) {
14
+ throw new TypeError('The GOP size must be an integer greater than 0 or null.');
15
+ }
16
+ };
17
+ exports.validateGopSize = validateGopSize;
18
+ const cliFlag = 'gop';
19
+ exports.gopSizeOption = {
20
+ name: 'GOP size',
21
+ cliFlag,
22
+ description: () => (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: ["Set the maximum number of frames between two keyframes. This maps to FFmpeg's ",
23
+ jsx_runtime_1.jsx("code", { children: "-g" }),
24
+ " option. Default: Let the encoder decide."] })),
25
+ ssrName: 'gopSize',
26
+ docLink: 'https://www.remotion.dev/docs/config#setgopsize',
27
+ type: null,
28
+ getValue: ({ commandLine }) => {
29
+ const value = commandLine[cliFlag];
30
+ if (value !== undefined) {
31
+ (0, exports.validateGopSize)(value);
32
+ return { value: value, source: 'cli' };
33
+ }
34
+ return { value: gopSize, source: gopSize === null ? 'default' : 'config' };
35
+ },
36
+ setConfig: (value) => {
37
+ (0, exports.validateGopSize)(value);
38
+ gopSize = value;
39
+ },
40
+ id: cliFlag,
41
+ };
@@ -409,6 +409,22 @@ export declare const allOptions: {
409
409
  setConfig: (value: "angle" | "angle-egl" | "egl" | "swangle" | "swiftshader" | "vulkan" | null) => void;
410
410
  id: "gl";
411
411
  };
412
+ gopSizeOption: {
413
+ name: string;
414
+ cliFlag: "gop";
415
+ description: () => import("react/jsx-runtime").JSX.Element;
416
+ ssrName: string;
417
+ docLink: string;
418
+ type: number | null;
419
+ getValue: ({ commandLine }: {
420
+ commandLine: Record<string, unknown>;
421
+ }) => {
422
+ value: number | null;
423
+ source: string;
424
+ };
425
+ setConfig: (value: number | null) => void;
426
+ id: "gop";
427
+ };
412
428
  enableLambdaInsights: {
413
429
  name: string;
414
430
  cliFlag: "enable-lambda-insights";
@@ -36,6 +36,7 @@ const for_seamless_aac_concatenation_1 = require("./for-seamless-aac-concatenati
36
36
  const force_new_studio_1 = require("./force-new-studio");
37
37
  const frames_1 = require("./frames");
38
38
  const gl_1 = require("./gl");
39
+ const gop_size_1 = require("./gop-size");
39
40
  const hardware_acceleration_1 = require("./hardware-acceleration");
40
41
  const headless_1 = require("./headless");
41
42
  const ignore_certificate_errors_1 = require("./ignore-certificate-errors");
@@ -115,6 +116,7 @@ exports.allOptions = {
115
116
  folderExpiryOption: folder_expiry_1.folderExpiryOption,
116
117
  enableMultiprocessOnLinuxOption: enable_multiprocess_on_linux_1.enableMultiprocessOnLinuxOption,
117
118
  glOption: gl_1.glOption,
119
+ gopSizeOption: gop_size_1.gopSizeOption,
118
120
  enableLambdaInsights: enable_lambda_insights_1.enableLambdaInsights,
119
121
  encodingMaxRateOption: encoding_max_rate_1.encodingMaxRateOption,
120
122
  encodingBufferSizeOption: encoding_buffer_size_1.encodingBufferSizeOption,
@@ -127,6 +127,22 @@ export declare const optionsMap: {
127
127
  setConfig: (profile: "fast" | "faster" | "medium" | "placebo" | "slow" | "slower" | "superfast" | "ultrafast" | "veryfast" | "veryslow" | null) => void;
128
128
  id: "x264-preset";
129
129
  };
130
+ readonly gopSize: {
131
+ name: string;
132
+ cliFlag: "gop";
133
+ description: () => import("react/jsx-runtime").JSX.Element;
134
+ ssrName: string;
135
+ docLink: string;
136
+ type: number | null;
137
+ getValue: ({ commandLine }: {
138
+ commandLine: Record<string, unknown>;
139
+ }) => {
140
+ value: number | null;
141
+ source: string;
142
+ };
143
+ setConfig: (value: number | null) => void;
144
+ id: "gop";
145
+ };
130
146
  readonly audioBitrate: {
131
147
  name: string;
132
148
  cliFlag: "audio-bitrate";
@@ -1308,6 +1324,22 @@ export declare const optionsMap: {
1308
1324
  setConfig: (profile: "fast" | "faster" | "medium" | "placebo" | "slow" | "slower" | "superfast" | "ultrafast" | "veryfast" | "veryslow" | null) => void;
1309
1325
  id: "x264-preset";
1310
1326
  };
1327
+ readonly gopSize: {
1328
+ name: string;
1329
+ cliFlag: "gop";
1330
+ description: () => import("react/jsx-runtime").JSX.Element;
1331
+ ssrName: string;
1332
+ docLink: string;
1333
+ type: number | null;
1334
+ getValue: ({ commandLine }: {
1335
+ commandLine: Record<string, unknown>;
1336
+ }) => {
1337
+ value: number | null;
1338
+ source: string;
1339
+ };
1340
+ setConfig: (value: number | null) => void;
1341
+ id: "gop";
1342
+ };
1311
1343
  readonly encodingMaxRate: {
1312
1344
  name: string;
1313
1345
  cliFlag: "max-rate";
@@ -1871,6 +1903,22 @@ export declare const optionsMap: {
1871
1903
  setConfig: (profile: "fast" | "faster" | "medium" | "placebo" | "slow" | "slower" | "superfast" | "ultrafast" | "veryfast" | "veryslow" | null) => void;
1872
1904
  id: "x264-preset";
1873
1905
  };
1906
+ readonly gopSize: {
1907
+ name: string;
1908
+ cliFlag: "gop";
1909
+ description: () => import("react/jsx-runtime").JSX.Element;
1910
+ ssrName: string;
1911
+ docLink: string;
1912
+ type: number | null;
1913
+ getValue: ({ commandLine }: {
1914
+ commandLine: Record<string, unknown>;
1915
+ }) => {
1916
+ value: number | null;
1917
+ source: string;
1918
+ };
1919
+ setConfig: (value: number | null) => void;
1920
+ id: "gop";
1921
+ };
1874
1922
  readonly encodingMaxRate: {
1875
1923
  name: string;
1876
1924
  cliFlag: "max-rate";
@@ -14,6 +14,7 @@ const encoding_buffer_size_1 = require("./encoding-buffer-size");
14
14
  const encoding_max_rate_1 = require("./encoding-max-rate");
15
15
  const enforce_audio_1 = require("./enforce-audio");
16
16
  const for_seamless_aac_concatenation_1 = require("./for-seamless-aac-concatenation");
17
+ const gop_size_1 = require("./gop-size");
17
18
  const hardware_acceleration_1 = require("./hardware-acceleration");
18
19
  const image_sequence_pattern_1 = require("./image-sequence-pattern");
19
20
  const jpeg_quality_1 = require("./jpeg-quality");
@@ -44,6 +45,7 @@ exports.optionsMap = {
44
45
  numberOfGifLoops: number_of_gif_loops_1.numberOfGifLoopsOption,
45
46
  repro: repro_1.reproOption,
46
47
  x264Preset: x264_preset_1.x264Option,
48
+ gopSize: gop_size_1.gopSizeOption,
47
49
  audioBitrate: audio_bitrate_1.audioBitrateOption,
48
50
  colorSpace: color_space_1.colorSpaceOption,
49
51
  codec: video_codec_1.videoCodecOption,
@@ -125,6 +127,7 @@ exports.optionsMap = {
125
127
  audioBitrate: audio_bitrate_1.audioBitrateOption,
126
128
  deleteAfter: delete_after_1.deleteAfterOption,
127
129
  x264Preset: x264_preset_1.x264Option,
130
+ gopSize: gop_size_1.gopSizeOption,
128
131
  encodingMaxRate: encoding_max_rate_1.encodingMaxRateOption,
129
132
  encodingBufferSize: encoding_buffer_size_1.encodingBufferSizeOption,
130
133
  colorSpace: color_space_1.colorSpaceOption,
@@ -163,6 +166,7 @@ exports.optionsMap = {
163
166
  audioBitrate: audio_bitrate_1.audioBitrateOption,
164
167
  videoBitrate: video_bitrate_1.videoBitrateOption,
165
168
  x264Preset: x264_preset_1.x264Option,
169
+ gopSize: gop_size_1.gopSizeOption,
166
170
  encodingMaxRate: encoding_max_rate_1.encodingMaxRateOption,
167
171
  encodingBufferSize: encoding_buffer_size_1.encodingBufferSizeOption,
168
172
  muted: mute_1.mutedOption,
@@ -28,6 +28,7 @@ type PreStitcherOptions = {
28
28
  codec: Codec | undefined;
29
29
  crf: number | null | undefined;
30
30
  x264Preset: X264Preset | null;
31
+ gopSize: number | null;
31
32
  onProgress: (progress: number) => void;
32
33
  proResProfile: _InternalTypes['ProResProfile'] | undefined;
33
34
  logLevel: LogLevel;
@@ -44,6 +44,7 @@ const prespawnFfmpeg = (options) => {
44
44
  proResProfileName,
45
45
  pixelFormat,
46
46
  x264Preset: options.x264Preset,
47
+ gopSize: options.gopSize,
47
48
  codec,
48
49
  crf: options.crf,
49
50
  videoBitrate: options.videoBitrate,
@@ -148,5 +148,5 @@ type RenderMediaResult = {
148
148
  contentType: string;
149
149
  };
150
150
  export declare const internalRenderMedia: (args_0: InternalRenderMediaOptions) => Promise<RenderMediaResult>;
151
- export declare const renderMedia: ({ proResProfile, x264Preset, crf, composition, inputProps, pixelFormat, codec, envVariables, frameRange, puppeteerInstance, outputLocation, onProgress, overwrite, onDownload, onBrowserLog, onStart, timeoutInMilliseconds, chromiumOptions, scale, browserExecutable, port, cancelSignal, muted, enforceAudioTrack, ffmpegOverride, audioBitrate, videoBitrate, encodingMaxRate, encodingBufferSize, audioCodec, jpegQuality, concurrency, serveUrl, disallowParallelEncoding, everyNthFrame, imageFormat, numberOfGifLoops, dumpBrowserLogs, preferLossless, verbose, quality, logLevel: passedLogLevel, offthreadVideoCacheSizeInBytes, colorSpace, repro, binariesDirectory, separateAudioTo, forSeamlessAacConcatenation, onBrowserDownload, onArtifact, metadata, hardwareAcceleration, chromeMode, offthreadVideoThreads, compositionStart, mediaCacheSizeInBytes, isProduction, sampleRate, ...apiKeyOrLicenseKey }: RenderMediaOptions) => Promise<RenderMediaResult>;
151
+ export declare const renderMedia: ({ proResProfile, x264Preset, gopSize, crf, composition, inputProps, pixelFormat, codec, envVariables, frameRange, puppeteerInstance, outputLocation, onProgress, overwrite, onDownload, onBrowserLog, onStart, timeoutInMilliseconds, chromiumOptions, scale, browserExecutable, port, cancelSignal, muted, enforceAudioTrack, ffmpegOverride, audioBitrate, videoBitrate, encodingMaxRate, encodingBufferSize, audioCodec, jpegQuality, concurrency, serveUrl, disallowParallelEncoding, everyNthFrame, imageFormat, numberOfGifLoops, dumpBrowserLogs, preferLossless, verbose, quality, logLevel: passedLogLevel, offthreadVideoCacheSizeInBytes, colorSpace, repro, binariesDirectory, separateAudioTo, forSeamlessAacConcatenation, onBrowserDownload, onArtifact, metadata, hardwareAcceleration, chromeMode, offthreadVideoThreads, compositionStart, mediaCacheSizeInBytes, isProduction, sampleRate, ...apiKeyOrLicenseKey }: RenderMediaOptions) => Promise<RenderMediaResult>;
152
152
  export {};
@@ -31,6 +31,7 @@ const logger_1 = require("./logger");
31
31
  const make_cancel_signal_1 = require("./make-cancel-signal");
32
32
  const mime_types_1 = require("./mime-types");
33
33
  const color_space_1 = require("./options/color-space");
34
+ const gop_size_1 = require("./options/gop-size");
34
35
  const offthreadvideo_threads_1 = require("./options/offthreadvideo-threads");
35
36
  const x264_preset_1 = require("./options/x264-preset");
36
37
  const overwrite_1 = require("./overwrite");
@@ -55,7 +56,7 @@ const validate_videobitrate_1 = require("./validate-videobitrate");
55
56
  const wrap_with_error_handling_1 = require("./wrap-with-error-handling");
56
57
  const SLOWEST_FRAME_COUNT = 10;
57
58
  const MAX_RECENT_FRAME_TIMINGS = 150;
58
- const internalRenderMediaRaw = ({ proResProfile, x264Preset, crf, composition: compositionWithPossibleUnevenDimensions, serializedInputPropsWithCustomSchema, pixelFormat: userPixelFormat, codec, envVariables, frameRange, puppeteerInstance, outputLocation, onProgress, overwrite, onDownload, onBrowserLog, onStart, timeoutInMilliseconds, chromiumOptions, scale, browserExecutable, port, cancelSignal, muted, enforceAudioTrack, ffmpegOverride, audioBitrate, videoBitrate, encodingMaxRate, encodingBufferSize, audioCodec, concurrency, disallowParallelEncoding, everyNthFrame, imageFormat: provisionalImageFormat, indent, jpegQuality, numberOfGifLoops, onCtrlCExit, preferLossless, serveUrl, server: reusedServer, logLevel, serializedResolvedPropsWithCustomSchema, offthreadVideoCacheSizeInBytes, colorSpace, repro, binariesDirectory, separateAudioTo, forSeamlessAacConcatenation, compositionStart, onBrowserDownload, onArtifact, metadata, hardwareAcceleration, chromeMode, offthreadVideoThreads, mediaCacheSizeInBytes, onLog, licenseKey, isProduction, sampleRate, }) => {
59
+ const internalRenderMediaRaw = ({ proResProfile, x264Preset, gopSize, crf, composition: compositionWithPossibleUnevenDimensions, serializedInputPropsWithCustomSchema, pixelFormat: userPixelFormat, codec, envVariables, frameRange, puppeteerInstance, outputLocation, onProgress, overwrite, onDownload, onBrowserLog, onStart, timeoutInMilliseconds, chromiumOptions, scale, browserExecutable, port, cancelSignal, muted, enforceAudioTrack, ffmpegOverride, audioBitrate, videoBitrate, encodingMaxRate, encodingBufferSize, audioCodec, concurrency, disallowParallelEncoding, everyNthFrame, imageFormat: provisionalImageFormat, indent, jpegQuality, numberOfGifLoops, onCtrlCExit, preferLossless, serveUrl, server: reusedServer, logLevel, serializedResolvedPropsWithCustomSchema, offthreadVideoCacheSizeInBytes, colorSpace, repro, binariesDirectory, separateAudioTo, forSeamlessAacConcatenation, compositionStart, onBrowserDownload, onArtifact, metadata, hardwareAcceleration, chromeMode, offthreadVideoThreads, mediaCacheSizeInBytes, onLog, licenseKey, isProduction, sampleRate, }) => {
59
60
  var _a, _b;
60
61
  const pixelFormat = (_a = userPixelFormat !== null && userPixelFormat !== void 0 ? userPixelFormat : compositionWithPossibleUnevenDimensions.defaultPixelFormat) !== null && _a !== void 0 ? _a : pixel_format_1.DEFAULT_PIXEL_FORMAT;
61
62
  if (repro) {
@@ -78,6 +79,7 @@ const internalRenderMediaRaw = ({ proResProfile, x264Preset, crf, composition: c
78
79
  encodingBufferSize,
79
80
  hardwareAcceleration,
80
81
  });
82
+ (0, gop_size_1.validateGopSize)(gopSize);
81
83
  (0, validate_videobitrate_1.validateBitrate)(audioBitrate, 'audioBitrate');
82
84
  (0, validate_videobitrate_1.validateBitrate)(videoBitrate, 'videoBitrate');
83
85
  (0, validate_videobitrate_1.validateBitrate)(encodingMaxRate, 'encodingMaxRate');
@@ -245,6 +247,7 @@ const internalRenderMediaRaw = ({ proResProfile, x264Preset, crf, composition: c
245
247
  encodingBufferSize,
246
248
  indent,
247
249
  x264Preset: x264Preset !== null && x264Preset !== void 0 ? x264Preset : null,
250
+ gopSize,
248
251
  colorSpace,
249
252
  binariesDirectory,
250
253
  hardwareAcceleration,
@@ -426,6 +429,7 @@ const internalRenderMediaRaw = ({ proResProfile, x264Preset, crf, composition: c
426
429
  codec,
427
430
  proResProfile,
428
431
  crf,
432
+ gopSize,
429
433
  assetsInfo,
430
434
  onProgress: (frame) => {
431
435
  // With seamless AAC concatenation, the amount of rendered frames
@@ -570,7 +574,7 @@ exports.internalRenderMedia = (0, wrap_with_error_handling_1.wrapWithErrorHandli
570
574
  * @description Render a video or an audio programmatically.
571
575
  * @see [Documentation](https://www.remotion.dev/docs/renderer/render-media)
572
576
  */
573
- const renderMedia = ({ proResProfile, x264Preset, crf, composition, inputProps, pixelFormat, codec, envVariables, frameRange, puppeteerInstance, outputLocation, onProgress, overwrite, onDownload, onBrowserLog, onStart, timeoutInMilliseconds, chromiumOptions, scale, browserExecutable, port, cancelSignal, muted, enforceAudioTrack, ffmpegOverride, audioBitrate, videoBitrate, encodingMaxRate, encodingBufferSize, audioCodec, jpegQuality, concurrency, serveUrl, disallowParallelEncoding, everyNthFrame, imageFormat, numberOfGifLoops, dumpBrowserLogs, preferLossless, verbose, quality, logLevel: passedLogLevel, offthreadVideoCacheSizeInBytes, colorSpace, repro, binariesDirectory, separateAudioTo, forSeamlessAacConcatenation, onBrowserDownload, onArtifact, metadata, hardwareAcceleration, chromeMode, offthreadVideoThreads, compositionStart, mediaCacheSizeInBytes, isProduction, sampleRate, ...apiKeyOrLicenseKey }) => {
577
+ const renderMedia = ({ proResProfile, x264Preset, gopSize, crf, composition, inputProps, pixelFormat, codec, envVariables, frameRange, puppeteerInstance, outputLocation, onProgress, overwrite, onDownload, onBrowserLog, onStart, timeoutInMilliseconds, chromiumOptions, scale, browserExecutable, port, cancelSignal, muted, enforceAudioTrack, ffmpegOverride, audioBitrate, videoBitrate, encodingMaxRate, encodingBufferSize, audioCodec, jpegQuality, concurrency, serveUrl, disallowParallelEncoding, everyNthFrame, imageFormat, numberOfGifLoops, dumpBrowserLogs, preferLossless, verbose, quality, logLevel: passedLogLevel, offthreadVideoCacheSizeInBytes, colorSpace, repro, binariesDirectory, separateAudioTo, forSeamlessAacConcatenation, onBrowserDownload, onArtifact, metadata, hardwareAcceleration, chromeMode, offthreadVideoThreads, compositionStart, mediaCacheSizeInBytes, isProduction, sampleRate, ...apiKeyOrLicenseKey }) => {
574
578
  var _a, _b, _c, _d;
575
579
  const indent = false;
576
580
  const logLevel = verbose || dumpBrowserLogs ? 'verbose' : (passedLogLevel !== null && passedLogLevel !== void 0 ? passedLogLevel : 'info');
@@ -582,6 +586,7 @@ const renderMedia = ({ proResProfile, x264Preset, crf, composition, inputProps,
582
586
  return (0, exports.internalRenderMedia)({
583
587
  proResProfile: proResProfile !== null && proResProfile !== void 0 ? proResProfile : undefined,
584
588
  x264Preset: x264Preset !== null && x264Preset !== void 0 ? x264Preset : null,
589
+ gopSize: gopSize !== null && gopSize !== void 0 ? gopSize : null,
585
590
  codec,
586
591
  composition,
587
592
  serveUrl,
@@ -27,6 +27,7 @@ type InternalStitchFramesToVideoOptions = {
27
27
  codec: Codec;
28
28
  audioCodec: AudioCodec | null;
29
29
  crf: number | null;
30
+ gopSize: number | null;
30
31
  onProgress?: null | ((progress: number) => void);
31
32
  onDownload: undefined | RenderMediaOnDownload;
32
33
  proResProfile: undefined | _InternalTypes['ProResProfile'];
@@ -60,6 +61,7 @@ export type StitchFramesToVideoOptions = {
60
61
  codec?: Codec;
61
62
  audioCodec?: AudioCodec | null;
62
63
  crf?: number | null;
64
+ gopSize?: number | null;
63
65
  onProgress?: (progress: number) => void;
64
66
  onDownload?: RenderMediaOnDownload;
65
67
  proResProfile?: _InternalTypes['ProResProfile'];
@@ -75,5 +77,5 @@ export type StitchFramesToVideoOptions = {
75
77
  sampleRate?: number;
76
78
  } & Partial<ToOptions<typeof optionsMap.stitchFramesToVideo>>;
77
79
  export declare const internalStitchFramesToVideo: (options: InternalStitchFramesToVideoOptions) => Promise<Buffer | null>;
78
- export declare const stitchFramesToVideo: ({ assetsInfo, force, fps, height, width, audioBitrate, audioCodec, cancelSignal, codec, crf, enforceAudioTrack, ffmpegOverride, muted, numberOfGifLoops, onDownload, onProgress, outputLocation, pixelFormat, proResProfile, verbose, videoBitrate, maxRate, bufferSize, x264Preset, colorSpace, binariesDirectory, separateAudioTo, metadata, hardwareAcceleration, sampleRate, }: StitchFramesToVideoOptions) => Promise<Buffer | null>;
80
+ export declare const stitchFramesToVideo: ({ assetsInfo, force, fps, height, width, audioBitrate, audioCodec, cancelSignal, codec, crf, gopSize, enforceAudioTrack, ffmpegOverride, muted, numberOfGifLoops, onDownload, onProgress, outputLocation, pixelFormat, proResProfile, verbose, videoBitrate, maxRate, bufferSize, x264Preset, colorSpace, binariesDirectory, separateAudioTo, metadata, hardwareAcceleration, sampleRate, }: StitchFramesToVideoOptions) => Promise<Buffer | null>;
79
81
  export {};
@@ -23,6 +23,7 @@ const make_cancel_signal_1 = require("./make-cancel-signal");
23
23
  const make_metadata_args_1 = require("./make-metadata-args");
24
24
  const audio_codec_1 = require("./options/audio-codec");
25
25
  const color_space_1 = require("./options/color-space");
26
+ const gop_size_1 = require("./options/gop-size");
26
27
  const parse_ffmpeg_progress_1 = require("./parse-ffmpeg-progress");
27
28
  const pixel_format_1 = require("./pixel-format");
28
29
  const prores_profile_1 = require("./prores-profile");
@@ -30,7 +31,7 @@ const render_has_audio_1 = require("./render-has-audio");
30
31
  const validate_1 = require("./validate");
31
32
  const validate_even_dimensions_with_codec_1 = require("./validate-even-dimensions-with-codec");
32
33
  const validate_videobitrate_1 = require("./validate-videobitrate");
33
- const innerStitchFramesToVideo = async ({ assetsInfo, audioBitrate, audioCodec: audioCodecSetting, cancelSignal, codec, crf, enforceAudioTrack, ffmpegOverride, force, fps, height, indent, muted, onDownload, outputLocation, pixelFormat, preEncodedFileLocation, preferLossless, proResProfile, logLevel, videoBitrate, maxRate, bufferSize, width, numberOfGifLoops, onProgress, x264Preset, colorSpace, binariesDirectory, separateAudioTo, metadata, hardwareAcceleration, sampleRate, }, remotionRoot) => {
34
+ const innerStitchFramesToVideo = async ({ assetsInfo, audioBitrate, audioCodec: audioCodecSetting, cancelSignal, codec, crf, gopSize, enforceAudioTrack, ffmpegOverride, force, fps, height, indent, muted, onDownload, outputLocation, pixelFormat, preEncodedFileLocation, preferLossless, proResProfile, logLevel, videoBitrate, maxRate, bufferSize, width, numberOfGifLoops, onProgress, x264Preset, colorSpace, binariesDirectory, separateAudioTo, metadata, hardwareAcceleration, sampleRate, }, remotionRoot) => {
34
35
  var _a;
35
36
  (0, validate_1.validateDimension)(height, 'height', 'passed to `stitchFramesToVideo()`');
36
37
  (0, validate_1.validateDimension)(width, 'width', 'passed to `stitchFramesToVideo()`');
@@ -52,6 +53,7 @@ const innerStitchFramesToVideo = async ({ assetsInfo, audioBitrate, audioCodec:
52
53
  (0, validate_videobitrate_1.validateBitrate)(maxRate, 'maxRate');
53
54
  // bufferSize is not a bitrate but need to be validated using the same format
54
55
  (0, validate_videobitrate_1.validateBitrate)(bufferSize, 'bufferSize');
56
+ (0, gop_size_1.validateGopSize)(gopSize);
55
57
  (0, validate_1.validateFps)(fps, 'in `stitchFramesToVideo()`', false);
56
58
  assetsInfo.downloadMap.preventCleanup();
57
59
  const proResProfileName = (0, get_prores_profile_name_1.getProResProfileName)(codec, proResProfile);
@@ -201,6 +203,7 @@ const innerStitchFramesToVideo = async ({ assetsInfo, audioBitrate, audioCodec:
201
203
  proResProfileName,
202
204
  pixelFormat,
203
205
  x264Preset,
206
+ gopSize,
204
207
  colorSpace,
205
208
  hardwareAcceleration,
206
209
  indent,
@@ -312,7 +315,7 @@ exports.internalStitchFramesToVideo = internalStitchFramesToVideo;
312
315
  * @description Takes a series of images and audio information generated by renderFrames() and encodes it to a video.
313
316
  * @see [Documentation](https://www.remotion.dev/docs/renderer/stitch-frames-to-video)
314
317
  */
315
- const stitchFramesToVideo = ({ assetsInfo, force, fps, height, width, audioBitrate, audioCodec, cancelSignal, codec, crf, enforceAudioTrack, ffmpegOverride, muted, numberOfGifLoops, onDownload, onProgress, outputLocation, pixelFormat, proResProfile, verbose, videoBitrate, maxRate, bufferSize, x264Preset, colorSpace, binariesDirectory, separateAudioTo, metadata, hardwareAcceleration, sampleRate, }) => {
318
+ const stitchFramesToVideo = ({ assetsInfo, force, fps, height, width, audioBitrate, audioCodec, cancelSignal, codec, crf, gopSize, enforceAudioTrack, ffmpegOverride, muted, numberOfGifLoops, onDownload, onProgress, outputLocation, pixelFormat, proResProfile, verbose, videoBitrate, maxRate, bufferSize, x264Preset, colorSpace, binariesDirectory, separateAudioTo, metadata, hardwareAcceleration, sampleRate, }) => {
316
319
  return (0, exports.internalStitchFramesToVideo)({
317
320
  assetsInfo,
318
321
  audioBitrate: audioBitrate !== null && audioBitrate !== void 0 ? audioBitrate : null,
@@ -322,6 +325,7 @@ const stitchFramesToVideo = ({ assetsInfo, force, fps, height, width, audioBitra
322
325
  cancelSignal: cancelSignal !== null && cancelSignal !== void 0 ? cancelSignal : null,
323
326
  codec: codec !== null && codec !== void 0 ? codec : codec_1.DEFAULT_CODEC,
324
327
  crf: crf !== null && crf !== void 0 ? crf : null,
328
+ gopSize: gopSize !== null && gopSize !== void 0 ? gopSize : null,
325
329
  enforceAudioTrack: enforceAudioTrack !== null && enforceAudioTrack !== void 0 ? enforceAudioTrack : false,
326
330
  ffmpegOverride: ffmpegOverride !== null && ffmpegOverride !== void 0 ? ffmpegOverride : null,
327
331
  force: force !== null && force !== void 0 ? force : true,
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.464",
6
+ "version": "4.0.466",
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.464",
26
- "@remotion/streaming": "4.0.464",
25
+ "remotion": "4.0.466",
26
+ "@remotion/streaming": "4.0.466",
27
27
  "source-map": "0.8.0-beta.0",
28
28
  "ws": "8.20.1",
29
- "@remotion/licensing": "4.0.464"
29
+ "@remotion/licensing": "4.0.466"
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.464",
44
- "@remotion/eslint-config-internal": "4.0.464",
43
+ "@remotion/example-videos": "4.0.466",
44
+ "@remotion/eslint-config-internal": "4.0.466",
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.464",
50
- "@remotion/compositor-darwin-x64": "4.0.464",
51
- "@remotion/compositor-linux-arm64-gnu": "4.0.464",
52
- "@remotion/compositor-linux-arm64-musl": "4.0.464",
53
- "@remotion/compositor-linux-x64-gnu": "4.0.464",
54
- "@remotion/compositor-linux-x64-musl": "4.0.464",
55
- "@remotion/compositor-win32-x64-msvc": "4.0.464"
49
+ "@remotion/compositor-darwin-arm64": "4.0.466",
50
+ "@remotion/compositor-darwin-x64": "4.0.466",
51
+ "@remotion/compositor-linux-arm64-gnu": "4.0.466",
52
+ "@remotion/compositor-linux-arm64-musl": "4.0.466",
53
+ "@remotion/compositor-linux-x64-gnu": "4.0.466",
54
+ "@remotion/compositor-linux-x64-musl": "4.0.466",
55
+ "@remotion/compositor-win32-x64-msvc": "4.0.466"
56
56
  },
57
57
  "keywords": [
58
58
  "remotion",