Amage FPS Converter
The 'interpolate' here is a lie — a straight talk about Amage FPS Converter
- images
- IMAGE
Amage FPS Converter is the node you reach for when your video frames are the wrong count for what comes next. It takes an IMAGE batch, pretends the batch was shot at some original_fps, and resamples it so the same clip plays at target_fps. It lives in the Amage/Video category of the small ComfyUI-Amage pack, and honestly - it's the most interesting node in that pack, mostly because of what it doesn't do.
Why you'd actually use it
ComfyUI's video-save nodes (VHS Video Combine, SaveVideo) already have a frames-per-second field, so you can "fix" playback speed without touching frames at all. You reach for a resampler like this when the number of frames is the problem: you generated with AnimateDiff at 8 fps and want a 2-second clip at 16 fps (frame count matters), or you need to drop a 25 fps source to match a 16 fps target. This node is a frame-count switcher, not a codec tool.
How it works
The mechanism is one line of math: ratio = target_fps / original_fps, then it resamples the batch accordingly.
- downsample - picks
round(total_frames × ratio)evenly-spaced frames withnp.linspace. This is clean timing-wise: frames stay evenly distributed, none of the stutter you'd get from naive stepping. - duplicate - repeats each frame
round(ratio)times. Simple, zero thinking, exactly what it says. - interpolate - only runs when
ratio > 1and you have 2+ frames. It insertsround(ratio - 1)frames between each pair, and those frames are just linear alpha blends of the neighbors (img1*(1-alpha) + img2*alpha).
That last one is the trap, so let's be blunt: this "interpolate" is a crossfade, not interpolation. No motion estimation, no optical flow. Moving subjects get smeary double-exposure ghosts, which is exactly the artifact RIFE and the proper frame-interpolation packs exist to fix. If you want real interpolation for slow-mo or smoother motion, use RIFE or AnimateDiff-Evolved's interpolator - the KB's upscaling notes use RIFE as the standard companion for this exact job. This node's "interpolate" is for when a cheap blend is good enough to hit a frame budget.
Where people get burned
Two integer-rounding quirks hide in the source. First, original_fps and target_fps are both rounded to integers before anything runs. Second, a common case like 24 → 30 gives ratio = 1.25, which round()s to 1 - so duplicate does literally nothing (repeat every frame once) and interpolate inserts one blended frame per gap, overshooting to ~48 fps. Odd ratios produce weird results; stick to clean ratios (2x, 1.5x, half) and check the output frame count. Also note interpolate silently returns the input unchanged if ratio <= 1 - you asked to "interpolate" a slowdown and it just passes frames through without telling you.
The inputs that matter
You set four things: images (the frame batch - feed it from a video loader or your AnimateDiff/Wan output), original_fps (your source rate; the node trusts you, it doesn't sniff it), target_fps (what you want), and method (downsample / duplicate / interpolate, default interpolate - the one I'd not default to). Output is a single IMAGE batch, same shape otherwise, which wires straight into Video Combine or any node that takes frames.
Install
It's a ComfyUI Manager search away - search "Amage" and install the ComfyUI-Amage pack, then restart. Or manually:
cd ComfyUI/custom_nodes
git clone https://github.com/Sampkao/ComfyUI-Amage.git
# restart ComfyUI
One pack-wide gotcha: there's no requirements.txt, and the pack imports transformers at module load (it's only used by the Amage STT node). If transformers isn't installed in your ComfyUI Python env, all four nodes in the pack fail to load, FPS Converter included. pip install transformers into the ComfyUI venv fixes it.
Keep the batch, check the frame count, and don't expect RIFE-quality motion from a crossfade - and it'll do a perfectly honest job of re-timing your clips.
Inputs (4)
| Name | Type | Default | Description |
|---|---|---|---|
| images | IMAGE | — | |
| original_fps | FLOAT | 25.000.1–120 | — |
| target_fps | FLOAT | 16.000.1–120 | — |
| method | COMBO | interpolate | 3 options: downsample, duplicate, interpolate |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | — |