Video Scopes
The colorist's instruments, one frame at a time
- video
- image
Your monitor lies to you. Exposure and color judgment need instruments, not eyeballs, and that's what scopes are - the same waveform, parade, and vectorscope displays colorists live on. Video Scopes gives you those instruments inside ComfyTV, rendering one from a frame of your clip as a COMFYTV_IMAGE.
What it does
It samples a single frame of a COMFYTV_VIDEO, runs it through the corresponding FFmpeg scope filter, and outputs the scope as an image snapshot. scope picks the instrument:
- waveform (default) - luma waveform with graticule, for spotting clipping highlights and crushed shadows.
- waveform_parade - RGB parade, channels side by side; the fastest way to see a color cast.
- vectorscope - hue/saturation distribution with named targets; where you check skin-tone alignment.
- histogram - tonal distribution.
- cie - CIE chromaticity scope (HDTV gamut, white point shown) for gamut coverage.
at_seconds picks which frame to measure - -1 (default) means the middle of the clip; any other value 0–3600 targets a specific timestamp. Set it to check the blown window at 0:42 or the skin tone at the close-up.
Output is a single image (COMFYTV_IMAGE). It scopes one still, not the whole clip - if exposure changes across the shot, sample a few timestamps.
Why you'd actually use this
If you grade in ComfyTV's Video Color / Curves / LUT stages, scopes are your QC loop: check the waveform for clipping, then pull highlights down until the trace clears the top. The classic beginner move is trusting the preview, blowing highlights, and only noticing on export - scopes catch it in the edit. The docs' practical tips: waveform_parade for a cast, vectorscope for skin tones along the I-line.
Install and quirks
Pack-standard: git clone https://github.com/jtydhr88/ComfyTV into ComfyUI/custom_nodes, restart, under ComfyTV → Video. No models - this is PyAV media analysis, no GPU involved.
- at_seconds at -1 measures the middle - that's by design, and it's the right default for a general check.
- The scope image won't wire into a normal ComfyUI node - it's a
COMFYTV_IMAGEsnapshot; Bridge it if you need a tensor. - Scope looks empty or wrong at -1 - some clips are short; pick an explicit timestamp instead.
One honest note: it's scope rendering, not scope analysis - you read the result with your eyes. For that job it's fast, free of models, and infinitely better than guessing.
Inputs (6)
| Name | Type | Default | Description |
|---|---|---|---|
| force_run_token | INT | 00–2147483647 | Internal — bumped on Run to invalidate ComfyUI's input cache. |
| project_id | STRING | Internal — populated by the projectStore on the frontend. | |
| parent_output_id | INT | 00–2147483647 | Internal — lineage parent set by spawn handlers on the frontend. |
| scope | COMBO | waveform | 5 options: waveform, waveform_parade, vectorscope, histogram, cie |
| at_seconds | FLOAT | -1.00-1–3600 | -1 = middle of the clip |
| videoopt | COMFYTV_VIDEO | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| image | COMFYTV_IMAGE | — |