Batch Slowdown
Slow motion without the AI shimmer
- images
- mask
- latent
- images
- mask
- latent
- original_count
- new_count
- effective_mult
- info
There are two ways to make slow motion: interpolate new frames, which can hallucinate detail and cost a model pass, or duplicate frames you already have, which is instant, deterministic, and looks exactly like what it is. Batch Slowdown is the duplication camp - GPU-accelerated frame repetition to stretch a batch out, with enough smarts about non-integer multipliers that it doesn't feel like a blunt tool.
The core operation is torch.repeat_interleave: every frame gets repeated N times, in one shot, on the GPU. The reason the node exists rather than a one-liner is the decimal case. A 1.5x slowdown isn't "repeat each frame 1.5 times" - you have to decide which frames carry the extra copy. distribution handles that: spread (default) distributes the extra frames evenly through the clip, front_weighted piles them at the start, back_weighted at the end. For a 1.5x on a 24-frame clip you get base repeats of 1 plus extra copies sprinkled across every other frame, so motion stays roughly even instead of stuttering in bursts.
Modes
multiplier- direct factor, 2.0 = 2x slower, 0.5 = 2x faster. The default mode.target_frames- say "I need exactly 60 frames out of this 24" and it computes the multiplier for you.fps_convert- the 24fps → 60fps case. Give itsource_fpsandtarget_fpsand it derives the repeat pattern.
And the one that's easy to miss: enable_speedup. By default a multiplier below 1 (speeding up) is refused, because sampling every Nth frame loses frames and the author decided you should opt in. Turn it on and multipliers < 1 become stride sampling instead of duplication. If you're building a 60fps preview from a 24fps render, this is the mode that does the reverse direction.
Types and wiring
data_type gates which socket you feed: IMAGE, MASK, or LATENT. You can slow down a latent batch before sampling - which is often the smart move, since it's cheaper than slowing pixels after. Outputs are passthrough (images, mask, latent) plus the genuinely useful bookkeeping: original_count, new_count, effective_mult (the realized multiplier, which can differ from the requested one when rounding kicks in), and info, a string report.
The trap people hit: keeping the video and its masks in sync. If you slow down an image batch but the mask batch that pairs with it used a different multiplier or distribution, your compositing edges drift frame-by-frame. Run both through this node with identical settings, and use the count outputs to verify they match. This matters in any masked video workflow - the masking-detection layer of the ecosystem is unforgiving about misaligned masks.
No models, no downloads - the only dependency is torch, which ComfyUI already has. It installs with TrentNodes (ComfyUI Manager, "Trent Nodes", or clone + pip install -r requirements.txt). For the honest tradeoff: if your slow-mo needs new motion rather than held frames, look at the pack's Frame Ramp Boogie (actual interpolation); Batch Slowdown is the deterministic, artifact-free option.
Inputs (11)
| Name | Type | Default | Description |
|---|---|---|---|
| data_type | COMBO | IMAGE | Type of data to process |
| mode | COMBO | multiplier | How to specify the slowdown amount |
| distribution | COMBO | spread | How to distribute extra frames for decimal multipliers |
| imagesopt | IMAGE | Image batch to slow down | |
| maskopt | MASK | Mask batch to slow down | |
| latentopt | LATENT | Latent batch to slow down | |
| multiplieropt | FLOAT | 2.00.1–10 | Slowdown multiplier (2.0 = 2x slower, 0.5 = 2x faster) |
| target_framesopt | INT | 601–10000 | Target frame count for output |
| source_fpsopt | FLOAT | 24.01–240 | Source video FPS (for fps_convert mode) |
| target_fpsopt | FLOAT | 60.01–240 | Target video FPS (for fps_convert mode) |
| enable_speedupopt | BOOLEAN | false | Allow speedup (sample every Nth frame) when multiplier < 1 |
Outputs (7)
| Name | Type | Description |
|---|---|---|
| images | IMAGE | — |
| mask | MASK | — |
| latent | LATENT | — |
| original_count | INT | — |
| new_count | INT | — |
| effective_mult | FLOAT | — |
| info | STRING | — |