>FFmpegLab
FFmpeg Guide

Optical Flow & Motion Interpolation

Create buttery-smooth slow motion, convert frame rates, and eliminate judder with the minterpolate filter. Master motion estimation, compensation, and scene detection.

Optical flow and motion interpolation are among the most impressive—and most computationally expensive—features in FFmpeg. The minterpolate filter can transform choppy 24fps footage into buttery-smooth 60fps or 120fps video by analyzing motion between frames and generating entirely new frames that never existed.

Yet the documentation for minterpolate is sparse and confusing. As one FFmpeg user put it: "minterpolate is an important and amazing function"—but the parameter descriptions are cryptic, and the default values are unclear[reference:0]. Most users give up after seeing artifacts or waiting hours for a render.[reference:1]

This guide changes that. You'll learn exactly how motion interpolation works, how to tune the parameters for your specific content, and how to debug the inevitable issues that arise.

Key takeaways

The Gap: A Powerful Filter, Poorly Explained

The FFmpeg documentation for minterpolate lists the parameters but provides almost no guidance on how to use them. The parameter descriptions are technical and assume you already understand motion estimation theory.[reference:3]

Search online, and you'll find scattered forum posts with conflicting advice. Some users recommend mi_mode=mci:mc_mode=aobmc for the best quality, others suggest mc_mode=obmc for speed. Few explain why one works better than the other.[reference:4]

This guide bridges that gap with clear explanations, working examples, and troubleshooting steps.

The Symptom: "Why Is My Slow Motion So Choppy?"

You've tried the simple approach—using setpts to slow down your video.[reference:5]

ShareRenders { } Code Config
Generated Code Logs Customize
# Simple slow motion — drops frames, looks choppy
ffmpeg -i input.mp4 -filter:v "setpts=2.0*PTS" -r 12 output.mp4

The result? The video plays in slow motion, but it's choppy and stuttery. That's because setpts simply stretches the existing frames over a longer duration—it doesn't create any new frames. The frame rate drops, and the motion looks unnatural.

You need motion interpolation—a technique that analyzes the movement between frames and generates new frames that smoothly bridge the gap.

Core Concepts: What Is Motion Interpolation?

Motion interpolation is the process of generating intermediate frames between two existing frames by analyzing the motion of objects.[reference:6]

There are three approaches to interpolation, and FFmpeg's minterpolate supports all of them[reference:7]:

Motion-compensated interpolation works by:

  1. Motion estimation — Analyzing how pixels move between frames
  2. Motion compensation — Using those motion vectors to generate new frames
  3. Scene detection — Detecting scene changes to avoid interpolating across cuts

As one FFmpeg user noted: "minterpolate does a truly amazing job" when properly configured[reference:9].

The minterpolate Filter Parameters

Here's every parameter you need to know, with practical guidance for each.

ParameterDefaultWhat it doesWhen to adjust
fps Required Output frame rate (e.g., 60, 120, 60000/1001) Set to your desired output frame rate
mi_mode No default[reference:10] Interpolation mode: dup, blend, or mci Use mci for high quality, blend for speed
mc_mode obmc[reference:11] Motion compensation mode: obmc (overlapped block) or aobmc (adaptive overlapped block) aobmc often gives better quality[reference:12]
me_mode bilat[reference:13] Motion estimation mode: bilat (bilateral) or bidir (bidirectional) bidir can improve accuracy for complex motion[reference:14]
me epzs[reference:15] Motion estimation algorithm: epzs, esa, tss, ntss, fss, ds, hexbs, umh epzs is fastest; umh is more accurate but slower
vsbmc 0 Enable variable-size block motion compensation Set to 1 for better quality[reference:16]
search_param 32 Search range for motion estimation Increase for fast motion (e.g., 64-128)[reference:17]
scd fdiff[reference:18] Scene change detection method: none or fdiff (frame difference) Leave as fdiff to avoid artifacts across cuts
scd_threshold 10.0[reference:19] Threshold for scene change detection Lower = more sensitive; adjust if scenes aren't detected[reference:20]

Practical Example 1: Buttery-Smooth Slow Motion

Let's create a 2x slow-motion effect from a 24fps input. To slow down by 2x, we need to output at 48fps (2 × 24).

ShareRenders { } Code Config
Generated Code Logs Customize
# 2x smooth slow motion using motion-compensated interpolation
ffmpeg -i input_24fps.mp4 \
-filter:v "minterpolate=fps=48:mi_mode=mci:mc_mode=aobmc:vsbmc=1" \
-c:a copy output_slowmo.mp4

