Frame Interpolate π
Retime video to a real fps target, not just a doubled one
- frames
- frames
- fps
Most frame interpolation in ComfyUI thinks in multiples: double the frames, and that's your 2x. But the real world wants 24 to 30, or 23.976 to 29.97, and a 2x node can't do that without hand-built math around it. Frame Interpolate π is built around frames per second instead: you give it the source rate and the target rate, and it resamples the batch to land on the target. 24β30 works as naturally as doubling.
How it works
Every output frame is either a direct copy (when it lands exactly on a source frame - those are untouched) or an in-between synthesized from its two neighbors. Two methods:
- blend - a crossfade between neighbors. Instant, no downloads, no weights. Soft on fast motion, which is its honest limit.
- optical flow - warps both neighbors along RAFT motion vectors for sharper in-betweens. The catch is in the name: it needs an already-cached RAFT checkpoint and will never download one. If you don't have the weights cached, it falls back or errors - the node says so rather than silently fetching.
scene_cut_threshold (default 0.35) is the smart bit: frames with a mean absolute difference above the threshold count as a hard cut, and instead of morphing across the cut (the smeared-transition look every other interpolator gives you at a scene change), the new frame holds the last frame before it. Set it to 0 to disable cut detection. batch_size just controls how many in-betweens are computed per pass - higher is faster, costs VRAM.
The source_fps tooltip is the hint: wire Load Video's fps output in so the node knows the real rate. The fps output, in turn, is the thing you feed to Save Video so rounding to a whole frame count never drifts the timing.
What comes out
frames - the resampled BHWC batch at the target rate, and fps - the actual output rate. Wire that fps into Save Video π and the encode stays honest even with fractional rates. Matching target_fps to source_fps passes frames through unchanged, which makes the node a handy no-op gate.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/ausboss/ComfyUI-AusBoss.git
Restart ComfyUI and search for AusBoss (Manager: ComfyUI-AusBoss). No extra Python dependencies; the blend path needs nothing beyond ComfyUI's bundled libraries, the flow path needs your cached RAFT weights. Minimum ComfyUI 0.27.1.
Troubleshooting
Blend-mode ghosting on fast motion is expected, not a bug - that's what the optical flow method is for. If flow mode won't run, the RAFT checkpoint isn't cached; that's the one missing-dependency failure here and the error will say so. Long clips: memory is bounded by planning the work first and streaming results back to the CPU, but the flow path still eats VRAM in proportion to batch_size, so lower it on a long clip. And if the output timing looks wrong, the source_fps is lying to you - check it against the source video's real rate.
Inputs (6)
| Name | Type | Default | Description |
|---|---|---|---|
| frames | IMAGE | Video frames as a BHWC IMAGE batch. | |
| source_fps | FLOAT | 24.000.01β240 | Frame rate of the incoming batch; wire Load Video's fps output to match the source. |
| target_fps | FLOAT | 30.000.01β240 | Frame rate to resample to. Matching the source fps passes the frames through unchanged. |
| method | COMBO | blend | blend crossfades neighboring frames: instant, no downloads, soft on fast motion. Optical flow warps both neighbors along RAFT motion vectors for sharper in-betweens. It only uses an already-cached checkpoint and never downloads one. |
| scene_cut_threshold | FLOAT | 0.350β1 | Mean absolute frame difference above this counts as a hard cut, and the new frame holds the last frame before the cut instead of morphing across it. 0 disables cut detection. |
| batch_size | INT | 81β256 | In-between frames computed per batch: higher is faster but uses more VRAM. |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| frames | IMAGE | The resampled BHWC frame batch at the target rate. |
| fps | FLOAT | The actual output fps; wire this into Save Video so rounding to a whole frame count never drifts the timing. |