π Concat Videos
Stitch clips end-to-end, instant or transcoded β with transitions if you want them
- frames
- audio
- final_video_path
MF_ConcatVideos joins video files end-to-end at the file level - the thing VideoHelperSuite can't do, since VHS only stitches image batches. You give it a list of paths (one per line), pick a mode, and it hands back a single output file. The two modes are the whole story: copy is a lightning-fast no-reencode stitch for clips that are already compatible, transcode is the always-works path that re-encodes and can even add an xfade transition between clips.
How it works
copy- uses FFmpeg's concat demuxer with stream copy. No re-encode, near-instant. The catch: all inputs must actually be compatible, and the node runs a preflight probe that checks codec, dimensions, pixel format, profile, and audio/sample/channel fields per stream before FFmpeg runs. Mismatch β it raises, instead of silently producing a corrupt file past the first segment (which is whatconcat + copyon mismatched inputs used to do - exit 0, glitched output). Extra streams like GoPro/DJI timecode data or embedded thumbnails are skipped with a warning; the concat demuxer can't carry them.transcode- builds afilter_complexgraph with optionalxfade. Always works on mixed sources, always re-encodes. Missing audio on some clips is auto-padded with silence, so the output doesn't drift out of sync.
Copy mode's output extension follows the first input's extension - two ProRes .mov clips give you a .mov, not .mp4 (the mp4 muxer has no ProRes tag and would fail).
The inputs that matter
video_paths- one path per line; you need at least 2.mode-copy(fast, strict) ortranscode(safe). Default istranscode, which is the right default for people who don't know their clips are compatible.transition_sec/transition_type- transcode only.0= hard cut;>0gives anxfade(fade,wipeleft,slideleft,dissolve, etc.).fps/width/height- transcode target dims.codec/crf/preset- transcode encode settings.
The dual-input twist: wire frames + tensor_fps + audio and the tensor becomes path[0] - prepended to your list. Good for "my AI-generated intro, then these real clips."
Install
Part of MediaForge:
cd ComfyUI/custom_nodes
git clone https://github.com/leon80148/comfyui_MediaForge.git
# restart ComfyUI
Or ComfyUI Manager β "MediaForge".
Common issues
The copy-mode raise listing per-file codec/dim differences is expected behavior, not a bug - that's the preflight working. Fix by normalizing sources with MF_SaveVideoFrames first, or just switch to transcode. And don't reach for copy when your clips come from different cameras or different encoding runs; it's for same-source footage (same camera, same settings). The pack's own framing: copy for joining clips from the same camera, transcode for stitching different codecs or resolutions.
Inputs (14)
| Name | Type | Default | Description |
|---|---|---|---|
| video_paths | STRING | input/clip1.mp4 input/clip2.mp4 | β |
| filename_prefix | STRING | MediaForge/concat | β |
| mode | COMBO | transcode | 2 options: copy, transcode |
| transition_sec | FLOAT | 0.000β5 | β |
| transition_type | COMBO | fade | 8 options: fade, wipeleft, wiperight, slideleft, slideright, circleopen, +2 |
| fps | FLOAT | 30.01β240 | β |
| width | INT | 192016β7680 | β |
| height | INT | 108016β4320 | β |
| crf | INT | 180β51 | β |
| codec | COMBO | h264 NVIDIA GPU (h264_nvenc) | 7 options: h264 (libx264), hevc (libx265), av1 (libsvtav1), prores (prores_ks), h264 NVIDIA GPU (h264_nvenc), hevc NVIDIA GPU (hevc_nvenc), +1 |
| preset | COMBO | medium | 9 options: ultrafast, superfast, veryfast, faster, fast, medium, +3 |
| framesopt | IMAGE | β | |
| tensor_fpsopt | FLOAT | 30.01β240 | β |
| audioopt | AUDIO | β |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| final_video_path | STRING | β |