Nodes/ComfyTV/Video Composite
ComfyUI Node

Video Composite

A 39-blend-mode compositor that does keyframed transforms too

By jtydhr88·Created 3 months ago·Updated about 15 hours ago· 725
Video Composite
  • background
  • foreground
  • mask
  • track
  • video
force_run_token0
project_id
parent_output_id0
operatorover
opacity1.00
pos_x0
pos_y0
scale1.00
rotation0.0
keyframes

The moment you have more than one layer of video, you need compositing - and most ComfyUI workflows quietly fake it with a single "over" merge and no control. Video Composite is the stage that does it properly: it puts a foreground clip over a background with your choice of 39 blend modes, opacity, position, scale, and rotation, and it can animate all of that with keyframes. It's the node you reach for when a chroma key leaves you with a subject that needs to sit inside a scene, not just float on top of it.

It's a ComfyTV Compose stage, which in this pack's canvas model means: own Run button, snapshot output, and it composes in a single pass rather than re-rendering your whole graph.

The inputs that matter

  • background and foreground - both required. The error message is blunt: "Video Composite needs background and foreground videos." Foreground is composited on top.
  • operator - the blend mode, over by default. ComfyTV lists 39 blend modes, so the usual suspects are all here: screen, multiply, add, overlay, and friends for the glow-and-light work.
  • opacity (0–1, default 1), pos_x / pos_y (−8192 to 8192), scale (0.01–10), rotation (−360 to 360) - the static transform of the foreground layer.
  • keyframes - JSON [{t,x,y,scale,rotation,opacity,interp}] for animating the transform over time. This is what turns a static overlay into a tracked, moving one.
  • mask (optional) - a video/alpha input that gates where the foreground shows through.
  • track (optional, COMFYTV_TEXT) - accepts tracking data from a Motion Track stage and converts it into keyframes, so your overlay can follow a moving point automatically.

The project_id / parent_output_id / force_run_token inputs are internal frontend bookkeeping - ignore them.

How it works

Under the hood it calls the pack's torch-based compositor, which applies the blend operation, the transform, and any keyframed path, with the mask gating the composite. The track input is the clever bit: rather than hand-keyframing a position, you feed it a motion-track's output and it converts those points into keyframes with linear interpolation - the classic "stick an overlay to a moving face/object" move.

Install

ComfyTV ships ~190 stages in one pack; this node comes with it.

cd ComfyUI/custom_nodes
git clone https://github.com/jtydhr88/ComfyTV

Restart ComfyUI fully and look under ComfyTV → Compose. ComfyUI Manager finds it by searching "ComfyTV". No model downloads, no extra Python dependencies. On ComfyUI Desktop or macOS, clone into the running instance's absolute path from the startup log instead of trusting the relative cd.

Troubleshooting

  • "needs background and foreground videos" - you forgot one of the two inputs; both are mandatory.
  • The overlay is invisible. Check opacity (0 hides it) and that your blend mode isn't one that only shows on bright/dark pixels. over is the safe diagnostic.
  • Keyframed motion jumps instead of glides. Add intermediate keyframes or set the interp field on your keyframes to something smoother than linear.

It's not a substitute for a real NLE timeline, but for "subject over scene, moving on a tracked path" it's the right tool in this pack.

CategoryComfyTV/Compose

Inputs (14)

NameTypeDefaultDescription
force_run_tokenINT00–2147483647Internal — bumped on Run to invalidate ComfyUI's input cache.
project_idSTRINGInternal — populated by the projectStore on the frontend.
parent_output_idINT00–2147483647Internal — lineage parent set by spawn handlers on the frontend.
operatorCOMBOover39 options: atop, average, color, color-burn, color-dodge, conjoint-over, +33
opacityFLOAT1.000–1
pos_xFLOAT0-8192–8192
pos_yFLOAT0-8192–8192
scaleFLOAT1.000.01–10
rotationFLOAT0.0-360–360
keyframesSTRINGJSON [{t,x,y,scale,rotation,opacity,interp}]
backgroundoptCOMFYTV_VIDEO
foregroundoptCOMFYTV_VIDEO
maskoptCOMFYTV_VIDEO
trackoptCOMFYTV_TEXT

Outputs (1)

NameTypeDescription
videoCOMFYTV_VIDEO