@remotion/renderer 3.3.41 → 3.3.43

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/client.d.ts ADDED
@@ -0,0 +1 @@
1
+ export * from './dist/client';
package/client.js ADDED
@@ -0,0 +1 @@
1
+ module.exports = require('./dist/client');
@@ -0,0 +1,27 @@
1
+ import type { Codec } from './codec';
2
+ export declare const validAudioCodecs: readonly ["pcm-16", "aac", "mp3", "opus"];
3
+ export declare type AudioCodec = typeof validAudioCodecs[number];
4
+ export declare const supportedAudioCodecs: {
5
+ readonly h264: readonly ["aac", "pcm-16"];
6
+ readonly 'h264-mkv': readonly ["pcm-16"];
7
+ readonly aac: readonly ["aac", "pcm-16"];
8
+ readonly gif: readonly [];
9
+ readonly h265: readonly ["aac", "pcm-16"];
10
+ readonly mp3: readonly ["mp3", "pcm-16"];
11
+ readonly prores: readonly ["aac", "pcm-16"];
12
+ readonly vp8: readonly ["opus", "pcm-16"];
13
+ readonly vp9: readonly ["opus", "pcm-16"];
14
+ readonly wav: readonly ["pcm-16"];
15
+ };
16
+ export declare const audioCodecNames: readonly ["pcm_s16le", "aac", "libmp3lame", "libopus"];
17
+ export declare type FfmpegAudioCodecName = typeof audioCodecNames[number];
18
+ export declare const mapAudioCodecToFfmpegAudioCodecName: (audioCodec: AudioCodec) => FfmpegAudioCodecName;
19
+ export declare const defaultAudioCodecs: {
20
+ [key in Codec]: {
21
+ [k in 'compressed' | 'lossless']: typeof supportedAudioCodecs[key][number] | null;
22
+ };
23
+ };
24
+ export declare const getDefaultAudioCodec: ({ codec, preferLossless, }: {
25
+ codec: Codec;
26
+ preferLossless: boolean;
27
+ }) => AudioCodec | null;
@@ -0,0 +1,89 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getDefaultAudioCodec = exports.defaultAudioCodecs = exports.mapAudioCodecToFfmpegAudioCodecName = exports.audioCodecNames = exports.supportedAudioCodecs = exports.validAudioCodecs = void 0;
4
+ exports.validAudioCodecs = ['pcm-16', 'aac', 'mp3', 'opus'];
5
+ exports.supportedAudioCodecs = {
6
+ h264: ['aac', 'pcm-16'],
7
+ 'h264-mkv': ['pcm-16'],
8
+ aac: ['aac', 'pcm-16'],
9
+ gif: [],
10
+ h265: ['aac', 'pcm-16'],
11
+ mp3: ['mp3', 'pcm-16'],
12
+ prores: ['aac', 'pcm-16'],
13
+ vp8: ['opus', 'pcm-16'],
14
+ vp9: ['opus', 'pcm-16'],
15
+ wav: ['pcm-16'],
16
+ };
17
+ const _satisfies = exports.supportedAudioCodecs;
18
+ if (_satisfies) {
19
+ // Just for type checking
20
+ }
21
+ exports.audioCodecNames = [
22
+ 'pcm_s16le',
23
+ 'aac',
24
+ 'libmp3lame',
25
+ 'libopus',
26
+ ];
27
+ const mapAudioCodecToFfmpegAudioCodecName = (audioCodec) => {
28
+ if (audioCodec === 'aac') {
29
+ return 'aac';
30
+ }
31
+ if (audioCodec === 'mp3') {
32
+ return 'libmp3lame';
33
+ }
34
+ if (audioCodec === 'opus') {
35
+ return 'libopus';
36
+ }
37
+ if (audioCodec === 'pcm-16') {
38
+ return 'pcm_s16le';
39
+ }
40
+ throw new Error('unknown audio codec: ' + audioCodec);
41
+ };
42
+ exports.mapAudioCodecToFfmpegAudioCodecName = mapAudioCodecToFfmpegAudioCodecName;
43
+ exports.defaultAudioCodecs = {
44
+ 'h264-mkv': {
45
+ lossless: 'pcm-16',
46
+ compressed: 'pcm-16',
47
+ },
48
+ aac: {
49
+ lossless: 'pcm-16',
50
+ compressed: 'aac',
51
+ },
52
+ gif: {
53
+ lossless: null,
54
+ compressed: null,
55
+ },
56
+ h264: {
57
+ lossless: 'pcm-16',
58
+ compressed: 'aac',
59
+ },
60
+ h265: {
61
+ lossless: 'pcm-16',
62
+ compressed: 'aac',
63
+ },
64
+ mp3: {
65
+ lossless: 'pcm-16',
66
+ compressed: 'mp3',
67
+ },
68
+ prores: {
69
+ lossless: 'pcm-16',
70
+ // V4.0: Make pcm the default
71
+ compressed: 'aac',
72
+ },
73
+ vp8: {
74
+ lossless: 'pcm-16',
75
+ compressed: 'opus',
76
+ },
77
+ vp9: {
78
+ lossless: 'pcm-16',
79
+ compressed: 'opus',
80
+ },
81
+ wav: {
82
+ lossless: 'pcm-16',
83
+ compressed: 'pcm-16',
84
+ },
85
+ };
86
+ const getDefaultAudioCodec = ({ codec, preferLossless, }) => {
87
+ return exports.defaultAudioCodecs[codec][preferLossless ? 'lossless' : 'compressed'];
88
+ };
89
+ exports.getDefaultAudioCodec = getDefaultAudioCodec;
package/dist/client.d.ts CHANGED
@@ -1,10 +1,178 @@
1
1
  export declare const BrowserSafeApis: {
2
- getFileExtensionFromCodec: (codec: "h264" | "h265" | "vp8" | "vp9" | "mp3" | "aac" | "wav" | "prores" | "h264-mkv" | "gif") => "mp3" | "aac" | "wav" | "gif" | "mp4" | "mkv" | "mov" | "webm";
2
+ getFileExtensionFromCodec: <T extends "h264" | "h265" | "vp8" | "vp9" | "mp3" | "aac" | "wav" | "prores" | "h264-mkv" | "gif">(codec: T, audioCodec: "mp3" | "aac" | "pcm-16" | "opus" | null) => import("./file-extensions").FileExtension;
3
3
  validCodecs: readonly ["h264", "h265", "vp8", "vp9", "mp3", "aac", "wav", "prores", "h264-mkv", "gif"];
4
4
  getDefaultCrfForCodec: (codec: "h264" | "h265" | "vp8" | "vp9" | "mp3" | "aac" | "wav" | "prores" | "h264-mkv" | "gif") => number;
5
5
  getValidCrfRanges: (codec: "h264" | "h265" | "vp8" | "vp9" | "mp3" | "aac" | "wav" | "prores" | "h264-mkv" | "gif") => [number, number];
6
6
  isAudioCodec: (codec: "h264" | "h265" | "vp8" | "vp9" | "mp3" | "aac" | "wav" | "prores" | "h264-mkv" | "gif" | undefined) => boolean;
7
- proResProfileOptions: readonly ["4444-xq", "4444", "hq", "standard", "light", "proxy"];
8
7
  validPixelFormats: readonly ["yuv420p", "yuva420p", "yuv422p", "yuv444p", "yuv420p10le", "yuv422p10le", "yuv444p10le", "yuva444p10le"];
9
8
  DEFAULT_PIXEL_FORMAT: "yuv420p" | "yuva420p" | "yuv422p" | "yuv444p" | "yuv420p10le" | "yuv422p10le" | "yuv444p10le" | "yuva444p10le";
9
+ supportedAudioCodecs: {
10
+ readonly h264: readonly ["aac", "pcm-16"];
11
+ readonly 'h264-mkv': readonly ["pcm-16"];
12
+ readonly aac: readonly ["aac", "pcm-16"];
13
+ readonly gif: readonly [];
14
+ readonly h265: readonly ["aac", "pcm-16"];
15
+ readonly mp3: readonly ["mp3", "pcm-16"];
16
+ readonly prores: readonly ["pcm-16", "aac"];
17
+ readonly vp8: readonly ["opus", "pcm-16"];
18
+ readonly vp9: readonly ["opus", "pcm-16"];
19
+ readonly wav: readonly ["pcm-16"];
20
+ };
21
+ defaultFileExtensionMap: {
22
+ h264: {
23
+ default: import("./file-extensions").FileExtension;
24
+ forAudioCodec: {
25
+ aac: {
26
+ possible: import("./file-extensions").FileExtension[];
27
+ default: import("./file-extensions").FileExtension;
28
+ };
29
+ "pcm-16": {
30
+ possible: import("./file-extensions").FileExtension[];
31
+ default: import("./file-extensions").FileExtension;
32
+ };
33
+ };
34
+ };
35
+ h265: {
36
+ default: import("./file-extensions").FileExtension;
37
+ forAudioCodec: {
38
+ aac: {
39
+ possible: import("./file-extensions").FileExtension[];
40
+ default: import("./file-extensions").FileExtension;
41
+ };
42
+ "pcm-16": {
43
+ possible: import("./file-extensions").FileExtension[];
44
+ default: import("./file-extensions").FileExtension;
45
+ };
46
+ };
47
+ };
48
+ vp8: {
49
+ default: import("./file-extensions").FileExtension;
50
+ forAudioCodec: {
51
+ "pcm-16": {
52
+ possible: import("./file-extensions").FileExtension[];
53
+ default: import("./file-extensions").FileExtension;
54
+ };
55
+ opus: {
56
+ possible: import("./file-extensions").FileExtension[];
57
+ default: import("./file-extensions").FileExtension;
58
+ };
59
+ };
60
+ };
61
+ vp9: {
62
+ default: import("./file-extensions").FileExtension;
63
+ forAudioCodec: {
64
+ "pcm-16": {
65
+ possible: import("./file-extensions").FileExtension[];
66
+ default: import("./file-extensions").FileExtension;
67
+ };
68
+ opus: {
69
+ possible: import("./file-extensions").FileExtension[];
70
+ default: import("./file-extensions").FileExtension;
71
+ };
72
+ };
73
+ };
74
+ mp3: {
75
+ default: import("./file-extensions").FileExtension;
76
+ forAudioCodec: {
77
+ mp3: {
78
+ possible: import("./file-extensions").FileExtension[];
79
+ default: import("./file-extensions").FileExtension;
80
+ };
81
+ "pcm-16": {
82
+ possible: import("./file-extensions").FileExtension[];
83
+ default: import("./file-extensions").FileExtension;
84
+ };
85
+ };
86
+ };
87
+ aac: {
88
+ default: import("./file-extensions").FileExtension;
89
+ forAudioCodec: {
90
+ aac: {
91
+ possible: import("./file-extensions").FileExtension[];
92
+ default: import("./file-extensions").FileExtension;
93
+ };
94
+ "pcm-16": {
95
+ possible: import("./file-extensions").FileExtension[];
96
+ default: import("./file-extensions").FileExtension;
97
+ };
98
+ };
99
+ };
100
+ wav: {
101
+ default: import("./file-extensions").FileExtension;
102
+ forAudioCodec: {
103
+ "pcm-16": {
104
+ possible: import("./file-extensions").FileExtension[];
105
+ default: import("./file-extensions").FileExtension;
106
+ };
107
+ };
108
+ };
109
+ prores: {
110
+ default: import("./file-extensions").FileExtension;
111
+ forAudioCodec: {
112
+ aac: {
113
+ possible: import("./file-extensions").FileExtension[];
114
+ default: import("./file-extensions").FileExtension;
115
+ };
116
+ "pcm-16": {
117
+ possible: import("./file-extensions").FileExtension[];
118
+ default: import("./file-extensions").FileExtension;
119
+ };
120
+ };
121
+ };
122
+ "h264-mkv": {
123
+ default: import("./file-extensions").FileExtension;
124
+ forAudioCodec: {
125
+ "pcm-16": {
126
+ possible: import("./file-extensions").FileExtension[];
127
+ default: import("./file-extensions").FileExtension;
128
+ };
129
+ };
130
+ };
131
+ gif: {
132
+ default: import("./file-extensions").FileExtension;
133
+ forAudioCodec: {};
134
+ };
135
+ };
136
+ defaultAudioCodecs: {
137
+ h264: {
138
+ compressed: "aac" | "pcm-16" | null;
139
+ lossless: "aac" | "pcm-16" | null;
140
+ };
141
+ h265: {
142
+ compressed: "aac" | "pcm-16" | null;
143
+ lossless: "aac" | "pcm-16" | null;
144
+ };
145
+ vp8: {
146
+ compressed: "pcm-16" | "opus" | null;
147
+ lossless: "pcm-16" | "opus" | null;
148
+ };
149
+ vp9: {
150
+ compressed: "pcm-16" | "opus" | null;
151
+ lossless: "pcm-16" | "opus" | null;
152
+ };
153
+ mp3: {
154
+ compressed: "mp3" | "pcm-16" | null;
155
+ lossless: "mp3" | "pcm-16" | null;
156
+ };
157
+ aac: {
158
+ compressed: "aac" | "pcm-16" | null;
159
+ lossless: "aac" | "pcm-16" | null;
160
+ };
161
+ wav: {
162
+ compressed: "pcm-16" | null;
163
+ lossless: "pcm-16" | null;
164
+ };
165
+ prores: {
166
+ compressed: "aac" | "pcm-16" | null;
167
+ lossless: "aac" | "pcm-16" | null;
168
+ };
169
+ "h264-mkv": {
170
+ compressed: "pcm-16" | null;
171
+ lossless: "pcm-16" | null;
172
+ };
173
+ gif: {
174
+ compressed: null;
175
+ lossless: null;
176
+ };
177
+ };
10
178
  };
