IC-Light Video (Frame by Frame)
IC-Light Video (Frame by Frame)
- images
- model
- positive
- negative
- vae
- sampler
- sigmas
- latent_image
- opt_background
- images
The name is doing honest work. IC-Light Video (Frame by Frame) takes a batch of frames - say, a loaded video - runs IC-Light's relighting on every single frame, and hands you back a fresh image stack you can wire straight into a VideoCombine node. It's not cleverer than that, but it doesn't need to be. Without it, relighting a clip means building the same encode → condition → sample → decode chain once per frame, and this node collapses all of that into one box.
A quick refresh on the model underneath, because it matters for everything else here. IC-Light is lllyasviel's SD 1.5 relighting model: you give it a subject and a lighting description, and it re-lights the image and the background that lighting implies, while leaving the subject's material and structure alone. Its code has been frozen since a day after release in May 2024, and it's still the right answer for one narrow job - relighting where details must survive. This pack is a fork of kijai's standard ComfyUI-IC-Light with exactly one node added on top, and the whole rest of the pack is kijai's machinery.
How it works
For every frame the node VAE-encodes it, builds IC-Light's conditioning (the foreground latent concatenated into the sampler at a multiplier), runs a custom-sampler pass, and decodes back to an image. All the fiddly parts - the 8-channel UNet patch, the concat-latent conditioning, the extra_conds handling - are the same kijai implementation, just looped over your frames. You don't build that graph; you feed the node its pieces and it grinds through the clip.
The required inputs are exactly what a kijai-style IC-Light workflow would need: images (your frames), model (an SD 1.5 checkpoint with the pack's Load And Apply IC-Light node applied - IC-Light refuses anything that isn't SD 1.5), positive and negative conditioning (describe the light: "sunset over sea, warm light from the right"), vae, and the sampler + sigmas pair from a scheduler node.
The optional inputs worth actually touching:
start,stop,step- the frame slicer.startdefaults to 1 and is 1-indexed, so frame 1 is your first frame.stopleft at 0 means all frames; set it to 8 and it processes frames 1–8 inclusively.stepskips frames if you only want every Nth one.cfg(default 8.0),noise_seed,add_noise- the sampling knobs, same as you'd set on a KSampler.multiplier(default 0.18215) - the IC-Light conditioning strength, same default kijai uses. Dial it down and the relight gets subtler.latent_image- plug a latent in if you want the sampler to start from something other than the empty one.opt_background- only valid with thefbcmodel variant (the one conditioned on a background image), and even then the KB's warning stands:fbcbleeds background color into the subject, sofcusually composites better.
The output is a single images tensor with every processed frame concatenated - that's your feed for VideoCombine from VideoHelperSuite.
Installing it
ComfyUI Manager is the easy route: search "IC-Light" (or "IC-Light-Video") and install. Manual:
cd ComfyUI/custom_nodes
git clone https://github.com/Polygoningenieur/ComfyUI-IC-Light-Video
then restart ComfyUI. The only real dependency is opencv-python; Manager sorts it out. Grab the models through Manager (search "IC-light", they land in ComfyUI/models/unet/IC-Light) or download iclight_sd15_fc.safetensors (the default), fcon (when fc washes out your darks), or fbc from lllyasviel/ic-light on HuggingFace into models/unet. One real gotcha: don't install this alongside kijai's ComfyUI-IC-Light - the README says only one is needed, and since they share the other node classes you'll get duplicate registration.
The honest take on video
Here's the part nobody advertises: each frame relights independently, so your output flickers exactly as much as IC-Light's frame-to-frame consistency allows - and the KB's verdict is blunt that video was never really solved with IC-Light, because temporal consistency was always the blocker. This node is the convenient version of that 2024-era approach, and the convenience is real. Reach for it on short clips or static-ish shots, and plan a deflicker/denoise pass afterward.
Two more things to know. First, if every frame errors (wrong model, bad conditioning), the node doesn't crash - it silently returns your original frames, so watch the console log for "Error" lines or you'll think the relight just wasn't strong enough. Second, expect the warm skin-tone shift on people; the pack's Detail Transfer node is a frequency-separation blend, which is the standard fix - take lighting from the relight, detail from the original.
Inputs (16)
| Name | Type | Default | Description |
|---|---|---|---|
| images | IMAGE | Multiple Images | |
| model | MODEL | IC-Light model | |
| positive | CONDITIONING | — | |
| negative | CONDITIONING | — | |
| vae | VAE | — | |
| sampler | SAMPLER | — | |
| sigmas | SIGMAS | — | |
| latent_imageopt | LATENT | Plug in a latent image for the sampler, otherwise an empty latent is used. | |
| opt_backgroundopt | LATENT | — | |
| startopt | INT | 11–18446744073709550000 | Frame to start at. |
| stopopt | INT | 00–18446744073709550000 | Frame to stop at. Leave at 0 to use all frames. |
| stepopt | INT | 11–18446744073709550000 | How much frames to step over each iteration. |
| multiplieropt | FLOAT | 0.1820–1 | Conditioning Multiplier |
| add_noiseopt | BOOLEAN | true | Add noise to sampler. |
| noise_seedopt | INT | 00–18446744073709550000 | Sampling Noise Seed |
| cfgopt | FLOAT | 8.00–100 | Sampling cfg |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| images | IMAGE | — |