MAI Video Compare (2-6, synchronized)
2-6 renders, synchronized, in the browser, for zero VRAM
- video_1
- video_2
- video_3
- video_4
- video_5
- video_6
- winner_video
- winner_index
- manifest
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.
Inputs (16)
| Name | Type | Default | Description |
|---|---|---|---|
| winner | INT | 11–6 | set by the viewer's star; which source winner_video passes through |
| preview_crf | INT | 2310–40 | — |
| video_1opt | VIDEO | — | |
| video_2opt | VIDEO | — | |
| video_3opt | VIDEO | — | |
| video_4opt | VIDEO | — | |
| video_5opt | VIDEO | — | |
| video_6opt | VIDEO | — | |
| label_1opt | STRING | — | |
| label_2opt | STRING | — | |
| label_3opt | STRING | — | |
| label_4opt | STRING | — | |
| label_5opt | STRING | — | |
| label_6opt | STRING | — | |
| hold_mapopt | STRING | H3 Time Smear's hold_map_used: the viewer draws the regenerated window as a band and fires enter/exit blips on it | |
| curvesopt | STRING | JSON {name: [per-frame floats]}; drawn as lanes under the playhead |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| winner_video | VIDEO | — |
| winner_index | INT | — |
| manifest | STRING | — |