What's happening here?

For 4x slow motion (24fps → 96fps):

ShareRenders { } Code Config
Generated Code Logs Customize
# 4x smooth slow motion (24fps → 96fps)
ffmpeg -i input_24fps.mp4 \
-filter:v "minterpolate=fps=96:mi_mode=mci:mc_mode=aobmc:vsbmc=1" \
-c:a copy output_4x_slowmo.mp4

Practical Example 2: Frame Rate Conversion

Converting 24fps film to 60fps for modern displays is a common use case. The goal is to eliminate judder while preserving the cinematic look.

ShareRenders { } Code Config
Generated Code Logs Customize
# 24fps film to 60fps with motion interpolation (NTSC-friendly)
ffmpeg -i film_24fps.mp4 \
-filter:v "minterpolate=fps=60000/1001:mi_mode=mci:mc_mode=aobmc:vsbmc=1" \
-c:a copy output_60fps.mp4

For 24fps to 120fps (ideal for high-refresh-rate displays):

ShareRenders { } Code Config
Generated Code Logs Customize
# 24fps film to 120fps for high refresh rate displays
ffmpeg -i film_24fps.mp4 \
-filter:v "minterpolate=fps=120:mi_mode=mci:mc_mode=aobmc:vsbmc=1" \
-c:a copy output_120fps.mp4

Note on audio: When slowing down video, you must also slow down the audio to maintain sync. Use the atempo filter[reference:24]:

ShareRenders { } Code Config
Generated Code Logs Customize
# 2x slow motion with audio (24fps → 48fps, audio at 0.5x speed)
ffmpeg -i input_24fps.mp4 \
-filter_complex "[0:v]minterpolate=fps=48:mi_mode=mci:mc_mode=aobmc:vsbmc=1[v];[0:a]atempo=0.5[a]" \
-map "[v]" -map "[a]" output_slowmo.mp4

Note: atempo is limited to values between 0.5 and 2.0. For slower speeds, chain multiple atempo filters[reference:25].

Scene Detection – Preventing Artifacts

One of the most important—and most overlooked—features of minterpolate is scene change detection. When a scene changes, motion vectors point in random directions. Interpolating across a cut creates ugly artifacts.[reference:26]

The scd (scene change detection) parameter detects these cuts and replaces interpolated frames with duplicated ones to prevent artifacts.[reference:27]

ShareRenders { } Code Config
Generated Code Logs Customize
# With scene change detection (recommended for all content with cuts)
ffmpeg -i input.mp4 \
-filter:v "minterpolate=fps=60:mi_mode=mci:mc_mode=aobmc:scd=fdiff:scd_threshold=10" \
-c:a copy output.mp4

Key parameters:

If you're seeing interpolation artifacts across cuts, try lowering scd_threshold (e.g., to 5) to make detection more sensitive. If scenes aren't being detected, raise it (e.g., to 15).

Performance & Hardware Considerations

Motion interpolation is computationally expensive. A 4K 24fps to 60fps conversion can take hours on a CPU. Here are some strategies to manage performance.

Choosing the Right Motion Estimation Algorithm

The me parameter controls the motion estimation algorithm[reference:30]:

For most users, me=epzs (the default) is the best choice. Only switch to umh or hexbs if you have serious quality issues.[reference:35]

Reducing Resolution

Consider scaling down before interpolation if you're just testing:

ShareRenders { } Code Config
Generated Code Logs Customize
# Scale down before interpolation for faster testing
ffmpeg -i input_4k.mp4 -vf "scale=1280:720,minterpolate=fps=60:mi_mode=mci" -c:a copy output_test.mp4

GPU Acceleration

FFmpeg's minterpolate filter is CPU‑only. However, there are GPU‑accelerated alternatives like SVPflow, MVTools2, and DAIN that can be integrated with FFmpeg[reference:36]. These are outside the scope of this guide but worth exploring for production workflows.

Debugging Common Interpolation Issues

Motion interpolation is never perfect. Here are the most common issues and how to fix them.

