@remotion/renderer 4.0.120 → 4.0.121

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/dist/browser/BrowserPage.js +29 -10
  2. package/dist/call-ffmpeg.d.ts +1 -0
  3. package/dist/can-concatenate-seamlessly.d.ts +3 -0
  4. package/dist/can-concatenate-seamlessly.js +7 -0
  5. package/dist/client.d.ts +49 -49
  6. package/dist/combine-audio.d.ts +6 -1
  7. package/dist/combine-audio.js +33 -12
  8. package/dist/combine-video-streams-seamlessly.d.ts +3 -0
  9. package/dist/combine-video-streams-seamlessly.js +8 -0
  10. package/dist/combine-video-streams.d.ts +4 -1
  11. package/dist/combine-video-streams.js +9 -3
  12. package/dist/compress-audio.d.ts +13 -0
  13. package/dist/compress-audio.js +28 -0
  14. package/dist/create-audio.d.ts +21 -0
  15. package/dist/create-audio.js +82 -0
  16. package/dist/create-combined-video.d.ts +18 -0
  17. package/dist/create-combined-video.js +27 -0
  18. package/dist/create-ffmpeg-complex-filter.d.ts +1 -4
  19. package/dist/get-extension-from-audio-codec.d.ts +2 -0
  20. package/dist/get-extension-from-audio-codec.js +19 -0
  21. package/dist/get-silent-parts.d.ts +1 -1
  22. package/dist/index.d.ts +28 -26
  23. package/dist/mux-video-and-audio.d.ts +5 -1
  24. package/dist/mux-video-and-audio.js +12 -3
  25. package/dist/options/gl.d.ts +3 -3
  26. package/dist/options/index.d.ts +10 -10
  27. package/dist/options/log-level.d.ts +2 -2
  28. package/dist/options/options-map.d.ts +39 -39
  29. package/dist/options/prefer-lossless.d.ts +12 -2
  30. package/dist/options/prefer-lossless.js +19 -4
  31. package/dist/options/x264-preset.d.ts +2 -2
  32. package/dist/provide-screenshot.d.ts +2 -2
  33. package/dist/provide-screenshot.js +2 -1
  34. package/dist/puppeteer-screenshot.d.ts +1 -1
  35. package/dist/puppeteer-screenshot.js +1 -0
  36. package/dist/render-frames.js +2 -1
  37. package/dist/screenshot-dom-element.d.ts +2 -2
  38. package/dist/screenshot-dom-element.js +2 -1
  39. package/dist/screenshot-task.d.ts +2 -2
  40. package/dist/screenshot-task.js +11 -9
  41. package/dist/should-seamless.d.ts +3 -0
  42. package/dist/should-seamless.js +7 -0
  43. package/dist/stitch-frames-to-video.d.ts +1 -0
  44. package/dist/take-frame-and-compose.js +1 -0
  45. package/package.json +9 -9
@@ -195,16 +195,35 @@ class Page extends EventEmitter_1.EventEmitter {
195
195
  return __classPrivateFieldGet(this, _Page_frameManager, "f").mainFrame();
196
196
  }
197
197
  async setViewport(viewport) {
198
- const { value } = await __classPrivateFieldGet(this, _Page_client, "f").send('Emulation.setDeviceMetricsOverride', {
199
- mobile: false,
200
- width: viewport.width,
201
- height: viewport.height,
202
- deviceScaleFactor: viewport.deviceScaleFactor,
203
- screenOrientation: {
204
- angle: 0,
205
- type: 'portraitPrimary',
206
- },
207
- });
198
+ const fromSurface = !process.env.DISABLE_FROM_SURFACE;
199
+ const request = fromSurface
200
+ ? {
201
+ mobile: false,
202
+ width: viewport.width,
203
+ height: viewport.height,
204
+ deviceScaleFactor: viewport.deviceScaleFactor,
205
+ screenOrientation: {
206
+ angle: 0,
207
+ type: 'portraitPrimary',
208
+ },
209
+ }
210
+ : {
211
+ mobile: false,
212
+ width: viewport.width,
213
+ height: viewport.height,
214
+ deviceScaleFactor: 1,
215
+ screenHeight: viewport.height,
216
+ screenWidth: viewport.width,
217
+ scale: viewport.deviceScaleFactor,
218
+ viewport: {
219
+ height: viewport.height * viewport.deviceScaleFactor,
220
+ width: viewport.width * viewport.deviceScaleFactor,
221
+ scale: 1,
222
+ x: 0,
223
+ y: 0,
224
+ },
225
+ };
226
+ const { value } = await __classPrivateFieldGet(this, _Page_client, "f").send('Emulation.setDeviceMetricsOverride', request);
208
227
  return value;
209
228
  }
