😺NKD Video Viewer
A video player that actually scrubs
- images
- audio
- reference
- video
- filepath
The core preview lies to you
ComfyUI's built-in SaveVideo hands the browser a bare <video> element, and Video Helper Suite - the usual fix - transcodes every preview into a streaming WebM without Range support, which is exactly why its preview can't really be scrubbed. NKD Video Viewer, from Nekodificador's NKD Preview Tools, fixes the actual problem: it encodes once, serves the raw file, and lets the browser seek natively. Frame-accurate stepping, a filmstrip along the scrub bar so you can find a shot by looking at it, J/K/L shuttling, loop and pingpong, fullscreen with the controls still there, and a float-to-second-monitor mode. It's the "actually review your render" node.
How it encodes
Everything goes through PyAV, which is already a hard dependency of core ComfyUI - so this pack adds zero Python packages. The format input is a DynamicCombo with six options, and only the settings of the format you picked are shown: mp4/h264 (CRF + preset), webm/vp9, mov/ProRes (the editing codec - big files, no generation loss, and 4444 is the one that keeps an alpha channel), GIF (colors/dither), animated WebP, and a PNG image sequence. The encoded file is served raw through ComfyUI's /view endpoint with HTTP Range support, so the <video> seeks natively instead of approximating.
The inputs that matter
media(theimagessocket) - an IMAGE batch, a MASK, or a VIDEO to re-encode.audiooptionally overrides the video's own track.formatand its per-format knobs - the only quality controls you'll touch day to day.filename_prefix- where it lands and what it's called. Tokens:%project%and%category%(picked in the chip on this node - one click moves every NKD node in the graph),%node%(the node's TITLE, so rename the node toSH010_compand it lands there),%v###%,%res%,%fps%,%frames%,%duration%,%format%,%codec%,%time:HH-mm-ss%. Tokens work in the folder part too.versioning-autotakes the next unused_v001in the target folder;manualuses theversionfield and overwrites. Key detail: changing the version does NOT re-render - the render is cached on tensor identity, so a version bump is instant.reference- the "before" for an A/B compare. Wire a video, batch or mask and wipe between the render and the reference, look at the difference, or hold B to see the reference whole. One button makes whatever is on screen the reference for the next run.
Outputs: video (the encoded file as a VIDEO value) and filepath (the STRING path - handy for feeding other nodes or just knowing where it went).
Install
Same pack, same story - no models, no deps:
cd ComfyUI/custom_nodes
git clone https://github.com/Nekodificador/ComfyUI-NKD-Preview-Tools
Or via Manager (search "NKD Preview Tools"), restart, and it's under 😺NKD Nodes/Preview.
Where people trip
Pick ProRes for delivery to Nuke or Resolve, not for what you watch in the browser - no browser plays ProRes, so review in mp4/webm and export the ProRes for the edit. And don't expect auto versioning to stamp a fresh file on every queue: ComfyUI's cache short-circuits identical renders, which is exactly why version forcing routes through manual. save_output off writes to temp/ when you just want a look and no files.
Inputs (14)
| Name | Type | Default | Description |
|---|---|---|---|
| fps | FLOAT | 24.000.01–1000 | — |
| pingpong | BOOLEAN | false | Play forward then backward, for a seamless loop. |
| format | COMBO | 6 options: [object Object], [object Object], [object Object], [object Object], [object Object], [object Object] | |
| filename_prefix | STRING | %project%/%category%/ | Relative to output/. Tokens: %project% and %category% (the active ones, picked in the chip on this node — one click moves every NKD node in the graph), %node% (this node's TITLE — rename the node to SH010_comp and it lands there), %v###% (version, one digit per hash), %res%, %fps%, %frames%, %duration%, %format%, %codec%, %time:HH-mm-ss%, plus ComfyUI's own %date:yyyy-MM-dd% and %Node title.widget%. Tokens work in the folder part too. |
| versioning | COMBO | auto (next free) | Adds _v001 to the name — no need to type %v###% yourself; spell the token out only to place it elsewhere (a folder) or pad it differently. `auto` takes the next unused version in the target folder. Turning this on also drops ComfyUI's _0001_ counter, which would number the same thing twice. Note that a cached graph does not re-run, so it makes no new version — the render would be identical; use `manual` to force one (and it overwrites, like re-rendering a version in Nuke). |
| version | INT | 11–99999 | Used when versioning is `manual`. |
| numbering | COMBO | counter | `counter` is ComfyUI's _0001_ suffix. `none` gives a clean name - what you want once the version is carrying the uniqueness. |
| filename | STRING | NKD | Split the name from the folder: leave this EMPTY and filename_prefix keeps carrying both, exactly as before. Fill it in and filename_prefix becomes the folder only — so you can keep %project%/%category% up there and change how files are named down here without ever touching the project's directory. Same tokens work in both. |
| labels | STRING | — | |
| save_output | BOOLEAN | true | Off writes the render to temp/ — a preview you can discard. |
| labeled_copy | BOOLEAN | true | Also write <name>_labeled.mp4 with the tracked widget values burned in. Off keeps the marks but skips the file. With save output off, the labeled copy still goes to output/ — in a test run it is the file worth keeping. |
| imagesopt | IMAGE,MASK,VIDEO | What to encode: an IMAGE batch, a MASK, or a VIDEO to re-encode. | |
| audioopt | AUDIO | Overrides the audio carried by `video`. | |
| referenceopt | IMAGE,MASK,VIDEO | The 'before' for the A/B compare - a video, a batch of frames or a mask. Wiring it beats the global NKD Reference slot: a connection is a statement, the slot is whatever ran last. |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| video | VIDEO | — |
| filepath | STRING | — |