๐น๐ Combine Video + Audio
Mux frames or a video file with a soundtrack
- IMAGES
- AUDIO
- video_path
- video_duration
- fps
- number_of_frames
Exactly what it says: take a video and an audio track and mux them into a single file with sound. It's the last step in a lot of the pack's video pipelines - you generate frames, you generate or fetch a voice line or a music bed, and this is the node that puts them together into something you'd actually export and share.
What makes it flexible
Both sides accept two formats, which matters because the rest of the pack isn't consistent about which one it hands you. Video can come in as a list of IMAGES straight out of a generation or animation node, or as a video_path string pointing at a file already on disk. Audio works the same way - either the native AUDIO type ComfyUI passes around internally, or an audio_path string from something like a TTS node or a saved file. You don't need to convert formats before feeding this node; it takes whichever one you happen to have on hand.
The inputs and outputs that matter
Everything here is technically optional in the schema, but functionally you'll want to give it at least one video source and one audio source. fps (default 30) sets the frame rate for the output when you're feeding in raw IMAGES rather than an existing video file.
The outputs are useful beyond just the result file: video_path is the muxed file itself, ready to preview or save properly. video_duration, fps, and number_of_frames come back as separate values too - handy if a downstream node needs to know exactly how long the combined result runs, rather than you having to inspect the file yourself.
Installing it
Through ComfyUI Manager: search Bjornulf_custom_nodes, install, restart. Or by hand:
cd ComfyUI/custom_nodes
git clone https://github.com/justUmen/Bjornulf_custom_nodes
This node leans on the pack's ffmpeg tooling to do the actual muxing, so the shared requirements.txt install (which pulls in ffmpeg-python) is necessary - but not sufficient. ffmpeg-python is a wrapper around the real ffmpeg binary, not a bundled copy of it. If ffmpeg isn't already installed and on your system PATH, this node will fail even with every pip dependency correctly installed. That's the single most common reason any of this pack's video nodes don't work on a fresh setup.
Where people get burned
Beyond the missing-ffmpeg trap: mismatched durations between your video and audio don't get automatically reconciled here - this node combines what you give it, it doesn't stretch or trim to match. If your audio runs longer than your video (or the reverse) and you want them to line up cleanly, sync them first with the pack's own Audio Video Sync node, then feed the result into this one. Trying to skip that step and just hoping the mismatch won't be noticeable is the most common reason people end up with a video that cuts off mid-sentence or trails silence at the end.
Also worth remembering: like the rest of this pack's video and audio nodes, this one's history skews Linux-first - the author's own notes describe the video and TTS tooling as tested mainly there. If something in the ffmpeg step silently fails on Windows, that's a known rough edge, not necessarily something you broke.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| IMAGESopt | IMAGE | โ | |
| AUDIOopt | AUDIO | โ | |
| audio_pathopt | STRING | โ | |
| video_pathopt | STRING | โ | |
| fpsopt | FLOAT | 30.01โ120 | โ |
Outputs (4)
| Name | Type | Description |
|---|---|---|
| video_path | STRING | โ |
| video_duration | FLOAT | โ |
| fps | FLOAT | โ |
| number_of_frames | INT | โ |