How to Configure ProRes Encoding Profiles in Remotion: A Complete Guide

You can configure Apple ProRes encoding profiles in Remotion using Config.setProResProfile() in your configuration file, the --prores-profile CLI flag, or the proResProfile option in the renderMedia() API.

The remotion-dev/remotion repository provides first-class support for Apple ProRes, a professional-grade intermediate codec widely used in video production workflows. Configuring the correct ProRes encoding profile ensures your output matches the quality and color-depth requirements of your post-production pipeline, whether you need high-quality 4:2:2 sampling or full-alpha 4:4:4:4 support.

What Are ProRes Encoding Profiles?

ProRes profiles determine the compression ratio, bitrate, and color sampling of your video output. Remotion supports six distinct profiles that map to Apple's standard variants:

  • 4444-xq: Maximum quality 4:4:4:4 with alpha, 12-bit color depth
  • 4444: High-quality 4:4:4:4 with alpha, 12-bit color depth
  • hq (default): High-quality 4:2:2, 10-bit color depth
  • standard: Standard 4:2:2, 10-bit color depth
  • light: Light 4:2:2, 10-bit color depth (smaller files)
  • proxy: Proxy 4:2:2, 10-bit color depth (smallest files)

Configuration Methods in Remotion

Remotion provides three interfaces for setting your ProRes profile, all converging on the same internal configuration system.

Using the Config API in remotion.config.ts

The most common approach is setting the profile globally in your configuration file. In packages/cli/src/config/prores-profile.ts, the setProResProfile() function stores your selection in a module-scoped variable:

// remotion.config.ts
import {Config} from '@remotion/cli/config';

// Set to Apple ProRes 4444 for alpha channel support
Config.setProResProfile('4444');

Using CLI Flags

You can override the configuration file setting via the command line. The --prores-profile flag is parsed in packages/cli/src/parse-command-line.ts and forwarded to the same setter:

npx remotion render src/index.ts MyComposition out/video.mov \
  --codec prores \
  --prores-profile hq

Programmatic Access in Components

If you need to read the currently configured profile at runtime, Remotion exposes internal getters through ConfigInternals:

import {ConfigInternals} from '@remotion/cli/config';

const currentProfile = ConfigInternals.getProResProfile(); 
// Returns: 'hq' | '4444' | '4444-xq' | 'standard' | 'light' | 'proxy' | undefined

How Remotion Processes ProRes Profiles Internally

Understanding the internal pipeline helps debug configuration issues. When you specify a profile, Remotion executes a five-stage validation and translation process:

  1. Configuration Storage: Your profile is stored in packages/cli/src/config/prores-profile.ts via setProResProfile().

  2. Validation: Before rendering, validateSelectedCodecAndProResCombination() in packages/renderer/src/prores-profile.ts ensures the codec is prores and the profile string is valid. This function throws a TypeError if you attempt to use a ProRes profile with an incompatible codec like h264.

  3. FFmpeg Translation: The symbolic profile name (e.g., '4444') must be converted to FFmpeg's numeric identifiers. The function getProResProfileName() in packages/renderer/src/get-prores-profile-name.ts performs this mapping:

    • 'proxy' → '0'
    • 'light' → '1'
    • 'standard' → '2'
    • 'hq' → '3'
    • '4444' → '4'
    • '4444-xq' → '5'
  4. Video Stitching: The numeric value is injected into the FFmpeg command as -profile:v <num> in packages/renderer/src/stitch-frames-to-video.ts and packages/renderer/src/prespawn-ffmpeg.ts.

  5. Default Handling: If no profile is specified, getProResProfile() returns undefined, and the system defaults to 'hq' (high quality 4:2:2).

Complete Implementation Examples

Example 1: High-Quality Editing Intermediate

For sending footage to DaVinci Resolve or Final Cut Pro:

// remotion.config.ts
import {Config} from '@remotion/cli/config';

Config.setCodec('prores');
Config.setProResProfile('hq'); // 4:2:2, 10-bit, high quality

Example 2: Alpha Channel for Compositing

When you need transparency in your output:

// remotion.config.ts
import {Config} from '@remotion/cli/config';

Config.setCodec('prores');
Config.setProResProfile('4444'); // 4:4:4:4 with alpha, 12-bit

Example 3: CLI Batch Rendering

Rendering multiple compositions with different profiles:


# Render proxy version for offline editing

npx remotion render src/index.ts Comp out/proxy.mov --codec prores --prores-profile proxy

# Render HQ version for final delivery

npx remotion render src/index.ts Comp out/final.mov --codec prores --prores-profile hq

Example 4: Programmatic Rendering with renderMedia

When using the Node.js API directly:

import {renderMedia} from '@remotion/renderer';
import {ConfigInternals} from '@remotion/cli/config';

// Set configuration
Config.setCodec('prores');
Config.setProResProfile('4444-xq');

await renderMedia({
  composition: myComposition,
  serveUrl: bundled,
  codec: 'prores',
  proResProfile: ConfigInternals.getProResProfile(), // '4444-xq'
  outputLocation: 'out/video.mov',
});

Summary

  • ProRes profiles in Remotion control bitrate, color depth, and alpha channel support through six variants: 4444-xq, 4444, hq, standard, light, and proxy.
  • Configuration happens via Config.setProResProfile() in remotion.config.ts, the --prores-profile CLI flag, or the proResProfile option in renderMedia().
  • Internal pipeline: The renderer validates your selection in packages/renderer/src/prores-profile.ts, translates symbolic names to FFmpeg numeric values in get-prores-profile-name.ts, and injects -profile:v during stitching in stitch-frames-to-video.ts.
  • Default behavior: If unspecified, Remotion defaults to the hq profile (high-quality 4:2:2, 10-bit).

Frequently Asked Questions

What is the default ProRes profile in Remotion?

If you do not explicitly call Config.setProResProfile() or pass the --prores-profile flag, Remotion defaults to hq. This corresponds to Apple ProRes 422 HQ, which provides high-quality 4:2:2 chroma subsampling with 10-bit color depth. The default is enforced in the validation layer when the internal profile variable is undefined.

Can I use ProRes profiles with other codecs like H.264 or HEVC?

No. The function validateSelectedCodecAndProResCombination() in packages/renderer/src/prores-profile.ts explicitly throws a TypeError if you specify a ProRes profile while using any codec other than prores. ProRes profiles are tightly coupled to the Apple ProRes codec and have no meaning in the context of H.264, HEVC, or VP8 encoding.

How do I verify which ProRes profile was used in my output video?

You can inspect the generated FFmpeg command by enabling verbose logging, or you can analyze the output file using ffprobe. The numeric profile value (e.g., 3 for hq, 4 for 4444) is passed to FFmpeg as -profile:v during the stitching phase in packages/renderer/src/stitch-frames-to-video.ts. Running ffprobe -v error -select_streams v:0 -show_entries stream=profile -of default=noprint_wrappers=1 out.mov will display the numeric profile identifier used.

Is ProRes encoding slower than H.264 in Remotion?

Generally, yes. ProRes is an intermediate codec designed for editing quality rather than compression efficiency. While Remotion's rendering speed is primarily determined by the complexity of your React components and the concurrency setting, the final FFmpeg stitching step will typically produce larger files and may take longer to encode with ProRes compared to H.264 or HEVC, especially when using high-bitrate profiles like 4444-xq or 4444.

Have a question about this repo?

These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:

Share the following with your agent to get started:
curl -s "https://instagit.com/install.md"

Works with
Claude Codex Cursor VS Code OpenClaw Any MCP Client

Maintain an open-source project? Get it listed too →