⭐ Star Video Compare
A wipe slider for two videos, plus a stitched clip you can actually send someone
- video_1
- video_2
- video_native_1
- video_native_2
- comparison_video
Why you'd want this
Video work is a comparison business. Pass 1 versus the upscale refine. LoRA on versus off. Original versus a grade. Seed A versus seed B. Two media player windows and a lot of eye-flicking is how most people do it, and eye-flicking is bad at judging motion, texture and flicker.
⭐ Star Video Compare puts a draggable wipe slider right inside the node - two clips synced, drag it back and forth - and it also hands you a single stitched comparison video back out as a wire, so you can save it, compress it, or paste it into a thread to show someone why version B is better.
It's the video sibling of the pack's ⭐ Star Image Compare, from ComfyUI_StarNodes - an unusually broad one-person pack (100+ nodes, v3.0, in ComfyUI Manager since the author's first "tiny helper nodes" drop in late 2024).
What goes in
Four optional inputs, and you use whichever you have:
video_1/video_2- videos as an IMAGE batch (frames), which is what most ComfyUI video nodes hand around.video_native_1/video_native_2- native ComfyUIVIDEOobjects. These are only used when the matching IMAGE input isn't connected; the node decodes them to frames through ffmpeg.
The widgets that matter to a beginner:
layout-left/rightortop/bottomfor the stitched output.max_size- longest side of the stitched video, default 1920, and0means no resize at all. This is the one people forget: at 1920 withleft/right, each half ends up about 960 px wide.fps- drives both the preview playback and the stitched output. Set your save node to the same number or the clip plays at the wrong speed.caption_video1/caption_video2- short labels burned into each half. Worth filling in for anything you're going to share; the bars are sized relative to frame height, so short captions look tidy and long ones get cramped.compare_position- where the slider starts.0.0shows video 2,1.0shows video 1.loop- whether the in-node preview loops.
Output: one IMAGE batch named comparison_video.
How it behaves
Both inputs get normalised first: if the two clips differ in resolution, the smaller is Lanczos-upscaled to the larger's dimensions so the wipe lines up on the same geometry. Then the node writes two small H.264 preview mp4s into ComfyUI's temp folder and sends them to the frontend - that's the slider you drag. The stitched output is built frame by frame in Python: frame counts matched by looping the shorter clip, caption bars drawn if you typed any, halves pasted side by side or stacked, then scaled so its longest side equals max_size. You get one IMAGE batch back.
Wiring the output
comparison_video is an IMAGE batch, not a VIDEO object, so it goes to anything that saves frames: Save WebM, Video Combine, the pack's own ⭐ Star Video Compressor, or a plain Save Image if you just want a still.
This is also an output node in the ComfyUI sense - it runs whether or not anything is plugged in after it. That's convenient: drop it on two branches and just use the slider to judge, never saving a thing. It also means an empty run of this node is normal, not a bug.
Installing
Standard pack install. Manager: search Starnodes → Install → restart. Manual:
cd ComfyUI/custom_nodes
git clone https://github.com/Starnodes2024/ComfyUI_StarNodes
cd ComfyUI_StarNodes
pip install -r requirements.txt
This node's dependency lives in that requirements list: imageio-ffmpeg, which ships a bundled ffmpeg binary. The pack looks for a bundled binary first, then imageio-ffmpeg, then system ffmpeg on your PATH, and if it finds none it says so in a clear error instead of failing mysteriously. You only need ffmpeg for the native VIDEO inputs and the temp preview clips; comparing two IMAGE batches works without it. And a whole-pack note: install.py also pip-installs nvidia-vfx from NVIDIA's index for the RTX super-res node - skip it on non-RTX hardware, nothing here needs it.
Traps worth knowing
Lengths get fudged. If one clip is 3 seconds and the other 6, the short one is looped to fill the timeline - fine for judging an upscale, useless for judging pacing.
Upscaling hides detail differences. Because the smaller clip is enlarged to match, a 720p versus 1080p comparison shows one side blurrier than it really is. For a fair upscale test, compare at matched resolution.
No audio. The decode strips it and the output is frames, so the comparison video is silent by construction. If sound matters, compare the original files.
max_size bites twice. At the default 1920, a side-by-side of two 1080p clips is downscaled to roughly 960 px per side. For a crisp two-up you're sharing, push max_size up or to 0 and let your encoder handle the size. And captions are burnt in with no toggle - leave both empty if you don't want bars.
Inputs (11)
| Name | Type | Default | Description |
|---|---|---|---|
| layout | COMBO | left/right | Orientation of the stitched comparison video output. |
| max_size | INT | 19200–16384 | Longest side of the stitched output video. 0 = no resize. |
| fps | FLOAT | 24.001–240 | Frame rate for the preview playback and the stitched output. |
| loop | BOOLEAN | true | Loop the preview playback. |
| caption_video1 | STRING | Caption for video 1 (left / top half of the stitched output). | |
| caption_video2 | STRING | Caption for video 2 (right / bottom half of the stitched output). | |
| compare_position | FLOAT | 0.500–1 | Initial slider position. 0.0 = Video 2, 1.0 = Video 1. |
| video_1opt | IMAGE | First video as IMAGE batch (frames). | |
| video_2opt | IMAGE | Second video as IMAGE batch (frames). | |
| video_native_1opt | VIDEO | Native ComfyUI VIDEO input for video 1. Used when video_1 is not connected. | |
| video_native_2opt | VIDEO | Native ComfyUI VIDEO input for video 2. Used when video_2 is not connected. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| comparison_video | IMAGE | — |