Nodes/ComfyUI-PainterNodes/Painter Video Combine 3
ComfyUI Node

Painter Video Combine 3

The save node that muxes your soundtrack and hides its own settings

By princepainter·Created 9 months ago·Updated 10 days ago· 205
Painter Video Combine 3
  • images
  • audio
  • frame_count
  • frame_rate
◄frame_rate24.0►
◄format▾►
◄filename_prefixVideo►
◄save_workflow_infotrue►

Every video workflow ends the same way: you have a batch of frames, and you want a file you can actually watch. In 2026 that file also has to carry a soundtrack, because the current generation of video models - MiniMax H3 most prominently - emits audio in the same pass as the picture. Combines that only know about images leave that audio stranded.

Painter Video Combine 3 is that last node. images in, optional audio in, an mp4 / webm / gif out in ComfyUI/output. It's a leaner sibling of VHS's Video Combine from the same lineage (the pack's README credits the VHS codebase directly), and it ships in three near-identical flavours - 1, 2 and 3 - where the differences are entirely about the buttons on the front of the node.

What it writes

The format dropdown is video/h264-mp4, video/webm or image/gif, and they're not equivalent choices. MP4 gets libx264 with yuv420p at crf 18 and the faster preset: sane quality, fast encode, plays everywhere. WebM is VP9 at crf 30 - much slower to encode, smaller file. GIF goes through a two-pass palette filter and looks like a GIF. Default to mp4 unless something is actively rejecting it.

frame_rate defaults to 24 and is playback speed, not a re-render: it decides how fast the frames you already have get played back, so it's the single most common cause of "why is my video in fast-forward." filename_prefix (default Video) is the name stem in the output folder, and save_workflow_info (on by default) is the one to leave alone.

The frame_count (INT) and frame_rate (FLOAT) outputs are the numbers the node actually used - wire frame_count into a note, an overlay, or a downstream check instead of guessing.

How it works under the hood

It shells out to ffmpeg with a raw RGB24 stream piped to stdin, resolving the binary the same way its sibling loader does - imageio_ffmpeg first, then ffmpeg on PATH. Frames are NaN-clamped, clipped to 0–1, converted to 8-bit, and any odd width or height is rounded down to even, because yuv420p needs even dimensions. A 1023-pixel-wide batch becomes 1022 with no complaint.

Audio is written to a temp WAV through soundfile and muxed as AAC for mp4 or Vorbis for webm. There's a detail in the source that's worth knowing because it's the bug that eats the final frame in other combine nodes: the audio track is deliberately padded by a fraction of a frame before -shortest trims it, so the encoder can't decide your video ended 0.008 seconds early and drop the last frame. Shorter audio gets padded; longer audio gets trimmed to the picture.

When save_workflow_info is on, the node writes your prompt and workflow into an ffmpeg metadata file and feeds that file in as the first input, which is how the values end up copied into the output container. The clip carries its own recipe, the same way a ComfyUI PNG does - useful for archival, and the reason to turn it off before sharing clips containing prompts you'd rather not publish. Note the audio input is only meaningful for mp4 and webm; GIF has nowhere to put a soundtrack, so leave it unwired there.

The buttons, and why the widgets are missing

Out of the box this node shows you almost no settings: frame_rate, format, filename_prefix and save_workflow_info are hidden by default. There's an eye icon in the button row at the top that toggles them into view. Hiding is cosmetic - the values still submit and still serialize into your workflow, which the front-end code goes out of its way to guarantee.

The other two buttons are workspace controls: ⟳ restarts every Painter video preview in the workspace from the beginning, and ⏸/▶ pauses all of them at once, so you can eyeball several renders side by side. That button row is drawn as a real DOM overlay rather than painted on the canvas, which is why it keeps working in ComfyUI's Nodes 2.0 Vue renderer - the frontend rewrite that broke a pile of third-party node UIs.

Install

Search PainterNodes in ComfyUI Manager, or:

cd ComfyUI/custom_nodes
git clone https://github.com/princepainter/ComfyUI-PainterNodes
cd ComfyUI-PainterNodes && pip install -r requirements.txt

Restart after. requirements.txt only pulls soundfile and numpy, but this node needs an ffmpeg binary - the bundled imageio_ffmpeg one or a system install. Without either, the process fails carrying ffmpeg's own stderr, which is at least an honest error message.

Where people get burned

Wrong frame_rate. The render looks sped up or sludgy and nothing is broken. 124 frames at 24fps is 5.2 seconds; the same 124 at 16fps is 7.75. Change this field before you debug anything else.

Very long or very high-res combines. The source waits on the encoder with a 60-second timeout, so this is a node for normal-length clips, not a ten-minute 4K render. If a combine fails on a big job, split it.

Nothing in the output folder. The node writes to ComfyUI/output only, and it actively refuses paths that resolve outside it. Check the filename_prefix before assuming the render failed - and the console prints the frame count and final filename when it succeeds.

A workflow upgrade changed the menu. Painter Video Combine 2 and 3 are the same backend with different overlays, and the pack adds and removes nodes between releases. Commit-pin the install if a workflow matters.

CategoryPainter/Video

Inputs (6)

NameTypeDefaultDescription
imagesIMAGE—
frame_rateFLOAT24.01–240—
formatCOMBO3 options: video/h264-mp4, video/webm, image/gif
filename_prefixSTRINGVideo—
save_workflow_infoBOOLEANtrue—
audiooptAUDIO—

Outputs (2)

NameTypeDescription
frame_countINT—
frame_rateFLOAT—