Video Transition Batch Merger (Buff)
Stitch clips into a timeline with actual transitions, audio included
- 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
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.
Inputs (139)
| Name | Type | Default | Description |
|---|---|---|---|
| inputcount | INT | 22–64 | Set the number of image batch inputs, then click Update inputs on the node. |
| image_batch_1 | IMAGE | First clip as a ComfyUI IMAGE batch [frames, height, width, channels]. | |
| image_batch_2 | IMAGE | Second clip as a ComfyUI IMAGE batch [frames, height, width, channels]. | |
| fps | FLOAT | 24.001–240 | Frames per second for the merged image timeline and audio alignment. |
| transition_mode | COMBO | auto | auto: overlap for A/B roll transitions and non-overlap for dip/camera-artifact transitions. |
| default_transition | COMBO | cross_dissolve | Transition used when a pair-specific transition is set to same_as_default. |
| default_transition_frames | INT | 120–1000 | Default transition length in frames. Pair-specific values of 0 use this default. |
| easing | COMBO | smoothstep | Progress curve used by opacity, wipe, slide, and inserted transition frames. |
| size_match | COMBO | first_batch | How to choose the output dimensions when input batches differ. |
| resize_method | COMBO | pad | Resize method used when size_match is not strict and clip dimensions differ. |
| wipe_softness | FLOAT | 0.080–0.5 | Soft edge width for wipe and iris transitions as a fraction of the frame. |
| effect_intensity | FLOAT | 1.000–3 | Strength for bloom, light leak, and whip-pan blur effects. |
| audio_1opt | AUDIO,VHS_AUDIO | Optional audio paired with image_batch_1. Accepts ComfyUI AUDIO or legacy VHS_AUDIO. | |
| audio_2opt | AUDIO,VHS_AUDIO | Optional audio paired with image_batch_2. Accepts ComfyUI AUDIO or legacy VHS_AUDIO. | |
| transition_planopt | STRING | Optional 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_3opt | IMAGE | Optional API-safe clip input for image_batch_3. Set inputcount high enough for this input to be used. | |
| audio_3opt | AUDIO,VHS_AUDIO | Optional audio paired with image_batch_3. | |
| image_batch_4opt | IMAGE | Optional API-safe clip input for image_batch_4. Set inputcount high enough for this input to be used. | |
| audio_4opt | AUDIO,VHS_AUDIO | Optional audio paired with image_batch_4. | |
| image_batch_5opt | IMAGE | Optional API-safe clip input for image_batch_5. Set inputcount high enough for this input to be used. | |
| audio_5opt | AUDIO,VHS_AUDIO | Optional audio paired with image_batch_5. | |
| image_batch_6opt | IMAGE | Optional API-safe clip input for image_batch_6. Set inputcount high enough for this input to be used. | |
| audio_6opt | AUDIO,VHS_AUDIO | Optional audio paired with image_batch_6. | |
| image_batch_7opt | IMAGE | Optional API-safe clip input for image_batch_7. Set inputcount high enough for this input to be used. | |
| audio_7opt | AUDIO,VHS_AUDIO | Optional audio paired with image_batch_7. | |
| image_batch_8opt | IMAGE | Optional API-safe clip input for image_batch_8. Set inputcount high enough for this input to be used. | |
| audio_8opt | AUDIO,VHS_AUDIO | Optional audio paired with image_batch_8. | |
| image_batch_9opt | IMAGE | Optional API-safe clip input for image_batch_9. Set inputcount high enough for this input to be used. | |
| audio_9opt | AUDIO,VHS_AUDIO | Optional audio paired with image_batch_9. | |
| image_batch_10opt | IMAGE | Optional API-safe clip input for image_batch_10. Set inputcount high enough for this input to be used. | |
| audio_10opt | AUDIO,VHS_AUDIO | Optional audio paired with image_batch_10. | |
| image_batch_11opt | IMAGE | Optional API-safe clip input for image_batch_11. Set inputcount high enough for this input to be used. | |
| audio_11opt | AUDIO,VHS_AUDIO | Optional audio paired with image_batch_11. | |
| image_batch_12opt | IMAGE | Optional API-safe clip input for image_batch_12. Set inputcount high enough for this input to be used. | |
| audio_12opt | AUDIO,VHS_AUDIO | Optional audio paired with image_batch_12. | |
| image_batch_13opt | IMAGE | Optional API-safe clip input for image_batch_13. Set inputcount high enough for this input to be used. | |
| audio_13opt | AUDIO,VHS_AUDIO | Optional audio paired with image_batch_13. | |
| image_batch_14opt | IMAGE | Optional API-safe clip input for image_batch_14. Set inputcount high enough for this input to be used. | |
| audio_14opt | AUDIO,VHS_AUDIO | Optional audio paired with image_batch_14. | |
| image_batch_15opt | IMAGE | Optional API-safe clip input for image_batch_15. Set inputcount high enough for this input to be used. | |
| audio_15opt | AUDIO,VHS_AUDIO | Optional audio paired with image_batch_15. | |
| image_batch_16opt | IMAGE | Optional API-safe clip input for image_batch_16. Set inputcount high enough for this input to be used. | |
| audio_16opt | AUDIO,VHS_AUDIO | Optional audio paired with image_batch_16. | |
| image_batch_17opt | IMAGE | Optional API-safe clip input for image_batch_17. Set inputcount high enough for this input to be used. | |
| audio_17opt | AUDIO,VHS_AUDIO | Optional audio paired with image_batch_17. | |
| image_batch_18opt | IMAGE | Optional API-safe clip input for image_batch_18. Set inputcount high enough for this input to be used. | |
| audio_18opt | AUDIO,VHS_AUDIO | Optional audio paired with image_batch_18. | |
| image_batch_19opt | IMAGE | Optional API-safe clip input for image_batch_19. Set inputcount high enough for this input to be used. | |
| audio_19opt | AUDIO,VHS_AUDIO | Optional audio paired with image_batch_19. | |
| image_batch_20opt | IMAGE | Optional API-safe clip input for image_batch_20. Set inputcount high enough for this input to be used. | |
| audio_20opt | AUDIO,VHS_AUDIO | Optional audio paired with image_batch_20. | |
| image_batch_21opt | IMAGE | Optional API-safe clip input for image_batch_21. Set inputcount high enough for this input to be used. | |
| audio_21opt | AUDIO,VHS_AUDIO | Optional audio paired with image_batch_21. | |
| image_batch_22opt | IMAGE | Optional API-safe clip input for image_batch_22. Set inputcount high enough for this input to be used. | |
| audio_22opt | AUDIO,VHS_AUDIO | Optional audio paired with image_batch_22. | |
| image_batch_23opt | IMAGE | Optional API-safe clip input for image_batch_23. Set inputcount high enough for this input to be used. | |
| audio_23opt | AUDIO,VHS_AUDIO | Optional audio paired with image_batch_23. | |
| image_batch_24opt | IMAGE | Optional API-safe clip input for image_batch_24. Set inputcount high enough for this input to be used. | |
| audio_24opt | AUDIO,VHS_AUDIO | Optional audio paired with image_batch_24. | |
| image_batch_25opt | IMAGE | Optional API-safe clip input for image_batch_25. Set inputcount high enough for this input to be used. | |
| audio_25opt | AUDIO,VHS_AUDIO | Optional audio paired with image_batch_25. | |
| image_batch_26opt | IMAGE | Optional API-safe clip input for image_batch_26. Set inputcount high enough for this input to be used. | |
| audio_26opt | AUDIO,VHS_AUDIO | Optional audio paired with image_batch_26. | |
| image_batch_27opt | IMAGE | Optional API-safe clip input for image_batch_27. Set inputcount high enough for this input to be used. | |
| audio_27opt | AUDIO,VHS_AUDIO | Optional audio paired with image_batch_27. | |
| image_batch_28opt | IMAGE | Optional API-safe clip input for image_batch_28. Set inputcount high enough for this input to be used. | |
| audio_28opt | AUDIO,VHS_AUDIO | Optional audio paired with image_batch_28. | |
| image_batch_29opt | IMAGE | Optional API-safe clip input for image_batch_29. Set inputcount high enough for this input to be used. | |
| audio_29opt | AUDIO,VHS_AUDIO | Optional audio paired with image_batch_29. | |
| image_batch_30opt | IMAGE | Optional API-safe clip input for image_batch_30. Set inputcount high enough for this input to be used. | |
| audio_30opt | AUDIO,VHS_AUDIO | Optional audio paired with image_batch_30. | |
| image_batch_31opt | IMAGE | Optional API-safe clip input for image_batch_31. Set inputcount high enough for this input to be used. | |
| audio_31opt | AUDIO,VHS_AUDIO | Optional audio paired with image_batch_31. | |
| image_batch_32opt | IMAGE | Optional API-safe clip input for image_batch_32. Set inputcount high enough for this input to be used. | |
| audio_32opt | AUDIO,VHS_AUDIO | Optional audio paired with image_batch_32. | |
| image_batch_33opt | IMAGE | Optional API-safe clip input for image_batch_33. Set inputcount high enough for this input to be used. | |
| audio_33opt | AUDIO,VHS_AUDIO | Optional audio paired with image_batch_33. | |
| image_batch_34opt | IMAGE | Optional API-safe clip input for image_batch_34. Set inputcount high enough for this input to be used. | |
| audio_34opt | AUDIO,VHS_AUDIO | Optional audio paired with image_batch_34. | |
| image_batch_35opt | IMAGE | Optional API-safe clip input for image_batch_35. Set inputcount high enough for this input to be used. | |
| audio_35opt | AUDIO,VHS_AUDIO | Optional audio paired with image_batch_35. | |
| image_batch_36opt | IMAGE | Optional API-safe clip input for image_batch_36. Set inputcount high enough for this input to be used. | |
| audio_36opt | AUDIO,VHS_AUDIO | Optional audio paired with image_batch_36. | |
| image_batch_37opt | IMAGE | Optional API-safe clip input for image_batch_37. Set inputcount high enough for this input to be used. | |
| audio_37opt | AUDIO,VHS_AUDIO | Optional audio paired with image_batch_37. | |
| image_batch_38opt | IMAGE | Optional API-safe clip input for image_batch_38. Set inputcount high enough for this input to be used. | |
| audio_38opt | AUDIO,VHS_AUDIO | Optional audio paired with image_batch_38. | |
| image_batch_39opt | IMAGE | Optional API-safe clip input for image_batch_39. Set inputcount high enough for this input to be used. | |
| audio_39opt | AUDIO,VHS_AUDIO | Optional audio paired with image_batch_39. | |
| image_batch_40opt | IMAGE | Optional API-safe clip input for image_batch_40. Set inputcount high enough for this input to be used. | |
| audio_40opt | AUDIO,VHS_AUDIO | Optional audio paired with image_batch_40. | |
| image_batch_41opt | IMAGE | Optional API-safe clip input for image_batch_41. Set inputcount high enough for this input to be used. | |
| audio_41opt | AUDIO,VHS_AUDIO | Optional audio paired with image_batch_41. | |
| image_batch_42opt | IMAGE | Optional API-safe clip input for image_batch_42. Set inputcount high enough for this input to be used. | |
| audio_42opt | AUDIO,VHS_AUDIO | Optional audio paired with image_batch_42. | |
| image_batch_43opt | IMAGE | Optional API-safe clip input for image_batch_43. Set inputcount high enough for this input to be used. | |
| audio_43opt | AUDIO,VHS_AUDIO | Optional audio paired with image_batch_43. | |
| image_batch_44opt | IMAGE | Optional API-safe clip input for image_batch_44. Set inputcount high enough for this input to be used. | |
| audio_44opt | AUDIO,VHS_AUDIO | Optional audio paired with image_batch_44. | |
| image_batch_45opt | IMAGE | Optional API-safe clip input for image_batch_45. Set inputcount high enough for this input to be used. | |
| audio_45opt | AUDIO,VHS_AUDIO | Optional audio paired with image_batch_45. | |
| image_batch_46opt | IMAGE | Optional API-safe clip input for image_batch_46. Set inputcount high enough for this input to be used. | |
| audio_46opt | AUDIO,VHS_AUDIO | Optional audio paired with image_batch_46. | |
| image_batch_47opt | IMAGE | Optional API-safe clip input for image_batch_47. Set inputcount high enough for this input to be used. | |
| audio_47opt | AUDIO,VHS_AUDIO | Optional audio paired with image_batch_47. | |
| image_batch_48opt | IMAGE | Optional API-safe clip input for image_batch_48. Set inputcount high enough for this input to be used. | |
| audio_48opt | AUDIO,VHS_AUDIO | Optional audio paired with image_batch_48. | |
| image_batch_49opt | IMAGE | Optional API-safe clip input for image_batch_49. Set inputcount high enough for this input to be used. | |
| audio_49opt | AUDIO,VHS_AUDIO | Optional audio paired with image_batch_49. | |
| image_batch_50opt | IMAGE | Optional API-safe clip input for image_batch_50. Set inputcount high enough for this input to be used. | |
| audio_50opt | AUDIO,VHS_AUDIO | Optional audio paired with image_batch_50. | |
| image_batch_51opt | IMAGE | Optional API-safe clip input for image_batch_51. Set inputcount high enough for this input to be used. | |
| audio_51opt | AUDIO,VHS_AUDIO | Optional audio paired with image_batch_51. | |
| image_batch_52opt | IMAGE | Optional API-safe clip input for image_batch_52. Set inputcount high enough for this input to be used. | |
| audio_52opt | AUDIO,VHS_AUDIO | Optional audio paired with image_batch_52. | |
| image_batch_53opt | IMAGE | Optional API-safe clip input for image_batch_53. Set inputcount high enough for this input to be used. | |
| audio_53opt | AUDIO,VHS_AUDIO | Optional audio paired with image_batch_53. | |
| image_batch_54opt | IMAGE | Optional API-safe clip input for image_batch_54. Set inputcount high enough for this input to be used. | |
| audio_54opt | AUDIO,VHS_AUDIO | Optional audio paired with image_batch_54. | |
| image_batch_55opt | IMAGE | Optional API-safe clip input for image_batch_55. Set inputcount high enough for this input to be used. | |
| audio_55opt | AUDIO,VHS_AUDIO | Optional audio paired with image_batch_55. | |
| image_batch_56opt | IMAGE | Optional API-safe clip input for image_batch_56. Set inputcount high enough for this input to be used. | |
| audio_56opt | AUDIO,VHS_AUDIO | Optional audio paired with image_batch_56. | |
| image_batch_57opt | IMAGE | Optional API-safe clip input for image_batch_57. Set inputcount high enough for this input to be used. | |
| audio_57opt | AUDIO,VHS_AUDIO | Optional audio paired with image_batch_57. | |
| image_batch_58opt | IMAGE | Optional API-safe clip input for image_batch_58. Set inputcount high enough for this input to be used. | |
| audio_58opt | AUDIO,VHS_AUDIO | Optional audio paired with image_batch_58. | |
| image_batch_59opt | IMAGE | Optional API-safe clip input for image_batch_59. Set inputcount high enough for this input to be used. | |
| audio_59opt | AUDIO,VHS_AUDIO | Optional audio paired with image_batch_59. | |
| image_batch_60opt | IMAGE | Optional API-safe clip input for image_batch_60. Set inputcount high enough for this input to be used. | |
| audio_60opt | AUDIO,VHS_AUDIO | Optional audio paired with image_batch_60. | |
| image_batch_61opt | IMAGE | Optional API-safe clip input for image_batch_61. Set inputcount high enough for this input to be used. | |
| audio_61opt | AUDIO,VHS_AUDIO | Optional audio paired with image_batch_61. | |
| image_batch_62opt | IMAGE | Optional API-safe clip input for image_batch_62. Set inputcount high enough for this input to be used. | |
| audio_62opt | AUDIO,VHS_AUDIO | Optional audio paired with image_batch_62. | |
| image_batch_63opt | IMAGE | Optional API-safe clip input for image_batch_63. Set inputcount high enough for this input to be used. | |
| audio_63opt | AUDIO,VHS_AUDIO | Optional audio paired with image_batch_63. | |
| image_batch_64opt | IMAGE | Optional API-safe clip input for image_batch_64. Set inputcount high enough for this input to be used. | |
| audio_64opt | AUDIO,VHS_AUDIO | Optional audio paired with image_batch_64. |
Outputs (5)
| Name | Type | Description |
|---|---|---|
| images | IMAGE | — |
| audio | AUDIO | — |
| fps | FLOAT | — |
| frame_count | INT | — |
| timeline_info | STRING | — |