Nodes/Steerable Motion/Video Continuation Generator πŸŽžοΈπŸ…’πŸ…œ
ComfyUI Node

Video Continuation Generator πŸŽžοΈπŸ…’πŸ…œ

The node that fixes colour drift in Wan continuations

By banodocoΒ·Created 3 years agoΒ·Updated 11 months agoΒ· 975
Video Continuation Generator πŸŽžοΈπŸ…’πŸ…œ
  • input_video_frames
  • end_frame
  • control_images
  • inpaint_mask
  • continuation_video_frames
  • continuation_frame_masks
β—„total_output_frames81β–Ί
β—„overlap_frames3β–Ί
β—„empty_frame_fill_level0.50β–Ί
β—„how_to_use_control_imagesstart_sequence_at_beginning_and_prioritise_input_framesβ–Ί
β—„how_to_use_inpaint_masksstart_sequence_at_beginning_and_prioritise_input_framesβ–Ί

Chain two VACE continuations back to back and you'll meet the classic failure: the colours shift, detail softens, and by the third extension your clip has drifted into a different palette entirely. The author's own launch post for the Wan side of this pack said most people - including him - were getting continuations wrong because they weren't using masks correctly. Video Continuation Generator πŸŽžοΈπŸ…’πŸ…œ is that fix, packaged into one node: it builds the guidance video and the inpaint masks that tell VACE which frames are real and should be preserved, instead of letting the model hallucinate over everything.

What it does

For one continuation step, it takes the last overlap_frames of your input video and reuses them at the start of the output - that's your continuity anchor, the thing the next generation can't be allowed to redraw. Then it fills the rest of the timeline, either with the control_images you feed it or a plain gray fill, and produces the mask that marks known frames (mask 0) versus frames VACE is free to generate (mask 1). The whole trick is in that mask. When VACE knows the overlap frames are already decided, it doesn't re-colour them, and the colour drift that plagues naive continuations mostly evaporates.

The inputs that matter

  • input_video_frames - the previous clip, the seed for the continuation.
  • total_output_frames - the length you want, and it must satisfy (frames - 1) divisible by 4 or the node throws a hard error. Use WanInputFrameNumber to pick a safe value.
  • overlap_frames (default 3) - how many tail frames become the anchor. Too small and continuity breaks; too large and the model wastes its budget re-rendering content you already own.
  • empty_frame_fill_level (0–1, default 0.5) - the gray level for the blank frames you're leaving for the model to invent. Mid-gray is the safe starting point.
  • Optional end_frame pins a single target frame at the end, control_images fills the middle with real frames, and inpaint_mask overrides the generated mask. The two how_to_use_* dropdowns decide whether control images and masks start at frame 0 or only after the overlap - the default (prioritise input frames) is almost always right.

The outputs

continuation_video_frames (IMAGE) and continuation_frame_masks (MASK). Both go into WanVideoVACEEncode - the frames as the reference/guidance, the masks telling the encoder what's known. From there the new segment gets sampled, and you chain segments with WanVideoBlender for the final stitch. Because it creates a new generation per image pair, you can chain indefinitely - the author's pitch is endless videos, prompt travel, vid2vid, all from the same mechanism.

Install and gotchas

Standard pack install: Manager β†’ "Steerable Motion", or git clone https://github.com/banodoco/steerable-motion into ComfyUI/custom_nodes/ and restart. The real dependency is Kijai's ComfyUI-WanVideoWrapper (all the WanVideo* nodes in Vace_Travel.json), plus the VACE model files you'll be prompted to download.

Two things to watch: keep total_output_frames rule-compliant or you'll chase a confusing error, and don't set overlap_frames bigger than your input clip - the node clamps it and logs a warning, but a clamp means you got less continuity than you asked for. And if your continuation still drifts, check the mask preview before blaming the sampler: if the overlap frames aren't showing as known (mask 0), the node isn't the problem, the wiring to VACE encode is.

CategorySteerable-Motion

Inputs (9)

NameTypeDefaultDescription
input_video_framesIMAGEInput video frames to create continuation from.
total_output_framesINT811–10000Total number of frames for the output continuation video. Must satisfy: (frames - 1) divisible by 4.
overlap_framesINT31–50Number of frames from the end of input video to use as overlap at the start.
empty_frame_fill_levelFLOAT0.500–1Grayscale level (0.0 black, 1.0 white) for empty continuation frames.
end_frameoptIMAGEOptional single frame to place at the end of the continuation video.
control_imagesoptIMAGEOptional control images to fill the empty frames.
inpaint_maskoptMASKOptional inpaint mask to use for the empty frames, overriding the default mask.
how_to_use_control_imagesoptCOMBOstart_sequence_at_beginning_and_prioritise_input_framesIf start_sequence_at_beginning_and_prioritise_input_frames is selected, control images align with frame 0 but input overlap frames take priority, so control images become visible after the overlap period. If start_sequence_after_overlap_frames_and_prioritise_input_frames is selected, control images start being placed after the overlap frames from the input video.
how_to_use_inpaint_masksoptCOMBOstart_sequence_at_beginning_and_prioritise_input_framesIf start_sequence_at_beginning_and_prioritise_input_frames is selected, inpaint masks align with frame 0 but preserve input overlap frames as known. If start_sequence_after_overlap_frames_and_prioritise_input_frames is selected, inpaint masks only affect frames after the overlap period.

Outputs (2)

NameTypeDescription
continuation_video_framesIMAGEβ€”
continuation_frame_masksMASKβ€”