Nodes/NKD Preview Tools/😺NKD Video Viewer
ComfyUI Node

😺NKD Video Viewer

A video player that actually scrubs

By Nekodificador·Created 5 months ago·Updated 4 days ago· 41
😺NKD Video Viewer
  • images
  • audio
  • reference
  • video
  • filepath
fps24.00
pingpongfalse
format
filename_prefix%project%/%category%/
versioningauto (next free)
version1
numberingcounter
filenameNKD
labels
save_outputtrue
labeled_copytrue

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 (the images socket) - an IMAGE batch, a MASK, or a VIDEO to re-encode. audio optionally overrides the video's own track.
  • format and 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 to SH010_comp and it lands there), %v###%, %res%, %fps%, %frames%, %duration%, %format%, %codec%, %time:HH-mm-ss%. Tokens work in the folder part too.
  • versioning - auto takes the next unused _v001 in the target folder; manual uses the version field 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.

Category😺NKD Nodes/Preview

Inputs (14)

NameTypeDefaultDescription
fpsFLOAT24.000.01–1000
pingpongBOOLEANfalsePlay forward then backward, for a seamless loop.
formatCOMBO6 options: [object Object], [object Object], [object Object], [object Object], [object Object], [object Object]
filename_prefixSTRING%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.
versioningCOMBOauto (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).
versionINT11–99999Used when versioning is `manual`.
numberingCOMBOcounter`counter` is ComfyUI's _0001_ suffix. `none` gives a clean name - what you want once the version is carrying the uniqueness.
filenameSTRINGNKDSplit 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.
labelsSTRING
save_outputBOOLEANtrueOff writes the render to temp/ — a preview you can discard.
labeled_copyBOOLEANtrueAlso 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.
imagesoptIMAGE,MASK,VIDEOWhat to encode: an IMAGE batch, a MASK, or a VIDEO to re-encode.
audiooptAUDIOOverrides the audio carried by `video`.
referenceoptIMAGE,MASK,VIDEOThe '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)

NameTypeDescription
videoVIDEO
filepathSTRING