Frame Blend
Real motion blur from static shots, shutter-angle style
- video
- video
Video that's been interpolated, slowed down, or AI-generated from stills has a tell: it's too sharp. Every frame is crisp, so motion feels steppy and digital instead of cinematic. Real cameras smear fast motion because the shutter stays open for part of each frame - that smear is motion blur, and Frame Blend fakes it properly by combining frames across time.
It's the tool you reach for after you've used a frame interpolation or slow-motion node and the result looks like a slideshow at 60fps, or any time you want AI video to feel like it was shot on a camera with a sane shutter angle. ComfyTV is jtydhr88's canvas app (~190 stages, each its own node), and this one lives in its VideoFX suite as a temporal - not spatial - effect.
How it works
Frame Blend takes a window of frames around each output frame and combines them with an operation - default average, which is exactly what a long-shutter camera does: light accumulates, motion smears. The output frame's timing is controlled the way a camera's is, which is the clever part: shutter is the duration in frames that the "shutter is open" (default 0.5 - think a 180° shutter on a 24fps timeline), shutter_type is centered or trailing, and shutter_offset shifts the window. decay fades older frames so the smear trails rather than averaging evenly, and divisions controls how finely the window is sampled.
The mode combo sets window (blend a range around each frame) vs. other accumulation styles, and frame_min/frame_max (defaults −5 to 0) define the raw window bounds, with interval stepping through it. In plain terms: the defaults give you a smooth, centered motion-blur; widen shutter for more smear, drop it toward 0 for a sharper, more digital look.
Optional video in, video out. No video in, nothing happens.
The settings that matter
- shutter - the dial that matters most. 0.5 is film-like; 1.0 is heavy smear; 2+ is deliberate "long exposure" mush.
- operation - average is the safe default. If the result looks muddy, you may want a different combine.
- frame_min / frame_max - the temporal window. Narrow it for fast cuts, widen it for long, languid smears.
Installing it
Same pack, same drill:
cd ComfyUI/custom_nodes
git clone https://github.com/jtydhr88/ComfyTV
or ComfyUI Manager ("ComfyTV"), full backend restart, then ComfyTV → VideoFX. The one gotcha that bites people: on ComfyUI Desktop, macOS, or multiple installs, clone into the running instance by absolute path and confirm custom_nodes/ComfyTV/__init__.py exists (not nested), then fully restart. The pack declares no pip deps, but video stages lazily import PyAV - pip install av if a video node errors.
Common issues
- Looks like a double-exposure ghost - too wide a window or a centered window on fast motion. Narrow
frame_min/frame_maxor reduceshutter. - Motion still steppy - Frame Blend blends, it doesn't invent frames. If the source has too little motion between frames, blur alone won't smooth it; pair it with an interpolation stage.
- Muddy, soft footage - that's
shuttertoo high plusaverageon a long window. Dial the shutter back.
Inputs (14)
| 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 | window | 2 options: window, shutter |
| frame_min | INT | -5-60–0 | — |
| frame_max | INT | 00–60 | — |
| interval | INT | 11–10 | — |
| operation | COMBO | average | 5 options: average, min, max, sum, product |
| decay | FLOAT | 0.000–1 | — |
| shutter | FLOAT | 0.500–8 | — |
| shutter_type | COMBO | centered | 4 options: centered, start, end, custom |
| shutter_offset | FLOAT | 0.00-8–8 | — |
| divisions | INT | 101–64 | — |
| videoopt | COMFYTV_VIDEO | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| video | COMFYTV_VIDEO | — |