Nodes/msch-comfyui-nodes/PuppetFace ▸ Save Video
ComfyUI Node

PuppetFace ▸ Save Video

The unglamorous MP4 saver that finishes every PuppetFace chain

By mariobilly·Created a day ago·Updated a day ago· 0
PuppetFace ▸ Save Video
  • images
  • video_path
fps24.00
filename_prefixPuppetFace

Not every node gets to be the flashy one. PuppetFaceSaveVideo (display "PuppetFace ▸ Save Video") is the reliable friend at the end of the graph: you hand it an IMAGE batch and an fps, it writes a uniquely numbered MP4 into ComfyUI's output directory and tells you the path. It exists because the PuppetFace component - the landmark/cursor overlay system in the MSCH Nodes pack - ships its own self-contained video encoding so the whole "face tracking graphics" workflow runs without you reaching for a separate video-suite pack. Keep that in mind: if you already have a video pipeline you love, this node is skippable; it's there so the PuppetFace chain doesn't depend on one.

How it works

It's deliberately minimal: OpenCV's mp4v writer encodes your frames to a new, never-clobbering file (PuppetFace_0001.mp4, _0002, …) in the output folder, prefixed by filename_prefix. The fps input is the one knob that actually matters - feed it the effective frame rate of your source (the pack's PuppetFaceLoadVideo exposes fps precisely for this) or playback speed comes out wrong. It does not mux audio - if your source clip had a soundtrack, save it separately and combine in an editor. The single output is video_path (a STRING you can feed to other path-consuming nodes), and because it's an output node it also shows the saved filename in the UI so you know where it went.

Wiring it

The canonical PuppetFace graph:

PuppetFaceLoadVideo → PuppetFaceOverlay → PuppetFaceSaveVideo
        └──────── fps ────────────────┘

Load the clip, draw the landmark dots and tracking cursor, save the result. The fps wire is the one connection beginners forget - the loader knows the clip's real rate (accounting for any select_every_nth subsampling), and if you let SaveVideo default to 24 fps on a 30 fps clip, everything plays back 25% slow.

Install

One of 35 nodes in the unified MSCH Nodes pack - no separate install, no models:

cd ComfyUI/custom_nodes
git clone https://github.com/mariobilly/msch-comfyui-nodes.git
cd msch-comfyui-nodes
python -m pip install -r requirements.txt

(Or ComfyUI Manager: search "MSCH Nodes" / msch-comfyui-nodes, then restart.) opencv-python comes with the pack's requirements, so the mp4v writer is ready on first run.

Gotchas

The short list: forgetting the fps wire (playback speed), expecting audio in the file (not there - it's video-only by design), and hunting for your output in the wrong folder (ComfyUI's output directory, under your install - not next to your input file). If you're encoding frames that came from a higher-resolution source, mind your RAM: unlike the pack's slideshow engine, this saver receives the whole batch at once, so a 4K clip at hundreds of frames is a lot of tensors. And for output that needs to play everywhere, mp4v is fine; if you specifically need H.264 with audio, route the images output to your usual video encoder instead of this node.

CategoryPuppetFace

Inputs (3)

NameTypeDefaultDescription
imagesIMAGE
fpsFLOAT24.001–120
filename_prefixSTRINGPuppetFace

Outputs (1)

NameTypeDescription
video_pathSTRING