Nodes/ComfyUI-Buff-Nodes/Video Transition Batch Merger (Buff)
ComfyUI Node

Video Transition Batch Merger (Buff)

Stitch clips into a timeline with actual transitions, audio included

By BuffMcBigHuge·Created 2 years ago·Updated 20 days ago· 2
Video Transition Batch Merger (Buff)
  • image_batch_1
  • image_batch_2
  • audio_1
  • audio_2
  • image_batch_3
  • audio_3
  • image_batch_4
  • audio_4
  • image_batch_5
  • audio_5
  • image_batch_6
  • audio_6
  • image_batch_7
  • audio_7
  • image_batch_8
  • audio_8
  • image_batch_9
  • audio_9
  • image_batch_10
  • audio_10
  • image_batch_11
  • audio_11
  • image_batch_12
  • audio_12
  • image_batch_13
  • audio_13
  • image_batch_14
  • audio_14
  • image_batch_15
  • audio_15
  • image_batch_16
  • audio_16
  • image_batch_17
  • audio_17
  • image_batch_18
  • audio_18
  • image_batch_19
  • audio_19
  • image_batch_20
  • audio_20
  • image_batch_21
  • audio_21
  • image_batch_22
  • audio_22
  • image_batch_23
  • audio_23
  • image_batch_24
  • audio_24
  • image_batch_25
  • audio_25
  • image_batch_26
  • audio_26
  • image_batch_27
  • audio_27
  • image_batch_28
  • audio_28
  • image_batch_29
  • audio_29
  • image_batch_30
  • audio_30
  • image_batch_31
  • audio_31
  • image_batch_32
  • audio_32
  • image_batch_33
  • audio_33
  • image_batch_34
  • audio_34
  • image_batch_35
  • audio_35
  • image_batch_36
  • audio_36
  • image_batch_37
  • audio_37
  • image_batch_38
  • audio_38
  • image_batch_39
  • audio_39
  • image_batch_40
  • audio_40
  • image_batch_41
  • audio_41
  • image_batch_42
  • audio_42
  • image_batch_43
  • audio_43
  • image_batch_44
  • audio_44
  • image_batch_45
  • audio_45
  • image_batch_46
  • audio_46
  • image_batch_47
  • audio_47
  • image_batch_48
  • audio_48
  • image_batch_49
  • audio_49
  • image_batch_50
  • audio_50
  • image_batch_51
  • audio_51
  • image_batch_52
  • audio_52
  • image_batch_53
  • audio_53
  • image_batch_54
  • audio_54
  • image_batch_55
  • audio_55
  • image_batch_56
  • audio_56
  • image_batch_57
  • audio_57
  • image_batch_58
  • audio_58
  • image_batch_59
  • audio_59
  • image_batch_60
  • audio_60
  • image_batch_61
  • audio_61
  • image_batch_62
  • audio_62
  • image_batch_63
  • audio_63
  • image_batch_64
  • audio_64
  • images
  • audio
  • fps
  • frame_count
  • timeline_info
inputcount2
fps24.00
transition_modeauto
default_transitioncross_dissolve
default_transition_frames12
easingsmoothstep
size_matchfirst_batch
resize_methodpad
wipe_softness0.08
effect_intensity1.00
transition_plan

This is the heavyweight of the pack, and it's the most ambitious node here by a wide margin. VideoTransitionBatchMerger takes multiple ComfyUI image batches - each one a clip - and merges them into a single timeline with a real transition between every pair, matching audio, a final frame count, and even a timeline summary string. It's a miniature video editor living inside a node.

The gap it fills is the one you hit the moment you generate a video in pieces - clip A, clip B, clip C - and need them cut together with a cross-dissolve instead of a hard jump cut. Without something like this, you're either leaving cuts in, or exporting each clip and cutting them in an external editor. This node keeps the whole thing inside ComfyUI and, because it's backend tensor math, it works through the API without browser-only extensions.

How it works

Two clips (image_batch_1, image_batch_2) is the minimum; crank inputcount and hit the node's "Update inputs" button to reveal image_batch_3+ and matching audio_N sockets, all the way to 64. Every socket also exists on the backend regardless of the UI, so raw Prompt API workflows can wire image_batch_9 directly. Between each pair, transition_mode decides the shape: overlap consumes handles from the outgoing and incoming clips (output shorter than the sum of inputs), non_overlap inserts generated frames between clips (output longer), and auto picks per transition - overlap for A/B roll moves, inserted frames for dips and camera artifacts.

