Nodes/ComfyTV/Frame Blend
ComfyUI Node

Frame Blend

Real motion blur from static shots, shutter-angle style

By jtydhr88·Created 3 months ago·Updated about 15 hours ago· 725
Frame Blend
  • video
  • video
force_run_token0
project_id
parent_output_id0
modewindow
frame_min-5
frame_max0
interval1
operationaverage
decay0.00
shutter0.50
shutter_typecentered
shutter_offset0.00
divisions10

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_max or reduce shutter.
  • 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 shutter too high plus average on a long window. Dial the shutter back.
CategoryComfyTV/VideoFX

Inputs (14)

NameTypeDefaultDescription
force_run_tokenINT00–2147483647Internal — bumped on Run to invalidate ComfyUI's input cache.
project_idSTRINGInternal — populated by the projectStore on the frontend.
parent_output_idINT00–2147483647Internal — lineage parent set by spawn handlers on the frontend.
modeCOMBOwindow2 options: window, shutter
frame_minINT-5-60–0
frame_maxINT00–60
intervalINT11–10
operationCOMBOaverage5 options: average, min, max, sum, product
decayFLOAT0.000–1
shutterFLOAT0.500–8
shutter_typeCOMBOcentered4 options: centered, start, end, custom
shutter_offsetFLOAT0.00-8–8
divisionsINT101–64
videooptCOMFYTV_VIDEO

Outputs (1)

NameTypeDescription
videoCOMFYTV_VIDEO