Audio Concat
Stitch audio clips together end-to-end, with a stream-copy fast path
- audio_a
- audio_b
- audio_c
- audio
- output_path
- duration_sec
- summary
So you generated four dialogue clips or a pile of foley one-shots, and now you need them as one continuous track. MKRAudioConcat is the "join these in order" node - it takes two audio inputs (plus an optional third and/or a list of file paths) and produces a single file with everything back-to-back. It's the boring, necessary utility that every multi-shot pipeline ends up needing, and unlike mixing it's not an overlay: the total duration is the sum of the parts.
Where it sits in the MKRShift_Nodes audio family: this is the Utility branch, so it's about assembling rather than shaping. Chain it before MKRAudioTrimFadeNormalize to master the joined result, or feed the output into MKRPresaveAudio to hand the whole thing to your delivery chain.
How it works
If the inputs are actual files and ffmpeg is available, the node uses ffmpeg's concat demuxer - a text file listing the sources. When stream_copy_if_possible is on (it is by default) and every source is the same format as the requested output, it concatenates with -c copy, which is nearly instant because nothing is re-encoded. If formats differ, or copy isn't possible, it falls back to a full re-encode with the right codec for the target format.
If the inputs are waveform payloads (no decodable file), there's a numpy fallback: it resamples everything to the highest sample rate, aligns channels, and concatenates sample arrays. That's slower and less clean than ffmpeg copy, but it means the node works even when ffmpeg isn't installed.
Inputs that matter
audio_a,audio_b- the two required sources, in order.audio_c(optional) - a third source.audio_paths(optional) - a multiline text box of file paths, one per line. This is the sneaky-useful one: you can concat a whole folder's worth of files without a dozen wires.stream_copy_if_possible- on by default. Leave it on; it's the difference between instant joins and a full re-encode. Turn it off only if copy produces glitches between files.- The usual save block:
output_format(autoinherits the first source's format),filename_prefix,subfolder,overwrite,filename_label.
Outputs: audio (MKR_AUDIO), output_path, duration_sec, summary (JSON with source count and which mode - file_ffmpeg copy/re-encode vs waveform - actually ran).
Install
ComfyUI Manager (search "MKRShift Nodes"), or:
cd ComfyUI/custom_nodes
git clone https://github.com/criskb/MKRShift_Nodes
Restart. The fast -c copy path needs ffmpeg on your PATH; without it you fall back to the numpy path (and only WAV-ish payloads work reliably). No model downloads either way.
Common issues
The trap is mixed formats: if your sources are a mix of MP3 and WAV and you ask for auto output, the node picks the first source's extension and has to re-encode - which is why stream_copy_if_possible sometimes doesn't save you. Normalize sources to one format upstream if you care about lossless joins. Also, audio_paths entries are resolved relative to ComfyUI's input/output/temp dirs and your CWD, so absolute paths are the safe bet.
Inputs (10)
| Name | Type | Default | Description |
|---|---|---|---|
| audio_a | * | — | |
| audio_b | * | — | |
| output_format | COMBO | auto | 5 options: auto, wav, mp3, flac, ogg |
| filename_prefix | STRING | MKR_audio_concat | — |
| subfolder | STRING | — | |
| overwrite | BOOLEAN | false | — |
| stream_copy_if_possible | BOOLEAN | true | — |
| audio_copt | * | — | |
| audio_pathsopt | STRING | — | |
| filename_labelopt | STRING | — |
Outputs (4)
| Name | Type | Description |
|---|---|---|
| audio | MKR_AUDIO | — |
| output_path | STRING | — |
| duration_sec | FLOAT | — |
| summary | STRING | — |