VideoPartial CaptureComfyUI-VideoHelperSuite

VHS_VideoCombine (Video Combine)

class_type: VHS_VideoCombine

Source repoVerified against ComfyUI-VideoHelperSuite v1.7.9 · 2026-08-02

Combines a batch of frames into a video file — the standard video-output node for ComfyUI animation workflows. Choose video/h264-mp4 with yuv420p for the broadest playback compatibility; WebM, AV1, ProRes, FFV1, GIF, and WebP cover web, archival, and preview needs.

What It Does

VHS_VideoCombine is the video equivalent of SaveImage: it takes a batch of frames and encodes them into a video file. Feed it images (or latents plus a VAE to decode inside the node), set frame_rate (default 8), pick a format, and queue. For the broadest playback compatibility, start with video/h264-mp4, pix_fmt yuv420p, and the default crf 19.

The format dropdown is dynamic. image/gif and image/webp are always available via Pillow; the FFmpeg-backed formats — H.264/H.265 MP4, WebM, AV1, ProRes, lossless FFV1, PNG sequences, and NVENC hardware variants — only appear when a usable FFmpeg binary is found, and each reveals its own quality widgets (crf, pix_fmt, save_metadata, trim_to_audio, bitrate, profile) when selected.

One run can produce several files: a first-frame PNG carrying full ComfyUI metadata, the silent video, and — when audio is wired — a second file ending in -audio with the sound muxed in. The Filenames output returns all of these in order; the last path is the final video.

With save_metadata on (the default for the main formats), the prompt and workflow are also embedded in the container itself. That embedded metadata is fragile, though: editors, transcodes, and platform uploads routinely strip it, and its exact behavior has changed across VideoHelperSuite releases. Numonic therefore records the link between the rendered video, its source workflow, models, seeds, and prompts independently of what survives inside the file.

Inputs

imagesIMAGE | LATENT

Batch of frames to combine. Accepts decoded images, or latents when a VAE is wired to the optional vae input.

frame_rateFLOAT/INT

Output frame rate in fps (default 8, minimum 1). Must be a single number — wiring a per-frame value list causes an FFmpeg "unable to parse option value as video rate" error.

loop_countINT

Playback repeats (default 0). For GIF/WebP, 0 means loop forever; for FFmpeg video formats, a value above 0 applies a loop filter.

filename_prefixSTRING

Output filename prefix (default "AnimateDiff"). May include relative subfolders; avoid characters your OS forbids in paths.

formatENUM

Container/codec choice. Always includes image/gif and image/webp; FFmpeg-backed formats appear only when a usable FFmpeg binary is detected. Selecting a format reveals its own dynamic widgets (crf, pix_fmt, save_metadata, trim_to_audio, bitrate, profile…).

pingpongBOOLEAN

Appends reversed playback after the forward pass (default false). Not compatible with meta_batch runs.

save_outputBOOLEAN

true (default) saves to the ComfyUI output directory; false writes to the temporary directory instead.

audioAUDIOoptional

Standard ComfyUI AUDIO. When wired, the node writes the silent video first, then a second "-audio" file with sound muxed in — that file becomes the final output. Legacy VHS_AUDIO connections from old workflows fail validation.

meta_batchVHS_BatchManageroptional

Splits very long frame streams across queued executions to avoid running out of memory. GIF/WebP and pre-pass formats are rejected in batch mode; use the same manager on the upstream loader.

vaeVAEoptional

Decodes latent input to frames inside the node. Ignored when images are already decoded.

Outputs

FilenamesVHS_FILENAMES

Ordered list of every file written this run (metadata PNG, silent video, "-audio" mux) plus the save_output flag. The final video is the last path. No separate fps/duration/resolution outputs exist.

Format Options

FormatOutputDynamic controlsBest for
video/h264-mp4.mp4 — libx264 + AAC audiocrf (default 19), pix_fmt yuv420p/yuv420p10le, save_metadata, trim_to_audioThe compatibility default — plays everywhere, previews in ComfyUI
video/h265-mp4.mp4 — libx265 + AAC audiocrf (default 22), pix_fmt, save_metadata, trim_to_audioSmaller files than H.264; ComfyUI browser preview may show blank
video/webm.webm + Vorbis audiocrf (default 20), pix_fmt incl. alpha (yuva420p), save_metadataWeb delivery, including transparency
video/av1-webm.webm — SVT-AV1 + Opus audiocrf (default 23), 10-bit pix_fmt, input_color_depthBest compression; slow encodes, check decoder support
video/ProRes.mov — prores_ks + PCM audioprofile: lt / standard / hq / 4444 / 4444xqEditing and interchange; 4444 profiles carry alpha
video/ffv1-mkv.mkv — lossless FFV1 + FLAC audioFFV1 tuning, pixel formatArchival/lossless masters, not browser delivery
video/nvenc_h264-mp4 · nvenc_hevc-mp4 · nvenc_av1-mp4.mp4 — NVIDIA hardware encoders + AAC audiobitrate (instead of crf), pix_fmt, save_metadataFast encodes on supported NVIDIA GPU + driver + FFmpeg builds
video/8bit-png · video/16bit-pngNumbered PNG image sequenceBit depth via format choiceLossless frames for compositing — not a single playable file
image/gif · image/webpAnimated GIF/WebP via Pillowlossless toggle (webp); frame timing ≈ 1000 ÷ frame_rate msQuick short previews; incompatible with meta_batch
video/ffmpeg-gif · video/gifskiHigher-quality GIF pathsDither controls / gifski quality (default 90)Better GIF palettes; gifski appears only when installed

