PuppetFace ▸ Save Video
The unglamorous MP4 saver that finishes every PuppetFace chain
- images
- video_path
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.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| images | IMAGE | — | |
| fps | FLOAT | 24.001–120 | — |
| filename_prefix | STRING | PuppetFace | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| video_path | STRING | — |