Then pick your transition. There are ~40, from cross_dissolve, wipes, iris wipes, pushes and slides, to dip_to_black, morph_cut, whip_pan, light_leak, glitch, film_burn, even page_peel and cube_spin. default_transition and default_transition_frames set the baseline, and the per-pair transition_plan text field overrides individual boundaries with lines like 2:dip_to_white:8. easing shapes the curve, wipe_softness feathers wipe edges, effect_intensity boosts the bloom/leak/whip effects.

The audio story is the part that surprised me. Connect audio_1/audio_2 (ComfyUI AUDIO or legacy VHS_AUDIO both accepted) and it builds a single aligned track: clips without audio get silence, inserted transition frames get silence, and overlapping transitions trim and crossfade the overlapping audio handles. fps drives the whole timeline and audio alignment.

Inputs that matter

inputcount, the two image batches, fps (default 24), default_transition / default_transition_frames, transition_mode, and transition_plan for per-pair overrides. size_match (strict, first_batch, largest_area, smallest_area) plus resize_method (stretch, pad, crop) handle clips of different dimensions - strict errors if they differ, which is the safe starting point.

Outputs: merged images, aligned audio, fps, frame_count, and a timeline_info summary string for debugging.

Install and gotchas

From BuffMcBigHuge's pack - ComfyUI Manager (search "ComfyUI-Buff-Nodes") or:

cd ComfyUI/custom_nodes
git clone https://github.com/BuffMcBigHuge/ComfyUI-Buff-Nodes

Restart ComfyUI. No extra dependencies.

The gotchas are the usual video-tooling ones. strict size matching will throw on mismatched clips - that's a feature; set first_batch or pad if you want it to cope. fps matters for audio even if you don't care about video timing, since it aligns the audio timeline. Transition frames cost VRAM on long timelines; default_transition_frames of 0 gives a hard cut if you're memory-bound. And remember the "Update inputs" button - the UI-driven sockets don't appear until you press it. It's the node in this pack with the most moving parts, and the one that most clearly earns its keep.

CategoryImage/Animation

Inputs (139)

