How to Fix “Remotion Render Failed” (FFmpeg/FFprobe, Missing Assets, Decode Errors)

I spent three hours last Tuesday staring at “Render failed” errors. The video previewed perfectly in Remotion Studio — smooth animations, audio synced, everything looked great. Hit render, and… crash. No helpful error message, just a vague failure.

Turns out, there are about five common reasons Remotion renders fail, and once you know what to look for in the logs, most of them take 2 minutes to fix. I’m Dora. I tested these fixes across different setups on February 2-4, 2026, and documented what actually works.

Here’s how to diagnose the failure fast, fix the usual suspects, and avoid them next time.

Diagnose in 60 Seconds (Which Log Lines Matter)

When a render fails, Remotion dumps a wall of text. Most of it is noise.

Three critical patterns to find:

  1. FFmpeg/FFprobe errors:Command failed with exit code 1: ffmpeg or ffprobe — FFmpeg can’t find a file or can’t decode something
  2. Asset errors:Error loading image/video/audio or No such file or directory — wrong path or missing file
  3. Decode errors:Cannot decode or Compositor error: No frame found — corrupted file or unsupported format

Quick diagnosis: Scroll to the bottom of the error first. The last 5-10 lines usually contain the actual failure. Everything above is just stack traces.

I wasted 20 minutes reading logs top-to-bottom my first time. The actual error — ffprobe: No such file or directory — was right at the end.

Example error:

Error: Command failed with exit code 1: ffprobe -v error 
/tmp/remotion-assets/371949071995914.mp4: No such file or directory

This tells you: FFprobe tried to analyze a video that doesn’t exist. Asset problem, not FFmpeg problem.

Fix FFmpeg/FFprobe Issues (Auto-Install vs PATH vs Custom Binaries)

Good news: Remotion v4.0+ bundles FFmpeg automatically. You don’t need to install anything.

But sometimes it still breaks.

Issue 1: You’re on Remotion v3 (Upgrade)

Check your version:

bash

npm list @remotion/cli

If it says 3.x.x, upgrade to v4:

bash

npm install @remotion/cli@latest @remotion/renderer@latest

According to the v4 migration docs, FFmpeg is now baked into @remotion/renderer — no manual installation needed.

Can’t upgrade? On v3, force FFmpeg reinstall:

bash

npx remotion install ffmpeg
npx remotion install ffprobe

(These commands don’t exist in v4 since FFmpeg is bundled.)

Issue 2: Custom FFmpeg Binary Conflicts

If you set ffmpegExecutable or ffprobeExecutable in your render config, remove them — v4 doesn’t support these options.

javascript

// ❌ Remove this
await renderMedia({
  ffmpegExecutable: '/usr/local/bin/ffmpeg',
});

// ✅ Use this
await renderMedia({
  composition,
  outputLocation: './out.mp4',
});

“Cannot Decode” Root Causes + Safe Asset Rules

The most frustrating errors: Cannot decode or No frame found at position X. These happen when FFmpeg can’t decode your file’s data.

Root cause 1: Unsupported codec

Remotion supports: H.264, H.265, VP8, VP9, ProRes (video); AAC, MP3, Opus (audio). Anything else won’t work.

Check your codec:

bash

npx remotion ffprobe your-video.mp4

Look for Video: and Audio: lines. If unsupported, re-encode:

bash

npx remotion ffmpeg -i input.mp4 -c:v libx264 -c:a aac output.mp4

Root cause 2: Variable frame rate (VFR)

Screen recordings often use VFR. Remotion needs constant frame rate (CFR).

Convert to CFR:

bash

npx remotion ffmpeg -i input.mp4 -vsync cfr -r 30 output.mp4

Root cause 3: Corrupted file

Test if the file is readable:

bash

npx remotion ffmpeg -i your-video.mp4 -f null -

If this throws errors, re-download or re-export.

Root cause 4: Container issues

Re-mux to fix weird metadata:

bash

npx remotion ffmpeg -i input.mp4 -c copy -map 0 output.mp4