package/dist/client.js CHANGED
@@ -1,19 +1,22 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.BrowserSafeApis = void 0;
4
+ const audio_codec_1 = require("./audio-codec");
4
5
  const codec_1 = require("./codec");
5
6
  const crf_1 = require("./crf");
7
+ const file_extensions_1 = require("./file-extensions");
6
8
  const get_extension_from_codec_1 = require("./get-extension-from-codec");
7
9
  const is_audio_codec_1 = require("./is-audio-codec");
8
10
  const pixel_format_1 = require("./pixel-format");
9
- const prores_profile_1 = require("./prores-profile");
10
11
  exports.BrowserSafeApis = {
11
12
  getFileExtensionFromCodec: get_extension_from_codec_1.getFileExtensionFromCodec,
12
13
  validCodecs: codec_1.validCodecs,
13
14
  getDefaultCrfForCodec: crf_1.getDefaultCrfForCodec,
14
15
  getValidCrfRanges: crf_1.getValidCrfRanges,
15
16
  isAudioCodec: is_audio_codec_1.isAudioCodec,
16
- proResProfileOptions: prores_profile_1.proResProfileOptions,
17
17
  validPixelFormats: pixel_format_1.validPixelFormats,
18
18
  DEFAULT_PIXEL_FORMAT: pixel_format_1.DEFAULT_PIXEL_FORMAT,
19
+ supportedAudioCodecs: file_extensions_1.supportedAudioCodecs,
20
+ defaultFileExtensionMap: file_extensions_1.defaultFileExtensionMap,
21
+ defaultAudioCodecs: audio_codec_1.defaultAudioCodecs,
19
22
  };