210
229
  setDefaultNavigationTimeout(timeout) {
@@ -1,3 +1,4 @@
1
+ /// <reference types="node" />
1
2
  import execa from 'execa';
2
3
  import type { SpawnOptionsWithoutStdio } from 'node:child_process';
3
4
  import type { LogLevel } from './log-level';
@@ -0,0 +1,3 @@
1
+ import type { AudioCodec } from './audio-codec';
2
+ import type { Codec } from './codec';
3
+ export declare const canConcatSeamlessly: (audioCodec: AudioCodec | null, codec: Codec) => boolean;
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.canConcatSeamlessly = void 0;
4
+ const canConcatSeamlessly = (audioCodec, codec) => {
5
+ return audioCodec === 'aac' && codec === 'h264';
6
+ };
7
+ exports.canConcatSeamlessly = canConcatSeamlessly;
package/dist/client.d.ts CHANGED
@@ -350,7 +350,7 @@ export declare const BrowserSafeApis: {
350
350
  webhookCustomDataOption: {
351
351
  name: string;
352
352
  cliFlag: "webhook-custom-data";
353
- description: (type: "cli" | "ssr") => import("react/jsx-runtime").JSX.Element;
353
+ description: (type: "ssr" | "cli") => import("react/jsx-runtime").JSX.Element;
354
354
  ssrName: "customData";
355
355
  docLink: string;
356
356
  type: Record<string, unknown> | null;
@@ -424,19 +424,19 @@ export declare const BrowserSafeApis: {
424
424
  cliFlag: "gl";
425
425
  docLink: string;
426
426
  name: string;
427
- type: "swangle" | "angle" | "egl" | "swiftshader" | "vulkan" | "angle-egl" | null;
427
+ type: "angle" | "swangle" | "egl" | "swiftshader" | "vulkan" | "angle-egl" | null;
428
428
  ssrName: string;
429
429
  description: () => import("react/jsx-runtime").JSX.Element;
430
430
  getValue: ({ commandLine }: {
431
431
  commandLine: Record<string, unknown>;
432
432
  }) => {
433
- value: "swangle" | "angle" | "egl" | "swiftshader" | "vulkan" | "angle-egl";
433
+ value: "angle" | "swangle" | "egl" | "swiftshader" | "vulkan" | "angle-egl";
434
434
  source: string;
435
435
  } | {
436
436
  value: null;
437
437
  source: string;
438
438
  };
439
- setConfig: (value: "swangle" | "angle" | "egl" | "swiftshader" | "vulkan" | "angle-egl" | null) => void;
439
+ setConfig: (value: "angle" | "swangle" | "egl" | "swiftshader" | "vulkan" | "angle-egl" | null) => void;
440
440
  };
441
441
  enableLambdaInsights: {
442
442
  name: string;
@@ -543,17 +543,17 @@ export declare const BrowserSafeApis: {
543
543
  description: () => import("react/jsx-runtime").JSX.Element;
544
544
  ssrName: "x264Preset";
545
545
  docLink: string;
546
- type: "ultrafast" | "superfast" | "veryfast" | "faster" | "fast" | "medium" | "slow" | "slower" | "veryslow" | "placebo" | null;
546
+ type: "medium" | "ultrafast" | "superfast" | "veryfast" | "faster" | "fast" | "slow" | "slower" | "veryslow" | "placebo" | null;
547
547
  getValue: ({ commandLine }: {
548
548
  commandLine: Record<string, unknown>;
549
549
  }) => {
550
- value: "ultrafast" | "superfast" | "veryfast" | "faster" | "fast" | "medium" | "slow" | "slower" | "veryslow" | "placebo";
550
+ value: "medium" | "ultrafast" | "superfast" | "veryfast" | "faster" | "fast" | "slow" | "slower" | "veryslow" | "placebo";
551
551
  source: string;
552
552
  } | {
553
553
  value: null;
554
554
  source: string;
555
555
  };
556
- setConfig: (profile: "ultrafast" | "superfast" | "veryfast" | "faster" | "fast" | "medium" | "slow" | "slower" | "veryslow" | "placebo" | null) => void;
556
+ setConfig: (profile: "medium" | "ultrafast" | "superfast" | "veryfast" | "faster" | "fast" | "slow" | "slower" | "veryslow" | "placebo" | null) => void;
557
557
  };
558
558
  logLevelOption: {
559
559
  cliFlag: "log";
@@ -564,11 +564,11 @@ export declare const BrowserSafeApis: {
564
564
  getValue: ({ commandLine }: {
565
565
  commandLine: Record<string, unknown>;
566
566
  }) => {
567
- value: "verbose" | "info" | "warn" | "error";
567
+ value: "error" | "verbose" | "info" | "warn";
568
568
  source: string;
569
569
  };
570
- setConfig: (newLogLevel: "verbose" | "info" | "warn" | "error") => void;
571
- type: "verbose" | "info" | "warn" | "error";
570
+ setConfig: (newLogLevel: "error" | "verbose" | "info" | "warn") => void;
571
+ type: "error" | "verbose" | "info" | "warn";
572
572
  };
573
573
  delayRenderTimeoutInMillisecondsOption: {
574
574
  name: string;
@@ -706,17 +706,17 @@ export declare const BrowserSafeApis: {
706
706
  description: () => import("react/jsx-runtime").JSX.Element;
707
707
  ssrName: "x264Preset";
708
708
  docLink: string;
709
- type: "ultrafast" | "superfast" | "veryfast" | "faster" | "fast" | "medium" | "slow" | "slower" | "veryslow" | "placebo" | null;
709
+ type: "medium" | "ultrafast" | "superfast" | "veryfast" | "faster" | "fast" | "slow" | "slower" | "veryslow" | "placebo" | null;
710
710
  getValue: ({ commandLine }: {
711
711
  commandLine: Record<string, unknown>;
712
712
  }) => {
713
- value: "ultrafast" | "superfast" | "veryfast" | "faster" | "fast" | "medium" | "slow" | "slower" | "veryslow" | "placebo";
713
+ value: "medium" | "ultrafast" | "superfast" | "veryfast" | "faster" | "fast" | "slow" | "slower" | "veryslow" | "placebo";
714
714
  source: string;
715
715
  } | {
716
716
  value: null;
717
717
  source: string;
718
718
  };
719
- setConfig: (profile: "ultrafast" | "superfast" | "veryfast" | "faster" | "fast" | "medium" | "slow" | "slower" | "veryslow" | "placebo" | null) => void;
719
+ setConfig: (profile: "medium" | "ultrafast" | "superfast" | "veryfast" | "faster" | "fast" | "slow" | "slower" | "veryslow" | "placebo" | null) => void;
720
720
  };
721
721
  readonly audioBitrate: {
722
722
  name: string;
@@ -847,11 +847,11 @@ export declare const BrowserSafeApis: {
847
847
  getValue: ({ commandLine }: {
848
848
  commandLine: Record<string, unknown>;
849
849
  }) => {
850
- value: "verbose" | "info" | "warn" | "error";
850
+ value: "error" | "verbose" | "info" | "warn";
851
851
  source: string;
852
852
  };
853
- setConfig: (newLogLevel: "verbose" | "info" | "warn" | "error") => void;
854
- type: "verbose" | "info" | "warn" | "error";
853
+ setConfig: (newLogLevel: "error" | "verbose" | "info" | "warn") => void;
854
+ type: "error" | "verbose" | "info" | "warn";
855
855
  };
856
856
  readonly timeoutInMilliseconds: {
857
857
  name: string;
@@ -927,11 +927,11 @@ export declare const BrowserSafeApis: {
927
927
  getValue: ({ commandLine }: {
928
928
  commandLine: Record<string, unknown>;
929
929
  }) => {
930
- value: "verbose" | "info" | "warn" | "error";
930
+ value: "error" | "verbose" | "info" | "warn";
931
931
  source: string;
932
932
  };
933
- setConfig: (newLogLevel: "verbose" | "info" | "warn" | "error") => void;
934
- type: "verbose" | "info" | "warn" | "error";
933
+ setConfig: (newLogLevel: "error" | "verbose" | "info" | "warn") => void;
934
+ type: "error" | "verbose" | "info" | "warn";
935
935
  };
936
936
  readonly timeoutInMilliseconds: {
937
937
  name: string;
@@ -992,11 +992,11 @@ export declare const BrowserSafeApis: {
992
992
  getValue: ({ commandLine }: {
993
993
  commandLine: Record<string, unknown>;
994
994
  }) => {
995
- value: "verbose" | "info" | "warn" | "error";
995
+ value: "error" | "verbose" | "info" | "warn";
996
996
  source: string;
997
997
  };
998
- setConfig: (newLogLevel: "verbose" | "info" | "warn" | "error") => void;
999
- type: "verbose" | "info" | "warn" | "error";
998
+ setConfig: (newLogLevel: "error" | "verbose" | "info" | "warn") => void;
999
+ type: "error" | "verbose" | "info" | "warn";
1000
1000
  };
1001
1001
  readonly timeoutInMilliseconds: {
1002
1002
  name: string;
@@ -1057,11 +1057,11 @@ export declare const BrowserSafeApis: {
1057
1057
  getValue: ({ commandLine }: {
1058
1058
  commandLine: Record<string, unknown>;
1059
1059
  }) => {
1060
- value: "verbose" | "info" | "warn" | "error";
1060
+ value: "error" | "verbose" | "info" | "warn";
1061
1061
  source: string;
1062
1062
  };
1063
- setConfig: (newLogLevel: "verbose" | "info" | "warn" | "error") => void;
1064
- type: "verbose" | "info" | "warn" | "error";
1063
+ setConfig: (newLogLevel: "error" | "verbose" | "info" | "warn") => void;
1064
+ type: "error" | "verbose" | "info" | "warn";
1065
1065
  };
1066
1066
  readonly timeoutInMilliseconds: {
1067
1067
  name: string;
@@ -1137,11 +1137,11 @@ export declare const BrowserSafeApis: {
1137
1137
  getValue: ({ commandLine }: {
1138
1138
  commandLine: Record<string, unknown>;
1139
1139
  }) => {
1140
- value: "verbose" | "info" | "warn" | "error";
1140
+ value: "error" | "verbose" | "info" | "warn";
1141
1141
  source: string;
1142
1142
  };
1143
- setConfig: (newLogLevel: "verbose" | "info" | "warn" | "error") => void;
1144
- type: "verbose" | "info" | "warn" | "error";
1143
+ setConfig: (newLogLevel: "error" | "verbose" | "info" | "warn") => void;
1144
+ type: "error" | "verbose" | "info" | "warn";
1145
1145
  };
1146
1146
  readonly timeoutInMilliseconds: {
1147
1147
  name: string;
@@ -1268,17 +1268,17 @@ export declare const BrowserSafeApis: {
1268
1268
  description: () => import("react/jsx-runtime").JSX.Element;
1269
1269
  ssrName: "x264Preset";
1270
1270
  docLink: string;
1271
- type: "ultrafast" | "superfast" | "veryfast" | "faster" | "fast" | "medium" | "slow" | "slower" | "veryslow" | "placebo" | null;
1271
+ type: "medium" | "ultrafast" | "superfast" | "veryfast" | "faster" | "fast" | "slow" | "slower" | "veryslow" | "placebo" | null;
1272
1272
  getValue: ({ commandLine }: {
1273
1273
  commandLine: Record<string, unknown>;
1274
1274
  }) => {
1275
- value: "ultrafast" | "superfast" | "veryfast" | "faster" | "fast" | "medium" | "slow" | "slower" | "veryslow" | "placebo";
1275
+ value: "medium" | "ultrafast" | "superfast" | "veryfast" | "faster" | "fast" | "slow" | "slower" | "veryslow" | "placebo";
1276
1276
  source: string;
1277
1277
  } | {
1278
1278
  value: null;
1279
1279
  source: string;
1280
1280
  };
1281
- setConfig: (profile: "ultrafast" | "superfast" | "veryfast" | "faster" | "fast" | "medium" | "slow" | "slower" | "veryslow" | "placebo" | null) => void;
1281
+ setConfig: (profile: "medium" | "ultrafast" | "superfast" | "veryfast" | "faster" | "fast" | "slow" | "slower" | "veryslow" | "placebo" | null) => void;
1282
1282
  };
1283
1283
  readonly encodingMaxRate: {
1284
1284
  name: string;
@@ -1355,11 +1355,11 @@ export declare const BrowserSafeApis: {
1355
1355
  getValue: ({ commandLine }: {
1356
1356
  commandLine: Record<string, unknown>;
1357
1357
  }) => {
1358
- value: "verbose" | "info" | "warn" | "error";
1358
+ value: "error" | "verbose" | "info" | "warn";
1359
1359
  source: string;
1360
1360
  };
1361
- setConfig: (newLogLevel: "verbose" | "info" | "warn" | "error") => void;
1362
- type: "verbose" | "info" | "warn" | "error";
1361
+ setConfig: (newLogLevel: "error" | "verbose" | "info" | "warn") => void;
1362
+ type: "error" | "verbose" | "info" | "warn";
1363
1363
  };
1364
1364
  readonly timeoutInMilliseconds: {
1365
1365
  name: string;
@@ -1420,11 +1420,11 @@ export declare const BrowserSafeApis: {
1420
1420
  getValue: ({ commandLine }: {
1421
1421
  commandLine: Record<string, unknown>;
1422
1422
  }) => {
1423
- value: "verbose" | "info" | "warn" | "error";
1423
+ value: "error" | "verbose" | "info" | "warn";
1424
1424
  source: string;
1425
1425
  };
1426
- setConfig: (newLogLevel: "verbose" | "info" | "warn" | "error") => void;
1427
- type: "verbose" | "info" | "warn" | "error";
1426
+ setConfig: (newLogLevel: "error" | "verbose" | "info" | "warn") => void;
1427
+ type: "error" | "verbose" | "info" | "warn";
1428
1428
  };
1429
1429
  readonly deleteAfter: {
1430
1430
  name: string;
@@ -1503,11 +1503,11 @@ export declare const BrowserSafeApis: {
1503
1503
  getValue: ({ commandLine }: {
1504
1504
  commandLine: Record<string, unknown>;
1505
1505
  }) => {
1506
- value: "verbose" | "info" | "warn" | "error";
1506
+ value: "error" | "verbose" | "info" | "warn";
1507
1507
  source: string;
1508
1508
  };
1509
- setConfig: (newLogLevel: "verbose" | "info" | "warn" | "error") => void;
1510
- type: "verbose" | "info" | "warn" | "error";
1509
+ setConfig: (newLogLevel: "error" | "verbose" | "info" | "warn") => void;
1510
+ type: "error" | "verbose" | "info" | "warn";
1511
1511
  };
1512
1512
  readonly timeoutInMilliseconds: {
1513
1513
  name: string;
@@ -1616,17 +1616,17 @@ export declare const BrowserSafeApis: {
1616
1616
  description: () => import("react/jsx-runtime").JSX.Element;
1617
1617
  ssrName: "x264Preset";
1618
1618
  docLink: string;
1619
- type: "ultrafast" | "superfast" | "veryfast" | "faster" | "fast" | "medium" | "slow" | "slower" | "veryslow" | "placebo" | null;
1619
+ type: "medium" | "ultrafast" | "superfast" | "veryfast" | "faster" | "fast" | "slow" | "slower" | "veryslow" | "placebo" | null;
1620
1620
  getValue: ({ commandLine }: {
1621
1621
  commandLine: Record<string, unknown>;
1622
1622
  }) => {
1623
- value: "ultrafast" | "superfast" | "veryfast" | "faster" | "fast" | "medium" | "slow" | "slower" | "veryslow" | "placebo";
1623
+ value: "medium" | "ultrafast" | "superfast" | "veryfast" | "faster" | "fast" | "slow" | "slower" | "veryslow" | "placebo";
1624
1624
  source: string;
1625
1625
  } | {
1626
1626
  value: null;
1627
1627
  source: string;
1628
1628
  };
1629
- setConfig: (profile: "ultrafast" | "superfast" | "veryfast" | "faster" | "fast" | "medium" | "slow" | "slower" | "veryslow" | "placebo" | null) => void;
1629
+ setConfig: (profile: "medium" | "ultrafast" | "superfast" | "veryfast" | "faster" | "fast" | "slow" | "slower" | "veryslow" | "placebo" | null) => void;
1630
1630
  };
1631
1631
  readonly encodingMaxRate: {
1632
1632
  name: string;
@@ -1688,11 +1688,11 @@ export declare const BrowserSafeApis: {
1688
1688
  getValue: ({ commandLine }: {
1689
1689
  commandLine: Record<string, unknown>;
1690
1690
  }) => {
1691
- value: "verbose" | "info" | "warn" | "error";
1691
+ value: "error" | "verbose" | "info" | "warn";
1692
1692
  source: string;
1693
1693
  };
1694
- setConfig: (newLogLevel: "verbose" | "info" | "warn" | "error") => void;
1695
- type: "verbose" | "info" | "warn" | "error";
1694
+ setConfig: (newLogLevel: "error" | "verbose" | "info" | "warn") => void;
1695
+ type: "error" | "verbose" | "info" | "warn";
1696
1696
  };
1697
1697
  readonly delayRenderTimeoutInMilliseconds: {
1698
1698
  name: string;
@@ -1798,11 +1798,11 @@ export declare const BrowserSafeApis: {
1798
1798
  getValue: ({ commandLine }: {
1799
1799
  commandLine: Record<string, unknown>;
1800
1800
  }) => {
1801
- value: "verbose" | "info" | "warn" | "error";
1801
+ value: "error" | "verbose" | "info" | "warn";
1802
1802
  source: string;
1803
1803
  };
1804
- setConfig: (newLogLevel: "verbose" | "info" | "warn" | "error") => void;
1805
- type: "verbose" | "info" | "warn" | "error";
1804
+ setConfig: (newLogLevel: "error" | "verbose" | "info" | "warn") => void;
1805
+ type: "error" | "verbose" | "info" | "warn";
1806
1806
  };
1807
1807
  readonly scale: {
1808
1808
  name: string;
@@ -1,8 +1,9 @@
1
1
  import type { AudioCodec } from './audio-codec';
2
2
  import type { LogLevel } from './log-level';
3
+ import type { CancelSignal } from './make-cancel-signal';
3
4
  export declare const durationOf1Frame: number;
4
5
  export declare const getClosestAlignedTime: (targetTime: number) => number;
5
- export declare const createCombinedAudio: ({ seamless, filelistDir, files, indent, logLevel, audioBitrate, resolvedAudioCodec, output, chunkDurationInSeconds, addRemotionMetadata, }: {
6
+ export declare const createCombinedAudio: ({ seamless, filelistDir, files, indent, logLevel, audioBitrate, resolvedAudioCodec, output, chunkDurationInSeconds, addRemotionMetadata, binariesDirectory, fps, cancelSignal, onProgress, }: {
6
7
  seamless: boolean;
7
8
  filelistDir: string;
8
9
  files: string[];
@@ -13,4 +14,8 @@ export declare const createCombinedAudio: ({ seamless, filelistDir, files, inden
13
14
  output: string;
14
15
  chunkDurationInSeconds: number;
15
16
  addRemotionMetadata: boolean;
17
+ binariesDirectory: string | null;
18
+ fps: number;
19
+ cancelSignal: CancelSignal | undefined;
20
+ onProgress: (frames: number) => void;
16
21
  }) => Promise<string>;
@@ -17,12 +17,14 @@ const getClosestAlignedTime = (targetTime) => {
17
17
  return nearestFrameIndexForTargetTime * exports.durationOf1Frame;
18
18
  };
19
19
  exports.getClosestAlignedTime = getClosestAlignedTime;
20
- const encodeAudio = async ({ files, resolvedAudioCodec, audioBitrate, filelistDir, output, indent, logLevel, addRemotionMetadata, }) => {
20
+ const encodeAudio = async ({ files, resolvedAudioCodec, audioBitrate, filelistDir, output, indent, logLevel, addRemotionMetadata, fps, binariesDirectory, cancelSignal, onProgress, }) => {
21
21
  var _a;
22
22
  const fileList = files.map((p) => `file '${p}'`).join('\n');
23
23
  const fileListTxt = (0, path_1.join)(filelistDir, 'audio-files.txt');
24
24
  (0, fs_1.writeFileSync)(fileListTxt, fileList);
25
+ const startCombining = Date.now();
25
26
  const command = [
27
+ '-hide_banner',
26
28
  '-f',
27
29
  'concat',
28
30
  '-safe',
@@ -41,32 +43,39 @@ const encodeAudio = async ({ files, resolvedAudioCodec, audioBitrate, filelistDi
41
43
  '-y',
42
44
  output,
43
45
  ];
46
+ logger_1.Log.verbose({ indent, logLevel }, `Combining audio with re-encoding, command: ${command.join(' ')}`);
44
47
  try {
45
48
  const task = (0, call_ffmpeg_1.callFf)({
46
49
  args: command,
47
50
  bin: 'ffmpeg',
48
51
  indent,
49
52
  logLevel,
53
+ binariesDirectory,
54
+ cancelSignal,
50
55
  });
51
56
  (_a = task.stderr) === null || _a === void 0 ? void 0 : _a.on('data', (data) => {
52
- const parsed = (0, parse_ffmpeg_progress_1.parseFfmpegProgress)(data.toString('utf8'));
57
+ const utf8 = data.toString('utf8');
58
+ const parsed = (0, parse_ffmpeg_progress_1.parseFfmpegProgress)(utf8, fps);
53
59
  if (parsed === undefined) {
54
- logger_1.Log.verbose({ indent, logLevel }, data.toString('utf8'));
60
+ logger_1.Log.verbose({ indent, logLevel }, utf8);
55
61
  }
56
62
  else {
63
+ onProgress(parsed);
57
64
  logger_1.Log.verbose({ indent, logLevel }, `Encoded ${parsed} audio frames`);
58
65
  }
59
66
  });
60
67
  await task;
68
+ logger_1.Log.verbose({ indent, logLevel }, `Encoded audio in ${Date.now() - startCombining}ms`);
61
69
  return output;
62
70
  }
63
71
  catch (e) {
64
- (0, fs_1.rmSync)(filelistDir, { recursive: true });
72
+ (0, fs_1.rmSync)(fileListTxt, { recursive: true });
65
73
  throw e;
66
74
  }
67
75
  };
68
- const combineAudioSeamlessly = async ({ files, filelistDir, indent, logLevel, output, chunkDurationInSeconds, addRemotionMetadata, }) => {
76
+ const combineAudioSeamlessly = async ({ files, filelistDir, indent, logLevel, output, chunkDurationInSeconds, addRemotionMetadata, fps, binariesDirectory, cancelSignal, onProgress, }) => {
69
77
  var _a;
78
+ const startConcatenating = Date.now();
70
79
  const fileList = files
71
80
  .map((p, i) => {
72
81
  const isLast = i === files.length - 1;
@@ -97,6 +106,7 @@ const combineAudioSeamlessly = async ({ files, filelistDir, indent, logLevel, ou
97
106
  const fileListTxt = (0, path_1.join)(filelistDir, 'audio-files.txt');
98
107
  (0, fs_1.writeFileSync)(fileListTxt, fileList);
99
108
  const command = [
109
+ '-hide_banner',
100
110
  '-f',
101
111
  'concat',
102
112
  '-safe',
@@ -111,32 +121,35 @@ const combineAudioSeamlessly = async ({ files, filelistDir, indent, logLevel, ou
111
121
  '-y',
112
122
  output,
113
123
  ];
124
+ logger_1.Log.verbose({ indent, logLevel }, `Combining AAC audio seamlessly, command: ${command.join(' ')}`);
114
125
  try {
115
126
  const task = (0, call_ffmpeg_1.callFf)({
116
127
  args: command,
117
128
  bin: 'ffmpeg',
118
129
  indent,
119
130
  logLevel,
131
+ binariesDirectory,
132
+ cancelSignal,
120
133
  });
121
134
  (_a = task.stderr) === null || _a === void 0 ? void 0 : _a.on('data', (data) => {
122
- const parsed = (0, parse_ffmpeg_progress_1.parseFfmpegProgress)(data.toString('utf8'));
123
- if (parsed === undefined) {
124
- logger_1.Log.verbose({ indent, logLevel }, data.toString('utf8'));
125
- }
126
- else {
135
+ const utf8 = data.toString('utf8');
136
+ const parsed = (0, parse_ffmpeg_progress_1.parseFfmpegProgress)(utf8, fps);
137
+ if (parsed !== undefined) {
138
+ onProgress(parsed);
127
139
  logger_1.Log.verbose({ indent, logLevel }, `Encoded ${parsed} audio frames`);
128
140
  }
129
141
  });
130
142
  await task;
143
+ logger_1.Log.verbose({ indent, logLevel }, `Combined audio seamlessly in ${Date.now() - startConcatenating}ms`);
131
144
  return output;
132
145
  }
133
146
  catch (e) {
134
- (0, fs_1.rmSync)(filelistDir, { recursive: true });
147
+ (0, fs_1.rmSync)(fileListTxt, { recursive: true });
135
148
  console.log(e);
136
149
  throw e;
137
150
  }
138
151
  };
139
- const createCombinedAudio = ({ seamless, filelistDir, files, indent, logLevel, audioBitrate, resolvedAudioCodec, output, chunkDurationInSeconds, addRemotionMetadata, }) => {
152
+ const createCombinedAudio = ({ seamless, filelistDir, files, indent, logLevel, audioBitrate, resolvedAudioCodec, output, chunkDurationInSeconds, addRemotionMetadata, binariesDirectory, fps, cancelSignal, onProgress, }) => {
140
153
  if (seamless) {
141
154
  return combineAudioSeamlessly({
142
155
  filelistDir,
@@ -146,6 +159,10 @@ const createCombinedAudio = ({ seamless, filelistDir, files, indent, logLevel, a
146
159
  output,
147
160
  chunkDurationInSeconds,
148
161
  addRemotionMetadata,
162
+ binariesDirectory,
163
+ fps,
164
+ cancelSignal,
165
+ onProgress,
149
166
  });
150
167
  }
151
168
  return encodeAudio({
@@ -157,6 +174,10 @@ const createCombinedAudio = ({ seamless, filelistDir, files, indent, logLevel, a
157
174
  indent,
158
175
  logLevel,
159
176
  addRemotionMetadata,
177
+ binariesDirectory,
178
+ fps,
179
+ cancelSignal,
180
+ onProgress,
160
181
  });
161
182
  };
162
183
  exports.createCombinedAudio = createCombinedAudio;
@@ -0,0 +1,3 @@
1
+ export declare const combineVideoStreamsSeamlessly: ({ files }: {
2
+ files: string[];
3
+ }) => string;
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.combineVideoStreamsSeamlessly = void 0;
4
+ const combineVideoStreamsSeamlessly = ({ files }) => {
5
+ const fileList = `concat:${files.join('|')}`;
6
+ return fileList;
7
+ };
8
+ exports.combineVideoStreamsSeamlessly = combineVideoStreamsSeamlessly;
@@ -1,6 +1,7 @@
1
1
  import type { Codec } from './codec';
2
2
  import type { LogLevel } from './log-level';
3
- export declare const combineVideoStreams: ({ fps, codec, filelistDir, numberOfGifLoops, output, indent, logLevel, onProgress, files, addRemotionMetadata, }: {
3
+ import type { CancelSignal } from './make-cancel-signal';
4
+ export declare const combineVideoStreams: ({ fps, codec, filelistDir, numberOfGifLoops, output, indent, logLevel, onProgress, files, addRemotionMetadata, binariesDirectory, cancelSignal, }: {
4
5
  fps: number;
5
6
  codec: Codec;
6
7
  filelistDir: string;
@@ -11,4 +12,6 @@ export declare const combineVideoStreams: ({ fps, codec, filelistDir, numberOfGi
11
12
  onProgress: (p: number) => void;
12
13
  files: string[];
13
14
  addRemotionMetadata: boolean;
15
+ binariesDirectory: string | null;
16
+ cancelSignal: CancelSignal | undefined;
14
17
  }) => Promise<string>;
@@ -9,12 +9,13 @@ const convert_number_of_gif_loops_to_ffmpeg_1 = require("./convert-number-of-gif
9
9
  const logger_1 = require("./logger");
10
10
  const parse_ffmpeg_progress_1 = require("./parse-ffmpeg-progress");
11
11
  const truthy_1 = require("./truthy");
12
- const combineVideoStreams = async ({ fps, codec, filelistDir, numberOfGifLoops, output, indent, logLevel, onProgress, files, addRemotionMetadata, }) => {
12
+ const combineVideoStreams = async ({ fps, codec, filelistDir, numberOfGifLoops, output, indent, logLevel, onProgress, files, addRemotionMetadata, binariesDirectory, cancelSignal, }) => {
13
13
  var _a;
14
14
  const fileList = files.map((p) => `file '${p}'`).join('\n');
15
15
  const fileListTxt = (0, path_1.join)(filelistDir, 'video-files.txt');
16
16
  (0, fs_1.writeFileSync)(fileListTxt, fileList);
17
17
  const command = [
18
+ '-hide_banner',
18
19
  '-r',
19
20
  String(fps),
20
21
  '-f',
@@ -37,15 +38,19 @@ const combineVideoStreams = async ({ fps, codec, filelistDir, numberOfGifLoops,
37
38
  '-y',
38
39
  output,
39
40
  ].filter(truthy_1.truthy);
41
+ const startTime = Date.now();
42
+ logger_1.Log.verbose({ indent, logLevel }, `Combining video without re-encoding, command: ${command.join(' ')}`);
40
43
  try {
41
44
  const task = (0, call_ffmpeg_1.callFf)({
42
45
  args: command,
43
46
  bin: 'ffmpeg',
44
47
  indent,
45
48
  logLevel,
49
+ binariesDirectory,
50
+ cancelSignal,
46
51
  });
47
52
  (_a = task.stderr) === null || _a === void 0 ? void 0 : _a.on('data', (data) => {
48
- const parsed = (0, parse_ffmpeg_progress_1.parseFfmpegProgress)(data.toString('utf8'));
53
+ const parsed = (0, parse_ffmpeg_progress_1.parseFfmpegProgress)(data.toString('utf8'), fps);
49
54
  if (parsed === undefined) {
50
55
  logger_1.Log.verbose({ indent, logLevel }, data.toString('utf8'));
51
56
  }
@@ -55,10 +60,11 @@ const combineVideoStreams = async ({ fps, codec, filelistDir, numberOfGifLoops,
55
60
  }
56
61
  });
57
62
  await task;
63
+ logger_1.Log.verbose({ indent, logLevel }, `Finished combining video in ${Date.now() - startTime}ms`);
58
64
  return output;
59
65
  }
60
66
  catch (e) {
61
- (0, fs_1.rmSync)(filelistDir, { recursive: true });
67
+ (0, fs_1.rmSync)(fileListTxt, { recursive: true });
62
68
  throw e;
63
69
  }
64
70
  };
@@ -0,0 +1,13 @@
1
+ import type { AudioCodec } from './audio-codec';
2
+ import type { LogLevel } from './log-level';
3
+ import type { CancelSignal } from './make-cancel-signal';
4
+ export declare const compressAudio: ({ audioCodec, outName, binariesDirectory, indent, logLevel, audioBitrate, cancelSignal, inName, }: {
5
+ audioCodec: AudioCodec;
6
+ outName: string;
7
+ indent: boolean;
8
+ logLevel: LogLevel;
9
+ binariesDirectory: string | null;
10
+ audioBitrate: string | null;
11
+ cancelSignal: CancelSignal | undefined;
12
+ inName: string;
13
+ }) => Promise<void>;
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.compressAudio = void 0;
4
+ const audio_codec_1 = require("./audio-codec");
5
+ const call_ffmpeg_1 = require("./call-ffmpeg");
6
+ const truthy_1 = require("./truthy");
7
+ const compressAudio = async ({ audioCodec, outName, binariesDirectory, indent, logLevel, audioBitrate, cancelSignal, inName, }) => {
8
+ const args = [
9
+ ['-i', inName],
10
+ ['-c:a', (0, audio_codec_1.mapAudioCodecToFfmpegAudioCodecName)(audioCodec)],
11
+ audioCodec === 'aac' ? ['-f', 'adts'] : null,
12
+ audioCodec ? ['-b:a', audioBitrate || '320k'] : null,
13
+ audioCodec === 'aac' ? '-cutoff' : null,
14
+ audioCodec === 'aac' ? '18000' : null,
15
+ ['-y', outName],
16
+ ]
17
+ .filter(truthy_1.truthy)
18
+ .flat(2);
19
+ await (0, call_ffmpeg_1.callFf)({
20
+ bin: 'ffmpeg',
21
+ args,
22
+ indent,
23
+ logLevel,
24
+ binariesDirectory,
25
+ cancelSignal,
26
+ });
27
+ };
28
+ exports.compressAudio = compressAudio;