Time Remap
Speed ramps, freeze frames, and remapped time without leaving the graph
- video
- video
Time remap is the difference between a clip that plays and a clip that's edited: speed ramps, where a moment slows to a crawl and snaps back to real time, and freeze frames, where the action stops dead on one image. That's the entire product category of every "epic" montage on the internet, and ComfyTV's Time Remap stage does it as a node.
It's a ComfyTV Video stage: wire a video in, hit Run, get a re-timed snapshot downstream. It's one of the file-producing stages rather than a pure FX-spec one, because re-timing changes the frame count - there's a real output to write.
The inputs
- mode -
speed(default) orhold. - speed_keys - in speed mode, JSON keyframes of the shape
[{t (output s), v (speed ×), interp}].tis the output timestamp,vis the speed multiplier,interpis the easing. You'll draw these on the node's curve UI rather than typing JSON; a value of 0.5 means half speed, 2 means double. - smooth_fps (0–120, default 0) - 0 is off; a value > 0 pre-interpolates the source to that framerate before remapping. The tooltip warns it's slow, but it's how you get buttery speed ramps instead of chunky ones on low-fps AI clips.
- hold_frame (0–100000) and hold_increment (0–1000) - used in hold mode: hold freezes on
hold_frame, andhold_incrementlets you step forward through a sequence of held frames (a stutter effect).
The project_id / parent_output_id / force_run_token inputs are internal frontend bookkeeping - ignore them.
How it works
In speed mode it reads your keyframes and re-maps the source's timeline onto the output timeline, so a keyframe at output-second 2 with speed 0.5 spends 2 seconds of source stretched over a longer output. Without keys it refuses to run - the error message tells you constant speed is what the separate Video Speed node is for. Hold mode freezes a frame and optionally steps through held frames at an increment. If you turn on smooth_fps, the source gets interpolated first so the ramp has actual in-between frames to work with.
Install
ComfyTV ships ~190 stages in one pack, so installing the pack covers this node.
cd ComfyUI/custom_nodes
git clone https://github.com/jtydhr88/ComfyTV
Restart ComfyUI fully and look under ComfyTV → Video. ComfyUI Manager finds it by searching "ComfyTV". No model downloads, no extra Python deps. On ComfyUI Desktop or macOS, clone into the running instance's absolute path from the startup log rather than trusting the relative cd.
Troubleshooting
- "add speed keyframes on the node first" - expected; constant speed isn't this node's job, so drop a keyframe or two (or use Video Speed).
- Ramps look choppy on AI video. That's a low source framerate problem, not a bug - set
smooth_fpsto 2× your source (e.g. 48 for a 24fps clip) and accept the slower run. - Freeze doesn't start where you want.
hold_frameis a frame index, not seconds - at 24fps, frame 48 is 2 seconds in.
It's the "make it dramatic" node. Learn the difference between speed and hold and you've unlocked half of what makes edit-heavy content feel produced.
Inputs (9)
| Name | Type | Default | Description |
|---|---|---|---|
| force_run_token | INT | 00–2147483647 | Internal — bumped on Run to invalidate ComfyUI's input cache. |
| project_id | STRING | Internal — populated by the projectStore on the frontend. | |
| parent_output_id | INT | 00–2147483647 | Internal — lineage parent set by spawn handlers on the frontend. |
| mode | COMBO | speed | 2 options: speed, hold |
| speed_keys | STRING | JSON [{t (output s), v (speed ×), interp}] | |
| smooth_fps | INT | 00–120 | 0 = off; >0 pre-interpolates the source to this fps (slow) |
| hold_frame | INT | 00–100000 | — |
| hold_increment | INT | 00–1000 | — |
| videoopt | COMFYTV_VIDEO | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| video | COMFYTV_VIDEO | — |