Nodes/ComfyUI-RvTools_v2/Combine Video Clips v2
ComfyUI Node

Combine Video Clips v2

Stitching Video Clips Together Without Leaving ComfyUI

By r-vage·Created about a year ago·Updated 5 months ago· 23
Combine Video Clips v2
    • image
    • fps
    â—„frame_load_cap81â–ş
    â—„simple_combinefalseâ–ş
    â—„video_filelistâ–ş
    â—„joined_filelistâ–ş

    Video work in ComfyUI is a bunch of small generations, not one big one - you make a clip, you make another clip, and then you have to glue them together before you can do anything with the result. Combine Video Clips v2 is that glue. You give it a list of video files, it loads every clip frame by frame, and it hands you a single IMAGE batch plus an FPS value, ready to feed into a video-encode or frame-edit node. No ffmpeg gymnastics, no leaving the graph.

    How it works

    The node reads your videos with OpenCV (cv2.VideoCapture), converts each frame from BGR to RGB, normalizes to 0–1, and stacks everything into one tensor. The two inputs that matter:

    • video_filelist (optional, string) - comma-separated paths to your clips. This is the list that drives the whole node.
    • frame_load_cap (default 81) - the max number of frames it loads per clip. 81 is an oddly specific default (about 2.7 seconds at 30fps) but it's a sane cap for keeping memory down; raise it if your clips are longer.
    • simple_combine (default off) - flip this on and the node just concatenates every video in the list, plain and simple.
    • joined_filelist (optional, string) - here's the "v2" part. If your workflow generates transition clips (join files) to bridge two shots, this node knows how to interleave them: it plays the first half of a clip, then the join file, then the second half of the next clip. When simple_combine is off, it expects your video_filelist and joined_filelist to line up positionally and inserts each join file between its neighbors, trimming each clip to frame_load_cap // 2 around the join so the timing works out.

    Outputs are image (an IMAGE batch of all the loaded frames) and fps (a FLOAT). One honesty note: the fps output is hardcoded to 30.0 in the source - the node reads the real fps from each clip for logging, but it reports 30.0 out. If your source clips are 24fps, don't trust that output; set your frame rate yourself when you encode.

    When you'd reach for it

    This is squarely a Wan-video-adjacent tool, the kind of node that shows up in workflows where you generate shot-by-shot and assemble later. The join-file handling is the standout feature - nobody else in the pack does this - and it means a two-shot scene with a generated transition can be assembled in one node instead of a chain of concat operations. Because it always re-executes (it marks itself changed every run), you can rerun the pipeline and the combined result stays fresh.

    Installing it

    Part of ComfyUI-RvTools_v2. Manager → search "ComfyUI-RvTools_v2", or:

    cd ComfyUI/custom_nodes
    git clone https://github.com/r-vage/ComfyUI-RvTools_v2
    pip install -r requirements.txt  # needs opencv-python for video decoding
    # restart ComfyUI
    

    This is the one node in the pack where the extra dependency actually matters: video decoding uses opencv-python, which isn't part of a bare ComfyUI install. If the node errors on import, pip install opencv-python is the fix.

    Gotchas

    Three things bite people here. First, the file paths must exist - the node raises "Video file not found" rather than silently skipping, so double-check absolute paths. Second, the fps output is a lie (always 30.0) if your clips are a different rate - set your own fps downstream. Third, if you use the join-file mode, the two lists must be the same length and positionally aligned, or frames get trimmed from the wrong clip. And the usual pack caveat: RvTools_v2 is unmaintained in favor of ComfyUI_Eclipse.

    Category🫦 RvTools II/ Video

    Inputs (4)

    NameTypeDefaultDescription
    frame_load_capINT811–10000Total number of frames to load from each video
    simple_combineBOOLEANfalseWhen True it combines the video files only (without join files)
    video_filelistoptSTRING—
    joined_filelistoptSTRING—

    Outputs (2)

    NameTypeDescription
    imageIMAGE—
    fpsFLOAT—