Nodes/ComfyUI-KM-VideoReview/Video Review (A/B)
ComfyUI Node

Video Review (A/B)

Actually watching your video generations, instead of squinting at frames

By KasunMalinda·Created 29 days ago·Updated 23 days ago· 5
Video Review (A/B)
  • images_a
  • images_b
    Base fps24
    preview_formatjpeg (low quality)
    quality90
    Playback resolution1:1

    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 temp dir - 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 resolution 0.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.

    Categoryimage/video

    Inputs (6)

    NameTypeDefaultDescription
    images_aIMAGE
    images_boptIMAGE
    Base fpsoptFLOAT241–120Base playback rate of the review player (the live rate can be changed in the player).
    preview_formatoptCOMBOjpeg (low quality)How preview frames are encoded for the browser. jpeg is fastest to load; webp lossless is pixel-exact but slowest.
    qualityoptINT901–100Encode quality for jpeg / webp. Ignored for webp lossless.
    Playback resolutionoptCOMBO1:1Scale the preview frames relative to the source. Lower = faster load and less memory.

    Outputs (0)

    No outputs