Safe asset rules:

  • Video: H.264 MP4, CFR, AAC audio
  • Images: PNG, JPEG, WebP, SVG
  • Audio: MP3 or AAC
  • Avoid: Special characters in filenames (#, ?, &), absolute paths, relative paths

Fix Missing Assets + Wrong Paths

This is the most common render failure. Your asset exists, but Remotion can’t find it.

Rule 1: Always Use staticFile() for Assets

Remotion runs in a browser during preview but bundles everything during render. You can’t use absolute paths or relative paths like ../assets/video.mp4.

Wrong:

javascript

// ❌ These won't work during render
<Video src="/videos/intro.mp4" />
<Img src="../images/logo.png" />
<Audio src="C:/Users/me/music.mp3" />

Right:

javascript

import { staticFile } from 'remotion';

// ✅ Put assets in public/ folder, reference with staticFile()
<Video src={staticFile('videos/intro.mp4')} />
<Img src={staticFile('images/logo.png')} />
<Audio src={staticFile('music.mp3')} />

According to Remotion’s asset documentation, all assets must be in the public/ folder and referenced via staticFile(). This ensures they’re bundled correctly and work in both preview and render modes.

Rule 2: staticFile() Doesn’t Support Relative Paths

A common mistake:

javascript

// ❌ staticFile() expects paths relative to public/, not ./
staticFile('./videos/intro.mp4')  // FAILS
staticFile('../assets/logo.png')  // FAILS// ✅ Correct usage
staticFile('videos/intro.mp4')    // Looks in public/videos/
staticFile('logo.png')            // Looks in public/

Rule 3: Special Characters Break Paths (Before v4)

If you’re on Remotion v3, filenames with #, ?, or & cause issues. For example:

public/video#1.mp4  → Breaks (# treated as URL fragment)
public/image?.png   → Breaks (? treated as query string)

Remotion v4 fixed this by encoding filenames automatically, but if you’re on v3, rename files to remove special characters.

Rule 4: Assets Added After Bundling Won’t Work

Remotion bundles your project before rendering. If you add files to public/ after the bundle step, they won’t be included.

Solution: Restart the render or re-bundle if using server-side APIs.

Dynamic Imports (Advanced)

If you need to load assets dynamically at runtime, you can’t use variables directly:

javascript

// ❌ Doesn't work (Webpack can't bundle it)
const videoName = 'intro';
<Video src={staticFile(`${videoName}.mp4`)} />

Workaround: Use getStaticFiles() to enumerate available assets at runtime:

javascript

import { getStaticFiles, staticFile } from 'remotion';

const files = getStaticFiles();
const video = files.find(f => f.name === 'videos/intro.mp4');

<Video src={video.src} />

This works because getStaticFiles() reads the bundled assets list.

Pre-Render Checklist + FAQ

Here’s my actual pre-render checklist. I run through this before every render now — saves so much time.

Before clicking render:

  • ✅ All assets in public/ folder
  • ✅ Using staticFile() for every asset reference
  • ✅ No absolute paths (C:/... or /Users/...)
  • ✅ No relative imports (../ or ./)
  • ✅ Filenames don’t contain #, ?, &
  • ✅ Video assets are H.264 MP4 with AAC audio
  • ✅ Check logs for “deprecated pixel format” warnings (usually harmless but worth noting)

Quick test:

Run a 1-second test render before committing to a full render:

bash

npx remotion render src/index.ts MyComp out/test.mp4 --frames=0-30

This renders just the first second. If it fails, you catch it in 10 seconds instead of waiting 10 minutes for a full render to crash.

FAQ:

Why does my render work in Studio but fail in CLI?

Studio uses a local dev server with hot reloading. CLI renders use a bundled version. Asset path issues usually appear in CLI renders, not Studio. Always test with CLI before deploying.

Can I use remote URLs for assets?

Yes, but with caveats. You can pass https:// URLs to <Video>, <Img>, etc. But network issues, CORS, or rate limits can cause render failures. For production, download assets to public/ and use staticFile().

What if I need assets outside the project folder?

You can’t. Remotion’s bundling architecture requires all assets in public/. Copy them there or symlink the folder (on Linux/macOS).

Why does FFprobe fail with “No such file or directory” randomly?

This usually happens with concurrent renders or temp file cleanup race conditions. If you’re rendering multiple videos in parallel, Remotion might delete temp files before FFprobe finishes analyzing them. Solution: reduce concurrency or add delays between renders.

How do I debug “Compositor error: No frame found at position X”?

This means FFmpeg couldn’t extract a specific frame from your video, usually due to VFR issues or seek problems. Re-encode to CFR and test again. If it persists, the video file might have corrupted frames — try re-exporting from the source.


The biggest lesson I learned debugging these failures: 90% of render errors come down to asset paths and FFmpeg expecting specific formats. Once you internalize the staticFile() rule and stick to H.264 MP4 assets, most problems disappear.

Start with the checklist, check logs for the specific error pattern, and fix from there. Most fixes take under 2 minutes once you know what you’re looking for.

If you’re still finding these issues repetitive, or want to streamline the process even further, try Crepal. With its automatic workflow management, you can reduce the amount of time spent troubleshooting and focus more on creativity.

Visit crepal.ai to get started today.


Previous posts:

Leave a Reply

Your email address will not be published. Required fields are marked *