AD_Video_color_grad
Grade a video on a timeline without ever touching a latent
- video
- video
Most of the color work you do in ComfyUI is on stills, and most of the video color work people attempt happens by re-sampling - changing a prompt and hoping the model re-renders it warmer. AD_Video_color_grad is the grown-up version of neither: it's a real color-grading pass that runs on your decoded video, so it needs no latent and no VAE, and it keeps the audio track intact. The pack's own description sums it up: drag-select a range on a track, adjust brightness and color or let it smooth automatically, and the full video with audio comes out the other side.
The node ships its own editor widget. Run it once and the body of the node becomes a viewer with a timeline track underneath: two handles let you drag out the frame range you want to affect, a playhead scrubs the clip, and the sliders - strength, exposure, saturation, temperature - live-update the current frame so you can see the grade before committing. The range you drag gets written into the selection field as a JSON string of {start, end, reference} frame numbers. In normal use you never type that by hand; the widget owns it.
The three modes
Three modes, and they're quite different animals:
manual- your classic exposure/saturation/temperature adjustment applied across the selected range.exposureruns −4 to +4,saturation0–2,temperature−1 to +1 (negative cools, positive warms). This is the "this shot is underexposed and a bit green" fix.brightness_smooth- the interesting one. Instead of you dialing values, the node analyzes the brightness of frames in the selection and their immediate neighbours, builds a smooth target curve, and re-grades toward it. It's an automatic flicker/fluctuation smoother for a clip where lighting pulses or a moving light keeps changing exposure.strengthgoes to 3.0 here, unlike the other modes' 1.0 ceiling - it's the master dial for how hard the smoothing pushes.reference_match- match the selected frames' color profile to a singlereferenceframe (which defaults to the frame just before your selection starts). This is the "make the cut not look like a cut" tool: white-balance the new segment to the frame the viewer's eye is still holding.
How it works
Under the hood it reads the video's components, grades only start–end frame-by-frame (manual pushes are uniform; the smooth modes build luma and color tone curves across the range), and hands the result back as a new VIDEO with the original audio and frame rate untouched - the source frame count, fps and audio all carry over, so nothing downstream drifts out of sync. It's an output node, so it also posts a before/after preview pair back to the widget.
Gotchas
Gotchas worth knowing before you blame it:
- The output is a new video. If
strengthis 0 and nothing else changed, you get a no-op copy - harmless but pointless. - It operates on the
VIDEOobject, so whatever you feed it has to already be decoded pixels. In the H3/flow workflows this pack pushes, that usually means thesegment_videooutput of a sampler or the merge from aView_bridge_tentor. It will happily grade a Wan or any other clip too - it does not care what model made the video. - Corrupt or empty
selectionJSON raises a "invalid timeline selection" error rather than silently grading everything. If you hand-type the field,start/end/referenceare the only keys it accepts.
Installing it
Install is the pack install:
git clone https://github.com/cardenluo/ComfyUI-Apt_Preset.git
then run install.bat inside the folder and restart ComfyUI. The editor does need the pack's frontend files, so a plain backend install won't show the track - which is the usual reason people report "the widget's empty," and the fix is a hard refresh plus confirming the web folder is being served.
Is it a full color suite? No. It won't do curves per channel or real scopes, and if you're serious about looks you'll still export to Resolve or DaVinci-grade in an external app. But for the 90% case - matching two generated segments so a multi-stage video doesn't visibly change color at the seams - it's exactly the node you reach for, and it keeps the whole job inside the graph.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| video | VIDEO | — | |
| mode | COMBO | manual | 3 options: manual, brightness_smooth, reference_match |
| strength | FLOAT | 1.000–3 | — |
| exposure | FLOAT | 0.00-4–4 | — |
| saturation | FLOAT | 1.000–2 | — |
| temperature | FLOAT | 0.00-1–1 | — |
| selection | STRING | {} | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| video | VIDEO | — |