Video Stabilizer Motion Apply
Put the camera work back on AI video with Motion Apply
- frames
- motion_meta
- padding_color
- Frames
- Padding Mask
- Meta
Every stabilizer has the same dirty secret: once you smooth the camera path, the motion you removed is gone. This node is how you get it back. Video Stabilizer Motion Apply is the consumer half of the ComfyUI-Video-Stabilizer pack - it takes the motion_meta JSON that the stabilizer nodes emit and warps a video with it. Same motion, reapplied to whatever frames you feed it.
That unlocks the workflow the pack was built for. You stabilize footage to make it easy to edit or regenerate, run it through a video-generation AI, then plug Motion Apply back in with the saved meta. Result: generated frames that carry the original, natural camera work instead of that telltale AI stillness. It's also how you add artificial shake from the Shake Generator nodes - they only produce metadata, and this is the thing that actually moves the pixels.
How it works
The motion_meta JSON is just a list of 3×3 transform matrices, one per frame, plus the source resolution, fps, and frame count. Motion Apply warps each input frame with its matrix (inverse perspective warp under the hood), then handles the borders depending on framing_mode, and emits a mask of the areas where warping exposed empty pixels. That mask is the same outpainting hook the stabilizers use, so you can clean up the padding with a VACE model rather than living with grey bars.
The inputs that matter
frames- the video to warp.motion_meta- the JSON from a stabilizer's Motion Meta output, or from a shake generator's single output.framing_mode-crop_and_pad(default),crop, orexpand.cropwill center-crop away any pixels that never have valid content across the whole clip.motion_blur- a shutter fraction from0to1;0disables it. This is the interesting one: it adds real motion blur by sampling intermediate positions of the warp, which is what makes re-applied or generated shake read as "camera motion" instead of "the image jumped around."motion_blur_quality- Draft / Standard / High / Ultra. These map to how many shutter samples get averaged (roughly 5 to 33); the tooltip puts it plainly: Draft is faster, Ultra is smoother.
interpolation (bilinear vs bicubic) and padding_color (hex fill for exposed pixels) are the usual suspects. Outputs are Frames, Padding Mask, and Meta (the metadata echoed back, handy for chaining).
Install and gotchas
Same as the rest of the pack - ComfyUI Manager → "ComfyUI-Video-Stabilizer", or:
cd ComfyUI/custom_nodes
git clone https://github.com/nomadoor/ComfyUI-Video-Stabilizer
Restart, and keep in mind there are no model downloads and the only dependency is opencv-python-headless. It needs a recent ComfyUI (V3 node API).
Three things to watch. Motion blur multiplies the work per frame - at Ultra quality on a long clip, the progress bar moves a lot slower, so start with 0 and only add blur where the shake actually needs it. Second, if your motion_meta came from a stabilizer that used crop framing, the meta's matrices assume that crop, and the two have to agree on resolution or the warp will look wrong. Third, this node is the direct replacement for the pack's deprecated Video Stabilizer Inverse - if you loaded an old workflow, it should migrate automatically, but new graphs should just use Motion Apply.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| frames | IMAGE | — | |
| motion_meta | JSON | — | |
| framing_mode | COMBO | crop_and_pad | 3 options: crop_and_pad, crop, expand |
| interpolation | COMBO | bilinear | 2 options: bilinear, bicubic |
| padding_color | COLOR | #7F7F7F | HEX padding color used where warping exposes empty pixels. |
| motion_blur | FLOAT | 0.000–1 | Shutter fraction for matrix-sampled motion blur. 0 disables blur. |
| motion_blur_quality | COMBO | Standard | Draft is faster. High and Ultra average more shutter samples for smoother blur. |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| Frames | IMAGE | — |
| Padding Mask | MASK | — |
| Meta | JSON | — |