Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion packages/docs/docs/lambda/rendermediaonlambda.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,7 @@ See also [`renderMedia() -> codec`](/docs/renderer/render-media#codec).
### `audioCodec?`

_optional_
_"pcm-16" | "aac" | "mp3" | "opus", available from v3.3.41_
_"pcm-16" | "aac" | "mp3" | "opus" | "pcm-24", available from v3.3.41_

Choose the encoding of your audio.

Expand All @@ -135,6 +135,7 @@ Choose the encoding of your audio.
- Choose `pcm-16` if you need uncompressed audio.
- Not all video containers support all audio codecs.
- This option takes precedence if the `codec` option also specifies an audio codec.
- `pcm-24` outputs 24-bit audio, however note that Remotion's audio processing is limited to 16-bit.

Refer to the [Encoding guide](/docs/encoding/#audio-codec) to see defaults and supported combinations.

Expand Down
2 changes: 1 addition & 1 deletion packages/docs/docs/renderer/combine-chunks.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ The number of frames in each chunk. All chunks must have the same number of fram

### `audioCodec`

_"pcm-16" | "aac" | "mp3" | "opus" | null - optional_
_"pcm-16" | "aac" | "mp3" | "opus" | "pcm-24" | null - optional_

Audio codec to use for the output file. If not specified, it will be determined based on the video codec.

Expand Down
3 changes: 2 additions & 1 deletion packages/docs/docs/renderer/render-media.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -112,14 +112,15 @@ _object - optional_

### `audioCodec?`

_"pcm-16" | "aac" | "mp3" | "opus", available from v3.3.41_
_"pcm-16" | "aac" | "mp3" | "opus" | "pcm-24", available from v3.3.41_

Choose the encoding of your audio.

- The default is dependent on the chosen `codec`.
- Choose `pcm-16` if you need uncompressed audio.
- Not all video containers support all audio codecs.
- This option takes precedence if the `codec` option also specifies an audio codec.
- `pcm-24` outputs 24-bit audio, however note that Remotion's audio processing is limited to 16-bit.

Refer to the [Encoding guide](/docs/encoding/#audio-codec) to see defaults and supported combinations.

Expand Down
3 changes: 2 additions & 1 deletion packages/docs/docs/renderer/stitch-frames-to-video.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -60,14 +60,15 @@ Set a codec. See the [encoding guide](/docs/encoding) for available values and g

### `audioCodec?`<AvailableFrom v="3.3.41" />

_"pcm-16" | "aac" | "mp3" | "opus"_
_"pcm-16" | "aac" | "mp3" | "opus" | "pcm-24"_

Choose the encoding of your audio.

- The default is dependent on the chosen `codec`.
- Choose `pcm-16` if you need uncompressed audio.
- Not all video containers support all audio codecs.
- This option takes precedence if the `codec` option also specifies an audio codec.
- `pcm-24` outputs 24-bit audio, however note that Remotion's audio processing is limited to 16-bit.

Refer to the [Encoding guide](/docs/encoding/#audio-codec) to see defaults and supported combinations.

Expand Down
9 changes: 5 additions & 4 deletions packages/renderer/src/file-extensions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,13 +34,15 @@ export const defaultFileExtensionMap: {
default: 'mkv',
forAudioCodec: {
'pcm-16': {possible: ['mkv'], default: 'mkv'},
'pcm-24': {possible: ['mkv'], default: 'mkv'},
mp3: {possible: ['mkv'], default: 'mkv'},
},
},
'h264-ts': {
default: 'ts',
forAudioCodec: {
'pcm-16': {possible: ['ts'], default: 'ts'},
'pcm-24': {possible: ['ts'], default: 'ts'},
aac: {possible: ['ts'], default: 'ts'},
},
},
Expand All @@ -51,10 +53,6 @@ export const defaultFileExtensionMap: {
possible: ['aac', '3gp', 'm4a', 'm4b', 'mpg', 'mpeg'],
default: 'aac',
},
'pcm-16': {
possible: ['wav'],
default: 'wav',
},
},
},
gif: {
Expand All @@ -67,13 +65,15 @@ export const defaultFileExtensionMap: {
'pcm-16': {possible: ['mkv', 'mov'], default: 'mkv'},
aac: {possible: ['mp4', 'mkv', 'mov'], default: 'mp4'},
mp3: {possible: ['mp4', 'mkv', 'mov'], default: 'mp4'},
'pcm-24': {possible: ['mp4', 'mkv', 'mov'], default: 'mp4'},
},
},
h265: {
default: 'mp4',
forAudioCodec: {
aac: {possible: ['mp4', 'mkv', 'hevc'], default: 'mp4'},
'pcm-16': {possible: ['mkv'], default: 'mkv'},
'pcm-24': {possible: ['mkv'], default: 'mkv'},
},
},
mp3: {
Expand Down Expand Up @@ -108,6 +108,7 @@ export const defaultFileExtensionMap: {
default: 'wav',
forAudioCodec: {
'pcm-16': {possible: ['wav'], default: 'wav'},
'pcm-24': {possible: ['wav'], default: 'wav'},
},
},
};
30 changes: 21 additions & 9 deletions packages/renderer/src/options/audio-codec.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,23 +2,29 @@ import type {Codec} from '../codec';
import type {AnyRemotionOption} from './option';
import {separateAudioOption} from './separate-audio';

export const validAudioCodecs = ['pcm-16', 'aac', 'mp3', 'opus'] as const;
export const validAudioCodecs = [
'pcm-16',
'aac',
'mp3',
'opus',
'pcm-24',
] as const;

export type AudioCodec = (typeof validAudioCodecs)[number];

export const supportedAudioCodecs = {
h264: ['aac', 'pcm-16', 'mp3'] as const,
'h264-mkv': ['pcm-16', 'mp3'] as const,
'h264-ts': ['pcm-16', 'aac'] as const,
aac: ['aac', 'pcm-16'] as const,
h264: ['aac', 'pcm-16', 'pcm-24', 'mp3'] as const,
'h264-mkv': ['pcm-16', 'pcm-24', 'mp3'] as const,
'h264-ts': ['pcm-16', 'pcm-24', 'aac'] as const,
aac: ['aac'] as const,
avi: [] as const,
gif: [] as const,
h265: ['aac', 'pcm-16'] as const,
h265: ['aac', 'pcm-16', 'pcm-24'] as const,
mp3: ['mp3', 'pcm-16'] as const,
prores: ['aac', 'pcm-16'] as const,
vp8: ['opus', 'pcm-16'] as const,
vp9: ['opus', 'pcm-16'] as const,
wav: ['pcm-16'] as const,
wav: ['pcm-16', 'pcm-24'] as const,
} as const;

const _satisfies: {[key in Codec]: readonly AudioCodec[]} =
Expand All @@ -30,6 +36,7 @@ if (_satisfies) {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
const audioCodecNames = [
'pcm_s16le',
'pcm_s24le',
'libfdk_aac',
'libmp3lame',
'libopus',
Expand All @@ -56,7 +63,11 @@ export const mapAudioCodecToFfmpegAudioCodecName = (
return 'pcm_s16le';
}

throw new Error('unknown audio codec: ' + audioCodec);
if (audioCodec === 'pcm-24') {
return 'pcm_s24le';
}

throw new Error('unknown audio codec: ' + (audioCodec satisfies never));
};

const cliFlag = 'audio-codec' as const;
Expand All @@ -78,7 +89,7 @@ export const defaultAudioCodecs: {
compressed: 'aac',
},
aac: {
lossless: 'pcm-16',
lossless: null,
compressed: 'aac',
},
gif: {
Expand Down Expand Up @@ -120,6 +131,7 @@ const extensionMap = {
mp3: 'mp3',
opus: 'opus',
'pcm-16': 'wav',
'pcm-24': 'wav',
} as const;

export const getExtensionFromAudioCodec = (audioCodec: AudioCodec) => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,8 @@ export const getDefaultCodecs = ({
? 'mp3'
: userPreferredVideoCodec === 'wav'
? 'wav'
: defaultConfigurationAudioCodec === 'pcm-16'
: defaultConfigurationAudioCodec === 'pcm-16' ||
defaultConfigurationAudioCodec === 'pcm-24'
? 'wav'
: defaultConfigurationAudioCodec === 'mp3'
? 'mp3'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,13 @@ export const humanReadableAudioCodec = (audioCodec: AudioCodec) => {
return 'Lossless';
}

if (audioCodec === 'pcm-24') {
return 'PCM 24-bit';
}

if (audioCodec === 'opus') {
return 'Opus';
}

throw new Error('unknown audio codec: ' + (audioCodec satisfies never));
};
Loading