What Numonic Captures

  • Frame rate, format, codec, and quality settings (crf, pix_fmt) from the workflow graph
  • Frame count (from input batch size)
  • Prompt and workflow JSON embedded in supported containers when save_metadata is on (verified against VideoHelperSuite 1.7.9)
  • First-frame metadata PNG saved alongside the video output

Known Gaps

  • Embedded container metadata is fragile — editors, transcodes, and platform uploads routinely strip it, and behavior differs across VideoHelperSuite versions (metadata bugs were fixed as recently as May 2026)
  • The "-audio" derivative and intermediates can diverge from the silent encode’s metadata on older pack versions
  • Individual frame provenance is lost in the combined output
  • The audio source is not tracked

Troubleshooting

VHS_VideoCombine is missing, red, or "node type not found"

The node ships in ComfyUI-VideoHelperSuite, not ComfyUI core. Install or update the pack via ComfyUI Manager, fully restart ComfyUI, and check the startup console for a VideoHelperSuite import error — an installed pack can still fail to import due to a Python dependency conflict (opencv version clashes with packs like ReActor are a known cause).

Full fix guide: Node types were not found (red nodes) · Custom node import failed

Only GIF and WebP appear in the format dropdown

VideoHelperSuite hides FFmpeg-backed formats when it cannot find a usable FFmpeg binary. Install imageio-ffmpeg into the same Python environment that launches ComfyUI (portable installs use their own embedded Python), or put a current FFmpeg build on the PATH. Restart and check the startup log for the FFmpeg path it selected.

FFmpeg subprocess error: unknown encoder or "unrecognized option crf"

An old, minimal, or differently-compiled FFmpeg is being invoked — often a stale system-wide binary shadowing the bundled one. Check the exact binary path printed at ComfyUI startup and its encoder list. For the broadest fallback, select video/h264-mp4 with yuv420p; NVENC, HEVC, and AV1 need hardware, drivers, and an FFmpeg build that includes those encoders.

The file saves but the ComfyUI preview is blank

Confirm the output plays outside ComfyUI first. Browser preview support is narrower than encode support — H.265 and 10-bit pixel formats commonly save fine but preview empty. Re-encode with video/h264-mp4 + yuv420p as an in-browser diagnostic.

Audio is out of sync, trimmed, or the video has no sound

Expected video duration is frame_count ÷ frame_rate — compare that against your audio length. The node muxes audio after encoding the silent video: with trim_to_audio false (the default) audio is padded then cut with -shortest; with it true, no padding is applied. Also make sure the audio socket is actually wired and the source really contains an audio track.

Validation error: "Return type mismatch: VHS_AUDIO != AUDIO"

Older workflows used the legacy VHS_AUDIO type; current VideoHelperSuite expects standard ComfyUI AUDIO. Update the pack, then delete and re-add the VHS_VideoCombine node (and any old audio-loader nodes) so the sockets pick up the current types.

Full fix guide: Prompt outputs failed validation

Out of memory on long or high-resolution videos

Wire a VHS_BatchManager into meta_batch (and into the upstream VHS loader) so frames stream across multiple queued executions, and lower the loader frame batch size. Streamable formats like H.264 work in batch mode; GIF/WebP and pre-pass formats do not.

Exception: "Got unsupported ScalarType BFloat16"

An upstream node (some video VAEs and wrappers) is emitting BFloat16 frame tensors, which the frame conversion cannot process. Cast frames to fp16/fp32 before the node, or set the upstream VAE decode to a standard float mode.

Extension Pack: ComfyUI-VideoHelperSuite

This node is not built into ComfyUI. It requires the ComfyUI-VideoHelperSuite custom node package. Numonic detects and extracts metadata from this extension when it appears in workflows.

Related Nodes

Frequently Asked Questions

Quick answers about the Video Combine (VHS) node.

Keep the workflow behind every video

Container metadata is fragile — one transcode or platform upload and the embedded workflow is gone. Numonic links every render to its source workflow, models, seeds, and prompts, independently of what survives inside the file.