@@ -1,3 +1,4 @@
1
+ import type { AudioCodec } from './audio-codec';
1
2
  import type { Codec } from './codec';
2
3
  import type { FfmpegExecutable } from './ffmpeg-executable';
3
4
  declare type Options = {
@@ -11,6 +12,7 @@ declare type Options = {
11
12
  numberOfGifLoops: number | null;
12
13
  remotionRoot: string;
13
14
  ffmpegExecutable: FfmpegExecutable;
15
+ audioCodec: AudioCodec | null;
14
16
  };
15
17
  export declare const combineVideos: (options: Options) => Promise<void>;
16
18
  export {};
@@ -8,17 +8,18 @@ exports.combineVideos = void 0;
8
8
  const execa_1 = __importDefault(require("execa"));
9
9
  const fs_1 = require("fs");
10
10
  const path_1 = require("path");
11
+ const audio_codec_1 = require("./audio-codec");
11
12
  const ffmpeg_flags_1 = require("./ffmpeg-flags");
12
- const get_audio_codec_name_1 = require("./get-audio-codec-name");
13
13
  const is_audio_codec_1 = require("./is-audio-codec");
14
14
  const parse_ffmpeg_progress_1 = require("./parse-ffmpeg-progress");
15
15
  const truthy_1 = require("./truthy");
16
16
  const combineVideos = async (options) => {
17
17
  var _a;
18
- const { files, filelistDir, output, onProgress, numberOfFrames, codec, fps, numberOfGifLoops, ffmpegExecutable, remotionRoot, } = options;
18
+ const { files, filelistDir, output, onProgress, numberOfFrames, codec, fps, numberOfGifLoops, ffmpegExecutable, remotionRoot, audioCodec, } = options;
19
19
  const fileList = files.map((p) => `file '${p}'`).join('\n');
20
20
  const fileListTxt = (0, path_1.join)(filelistDir, 'files.txt');
21
21
  (0, fs_1.writeFileSync)(fileListTxt, fileList);
22
+ const resolvedAudioCodec = audioCodec !== null && audioCodec !== void 0 ? audioCodec : (0, audio_codec_1.getDefaultAudioCodec)({ codec, preferLossless: false });
22
23
  try {
23
24
  const task = (0, execa_1.default)(await (0, ffmpeg_flags_1.getExecutableBinary)(ffmpegExecutable, remotionRoot, 'ffmpeg'), [
24
25
  (0, is_audio_codec_1.isAudioCodec)(codec) ? null : '-r',
@@ -37,8 +38,10 @@ const combineVideos = async (options) => {
37
38
  : '-1',
38
39
  (0, is_audio_codec_1.isAudioCodec)(codec) ? null : '-c:v',
39
40
  (0, is_audio_codec_1.isAudioCodec)(codec) ? null : codec === 'gif' ? 'gif' : 'copy',
40
- '-c:a',
41
- (0, get_audio_codec_name_1.getAudioCodecName)(codec),
41
+ resolvedAudioCodec ? '-c:a' : null,
42
+ resolvedAudioCodec
43
+ ? (0, audio_codec_1.mapAudioCodecToFfmpegAudioCodecName)(resolvedAudioCodec)
44
+ : null,
42
45
  // Set max bitrate up to 512kbps, will choose lower if that's too much
43
46
  '-b:a',
44
47
  '512K',
@@ -0,0 +1,25 @@
1
+ import type { Codec } from './codec';
2
+ export declare const supportedAudioCodecs: {
3
+ readonly h264: readonly ["aac", "pcm-16"];
4
+ readonly 'h264-mkv': readonly ["pcm-16"];
5
+ readonly aac: readonly ["aac", "pcm-16"];
6
+ readonly gif: readonly [];
7
+ readonly h265: readonly ["aac", "pcm-16"];
8
+ readonly mp3: readonly ["mp3", "pcm-16"];
9
+ readonly prores: readonly ["pcm-16", "aac"];
10
+ readonly vp8: readonly ["opus", "pcm-16"];
11
+ readonly vp9: readonly ["opus", "pcm-16"];
12
+ readonly wav: readonly ["pcm-16"];
13
+ };
14
+ export declare type FileExtension = 'aac' | '3gp' | 'm4a' | 'm4b' | 'mpg' | 'mpeg' | 'mkv' | 'mp4' | 'gif' | 'hevc' | 'mp3' | 'mov' | 'mxf' | 'wav' | 'webm';
15
+ export declare const defaultFileExtensionMap: {
16
+ [key in Codec]: {
17
+ default: FileExtension;
18
+ forAudioCodec: {
19
+ [k in typeof supportedAudioCodecs[key][number]]: {
20
+ possible: FileExtension[];
21
+ default: FileExtension;
22
+ };
23
+ };
24
+ };
25
+ };
@@ -0,0 +1,88 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.defaultFileExtensionMap = exports.supportedAudioCodecs = void 0;
4
+ exports.supportedAudioCodecs = {
5
+ h264: ['aac', 'pcm-16'],
6
+ 'h264-mkv': ['pcm-16'],
7
+ aac: ['aac', 'pcm-16'],
8
+ gif: [],
9
+ h265: ['aac', 'pcm-16'],
10
+ mp3: ['mp3', 'pcm-16'],
11
+ prores: ['pcm-16', 'aac'],
12
+ vp8: ['opus', 'pcm-16'],
13
+ vp9: ['opus', 'pcm-16'],
14
+ wav: ['pcm-16'],
15
+ };
16
+ exports.defaultFileExtensionMap = {
17
+ 'h264-mkv': {
18
+ default: 'mkv',
19
+ forAudioCodec: {
20
+ 'pcm-16': { possible: ['mkv'], default: 'mkv' },
21
+ },
22
+ },
23
+ aac: {
24
+ default: 'aac',
25
+ forAudioCodec: {
26
+ aac: {
27
+ possible: ['aac', '3gp', 'm4a', 'm4b', 'mpg', 'mpeg'],
28
+ default: 'aac',
29
+ },
30
+ 'pcm-16': {
31
+ possible: ['wav'],
32
+ default: 'wav',
33
+ },
34
+ },
35
+ },
36
+ gif: {
37
+ default: 'gif',
38
+ forAudioCodec: {},
39
+ },
40
+ h264: {
41
+ default: 'mp4',
42
+ forAudioCodec: {
43
+ 'pcm-16': { possible: ['mkv'], default: 'mkv' },
44
+ aac: { possible: ['mp4', 'mkv'], default: 'mp4' },
45
+ },
46
+ },
47
+ h265: {
48
+ default: 'mp4',
49
+ forAudioCodec: {
50
+ aac: { possible: ['mp4', 'mkv', 'hevc'], default: 'mp4' },
51
+ 'pcm-16': { possible: ['mkv'], default: 'mkv' },
52
+ },
53
+ },
54
+ mp3: {
55
+ default: 'mp3',
56
+ forAudioCodec: {
57
+ mp3: { possible: ['mp3'], default: 'mp3' },
58
+ 'pcm-16': { possible: ['wav'], default: 'wav' },
59
+ },
60
+ },
61
+ prores: {
62
+ default: 'mov',
63
+ forAudioCodec: {
64
+ aac: { possible: ['mov', 'mkv', 'mxf'], default: 'mov' },
65
+ 'pcm-16': { possible: ['mov', 'mkv', 'mxf'], default: 'mov' },
66
+ },
67
+ },
68
+ vp8: {
69
+ default: 'webm',
70
+ forAudioCodec: {
71
+ 'pcm-16': { possible: ['mkv'], default: 'mkv' },
72
+ opus: { possible: ['webm'], default: 'webm' },
73
+ },
74
+ },
75
+ vp9: {
76
+ default: 'webm',
77
+ forAudioCodec: {
78
+ 'pcm-16': { possible: ['mkv'], default: 'mkv' },
79
+ opus: { possible: ['webm'], default: 'webm' },
80
+ },
81
+ },
82
+ wav: {
83
+ default: 'wav',
84
+ forAudioCodec: {
85
+ 'pcm-16': { possible: ['wav'], default: 'wav' },
86
+ },
87
+ },
88
+ };
@@ -1,2 +1,6 @@
1
+ import type { AudioCodec } from './audio-codec';
1
2
  import type { Codec } from './codec';
2
- export declare const getFileExtensionFromCodec: (codec: Codec) => "mp3" | "aac" | "wav" | "gif" | "webm" | "mp4" | "mov" | "mkv";
3
+ import type { FileExtension } from './file-extensions';
4
+ export declare const getFileExtensionFromCodec: <T extends "h264" | "h265" | "vp8" | "vp9" | "mp3" | "aac" | "wav" | "prores" | "h264-mkv" | "gif">(codec: T, audioCodec: AudioCodec | null) => FileExtension;
5
+ export declare const makeFileExtensionMap: () => Record<string, ("h264" | "h265" | "vp8" | "vp9" | "mp3" | "aac" | "wav" | "prores" | "h264-mkv" | "gif")[]>;
6
+ export declare const defaultCodecsForFileExtension: Record<FileExtension, Codec>;
@@ -1,35 +1,61 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getFileExtensionFromCodec = void 0;
3
+ exports.defaultCodecsForFileExtension = exports.makeFileExtensionMap = exports.getFileExtensionFromCodec = void 0;
4
4
  const codec_1 = require("./codec");
5
- const getFileExtensionFromCodec = (codec) => {
5
+ const file_extensions_1 = require("./file-extensions");
6
+ const getFileExtensionFromCodec = (codec, audioCodec) => {
6
7
  if (!codec_1.validCodecs.includes(codec)) {
7
8
  throw new Error(`Codec must be one of the following: ${codec_1.validCodecs.join(', ')}, but got ${codec}`);
8
9
  }
9
- switch (codec) {
10
- case 'aac':
11
- return 'aac';
12
- case 'h264':
13
- return 'mp4';
14
- // The chunks will be rendered as mkv, but the final output will still be MP4
15
- case 'h264-mkv':
16
- return 'mkv';
17
- case 'h265':
18
- return 'mp4';
19
- case 'mp3':
20
- return 'mp3';
21
- case 'prores':
22
- return 'mov';
23
- case 'vp8':
24
- return 'webm';
25
- case 'vp9':
26
- return 'webm';
27
- case 'gif':
28
- return 'gif';
29
- case 'wav':
30
- return 'wav';
31
- default:
32
- throw new Error("Don't know which file extension to use for codec " + codec);
10
+ const map = file_extensions_1.defaultFileExtensionMap[codec];
11
+ if (audioCodec === null) {
12
+ return map.default;
33
13
  }
14
+ const typedAudioCodec = audioCodec;
15
+ if (!(typedAudioCodec in map.forAudioCodec)) {
16
+ throw new Error(`Audio codec ${typedAudioCodec} is not supported for codec ${codec}`);
17
+ }
18
+ return map.forAudioCodec[audioCodec]
19
+ .default;
34
20
  };
35
21
  exports.getFileExtensionFromCodec = getFileExtensionFromCodec;
22
+ const makeFileExtensionMap = () => {
23
+ const map = {};
24
+ Object.keys(file_extensions_1.defaultFileExtensionMap).forEach((_codec) => {
25
+ const codec = _codec;
26
+ const fileExtMap = file_extensions_1.defaultFileExtensionMap[codec];
27
+ const audioCodecs = Object.keys(fileExtMap.forAudioCodec);
28
+ const possibleExtensionsForAudioCodec = audioCodecs.map((audioCodec) => fileExtMap.forAudioCodec[audioCodec].possible);
29
+ const allPossibleExtensions = [
30
+ fileExtMap.default,
31
+ ...possibleExtensionsForAudioCodec.flat(1),
32
+ ];
33
+ for (const extension of allPossibleExtensions) {
34
+ if (!map[extension]) {
35
+ map[extension] = [];
36
+ }
37
+ if (!map[extension].includes(codec)) {
38
+ map[extension].push(codec);
39
+ }
40
+ }
41
+ });
42
+ return map;
43
+ };
44
+ exports.makeFileExtensionMap = makeFileExtensionMap;
45
+ exports.defaultCodecsForFileExtension = {
46
+ '3gp': 'aac',
47
+ aac: 'aac',
48
+ gif: 'gif',
49
+ hevc: 'h265',
50
+ m4a: 'aac',
51
+ m4b: 'aac',
52
+ mkv: 'h264-mkv',
53
+ mov: 'prores',
54
+ mp3: 'mp3',
55
+ mp4: 'h264',
56
+ mpeg: 'aac',
57
+ mpg: 'aac',
58
+ mxf: 'prores',
59
+ wav: 'wav',
60
+ webm: 'vp8',
61
+ };
@@ -2,4 +2,4 @@ export declare const guessExtensionForVideo: ({ src, remotionRoot, ffprobeBinary
2
2
  src: string;
3
3
  remotionRoot: string;
4
4
  ffprobeBinary: string | null;
5
- }) => Promise<"mp3" | "wav" | "webm" | "mp4">;
5
+ }) => Promise<"mp3" | "wav" | "mp4" | "webm">;