๐ผ๏ธ Compare: videos
A/B your videos without leaving the graph โ a wipe slider for frame sequences
- images_a
- images_b
- images
If you've ever A/B'd two image generations with rgthree's Image Comparer and wished you could do the same for video, this is that node. CompareVideos ("๐ผ๏ธ Compare: videos") takes two sequences of frames and shows them as a wipe preview in the graph: a draggable vertical divider splits the canvas, sequence A on the left, sequence B on the right. It's the answer to the question people actually post - "is there a video compare node, like rgthree's image comparer but for videos?" - and yes, it exists, and it needs nothing else to run.
It's a genuinely useful little thing, because video is where A/B testing is most painful. You render two variants (different checkpoint, LoRA, seed, CFG, motion module - whatever), and your options are flipping between output files or squinting at two separate previews. This puts both in one node so you can drag the divider and watch frame 30 of each side by side. That's the whole job, and it does it with zero dependencies.
How it works
The backend is cheeky: CompareVideos subclasses ComfyUI's built-in PreviewImage, so it's an output node that saves every incoming frame as a PNG (filename prefix temp.compare.) and passes them to the frontend. The real work happens in the node's web/compare_video.js, which loads both sequences into <canvas> and draws them with clipping - left of the divider is A's current frame, right is B's.
Two behaviors, and the difference matters:
- autoplay on (the default): both sequences play in sync at ~30 fps and loop. Playback stops at the shorter sequence's last frame, so if A has 80 frames and B has 49, you only see the first 49 of each.
- autoplay off: the divider doubles as a scrubber. Dragging it horizontally wipes between A and B and advances both to the same frame index in sync. It's one gesture doing two things, which takes a second to get used to but is actually the killer feature - you can sit on frame 61 and inspect the difference.
One quirk worth knowing: despite the schema listing an images IMAGE output, the node returns its UI message rather than a real tensor. Treat it as a terminal preview - wire it to nothing and just read the canvas.
The inputs that matter
Only three, and only two you'll ever touch:
- images_a / images_b (IMAGE, required): batches of frames. These are not video files - feed it the frame tensors a video sampler or frame loader already hands you. Different lengths are fine; playback syncs to the shorter one.
- autoplay (BOOLEAN, default on): flip it off to scrub with the divider instead of letting it play.
Installing it
Plain git clone into custom_nodes, then restart ComfyUI:
cd ComfyUI/custom_nodes
git clone https://github.com/surinder83singh/ComfyUI-compare-videos.git
That's genuinely it. There's no requirements.txt, no model download, no API key - it only uses numpy/PIL and the PreviewImage node that ship with ComfyUI already. ComfyUI Manager's search for "Compare Videos" should also find it if you prefer that route. It'll show up under the preview category as "๐ผ๏ธ Compare: videos".
Where people get tripped up
- You can't feed it a video file. Drop a
.mp4in and nothing happens - it needs IMAGE batches. Most video-model outputs and the VHSLoad Videoโ frames path already produce these. - It spams your output folder. Because it inherits
PreviewImage, every frame gets written out astemp.compare.*.png. If you're rendering 80-frame videos, that's 160 PNGs per run. They're easy to clean up by prefix, but it's worth knowing where they come from. - Autoplay locks the scrubber. If dragging the divider does nothing, check that autoplay is off - while it's playing, mouse-drag is disabled by design.
It's a niche tool from a one-node pack, and it shows its age in a couple of places. But for the specific job of comparing two video generations frame-by-frame inside ComfyUI, it's the closest thing to "just works" you'll find.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| images_a | IMAGE | โ | |
| images_b | IMAGE | โ | |
| autoplayopt | BOOLEAN | true | โ |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| images | IMAGE | โ |