Nodes/ComfyUI-MAINodes/MAI Video Compare (2-6, synchronized)
ComfyUI Node

MAI Video Compare (2-6, synchronized)

2-6 renders, synchronized, in the browser, for zero VRAM

By matlowai·Created 17 days ago·Updated about 17 hours ago· 112
MAI Video Compare (2-6, synchronized)
  • video_1
  • video_2
  • video_3
  • video_4
  • video_5
  • video_6
  • winner_video
  • winner_index
  • manifest
winner1
preview_crf23
label_1
label_2
label_3
label_4
label_5
label_6
hold_map
curves

The hardest part of video generation isn't generating - it's deciding. Two renders come out different; which one wins? Staring at them one at a time doesn't work, your memory is lying, and loading all of them decoded eats your VRAM. MAI Video Compare is the pack's answer: wire 2-6 renders in as VIDEO, queue once, and get a browser widget where every source plays synchronized - flip, wipe, or side-by-side for a pair, a synchronized grid for more.

The workflow it gives you

The widget is a proper little review surface. Hover a source to hear it, click to lock its audio there. Space plays and pauses everything; the arrows step one frame (shift steps 12); F flickers A against B. All sources stay on the lead's clock, so you're comparing the same instant across every take, not six clips drifting apart.

Loop brackets are always live: i and o set them from the playhead (or drag the tabs), which is how you watch one seam fifty times without touching anything. And because this pack's whole reason to exist is de-roping fast motion, the viewer speaks hold maps: wire H3 Time Smear's hold_map_used into hold_map and the regenerated window draws as a band with enter/exit blips as the playhead crosses it. curves takes a JSON {name: [per-frame floats]} and draws each as a lane - handy if you're comparing jerk or timing profiles.

When you've decided, star the keeper. That sets the winner widget (1-6); the next queue passes that source through winner_video and winner_index. Pick, then finalize in a second execution - a graph never blocks waiting for a human mid-run.

Why it costs no VRAM

Each wired VIDEO is written once to the temp dir as a small h264 preview - CPU encode, no VAE, no tensors kept - and the browser does the decoding. preview_crf (default 23) trades preview quality against size. That's the load-bearing trick: comparing renders should never have to fight the same card that made them.

The honest caveats

It's alpha, and the sync is approximate - playback can drift or stagger between sources, and scrubbing during playback can wedge the transport (re-queue or reload recovers). The pack says outright that its standalone tools/compare_deck pages are the reliable frame-exact review surface today; this is the fast triage inside ComfyUI. For picking a keeper from a batch, that's a fair trade.

Install is the pack-wide clone (GPL-3.0, matlowai, no Python deps):

cd ComfyUI/custom_nodes
git clone https://github.com/matlowai/ComfyUI-MAINodes

Restart, and it's under image/minimax/video. Wire at least two videos or it will yell at you - and remember H3's weights are licence-geofenced out of the US, EU, UK and Korea, so comparing renders of it presumes you're somewhere you can run it.

Categoryimage/minimax/video

Inputs (16)

NameTypeDefaultDescription
winnerINT11–6set by the viewer's star; which source winner_video passes through
preview_crfINT2310–40
video_1optVIDEO
video_2optVIDEO
video_3optVIDEO
video_4optVIDEO
video_5optVIDEO
video_6optVIDEO
label_1optSTRING
label_2optSTRING
label_3optSTRING
label_4optSTRING
label_5optSTRING
label_6optSTRING
hold_mapoptSTRINGH3 Time Smear's hold_map_used: the viewer draws the regenerated window as a band and fires enter/exit blips on it
curvesoptSTRINGJSON {name: [per-frame floats]}; drawn as lanes under the playhead

Outputs (3)

NameTypeDescription
winner_videoVIDEO
winner_indexINT
manifestSTRING