NameTypeDefaultDescription
inputcountINT22–64Set the number of image batch inputs, then click Update inputs on the node.
image_batch_1IMAGEFirst clip as a ComfyUI IMAGE batch [frames, height, width, channels].
image_batch_2IMAGESecond clip as a ComfyUI IMAGE batch [frames, height, width, channels].
fpsFLOAT24.001–240Frames per second for the merged image timeline and audio alignment.
transition_modeCOMBOautoauto: overlap for A/B roll transitions and non-overlap for dip/camera-artifact transitions.
default_transitionCOMBOcross_dissolveTransition used when a pair-specific transition is set to same_as_default.
default_transition_framesINT120–1000Default transition length in frames. Pair-specific values of 0 use this default.
easingCOMBOsmoothstepProgress curve used by opacity, wipe, slide, and inserted transition frames.
size_matchCOMBOfirst_batchHow to choose the output dimensions when input batches differ.
resize_methodCOMBOpadResize method used when size_match is not strict and clip dimensions differ.
wipe_softnessFLOAT0.080–0.5Soft edge width for wipe and iris transitions as a fraction of the frame.
effect_intensityFLOAT1.000–3Strength for bloom, light leak, and whip-pan blur effects.
audio_1optAUDIO,VHS_AUDIOOptional audio paired with image_batch_1. Accepts ComfyUI AUDIO or legacy VHS_AUDIO.
audio_2optAUDIO,VHS_AUDIOOptional audio paired with image_batch_2. Accepts ComfyUI AUDIO or legacy VHS_AUDIO.
transition_planoptSTRINGOptional per-pair overrides, one per line. Examples: 1:cross_dissolve:12 2:dip_to_white:8 The web UI manages this automatically when using dynamic transition controls.
image_batch_3optIMAGEOptional API-safe clip input for image_batch_3. Set inputcount high enough for this input to be used.
audio_3optAUDIO,VHS_AUDIOOptional audio paired with image_batch_3.
image_batch_4optIMAGEOptional API-safe clip input for image_batch_4. Set inputcount high enough for this input to be used.
audio_4optAUDIO,VHS_AUDIOOptional audio paired with image_batch_4.
image_batch_5optIMAGEOptional API-safe clip input for image_batch_5. Set inputcount high enough for this input to be used.
audio_5optAUDIO,VHS_AUDIOOptional audio paired with image_batch_5.
image_batch_6optIMAGEOptional API-safe clip input for image_batch_6. Set inputcount high enough for this input to be used.
audio_6optAUDIO,VHS_AUDIOOptional audio paired with image_batch_6.
image_batch_7optIMAGEOptional API-safe clip input for image_batch_7. Set inputcount high enough for this input to be used.
audio_7optAUDIO,VHS_AUDIOOptional audio paired with image_batch_7.
image_batch_8optIMAGEOptional API-safe clip input for image_batch_8. Set inputcount high enough for this input to be used.
audio_8optAUDIO,VHS_AUDIOOptional audio paired with image_batch_8.
image_batch_9optIMAGEOptional API-safe clip input for image_batch_9. Set inputcount high enough for this input to be used.
audio_9optAUDIO,VHS_AUDIOOptional audio paired with image_batch_9.
image_batch_10optIMAGEOptional API-safe clip input for image_batch_10. Set inputcount high enough for this input to be used.
audio_10optAUDIO,VHS_AUDIOOptional audio paired with image_batch_10.
image_batch_11optIMAGEOptional API-safe clip input for image_batch_11. Set inputcount high enough for this input to be used.
audio_11optAUDIO,VHS_AUDIOOptional audio paired with image_batch_11.
image_batch_12optIMAGEOptional API-safe clip input for image_batch_12. Set inputcount high enough for this input to be used.
audio_12optAUDIO,VHS_AUDIOOptional audio paired with image_batch_12.
image_batch_13optIMAGEOptional API-safe clip input for image_batch_13. Set inputcount high enough for this input to be used.
audio_13optAUDIO,VHS_AUDIOOptional audio paired with image_batch_13.
image_batch_14optIMAGEOptional API-safe clip input for image_batch_14. Set inputcount high enough for this input to be used.
audio_14optAUDIO,VHS_AUDIOOptional audio paired with image_batch_14.
image_batch_15optIMAGEOptional API-safe clip input for image_batch_15. Set inputcount high enough for this input to be used.
audio_15optAUDIO,VHS_AUDIOOptional audio paired with image_batch_15.
image_batch_16optIMAGEOptional API-safe clip input for image_batch_16. Set inputcount high enough for this input to be used.
audio_16optAUDIO,VHS_AUDIOOptional audio paired with image_batch_16.
image_batch_17optIMAGEOptional API-safe clip input for image_batch_17. Set inputcount high enough for this input to be used.
audio_17optAUDIO,VHS_AUDIOOptional audio paired with image_batch_17.
image_batch_18optIMAGEOptional API-safe clip input for image_batch_18. Set inputcount high enough for this input to be used.
audio_18optAUDIO,VHS_AUDIOOptional audio paired with image_batch_18.
image_batch_19optIMAGEOptional API-safe clip input for image_batch_19. Set inputcount high enough for this input to be used.
audio_19optAUDIO,VHS_AUDIOOptional audio paired with image_batch_19.
image_batch_20optIMAGEOptional API-safe clip input for image_batch_20. Set inputcount high enough for this input to be used.
audio_20optAUDIO,VHS_AUDIOOptional audio paired with image_batch_20.
image_batch_21optIMAGEOptional API-safe clip input for image_batch_21. Set inputcount high enough for this input to be used.
audio_21optAUDIO,VHS_AUDIOOptional audio paired with image_batch_21.
image_batch_22optIMAGEOptional API-safe clip input for image_batch_22. Set inputcount high enough for this input to be used.
audio_22optAUDIO,VHS_AUDIOOptional audio paired with image_batch_22.
image_batch_23optIMAGEOptional API-safe clip input for image_batch_23. Set inputcount high enough for this input to be used.
audio_23optAUDIO,VHS_AUDIOOptional audio paired with image_batch_23.
image_batch_24optIMAGEOptional API-safe clip input for image_batch_24. Set inputcount high enough for this input to be used.
audio_24optAUDIO,VHS_AUDIOOptional audio paired with image_batch_24.
image_batch_25optIMAGEOptional API-safe clip input for image_batch_25. Set inputcount high enough for this input to be used.
audio_25optAUDIO,VHS_AUDIOOptional audio paired with image_batch_25.
image_batch_26optIMAGEOptional API-safe clip input for image_batch_26. Set inputcount high enough for this input to be used.
audio_26optAUDIO,VHS_AUDIOOptional audio paired with image_batch_26.
image_batch_27optIMAGEOptional API-safe clip input for image_batch_27. Set inputcount high enough for this input to be used.
audio_27optAUDIO,VHS_AUDIOOptional audio paired with image_batch_27.
image_batch_28optIMAGEOptional API-safe clip input for image_batch_28. Set inputcount high enough for this input to be used.
audio_28optAUDIO,VHS_AUDIOOptional audio paired with image_batch_28.
image_batch_29optIMAGEOptional API-safe clip input for image_batch_29. Set inputcount high enough for this input to be used.
audio_29optAUDIO,VHS_AUDIOOptional audio paired with image_batch_29.
image_batch_30optIMAGEOptional API-safe clip input for image_batch_30. Set inputcount high enough for this input to be used.
audio_30optAUDIO,VHS_AUDIOOptional audio paired with image_batch_30.
image_batch_31optIMAGEOptional API-safe clip input for image_batch_31. Set inputcount high enough for this input to be used.
audio_31optAUDIO,VHS_AUDIOOptional audio paired with image_batch_31.
image_batch_32optIMAGEOptional API-safe clip input for image_batch_32. Set inputcount high enough for this input to be used.
audio_32optAUDIO,VHS_AUDIOOptional audio paired with image_batch_32.
image_batch_33optIMAGEOptional API-safe clip input for image_batch_33. Set inputcount high enough for this input to be used.
audio_33optAUDIO,VHS_AUDIOOptional audio paired with image_batch_33.
image_batch_34optIMAGEOptional API-safe clip input for image_batch_34. Set inputcount high enough for this input to be used.
audio_34optAUDIO,VHS_AUDIOOptional audio paired with image_batch_34.
image_batch_35optIMAGEOptional API-safe clip input for image_batch_35. Set inputcount high enough for this input to be used.
audio_35optAUDIO,VHS_AUDIOOptional audio paired with image_batch_35.
image_batch_36optIMAGEOptional API-safe clip input for image_batch_36. Set inputcount high enough for this input to be used.
audio_36optAUDIO,VHS_AUDIOOptional audio paired with image_batch_36.
image_batch_37optIMAGEOptional API-safe clip input for image_batch_37. Set inputcount high enough for this input to be used.
audio_37optAUDIO,VHS_AUDIOOptional audio paired with image_batch_37.
image_batch_38optIMAGEOptional API-safe clip input for image_batch_38. Set inputcount high enough for this input to be used.
audio_38optAUDIO,VHS_AUDIOOptional audio paired with image_batch_38.
image_batch_39optIMAGEOptional API-safe clip input for image_batch_39. Set inputcount high enough for this input to be used.
audio_39optAUDIO,VHS_AUDIOOptional audio paired with image_batch_39.
image_batch_40optIMAGEOptional API-safe clip input for image_batch_40. Set inputcount high enough for this input to be used.
audio_40optAUDIO,VHS_AUDIOOptional audio paired with image_batch_40.
image_batch_41optIMAGEOptional API-safe clip input for image_batch_41. Set inputcount high enough for this input to be used.
audio_41optAUDIO,VHS_AUDIOOptional audio paired with image_batch_41.
image_batch_42optIMAGEOptional API-safe clip input for image_batch_42. Set inputcount high enough for this input to be used.
audio_42optAUDIO,VHS_AUDIOOptional audio paired with image_batch_42.
image_batch_43optIMAGEOptional API-safe clip input for image_batch_43. Set inputcount high enough for this input to be used.
audio_43optAUDIO,VHS_AUDIOOptional audio paired with image_batch_43.
image_batch_44optIMAGEOptional API-safe clip input for image_batch_44. Set inputcount high enough for this input to be used.
audio_44optAUDIO,VHS_AUDIOOptional audio paired with image_batch_44.
image_batch_45optIMAGEOptional API-safe clip input for image_batch_45. Set inputcount high enough for this input to be used.
audio_45optAUDIO,VHS_AUDIOOptional audio paired with image_batch_45.
image_batch_46optIMAGEOptional API-safe clip input for image_batch_46. Set inputcount high enough for this input to be used.
audio_46optAUDIO,VHS_AUDIOOptional audio paired with image_batch_46.
image_batch_47optIMAGEOptional API-safe clip input for image_batch_47. Set inputcount high enough for this input to be used.
audio_47optAUDIO,VHS_AUDIOOptional audio paired with image_batch_47.
image_batch_48optIMAGEOptional API-safe clip input for image_batch_48. Set inputcount high enough for this input to be used.
audio_48optAUDIO,VHS_AUDIOOptional audio paired with image_batch_48.
image_batch_49optIMAGEOptional API-safe clip input for image_batch_49. Set inputcount high enough for this input to be used.
audio_49optAUDIO,VHS_AUDIOOptional audio paired with image_batch_49.
image_batch_50optIMAGEOptional API-safe clip input for image_batch_50. Set inputcount high enough for this input to be used.
audio_50optAUDIO,VHS_AUDIOOptional audio paired with image_batch_50.
image_batch_51optIMAGEOptional API-safe clip input for image_batch_51. Set inputcount high enough for this input to be used.
audio_51optAUDIO,VHS_AUDIOOptional audio paired with image_batch_51.
image_batch_52optIMAGEOptional API-safe clip input for image_batch_52. Set inputcount high enough for this input to be used.
audio_52optAUDIO,VHS_AUDIOOptional audio paired with image_batch_52.
image_batch_53optIMAGEOptional API-safe clip input for image_batch_53. Set inputcount high enough for this input to be used.
audio_53optAUDIO,VHS_AUDIOOptional audio paired with image_batch_53.
image_batch_54optIMAGEOptional API-safe clip input for image_batch_54. Set inputcount high enough for this input to be used.
audio_54optAUDIO,VHS_AUDIOOptional audio paired with image_batch_54.
image_batch_55optIMAGEOptional API-safe clip input for image_batch_55. Set inputcount high enough for this input to be used.
audio_55optAUDIO,VHS_AUDIOOptional audio paired with image_batch_55.
image_batch_56optIMAGEOptional API-safe clip input for image_batch_56. Set inputcount high enough for this input to be used.
audio_56optAUDIO,VHS_AUDIOOptional audio paired with image_batch_56.
image_batch_57optIMAGEOptional API-safe clip input for image_batch_57. Set inputcount high enough for this input to be used.
audio_57optAUDIO,VHS_AUDIOOptional audio paired with image_batch_57.
image_batch_58optIMAGEOptional API-safe clip input for image_batch_58. Set inputcount high enough for this input to be used.
audio_58optAUDIO,VHS_AUDIOOptional audio paired with image_batch_58.
image_batch_59optIMAGEOptional API-safe clip input for image_batch_59. Set inputcount high enough for this input to be used.
audio_59optAUDIO,VHS_AUDIOOptional audio paired with image_batch_59.
image_batch_60optIMAGEOptional API-safe clip input for image_batch_60. Set inputcount high enough for this input to be used.
audio_60optAUDIO,VHS_AUDIOOptional audio paired with image_batch_60.
image_batch_61optIMAGEOptional API-safe clip input for image_batch_61. Set inputcount high enough for this input to be used.
audio_61optAUDIO,VHS_AUDIOOptional audio paired with image_batch_61.
image_batch_62optIMAGEOptional API-safe clip input for image_batch_62. Set inputcount high enough for this input to be used.
audio_62optAUDIO,VHS_AUDIOOptional audio paired with image_batch_62.
image_batch_63optIMAGEOptional API-safe clip input for image_batch_63. Set inputcount high enough for this input to be used.
audio_63optAUDIO,VHS_AUDIOOptional audio paired with image_batch_63.
image_batch_64optIMAGEOptional API-safe clip input for image_batch_64. Set inputcount high enough for this input to be used.
audio_64optAUDIO,VHS_AUDIOOptional audio paired with image_batch_64.

Outputs (5)

NameTypeDescription
imagesIMAGE
audioAUDIO
fpsFLOAT
frame_countINT
timeline_infoSTRING