diff --git a/packages/docs/docs/lambda/rendermediaonlambda.mdx b/packages/docs/docs/lambda/rendermediaonlambda.mdx index a3eda124b71..66ff214499b 100644 --- a/packages/docs/docs/lambda/rendermediaonlambda.mdx +++ b/packages/docs/docs/lambda/rendermediaonlambda.mdx @@ -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. @@ -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. diff --git a/packages/docs/docs/renderer/combine-chunks.mdx b/packages/docs/docs/renderer/combine-chunks.mdx index 7cf25ebd55d..4b5d8d81697 100644 --- a/packages/docs/docs/renderer/combine-chunks.mdx +++ b/packages/docs/docs/renderer/combine-chunks.mdx @@ -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. diff --git a/packages/docs/docs/renderer/render-media.mdx b/packages/docs/docs/renderer/render-media.mdx index d14d8caac97..8c6b931298b 100644 --- a/packages/docs/docs/renderer/render-media.mdx +++ b/packages/docs/docs/renderer/render-media.mdx @@ -112,7 +112,7 @@ _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. @@ -120,6 +120,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. diff --git a/packages/docs/docs/renderer/stitch-frames-to-video.mdx b/packages/docs/docs/renderer/stitch-frames-to-video.mdx index 737b3c097b9..59bdaa7e73b 100644 --- a/packages/docs/docs/renderer/stitch-frames-to-video.mdx +++ b/packages/docs/docs/renderer/stitch-frames-to-video.mdx @@ -60,7 +60,7 @@ Set a codec. See the [encoding guide](/docs/encoding) for available values and g ### `audioCodec?` -_"pcm-16" | "aac" | "mp3" | "opus"_ +_"pcm-16" | "aac" | "mp3" | "opus" | "pcm-24"_ Choose the encoding of your audio. @@ -68,6 +68,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. diff --git a/packages/renderer/src/file-extensions.ts b/packages/renderer/src/file-extensions.ts index 818eeeb828b..f9c7e112c8d 100644 --- a/packages/renderer/src/file-extensions.ts +++ b/packages/renderer/src/file-extensions.ts @@ -34,6 +34,7 @@ export const defaultFileExtensionMap: { default: 'mkv', forAudioCodec: { 'pcm-16': {possible: ['mkv'], default: 'mkv'}, + 'pcm-24': {possible: ['mkv'], default: 'mkv'}, mp3: {possible: ['mkv'], default: 'mkv'}, }, }, @@ -41,6 +42,7 @@ export const defaultFileExtensionMap: { default: 'ts', forAudioCodec: { 'pcm-16': {possible: ['ts'], default: 'ts'}, + 'pcm-24': {possible: ['ts'], default: 'ts'}, aac: {possible: ['ts'], default: 'ts'}, }, }, @@ -51,10 +53,6 @@ export const defaultFileExtensionMap: { possible: ['aac', '3gp', 'm4a', 'm4b', 'mpg', 'mpeg'], default: 'aac', }, - 'pcm-16': { - possible: ['wav'], - default: 'wav', - }, }, }, gif: { @@ -67,6 +65,7 @@ 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: { @@ -74,6 +73,7 @@ export const defaultFileExtensionMap: { forAudioCodec: { aac: {possible: ['mp4', 'mkv', 'hevc'], default: 'mp4'}, 'pcm-16': {possible: ['mkv'], default: 'mkv'}, + 'pcm-24': {possible: ['mkv'], default: 'mkv'}, }, }, mp3: { @@ -108,6 +108,7 @@ export const defaultFileExtensionMap: { default: 'wav', forAudioCodec: { 'pcm-16': {possible: ['wav'], default: 'wav'}, + 'pcm-24': {possible: ['wav'], default: 'wav'}, }, }, }; diff --git a/packages/renderer/src/options/audio-codec.tsx b/packages/renderer/src/options/audio-codec.tsx index 8d5f93ce4d5..0c165a71968 100644 --- a/packages/renderer/src/options/audio-codec.tsx +++ b/packages/renderer/src/options/audio-codec.tsx @@ -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[]} = @@ -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', @@ -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; @@ -78,7 +89,7 @@ export const defaultAudioCodecs: { compressed: 'aac', }, aac: { - lossless: 'pcm-16', + lossless: null, compressed: 'aac', }, gif: { @@ -120,6 +131,7 @@ const extensionMap = { mp3: 'mp3', opus: 'opus', 'pcm-16': 'wav', + 'pcm-24': 'wav', } as const; export const getExtensionFromAudioCodec = (audioCodec: AudioCodec) => { diff --git a/packages/studio/src/components/RenderModal/get-default-codecs.ts b/packages/studio/src/components/RenderModal/get-default-codecs.ts index 9dd20f4c9d5..cf390a0dd71 100644 --- a/packages/studio/src/components/RenderModal/get-default-codecs.ts +++ b/packages/studio/src/components/RenderModal/get-default-codecs.ts @@ -29,7 +29,8 @@ export const getDefaultCodecs = ({ ? 'mp3' : userPreferredVideoCodec === 'wav' ? 'wav' - : defaultConfigurationAudioCodec === 'pcm-16' + : defaultConfigurationAudioCodec === 'pcm-16' || + defaultConfigurationAudioCodec === 'pcm-24' ? 'wav' : defaultConfigurationAudioCodec === 'mp3' ? 'mp3' diff --git a/packages/studio/src/components/RenderModal/human-readable-audio-codecs.ts b/packages/studio/src/components/RenderModal/human-readable-audio-codecs.ts index cb189b6a20a..d3efd1e5cf8 100644 --- a/packages/studio/src/components/RenderModal/human-readable-audio-codecs.ts +++ b/packages/studio/src/components/RenderModal/human-readable-audio-codecs.ts @@ -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)); };