Video Comparer — Player + Wipe/Diff/Scopes
A/B video comparison that doesn't need a queue — wipe, diff, scopes, in-browser
- image_a
- image_b
- audio_a
- audio_b
- preview
- diff_mask
- scope
- info
Comparing two videos in ComfyUI has historically meant saving both, opening them in two players, and scrubbing back and forth by hand. VideoComparerC2C kills that workflow: it's an in-graph A/B comparer that plays two videos side by side on a shared transport, and its overlay modes - wipe, onion, diff, false color, scopes - render live in the browser without queueing the graph. That last part is the killer feature and the reason this node is worth seeking out inside the ComfyUI-CustomNodePacks pack.
Think of it as a mini Nuke-grade viewer. The author's framing is exactly that: a comparer for image, video, EXR, and audio, with a synced_player as the default so new users land on something that actually plays instead of a static canvas.
How it works
The node takes two sources (image_a/image_b, or file_a/file_b for loading media directly, plus optional audio_a/audio_b) and a mode dropdown that switches the viewer:
synced_player- dual<video>elements share one transport: play/pause, seek, frame-step ◀1f / 1f▶, in/out points, loop, playback rate, live FPS. Frame-perfect viarequestVideoFrameCallback. This is your default for real A/B review.- Overlay modes -
wipe(drag the canvas to move the split),onion,diff(withdiff_gain,diff_gamma,diff_threshold,diff_modefor absolute/signed/luminance),side_by_side,per_channel,false_color(choose a LUT: viridis, turbo, hot, etc.),bit_depth_crush(quantize to 8/10/12/16/32-bit to spot banding). - Scope modes (queue-time) -
waveform_scope,parade_scope,vectorscope,histogram_scope, plus audio waveform/spectrogram/loudness.
The live overlay modes are the part to remember: they're computed in the browser on the frames you've already loaded, so scrubbing a wipe or a diff costs zero queue time. The scope modes and audio analysis need a queue pass to compute.
Inputs and outputs that matter
image_a/image_b(IMAGE) - the two sides.file_a/file_b- load media directly from disk (populated from your input folders).mode- the viewer mode described above.wipe_position,onion_alpha,diff_gain,false_color_lut, etc. - per-mode tuning; only the relevant ones matter in each mode.label_a/label_b- on-screen labels, default "A"/"B".
Outputs (it's an output node, so it terminates a branch): preview (IMAGE), diff_mask (MASK), scope (IMAGE), and info (STRING). The diff_mask output is the sleeper: in diff modes you get an actual mask of where the two videos differ, which you can feed downstream - a change detector without building one.
Where it fits
Any before/after review loop: inpaint seam QA, model/sampler A/B sweeps, stabilization before/after, video-to-video comparisons. If you generate iterations of a clip, this is the node that makes "which one is better" a ten-second answer instead of a side-by-side-window chore.
Installing it
Standard pack install:
cd ComfyUI/custom_nodes
git clone https://github.com/Code2Collapse/ComfyUI-CustomNodePacks.git
restart ComfyUI or use Manager → "CustomNodePacks". The live browser modes need no extra dependencies; the audio/scopes features pull in whatever the pack already requires (ffmpeg/audio handling is part of the pack's stack).
The honest note
The synced-player and wipe modes are where this node shines and are worth upgrading your workflow for; the scope modes are more "nice to have" - fine for a quick waveform check, not a replacement for a real scopes tool. And since live modes don't queue, remember to run a queue pass if you need the diff_mask or scope outputs actually populated. Give the player a minute - it's the part people stick with.
Inputs (19)
| Name | Type | Default | Description |
|---|---|---|---|
| mode | COMBO | synced_player | synced_player: dual <video> player with shared transport — play, pause, seek, frame-step (◀ 1f / 1f ▶), in/out points, loop, playback rate. Use this for real-time A/B comparison of two videos. Switch to wipe / onion / diff / side_by_side / false_color / bit_depth_crush for overlay analysis. |
| bit_depth | COMBO | 32 | Quantization for bit_depth_crush mode. |
| wipe_position | FLOAT | 0.500–1 | — |
| onion_alpha | FLOAT | 0.500–1 | — |
| diff_gain | FLOAT | 161–1024 | — |
| diff_gamma | FLOAT | 1.000.1–4 | — |
| diff_threshold | FLOAT | 0.0000–0.5 | — |
| diff_mode | COMBO | absolute | 3 options: absolute, signed, luminance |
| false_color_lut | COMBO | turbo | 7 options: viridis, plasma, inferno, magma, turbo, hot, +1 |
| scope_intensity | FLOAT | 0.350.05–1 | — |
| frame_index | INT | 00–100000 | — |
| label_a | STRING | A | — |
| label_b | STRING | B | — |
| image_aopt | IMAGE | — | |
| image_bopt | IMAGE | — | |
| audio_aopt | AUDIO | — | |
| audio_bopt | AUDIO | — | |
| file_aopt | COMBO | 2 options: , example.png | |
| file_bopt | COMBO | 2 options: , example.png |
Outputs (4)
| Name | Type | Description |
|---|---|---|
| preview | IMAGE | — |
| diff_mask | MASK | — |
| scope | IMAGE | — |
| info | STRING | — |