Combine Videos

Concatenate multiple video clips with transitions and per-clip frame trim.

Overview

The Combine Videos node joins multiple video clips in sequence with configurable transitions between them. Supports drag-and-drop reordering of connected clips and per-clip head/tail frame trimming. All processing is done via FFmpeg.

Configuration

Field Type Default Description
Transition Select fade Transition type between clips
Transition Duration Number 0.5 VIDEO transition length in seconds (0.1-2s), hidden for “cut”
Audio Mode Select crossfade How to handle audio during transitions
Crossfade Duration Number 0.5 AUDIO-only crossfade length (0-5s, shown when Audio = Crossfade). Never affects the video. Falls back to Transition Duration on older workflows.
Crossfade Curve Select linear Audio fade curve (shown when Audio = Crossfade)
Smart Cut Toggle off PSNR-match boundary frames and cut at the closest pair (replaces the fixed trims)
Smart Cut: prev window Number 8 Frames searched at the END of each clip (1-24, shown when Smart Cut is on)
Smart Cut: next window Number 8 Frames searched at the START of the following clip (1-24)
Trim Start Frames Number 1 Frames trimmed from the start of EACH clip except the first (0-120). Default 1 drops the duplicated boundary frame AI continuation clips carry. With Smart Cut on, used as the fallback for boundaries without a match
Trim End Frames Number 2 Frames trimmed from the end of EACH clip except the last (0-120). Default 2 drops boundary generation artifacts. With Smart Cut on, used as the fallback for boundaries without a match
Clip Ordering Drag list Reorder connected video clips

Transition Options

50+ FFmpeg xfade transitions are available, organized into a tabbed picker in the config panel. The Common tab surfaces the most-used handful; the remaining tabs group every option by family. Each tile shows a looping mini-preview so you can compare options at a glance.

Common tab — the everyday handful:

Transition Description
cut Hard cut — instant switch, no blend. Fastest.
fade Smooth alpha cross-fade. Classic clean blend.
dissolve Random-pixel dissolve. Grainy, organic feel — good for memory beats.
dip-to-black Fade through black. Use between scenes or time jumps.
dip-to-white Fade through white. Bright, ethereal — flashbacks.
wipe-left, wipe-right Hard edge sweeps across the frame.
slide-left, slide-right Next clip pushes the current one off-screen.
circle-open Circular iris opens to reveal the next clip from center.

All groups — full catalog (id → FFmpeg xfade name):

Group Transitions
Fades & Dips cut (concat), fade, dissolve, dip-to-black (fadeblack), dip-to-white (fadewhite), fadegrays
Wipes wipe-left, wipe-right, wipe-up, wipe-down, wipe-tl, wipe-tr, wipe-bl, wipe-br
Slides slide-left, slide-right, slide-up, slide-down
Smooth smooth-left, smooth-right, smooth-up, smooth-down (feathered-edge wipes)
Shapes circle-open, circle-close, circle-crop, rect-crop, horz-open, horz-close, vert-open, vert-close, diag-tl, diag-tr, diag-bl, diag-br
Slices hl-slice, hr-slice, vu-slice, vd-slice
Reveals reveal-left, reveal-right, reveal-up, reveal-down
Covers cover-left, cover-right, cover-up, cover-down
Effects pixelize, radial, hblur, distance, zoom-in, squeeze-h, squeeze-v

Back-compat note: Workflows saved with the old 5-value transition field (cut / fade / dissolve / dip-to-black / dip-to-white) keep working. dip-to-black and dip-to-white now use FFmpeg’s built-in fadeblack / fadewhite xfade transitions instead of interleaving generated solid-color clips — visually identical, one fewer ffmpeg pass per dip. dissolve now produces the FFmpeg dissolve xfade (pixel-noise pattern), which differs subtly from fade — previously the two were aliased.

Audio Modes

The audio crossfade never influences the video. Its duration and curve shape only the soundtrack: at a cut the video stream is copied byte-for-byte (identical whether crossfade is on or off), and at blend transitions the video fade length is governed solely by Transition Duration.

How crossfade behaves per transition type:

Audio normalization: every clip is re-encoded to a common format before joining (24fps H.264, AAC 44.1kHz stereo), so clips from different providers — which often ship different sample rates — always splice cleanly. If some clips have audio and others are silent, the silent clips get a silent audio track injected so the combined track never drops out mid-video.

Smart Cut

For continuation clips (each generated from the previous clip’s last frame), the seam usually stutters because the models re-render a near-identical moment on both sides. Smart Cut finds it automatically: it searches the last N frames of each clip and the first M frames of the next (PSNR similarity), ends the first clip on the most similar frame and starts the next right after its match — of the two near-identical twins, the previous clip’s original frame is kept and the next clip’s re-rendered copy is dropped, so the shared moment plays exactly once and motion continues through the cut.

Match threshold + fallback: a pair only counts as a genuine match above 24dB PSNR (measured: continuation twins ≥ ~28dB, unrelated clips ≤ ~15dB). Boundaries with a match use the matcher’s cut; boundaries without one (clips that don’t actually continue each other, or a failed search) fall back to the fixed Trim Start/End values — which stay visible below the Smart Cut controls as the per-boundary defaults.

Every junction is searched independently — with 3 clips there are 2 boundaries, each with its own result. The applied values are reported in the job’s output_data.smartCuts:

"smartCuts": [
  { "boundary": 0, "prevClipEndTrimFrames": 0, "nextClipStartTrimFrames": 1, "psnrDb": 30.19, "matched": true, "searchedPrevFrames": 8, "searchedNextFrames": 8 },
  { "boundary": 1, "prevClipEndTrimFrames": 2, "nextClipStartTrimFrames": 1, "psnrDb": 11.7, "matched": false, "searchedPrevFrames": 8, "searchedNextFrames": 8 }
]

boundary k is the join between clip k and clip k+1. Every pair in the searchedPrevFrames × searchedNextFrames grid is compared (the requested windows, clamped to short clips). The trim fields are the values actually applied (drop counts: prevClipEndTrimFrames: 0 = the match was the previous clip’s very last frame, kept; nextClipStartTrimFrames: 1 = the next clip dropped just its duplicated first frame). matched: false means no pair cleared the threshold — the reported values are the fixed trims the boundary fell back to. psnrDb: >30 ≈ visually identical, 100 = pixel-identical, null = the search errored.

Crossfade Curve (only when Audio = Crossfade)

Curve FFmpeg acrossfade=curve= When to use
Linear tri Default — predictable but can dip in the middle for music
Equal Power qsin Keeps perceived loudness roughly constant — best for music
Smooth (Sine) hsin Gentler than equal-power — good for dialogue and ambient
Logarithmic log Compensates for the ear’s logarithmic loudness response; long, slow tails
Exponential exp Sharp out / slow in — punchy, good for impact moments

Inputs & Outputs

Inputs: 2+ video clips (connected via input handles) Outputs: Single combined video

Credit Cost

Combine Videos is dynamically priced based on output length and input count:

The estimator walks back through the connected upstream nodes to read each clip’s duration. When an upstream hasn’t generated yet, an 8-second fallback is used per missing entry.

Examples:

Configuration Estimated Output Credits
2 clips × 5s, cut transition 10s 2
3 clips × 10s, fade 0.5s 29s 7 (6 base + 1 input adder)
5 clips × 8s, dissolve 0.5s, trim 24+24 frames per clip 28s 9 (6 base + 3 input adder)

The Run button shows the live estimate.

Best Practices

Common Use Cases

Tips