Video Review (A/B)
Actually watching your video generations, instead of squinting at frames
- images_a
- images_b
The name is accurate for once: Video Review (A/B) is the closest thing ComfyUI has to an Autodesk RV-style review player, and if you've ever run two video generations and tried to tell which one was better, you already know the pain it exists to kill. Every video pipeline in ComfyUI - Wan, AnimateDiff, all of it - outputs an image sequence, and until this node showed up your options for comparing two runs were render a side-by-side video, screenshot every third frame, or memorize. That's absurd for a tool you use all day. This is the "just make it reviewable" node.
Think of it as rgthree's Image Comparer (the wipe slider in rgthree-comfy, which the author openly credits) grown up into a video player. The still-image equivalent is a solved problem; sequences were not.
How it works
Video Review is a pure sink - an output node with zero outputs, exactly like Preview Image. Feed it frames and it does one job: show them to you properly. Under the hood it follows the built-in PreviewImage convention: frames are encoded and written to ComfyUI's temp directory, then served to a rich DOM player the node mounts via addDOMWidget (the same trick VideoHelperSuite uses for its video preview widget). A/B are composited on a <canvas> with clipped regions, which is how the wipe stays smooth and the divider line stays visible over any content.
Two engineering details are worth knowing. Encoding runs through a thread pool across your CPU cores, so a ~50-frame pair encodes in seconds, and the node's green progress bar tells you it's working. And each run gets a fresh id, so re-running never overwrites frames the browser is still fetching.
The inputs that matter
Only one input is required, and the rest have sane defaults:
images_a(required, IMAGE) - your first frame sequence. Wire anything that outputs IMAGE batches into it.images_b(optional, IMAGE) - the second stream. Leave it unconnected and you get a plain single-stream player, which is honestly useful on its own.Base fps- playback rate, default 24. Purely a starting point; the player has its own FPS dropdown and once you touch that, it wins.preview_format- jpeg (default, fastest), webp (mid), or webp lossless (pixel-exact but slowest). Change it only if you're actually color-checking frames.Playback resolution- 1:1, 0.5, or 0.25. Drop this for 4K sources; browser memory is the real ceiling here.
The player is the point
This is where the RV inspiration shows. You get Wipe H/V, Side by Side, Difference (identical frames go black - instant artifact spotting), and A/B Flip, a full-frame mode with an on-screen button to flip between streams in place. Transport buttons, a draggable scrubber with frame counter, three loop modes (once/loop/bounce), and keyboard controls once the player has focus: ←/→ to step, Space to play, F to flip A/B. There's even an exposure/gamma adjustment applied on the GPU via WebGL - ride it without re-running the workflow.
Install
ComfyUI Manager: Manager → Custom Nodes Manager, search "KM-video review", install, restart. Or manually:
cd ComfyUI/custom_nodes
git clone https://github.com/KasunMalinda/ComfyUI-KM-VideoReview.git
Then restart ComfyUI. That's the entire install: the pyproject lists dependencies = [], and everything it uses (numpy, Pillow) ships with ComfyUI already. No model downloads, no API keys, no ffmpeg gotchas. Find it in the node menu as Video Review (A/B), or search "wipe", "compare", or "rv".
Gotchas
- Temp frames die on server restart. The previews live in ComfyUI's
tempdir - they survive a browser reload but not a ComfyUI restart, which will ask you to re-run the workflow. Expected, not a bug. - Don't duplicate the workflow tab. It's a documented bug: duplicated tabs share the internal node id, and one tab's run can replace the other's video. Copy the nodes into a new workflow instead of duplicating the tab.
- Mismatched lengths/resolutions are handled, not errors. The timeline spans the longer sequence and the shorter one goes black past its last frame; differing resolutions get matched by height and centered. Both get flagged with a ⚠ in the info bar, which is what you actually want to check before judging a comparison.
- Big 4K batches will hit browser memory. That's what
Playback resolution0.5/0.25 exists for. A few hundred 1080p frames per stream is comfortable.
If you generate video regularly, this is the node you'll forget you installed until the day you need it - and then you'll wonder how you ever compared runs before.
Inputs (6)
| Name | Type | Default | Description |
|---|---|---|---|
| images_a | IMAGE | — | |
| images_bopt | IMAGE | — | |
| Base fpsopt | FLOAT | 241–120 | Base playback rate of the review player (the live rate can be changed in the player). |
| preview_formatopt | COMBO | jpeg (low quality) | How preview frames are encoded for the browser. jpeg is fastest to load; webp lossless is pixel-exact but slowest. |
| qualityopt | INT | 901–100 | Encode quality for jpeg / webp. Ignored for webp lossless. |
| Playback resolutionopt | COMBO | 1:1 | Scale the preview frames relative to the source. Lower = faster load and less memory. |
Outputs (0)
No outputs