Video Interpolate Sampler
Morph video A into video B — the sampler that actually morphs
- model
- positive_A
- positive_B
- negative
- latents_A
- latents_B
- wave_config
- vae
- latent_batch
You've got video A, you've got video B, and you want the content of one to become the content of the other - not a hard cut, not a transparency crossfade, but an actual morph where the model hallucinates the in-between states. That's the whole job of Video Interpolate Sampler, and it does it by leaning on a wave-shaped denoise ramp: calm at the edges of the transition, most aggressive in the middle, where the two videos are genuinely fighting for control.
How it works
Feed it both videos as latents and both prompt conditionings (positive_A and positive_B), plus the wave_config from the Interpolation Wave Controller. Inside the overlap zone the sampler does two things per frame: crossfades the conditioning between A and B (weighted concatenation of the two prompt embeddings), and sets the denoise level from the bell curve - low at the entry and exit, peaking mid-morph. More denoise mid-transition means the model actually re-imagines the frame rather than just blending pixels, which is what produces a morph instead of a dissolve.
It also consumes the wave-integrated extras. If you've chained Wave ControlNet Apply onto a stream, the sampler can apply stream-specific ControlNets - and IPAdapter or style-model data attached to the wave config gets applied per-frame with wave-modulated strength. That's the difference between "both videos use the same control" and "A keeps its pose, B keeps its color."
Inputs that matter
- latents_A / latents_B - the two videos, VAE-encoded, from standard ComfyUI video loading.
- positive_A / positive_B - the prompt conditionings for each video. negative is shared.
- wave_config - from the Interpolation Wave Controller; required.
- feedback_mode -
noneorprevious_frame. On, each frame's output feeds into the next, tightening temporal continuity inside the morph. - steps, seed, sampler_name, scheduler, cfg - standard sampler dials; vae is optional (used by the controlnet/denoise paths when needed).
Output is a latent_batch - decode it to get the full morphed video, overlap zone included.
Installing it
Part of kentskooking-nodes: ComfyUI Manager → search kentskooking-nodes → install → restart, or:
cd ComfyUI/custom_nodes
git clone https://github.com/Kentskooking/kentskooking-nodes
Restart after. No models to download. The pack ships ready-made interpolation workflows for FLUX, SDXL and SD 1.5 under examples/workflows/ - use them as your template.
Common issues
- A morph that's all seams -
overlap_framestoo short for the motion. The overlap is the morph; give it room. - Melty noise in the middle -
denoise_maxtoo high. The model is inventing too hard. Back it off and let the crossfade carry more of the transition. - One video's identity dominates the whole morph - check whether you attached a ControlNet to one stream. Stream-specific controls don't cancel each other out; they stack, and an aggressive pose control on A will pin the whole transition to A's structure.
The config knob you'll touch most is denoise_max in the controller. Everything else is setup; that one is taste.
Inputs (14)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | — | |
| positive_A | CONDITIONING | — | |
| positive_B | CONDITIONING | — | |
| negative | CONDITIONING | — | |
| latents_A | LATENT | — | |
| latents_B | LATENT | — | |
| wave_config | WAVE_CONFIG | — | |
| seed | INT | 00–18446744073709550000 | — |
| steps | INT | 201–10000 | — |
| sampler_name | COMBO | 44 options: euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, heunpp2, +38 | |
| scheduler | COMBO | 9 options: simple, sgm_uniform, karras, exponential, ddim_uniform, beta, +3 | |
| cfg | FLOAT | 8.00–100 | — |
| feedback_mode | COMBO | none | 2 options: none, previous_frame |
| vaeopt | VAE | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| latent_batch | LATENT | — |