Extensions/ComfyUI-KM-VideoReview
ComfyUI Extension

ComfyUI-KM-VideoReview

RV-style interactive A/B video review player node for ComfyUI - wipe, side-by-side, difference, frame-accurate transport

By KasunMalinda·Created 27 days ago·Updated 21 days ago· 5
KasunMalinda/ComfyUI-KM-VideoReview
Nodes
On cloudLocal install
Stars5
Updated21 days ago
Readme

VideoReview: RV-style A/B video review inside ComfyUI

An interactive, frame-accurate review player node for professional VFX work, inspired by Autodesk RV. Feed it two image sequences (what every ComfyUI video pipeline produces) and review them with a draggable A/B wipe, real transport controls, and exact frame stepping. No baked-in comparison renders, no <video>-element seek slop: every frame you see is the exact frame, and A/B are synced by construction.

Node: Video Review (A/B)

| Input | Type | Notes | |---|---|---| | images_a | IMAGE | Required. Frame sequence A. | | images_b | IMAGE | Optional. Frame sequence B. Leave unconnected for a single-stream player. | | Base fps | FLOAT | Base playback rate (default 24). The live rate can be changed in the player. | | preview_format | jpeg (low) / webp (mid) / webp lossless (best) | How preview frames are encoded for the browser. jpeg is the default and fastest to load; webp lossless is pixel-exact but slowest. | | quality | INT | For jpeg / webp only. Ignored for webp lossless. | | Playback resolution | 0.25 / 0.5 / 1:1 | Scale the preview frames relative to the source. 1:1 = original; lower = faster load and less memory. |

The node is a pure review sink (like Preview Image) with no outputs.

Player

  • Compare modes: Wipe H, Wipe V, Side by Side, Difference (identical frames ⇒ black), and A/B Flip, a full-frame view with an on-screen A/B button you click to flip between the two streams in place (RV-style, for spotting changes).
  • Wipe: click or drag anywhere in the viewport to place the wipe line.
  • Transport: first · step back · play/pause reverse · play/pause forward · step forward · last. Each play button toggles play↔pause for its direction (and shows ⏸ while playing). Playback-FPS dropdown (4 / 8 / 12 / 24 / 25 / 30 / 48 / 96 + your Base fps), and a fullscreen button. If the node is made narrow the controls wrap to extra rows as three intact groups (transport · scrubber · options).
  • Scrubber: a draggable timeline with frame counter. Click anywhere or drag to seek.
  • Loop button cycles three modes: Once (→, hold at the end) · Loop (↻, wrap) · Bounce (⇄, ping-pong start→end→start). Defaults to Loop.
  • Info panel (collapsible, at the bottom): source resolution (with the playback resolution in brackets) and frame count for A and B, plus base fps and timeline length. Any A/B mismatch is flagged here with a ⚠ warning (visible even when the panel is collapsed).

Exposure / gamma

The 🎨 button opens an adjustment row with Exposure (±6 stops) and gamma sliders plus a reset, applied to the preview pixels on the GPU (WebGL), so riding them never re-runs the workflow. If WebGL is unavailable the sliders are inactive.

Fast encode + progress bar

Frame encoding is threaded across CPU cores, so a ~50-frame clip pair encodes in seconds rather than minutes. Progress is shown two ways: the node's green execution progress bar (like VHS) advances while frames encode, and once the browser starts fetching them a green bar inside the player shows download progress. The transport is usable as soon as the first frames arrive.

Keyboard (click the player first; hotkeys are active only while it has focus)

| Key | Action | |---|---| | / | Step one frame back / forward | | Space | Play / pause | | Home / End | First / last frame | | F | Flip A/B (enters A/B Flip mode) |

Behavior notes

  • Mismatched lengths: timeline spans the longer sequence; the shorter one goes black once past its last frame. Flagged in the Info bar.
  • Mismatched resolutions: A and B are composited at matched heights: both drawn at the same display height (widths follow each aspect), centered and overlaid. Never stretched; empty area is black; resizing the node zooms both together without changing their relative sizes. Both sizes are shown in the Info bar.
  • Preview frames live in ComfyUI's temp directory: they survive browser reloads but are cleared when the ComfyUI server restarts, and the player will ask you to re-run the workflow.
  • Frames are not saved into the workflow JSON.
  • Practical limits: browser memory is the ceiling. A few hundred 1080p frames per stream is comfortable. For 4K sources drop Playback resolution to 0.5/0.25 or use the jpeg preview_format.

Known issues

  • Duplicated workflow tabs can show each other's videos. If you duplicate a workflow tab, the Video Review nodes in both tabs share the same internal node id, and ComfyUI's preview stores are keyed by that id, so running one tab can replace the video shown in the other. The frames on disk are not affected; re-running a tab always brings back its own result. Workaround: instead of duplicating the tab, copy the nodes into a new workflow (or recreate the Video Review node), which assigns fresh ids.

Install

ComfyUI Manager (recommended)

Open Manager → Custom Nodes Manager, search for KM-video review, and click Install. Restart ComfyUI when it finishes.

Manual

cd ComfyUI/custom_nodes
git clone https://github.com/KasunMalinda/ComfyUI-KM-VideoReview.git

Restart ComfyUI.

No extra dependencies. Everything used (numpy, Pillow) already ships with ComfyUI.

Once installed, find the node as Video Review (A/B). Search the node menu for "video review", "compare", or "wipe".

Acknowledgements

This node builds upon concepts from other ComfyUI community projects:

  • rgthree-comfy: its Image Comparer node was the reference for the A/B wipe: compositing two frames on a <canvas> with clipped regions, and drawing the divider line with a difference blend so it stays visible over any content.
  • ComfyUI-VideoHelperSuite (Kosinkadink): the technique for hosting a rich, self-managed DOM player inside a node via addDOMWidget (non-serialized, hideOnZoom off, aspect-driven sizing) comes from its video-preview widget.
  • ComfyUI: the built-in PreviewImage node's temp-directory convention (writing previews under a per-run prefix and serving them as type: "temp") is how this node passes frames to the browser.

Inspired by Autodesk RV. The aim was to bring a bit of that frame-accurate A/B review feel into ComfyUI.

License

MIT. See LICENSE.