Video Speed Adjust | Akatz
Remap your video's timing frame-by-frame without re-rendering
- image_batch
- IMAGE
Video Speed Adjust is the Akatz node for time remapping: it plays a frame batch back at a speed that changes frame to frame. You give it your video frames and a list of speed values, and it re-samples the footage so some parts crawl and others whip past - no re-rendering, no interpolation, no ffmpeg round-trip.
Where this earns its keep is music-synced edits and camera moves. The classic ComfyUI way to "speed up" a video is to render it slower in the sampler, which costs generation time and can't change mid-clip. This node changes the playback of frames you already have, so you can do an impact-hit slowdown, a speed ramp into a beat drop, or a timelapse that accelerates, all driven by a schedule. It's the retime step you'd otherwise do in an NLE, dropped into the graph.
How it works
Under the hood it's simple and honest math. Each value in the speed schedule acts as a playback rate for one output frame - 1.0 plays at normal speed, 2.0 plays twice as fast, 0.5 half as fast. The node walks a virtual playhead, accumulating time_per_frame × speed for each scheduled value, then maps that accumulated time back to a source frame index by integer division. Frames that map to the same source index get repeated (slow-motion feel); indices that skip forward produce the fast-forward feel.
That also tells you the one real caveat: it re-uses source frames, it never synthesizes new ones. A big slow-down is smooth only if your source batch has enough frames to chew on. If you need buttery 4× slow-mo, generate more frames first.
Inputs and outputs
Three inputs, and really only two you'll touch:
image_batch- your video as an IMAGE batch, one tensor per frame.speed_schedule- a FLOAT list, one speed value per output frame. It's a forced input (no widget), so it comes from another node. Feeding it theaverage_sumoutput of Akatz's own Schedule Audio Framesync node is the canonical setup for beat-synced speed changes.fps- frames per second of the source video, used for the time mapping. Default 30.
Output is a single IMAGE batch at the remapped length - wire it into a preview or a VHS video combine.
Installing it
This is part of the akatz-ai/ComfyUI-AKatz-Nodes pack, so you get all ~28 nodes at once. In ComfyUI Manager, search "AKatz" and install; or do it by hand:
cd ComfyUI/custom_nodes
git clone https://github.com/akatz-ai/ComfyUI-AKatz-Nodes
cd ComfyUI-AKatz-Nodes
pip install -r requirements.txt
# restart ComfyUI
No model downloads. The requirements are numpy, torch, opencv-python and pydub - you already have the first two, so the actual install is small. (The pack README keeps it light and points to a Notion doc plus a Custom GPT for full docs.)
Common issues
The one footgun is the schedule length. If your speed list is shorter than the batch, it pads with the last value - fine. If it's empty, you get an error, because there's no "last value" to pad with. And fps should match the frame rate the frames were actually rendered at, or your speed values will be off in ways that are annoying to debug. The node asserts the schedule matches the batch after padding, so a length mismatch tells you loudly rather than silently mangling your timeline.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| image_batch | IMAGE | — | |
| speed_schedule | FLOAT | — | |
| fps | INT | 30 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | — |