Media Extractor (Purz)
Grab a video frame without the frame math
- image
Extracting a frame from a video is normally a "type in the frame number, run, squint, adjust, rerun" loop. PurzMediaExtractor replaces it with a video player: load a local video, scrub or hit play, pause on the frame you want, and the node hands you that frame as an IMAGE. First/last buttons, per-frame scrubbing, playback controls - it's the "load video, pick a frame" node that ComfyUI never shipped.
It's from ComfyUI-Purz's Purz/Interactive family, by PurzBeats (a Comfy Org staffer). And here's the genuinely interesting part: the video file never touches your server.
How it works
This is the client-side variant ("Path A" in the README's terms). When you load a video, it's wrapped in a blob URL in your browser and stays there - nothing gets uploaded when you pick it. The node plays it in a preview widget with Play/Pause that drives the scrubber (via requestVideoFrameCallback, so updates are per-frame rather than throttled). When you pause or release the scrubber, the browser encodes that single frame as a PNG and sends only that tiny image to the backend, where it's cached against the node's id. On execution, the backend decodes the cached frame and returns it as an IMAGE - [1, H, W, 3], one image, ready to wire into anything.
That design has a real privacy-and-bandwidth payoff: a 2GB video never leaves your machine. Only the frame you chose crosses the wire.
What you set
The node takes no graph inputs - the controls live in the widget UI, keyed to the node's unique_id. What you interact with: the Load button (pick your local video), Play/Pause, First/Last, and the scrubber.
The single output is image, type IMAGE, the exact frame you paused on. That's a natural input to img2img, a controlnet preprocessor, or the pack's own Interactive Filter.
Installing it
ComfyUI Manager - search ComfyUI-Purz - or:
cd ComfyUI/custom_nodes/
git clone https://github.com/purzbeats/ComfyUI-Purz.git
cd ComfyUI-Purz
pip install -r requirements.txt
Restart ComfyUI. Requirements are OpenCV, Pillow, torch, numpy - the client-side approach means almost no server-side processing, so nothing heavy to install and no models.
Where people get burned
The flip side of "the file never leaves your browser" is that state doesn't survive a refresh - reload the page and you've lost your loaded video (and your chosen frame). If you're building a workflow you'll come back to, use Media Extractor Upload (Purz) instead, which stores the video in ComfyUI's input/ directory and persists across reloads. Also worth knowing: because the frame lives in a browser-side cache, the node always re-executes (its IS_CHANGED returns NaN) to pick up the latest selection - that's normal, not a bug, but it means every queue picks up your current frame.
Inputs (0)
No inputs
Outputs (1)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |