Painter Video Combine 2
Two buttons that stop your six previews fighting each other
- images
- audio
- frame_count
- frame_rate
Queue a clip, like it, queue a variant, queue a third take - now four previews loop out of phase and you can't compare any two. Painter Video Combine 2 exists for that annoyance: an ffmpeg save node with two buttons that reset or pause every Painter preview in the graph at once.
What it is, and where it sits in a workflow
It's the last node in a video graph: feed it the IMAGE batch your sampler or decoder produced, pick a container, get a real file in ComfyUI/output/. It belongs to PainterNodes, a one-author pack aimed at MiniMax H3, LTX, Wan 2.2 and Bernini workflows - nine of its eleven example workflows end in a Painter combine node, so if you run those graphs this is already on the end of the wire.
Honest framing: the encoding half isn't new science. Kosinkadink's VideoHelperSuite "Video Combine" has been the community default for years, and this is a cleaned-up take on the same idea - the interesting part is the UI. The older PainterVideoCombine is untouched, so both coexist.
How it actually works
The Python side clips frames to 0–1, converts NaN/Inf to sane values, casts to uint8, and pipes raw rgb24 to an ffmpeg subprocess on stdin. Settings are hardcoded per format: libx264/yuv420p, CRF 18, faster preset for mp4; libvpx-vp9 CRF 30 for webm; the classic two-pass palettegen+paletteuse chain for GIF. The ffmpeg binary comes from imageio_ffmpeg when that package imports, else plain ffmpeg on your PATH - it isn't in the pack's requirements.txt because ComfyUI core ships it.
Two more details. Width and height get rounded down to even numbers, because H.264 won't take odd dimensions - a 1025px-wide decode quietly becomes 1024 and you lose a column rather than getting an error. And audio is written to a temp WAV with soundfile, muxed with -shortest, and padded or trimmed to picture length, with epsilon padding so a slightly-short track can't steal your last frame.
The part that's actually new
The first line of the node carries two small buttons, ⟳ and ⏸/▶, matching the right-click "Sync preview" action. Press ⟳ and every PainterVideoCombine and PainterVideoCombine2 node in the graph jumps to frame zero and replays together, so takes line up instead of drifting. Press ⏸ and they all freeze together - the button turns red and flips to a play icon. GIF previews get their URL cache-busted to restart the animation.
They're real DOM elements in an overlay, not drawn on the LiteGraph canvas - which is why they survive the Nodes 2.0 Vue rewrite that broke so many custom node UIs. Decent foresight for a one-person pack.
Inputs and outputs that matter
images- theIMAGEbatch. Required, and the whole point.frame_rate- default 24, range 1–240. Set your model's native rate, not a nice-looking one: Wan 2.2 output is 16fps, LTX runs 25–30. Leave 24 on a Wan clip and playback is visibly sped up.format-video/h264-mp4,video/webm, orimage/gif.filename_prefix- defaultVideo. A slash in the prefix writes to a subfolder ofoutput/; files land asVideo_00001_.mp4with an auto-incrementing counter.save_workflow_info(on by default) - embeds prompt and graph as an ffmpeg metadata comment, the video cousin of the chunks a ComfyUI PNG carries. Handy locally; most platforms strip it on upload.audio(optional) - anAUDIOinput. With one connected, mp4 gets AAC and webm gets Vorbis. GIF never gets audio.
The outputs are frame_count (INT) and frame_rate (FLOAT), there so you can feed another node those numbers without retyping them in a Primitive. Since this is an output node, it always runs and the cache works backward from it - muting it won't stop anything upstream.
Install
Easiest path is ComfyUI Manager: search PainterNodes and install. Otherwise:
cd ComfyUI/custom_nodes
git clone https://github.com/princepainter/ComfyUI-PainterNodes
cd ComfyUI-PainterNodes && pip install -r requirements.txt
Then restart ComfyUI. The dependency list is just soundfile and numpy - no CUDA extensions, no model downloads, nothing to drop into models/. The README also offers a release download; either way the folder name doesn't matter as long as it's under custom_nodes.
Gotchas
The 60-second encode timeout. The ffmpeg call has a hard timeout=60, so a long high-res export - or VP9, which is slow - can fail instead of writing your file. Short clips are fine; encode minutes elsewhere.
"FFmpeg failed" with no other clue. The binary wasn't findable; the real stderr is in your console. pip install imageio-ffmpeg in ComfyUI's environment fixes it, as does a system ffmpeg on PATH.
Audio length surprises. Longer audio is trimmed, shorter padded with silence. Right for lip-sync, quietly destructive for a music bed that outlasts the clip.
Sync stops at the Painter border. The buttons only touch PainterVideoCombine nodes - mix in a VHS combine for comparison and its preview keeps looping on its own.
Inputs (6)
| Name | Type | Default | Description |
|---|---|---|---|
| images | IMAGE | — | |
| frame_rate | FLOAT | 24.01–240 | — |
| format | COMBO | 3 options: video/h264-mp4, video/webm, image/gif | |
| filename_prefix | STRING | Video | — |
| save_workflow_info | BOOLEAN | true | — |
| audioopt | AUDIO | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| frame_count | INT | — |
| frame_rate | FLOAT | — |