Nodes/was-node-suite-comfyui/Video Motion Blur
ComfyUI Node Runs on cloud

Video Motion Blur

The blur your video model forgot to render

By WASasquatch·Created 4 years ago·Updated a day ago· 1,864
Video Motion Blur
  • video
  • mask
  • depth
  • motion
  • shutter_curve
  • video
  • motion_preview
◄shutter_angle180►
◄samples32►
◄blur_layersall►

Generated video is crisp in a way real footage is not. A real camera exposes each frame for a slice of time, so anything moving leaves a streak; a diffusion sampler renders instantaneously, which is why a fast pan out of H3 or Wan strobes like a slideshow frame-hold. Threads about "why does AI video look fake" keep landing on the same post-production list, and motion blur sits near the top of it next to film grain.

Video Motion Blur adds it properly: it measures how pixels move between your clip's own frames, then draws along that path. Not a directional blur filter - blur that follows the actual motion, frame by frame.

How it works

The node measures motion between neighbouring frames (or takes a motion measurement you already have), then for each pixel samples along its path. shutter_angle is how much of the frame interval is exposed, in film degrees: 0 is no blur, 180 is the film standard, 360 is the whole interval, and above 360 is deliberately exaggerated. samples is how many points are read along the path - 16 for a quick look, 32 for smooth streaks up to about 30 px of travel, 96 when you want long streaks without visible stepping.

The shutter_curve optional is the one that opens up creative work: it takes an array - the values out of Curve to Numbers - stretched across the clip, and it replaces shutter_angle. [90, 360, 90] opens the shutter through the middle of the shot and closes it again. That is a speed ramp's worth of blur without retiming anything.

The subject and depth inputs

mask takes a per-frame subject mask - white on the subject, from something like SAM 3 - and then blur_layers decides what gets the treatment: all blurs everything, background keeps the subject sharp, subject blurs only the subject. background is the one that makes a generated shot read as filmed, because it is what a real camera with a subject at closer range does.

depth takes a per-frame depth batch, white nearest, from something like Depth Anything. It resolves the genuinely hard case: where two surfaces' motions cross and you have to decide which one passes in front. Without depth, the node has to guess, and it guesses from motion alone.

motion lets you feed a shared measurement from Video Motion measured from this same clip at any size - worth doing when the graph has three other nodes keying off the same flow. Empty, it measures here at 768 px on the long side.

Output is a single video at the same size, length, frame rate and audio, plus motion_preview - the blur each frame was given, in the same hue-is-direction, brightness-is-length encoding Video Motion uses. If the streaks look wrong, look at the preview before you touch the settings; it will tell you whether the problem is the blur or the measurement.

Install

ComfyUI Manager, search WAS Node Suite v3, install, restart. Or:

cd ComfyUI/custom_nodes
git clone https://github.com/WASasquatch/was-node-suite-comfyui.git

ComfyUI 0.14.0+ and Python 3.10+. The pack installs no packages - requirements.txt holds a comment, it never runs pip, and the heavy bits it does bundle (its flow code, the EMA-VFI network) ship in the repo with their licences beside them. First start after install or update is a second or two slower. This node needs no model weights at all unless you hand it a learned flow network.

Practical settings, and where it bites

Start at the film default: shutter_angle 180, samples 32, no mask, no depth. That already fixes strobing. Then add mask + blur_layers: background if you want a subject that holds together while the world streaks past - it is the single biggest visual upgrade, and it depends on having a decent mask per frame, so budget for SAM or whatever you already use.

Redrawing the clip. There is no denoise here, so if the source is mushy, blurring it just gives you mush with streaks. Pair it with Video Retime when you speed a shot up: a 2× speed-up drops half the frames and strobing gets much worse, and the node's own description says exactly that.

Above 360 degrees. It is a legitimate tool for a punch-in or an impact, and it looks like a mistake if you leave it on for the whole clip.

Motion through a cut. Frame pairs either side of a hard cut have nonsense flow. If your clip has cuts and the blur misbehaves at exactly those frames, that is why - measure once with Video Motion and check the cuts before you blame the blur settings.

CategoryWAS Suite/Animation

Inputs (8)

NameTypeDefaultDescription
videoVIDEOThe clip to blur, at least two frames. Frame rate and audio pass through unchanged.
shutter_angleFLOAT1800–720Exposure per frame in degrees: 0 = no blur; 90 = crisp action; 180 = the film standard; 360 = the whole frame interval; above 360 = exaggerated streaks.
samplesINT324–256Points read along each pixel's path: 16 = quick look; 32 = smooth streaks up to about 30 px; 96 = long streaks without stepping.
blur_layersCOMBOallWith a mask wired: 'all' blurs everything; 'background' keeps the subject sharp; 'subject' blurs only the subject. Without a mask everything is blurred.
maskoptMASKSubject mask per frame, white on the subject, such as from SAM 3. The subject stays in front: background streaks pass behind it and its own blur spreads over the background.
depthoptIMAGEDepth per frame, white nearest, such as from Depth Anything. Decides which surface passes in front where two motions meet.
motionoptWAS_MOTIONMotion from Video Motion, measured from this same clip at any size, so one measurement serves several nodes. Left empty, it is measured here at 768 px on the long side.
shutter_curveoptARRAYShutter angles across the clip for a speed ramp, such as the values of Curve to Numbers: [90, 360, 90] opens up mid-clip. Stretched to the clip's length; replaces shutter_angle.

Outputs (2)

NameTypeDescription
videoVIDEOThe blurred clip: same size, length, frame rate and audio.
motion_previewIMAGEThe blur each frame was given, at the size motion was measured: hue is direction, brightness is length, black is none.