Nodes/ComfyUI Wan VACE Prep/πŸͺ VACE Join (Batch)
ComfyUI Node

πŸͺ VACE Join (Batch)

Join a whole folder of clips, not just two

By stuttlepressΒ·Created 8 months agoΒ·Updated 25 days agoΒ· 100
πŸͺ VACE Join (Batch)
  • video_1
  • video_2
  • control_video
  • control_mask
  • width
  • height
  • length
  • start_images
  • end_images
  • context_frames
  • replace_frames
  • new_frames
β—„is_firstfalseβ–Ί
β—„is_lastfalseβ–Ί
β—„context_frames8β–Ί
β—„replace_frames8β–Ί
β—„new_frames0β–Ί
β—„debugfalseβ–Ί

VACE Join (Batch) is the batch-aware version of the pack's flagship join node. Where plain VACE Join (WanVACEPrep) handles one pair of clips, this one is built to run inside a loop over many clips - a whole folder of footage stitched into one sequence. Same transition math, two extra switches (is_first, is_last), and the edge-case handling that makes it not fall apart on the first and last iterations.

It exists because of a real asymmetry: when you join clip A to clip B, then B to C, the middle clips do double duty. Clip B's tail is consumed by the A→B transition, and its head by the B→C transition. If you naively run a single-pair node in a loop, you'd drop frames at every boundary. This node's flags handle exactly that.

How it works

For each pair, it builds the same control video and mask as the single-pair version - context frames from each facing edge, gray placeholder transition zone, mask 1 over the zone. The difference is in what gets preserved:

  • With is_first = true (first iteration), start_images includes the full beginning of video_1.
  • On middle and last iterations, start_images trims both edges of video_1 - because the head was already consumed by the previous transition.
  • With is_last = true (final iteration), end_images includes the full ending of video_2. Otherwise end_images is empty, since the next iteration's join will consume it.

The node also validates more strictly for batch use: middle/last iterations require video_1 to have at least 2Γ—(context_frames + replace_frames) frames, because both edges get used. debug logs every input shape and flag, which makes it much easier to spot a wrong iteration.

The inputs and outputs that matter

  • video_1 / video_2 - the current pair of clips (IMAGE).
  • is_first / is_last - the flags that gate the edge handling. If you're driving this with the pack's VACE Batch Context node, it computes these for you from the iteration index.
  • context_frames (8), replace_frames (8), new_frames (0) - same meaning and same multiples-of-4 rules as VACE Join.
  • debug - turn it on for per-iteration console logging.

Outputs: control_video, control_mask, width/height/length (to WanVaceToVideo), start_images and end_images (the preserved segments to concatenate around each generated transition), plus passthroughs for context_frames/replace_frames/new_frames.

Install

Same pack, same one-line answer - ComfyUI Manager, search "Wan VACE Prep", install, restart, or:

cd /path/to/comfyui/custom_nodes
git clone https://github.com/stuttlepress/ComfyUI-Wan-VACE-Prep

No extra dependencies. The is_first/is_last flags are plain booleans you can drive from a loop counter or from the companion Batch Context node.

Common issues

  • "video_1 needs at least NΓ—2 frames" - the strict batch validation kicking in on middle/last iterations. Your clips need to be long enough to survive having both edges consumed. Shrink context_frames or replace_frames.
  • Missing start or end footage - if your final video is missing the opening or closing, is_first or is_last wasn't set on the right iterations. That's exactly what the flags exist for.
  • This is still VACE - transitions take minutes each at 14B. With a folder of clips, budget for a long session or reach for CausVid-style speed LoRAs.
CategoryWan VACE Prep/VACE

Inputs (8)

NameTypeDefaultDescription
video_1IMAGEβ€”
video_2IMAGEβ€”
is_firstBOOLEANfalseTrue for first iteration (index=0) - includes full beginning of video_1 in start_images.
is_lastBOOLEANfalseTrue for last iteration - includes full ending of video_2 in end_images.
context_framesINT84–120Reference frames from each video edge for VACE interpolation (multiple of 4).
replace_framesINT80–120Number of frames to regenerate at each transition edge (multiple of 4).
new_framesINT00–240Number of new transition frames to generate, in addition to the replace_frames (multiple of 4).
debugBOOLEANfalseLog details to the console

Outputs (10)

NameTypeDescription
control_videoIMAGEβ€”
control_maskMASKβ€”
widthINTβ€”
heightINTβ€”
lengthINTβ€”
start_imagesIMAGEβ€”
end_imagesIMAGEβ€”
context_framesINTβ€”
replace_framesINTβ€”
new_framesINTβ€”