Video Tools Pixaroma
Join, trim and loop eight clips without opening an editor
- music
- video_1
- audio_1
- video_2
- audio_2
- video_3
- audio_3
- video_4
- audio_4
- video_5
- audio_5
- video_6
- audio_6
- video_7
- audio_7
- video_8
- audio_8
- video_frames
- audio
- frame_count
- fps
- duration
Four seconds at a time gets old
Every open video model hands you a fragment. MiniMax H3 does 4–15 second clips at 24fps with native stereo audio, LTX does seconds-long drafts, Wan takes minutes per clip for a shot that still isn't a scene. The moment you want an actual video - three shots, a bit of music, a fade at the end - you're joining, trimming, looping, and guessing whether the audio still lines up.
Video Tools Pixaroma is that whole step as one node. Wire up to eight clips of frames plus their sound, set what you want done on the face, and it hands you finished frames and finished audio already matched to each other. Then Save Video writes the mp4.
How it works
All of it happens in memory on frame tensors - no ffmpeg pass in the middle, no re-encode generation loss. The clever part is the audio rule: frame f of a clip corresponds to sample round(f * rate / fps). Cut, crossfade, reverse, loop, fade - each is computed on the sound at the matching samples, so the audio comes out exactly as long as the video. That's the bit that goes wrong by hand.
Clips are normalised to the first clip's geometry first; you can't add a 720p tensor to a 1024p one. Size handling is fill (cover and crop), fit (letterbox in black) or stretch. After that:
- Joins are
cut,crossfade(frames blended over N frames, and the sound crossfades too) orblack(dip out, then back in). - Colour match shifts each clip's colour and brightness so its opening frames line up with the previous clip's tail, at strength 0–100. That fixes "shot two is mysteriously greener", which is most of what joining model output actually is.
- Loop is repeat, ping-pong (boomerang) or seamless, where the tail is blended into the head so the loop point doesn't pop.
- Fades in and out are counted in frames, not seconds.
One detail worth trusting: a crossfade into a clip can't reach back into the crossfade that came into it, so a short middle clip doesn't show clip 1 bleeding through clip 3. That was a real bug, fixed in the 25 October build.
The inputs and outputs that matter
Everything is optional in the schema, which reads odd and is deliberate: you wire what you have. video_1 … video_8 (IMAGE) are the clips; audio_1 … audio_8 (AUDIO) are their sound, and a clip without audio is simply silent for its span. A new pair of slots appears as you fill the previous one, so the node isn't twelve sockets wide on sight.
fps is an optional FLOAT and it's wire-only. Wire it from Load Video Pixaroma. If you don't, the node uses the fps stepper on its face, defaulting to 24 - H3's rate. This is the setting people get wrong, because a wrong fps doesn't error; it desyncs everything and gives you the wrong duration. music is one song under the whole finished video, cut to its length with the fades applied - song alone, or mixed under the clips' own sound.
Outputs: video_frames and audio into Save Video (or Save Mp4), plus frame_count, fps (the same value as the input) and duration in seconds. Wire that fps output into Save Video; don't retype it. After a run the node draws the clips on a timeline with a small moving preview, so you can see what the trims did without a round trip to disk.
Install
Manager search for Pixaroma works, but Manager serves the old 1.4.144, so this node won't be there. Switch Pixaroma to nightly in Manager, use the Windows Easy-Install (it ships the pack), or:
cd ComfyUI/custom_nodes
git clone https://github.com/pixaroma/ComfyUI-Pixaroma
Restart, then Ctrl+Shift+R in the browser.
The pack's requirements.txt is one line: imageio-ffmpeg, a bundled ffmpeg binary. That's for the save/load side of the pack, not this node - this one works on tensors. Which leads to the real gotcha: the author's changelog says to update the video nodes through Manager or your launcher, not git pull on its own, because a bare pull skips the dependency install and leaves you with nodes that load fine and can't save.
Where people get burned
No fps field. There isn't one - fps only accepts a wire. The number you can click is in the node's settings panel.
The result is shorter than the sum of the clips. Crossfade overlaps frames; that's the point. duration tells you the truth.
Different resolutions across clips. They're forced to clip 1's size, so put the clip whose framing you trust first. Fill crops heads off vertical clips, fit letterboxes them - pick on purpose.
Long videos and free RAM. Everything is a float tensor in memory. The node accepts up to 100,000 frames, which is not a promise your machine will. Downscale first.
Clips from different models drift in colour. Turn on colour match before reaching for a grading node. If your clips were matched already and the look goes flat, lower the strength instead.
If something genuinely misbehaves, the GitHub and GitLab issue trackers are closed - the author routes everything to #pixaroma-nodes on Discord. Inside ComfyUI, Alt+H opens help with a page per node that's more current than any blog post.
Inputs (18)
| Name | Type | Default | Description |
|---|---|---|---|
| fpsopt | FLOAT | Optional. The frames per second of the clips: wire fps from Load Video Pixaroma. Not wired, the fps set on the node is used (MiniMax H3 makes 24). | |
| musicopt | AUDIO | Optional. One song (or any sound) under the WHOLE finished video, from its start, cut to the video's length, with the fades. On the node: the song alone, or with the clips' own sound. Trim where the song starts with Load Audio Pixaroma. | |
| video_1opt | IMAGE | Clip 1: the frames of a video (IMAGE), for example video_frames from Load Video Pixaroma or the frames out of a video model's VAE Decode. | |
| audio_1opt | AUDIO | Optional. The sound of clip 1 (AUDIO). Clips without sound are silent while they play. | |
| video_2opt | IMAGE | Clip 2: the frames of a video (IMAGE), for example video_frames from Load Video Pixaroma or the frames out of a video model's VAE Decode. | |
| audio_2opt | AUDIO | Optional. The sound of clip 2 (AUDIO). Clips without sound are silent while they play. | |
| video_3opt | IMAGE | Clip 3: the frames of a video (IMAGE), for example video_frames from Load Video Pixaroma or the frames out of a video model's VAE Decode. | |
| audio_3opt | AUDIO | Optional. The sound of clip 3 (AUDIO). Clips without sound are silent while they play. | |
| video_4opt | IMAGE | Clip 4: the frames of a video (IMAGE), for example video_frames from Load Video Pixaroma or the frames out of a video model's VAE Decode. | |
| audio_4opt | AUDIO | Optional. The sound of clip 4 (AUDIO). Clips without sound are silent while they play. | |
| video_5opt | IMAGE | Clip 5: the frames of a video (IMAGE), for example video_frames from Load Video Pixaroma or the frames out of a video model's VAE Decode. | |
| audio_5opt | AUDIO | Optional. The sound of clip 5 (AUDIO). Clips without sound are silent while they play. | |
| video_6opt | IMAGE | Clip 6: the frames of a video (IMAGE), for example video_frames from Load Video Pixaroma or the frames out of a video model's VAE Decode. | |
| audio_6opt | AUDIO | Optional. The sound of clip 6 (AUDIO). Clips without sound are silent while they play. | |
| video_7opt | IMAGE | Clip 7: the frames of a video (IMAGE), for example video_frames from Load Video Pixaroma or the frames out of a video model's VAE Decode. | |
| audio_7opt | AUDIO | Optional. The sound of clip 7 (AUDIO). Clips without sound are silent while they play. | |
| video_8opt | IMAGE | Clip 8: the frames of a video (IMAGE), for example video_frames from Load Video Pixaroma or the frames out of a video model's VAE Decode. | |
| audio_8opt | AUDIO | Optional. The sound of clip 8 (AUDIO). Clips without sound are silent while they play. |
Outputs (5)
| Name | Type | Description |
|---|---|---|
| video_frames | IMAGE | The finished frames. Wire them into Save Video (or Save Mp4) to save the video. |
| audio | AUDIO | The finished sound, exactly as long as the frames. Nothing comes out when no clip had sound. |
| frame_count | INT | How many frames the finished video has. |
| fps | FLOAT | The frames per second, the same as the fps input. Wire it into Save Video's fps. |
| duration | FLOAT | How long the finished video is, in seconds. |