ProblemLikely CauseFix
Warping / morphing artifacts Motion estimation errors in complex scenes Try me_mode=bidir (bidirectional estimation)[reference:37]; increase search_param; use mc_mode=obmc instead of aobmc
Edge ghosting Occlusion (objects appearing/disappearing) Use mc_mode=obmc; consider using blend mode for problematic scenes[reference:38]
Artifacts at scene changes Scene detection isn't working Ensure scd=fdiff is set; lower scd_threshold[reference:39]
Interpolation looks choppy Output frame rate is too low Increase fps value; for 2x slow motion, set fps=2×input_fps
Unnatural "soap opera" effect Too much smoothing in motion vectors Try mc_mode=obmc instead of aobmc; reduce fps slightly
Processing is extremely slow High resolution and high FPS target Use me=epzs (default); scale down for testing; consider GPU alternatives[reference:40]
Letterbox edges artifact Black borders confuse motion estimation Crop or pad before interpolation; FFmpeg's minterpolate doesn't have built‑in edge padding[reference:41]

As one FFmpeg user noted: "Motion interpolation is never perfect, there are always some types artifacts, occlusions, edge morphing"[reference:42]. The key is minimizing them through careful parameter tuning.

Visualize Motion Vectors with the FFmpegLab IDE

Motion interpolation is much easier to debug with visual feedback. The FFmpegLab IDE lets you:

Here's how motion interpolation preview looks in the FFmpegLab IDE.

ShareRenders { } Code Config
Generated Code Logs Customize
📹 Input: 24fps, 1920×1080 🎯 Output: 60fps (2.5x interpolation) ✅ mi_mode=mci | mc_mode=aobmc
🔄 Frame 0 (original)
24 fps
✨ Frame 1 (interpolated)
⏳ Generating...
🔄 Frame 2 (original)
24 fps
[info]
Motion vectors: 1,024 blocks estimated
Scene change detected at frame 245 → skipping interpolation
# Interactive motion interpolation preview
# Adjust fps, scd_threshold, and search_param in real time
🎯 FPS: 60 📊 Motion vectors: 1,024 ✅ Scene detection: active

The IDE shows you exactly what's happening—which frames are original, which are interpolated, and whether scene detection is working correctly. You can experiment with different settings and see the results in real time.

Frequently Asked Questions (FAQ)

What's the difference between dup, blend, and mci?

dup duplicates frames—fast but choppy. blend averages frames—smoother but with ghosting[reference:43]. mci uses motion vectors to generate accurate new frames—highest quality but slowest[reference:44]. For professional results, use mci.

Why does my interpolated video have warping artifacts?

Warping occurs when motion estimation fails—typically in scenes with complex motion, occlusion, or low contrast[reference:45]. Try me_mode=bidir (bidirectional estimation)[reference:46], increase search_param, or switch to mc_mode=obmc instead of aobmc[reference:47].

How do I convert 24fps to 60fps without the "soap opera" effect?

The "soap opera" effect is caused by too much smoothing. Try using mc_mode=obmc instead of aobmc, which produces less aggressive interpolation[reference:48]. You can also reduce the output frame rate—e.g., 48fps instead of 60fps—to create a more subtle effect.

Is motion interpolation available for hardware acceleration?

FFmpeg's minterpolate is CPU‑only. However, there are GPU‑accelerated alternatives like SVPflow, MVTools2, and DAIN that can be integrated with FFmpeg[reference:49]. These are typically faster but require additional setup.

Why is minterpolate so slow?

Motion interpolation is computationally expensive—it's analyzing every pixel's movement and generating new frames[reference:50]. For 4K content, processing can take hours. To speed things up, reduce resolution for testing, use me=epzs (the fastest algorithm)[reference:51], or consider GPU‑accelerated alternatives.

Does minterpolate support scene change detection?

Yes. Use scd=fdiff to enable frame‑difference scene detection[reference:52]. The scd_threshold parameter controls sensitivity—lower values detect more scenes[reference:53]. This prevents interpolation artifacts across cuts[reference:54].

Final Word

Optical flow and motion interpolation are among FFmpeg's most impressive features. The minterpolate filter can transform choppy, low‑frame‑rate footage into buttery‑smooth video that rivals dedicated tools like Twixtor or SVP.

The key is understanding the parameters: mi_mode controls how frames are interpolated; mc_mode and me_mode control how accurately motion is estimated; and scd prevents artifacts across scene changes. Tune these for your specific content, and you'll get professional results.

As one FFmpeg user put it: "minterpolate is an important and amazing function"[reference:55]. With the FFmpegLab IDE's visual feedback, you can experiment, debug, and perfect your interpolation settings without the guesswork.

Next time you need to create smooth slow motion or convert frame rates, reach for minterpolate. Your viewers will thank you.

✦  Fresh from the render queue

Better FFmpeg workflows, delivered.

Get practical commands, new templates, and deep-dive guides for the edits that are usually hardest to get right.

✓  Copy-pasteable commands    ✓  Editor templates    ✓  No noise
One useful email at a time.