Save Video X
A real h264/h265/AV1 encoder that drops into your Video Helper Suite chain
- images
- audio
- vae
- Filenames
ComfyUI's built-in video output options are a WebP that browsers can play and not much else. When you actually want an MP4 you can send someone - real h264, h265, or AV1 - most people reach for Video Helper Suite and its ffmpeg backend. Save Video X is the WorkflowX take on that job, and it's deliberately compatible: it speaks the same VHS_FILENAMES output contract, so it drops straight into preview and upload chains built for VHS without rewiring anything.
What it is
An output node in WorkflowX/Video that takes an IMAGE batch, encodes each frame through ffmpeg, and writes a real video file. It sits at the end of any frame-producing pipeline: an AnimateDiff or Wan batch, an image-to-video model, or just a pile of frames you want turned into a clip. Whatever made the frames, this is the step that makes them a file.
How it works
The node shells out to ffmpeg with per-format encoder settings: libx264 for h264 MP4, libx265 for h265 MP4, libsvtav1 for AV1 WebM. It finds ffmpeg in a sensible order - a WORKFLOWX_FORCE_FFMPEG_PATH or VHS_FORCE_FFMPEG_PATH env var if you set one, then the ffmpeg binary bundled with imageio_ffmpeg (which most ComfyUI installs already have), then a system ffmpeg on PATH. The pack itself declares zero pip dependencies, so it leans on whatever ffmpeg is already lying around rather than forcing you to install anything.
The legacy defaults are a dead giveaway of where this node comes from: frame_rate defaults to 8 and filename_prefix to "AnimateDiff" - the Video Helper Suite / AnimateDiff convention, preserved so existing workflows keep working. Files save to your output folder with the usual counter (e.g. AnimateDiff_00001.mp4).
The inputs that matter
- images - your frame batch. It also accepts latents if you connect the optional vae input (that's the "compatibility input" - feed the VAE when you're handing it latent tensors and it decodes for you).
- format -
video/h264-mp4,video/h265-mp4, orvideo/av1-webm. Pick h264 for maximum compatibility, AV1 for the best size at good quality (note its pixel format defaults to 10-bit). - frame_rate - 1 to whatever; 8 is the legacy default, most motion looks fine at 12–16.
- crf_quality - a 10-step ladder from Draft (CRF 30) to Lossless. Standard (CRF 23) is a great everyday default; drop to Good/High if you're keeping the file.
- pixel_format - 8-bit
yuv420por 10-bityuv420p10le. 10-bit keeps gradients cleaner if your whole chain supports it. - audio (
AUDIO, optional) - mux it in: AAC for MP4, Opus for WebM. Plus audio_bitrate and an audio_filters string if you need to shape the track. - save_metadata_preview_image - writes a preview PNG alongside, in the same spirit as ComfyUI stuffing the workflow into the PNG. Nice-to-have for a quick look without opening the video.
- save_output - flip this off and it writes to the temp folder instead, handy for throwaway previews that shouldn't clutter your output directory.
Output
Filenames (VHS_FILENAMES) - file descriptors compatible with video-preview consumers. Wire it to a VHS preview or upload node and the encoded file appears in your UI as if VHS itself had written it.
Installing and troubleshooting
Pack-level, it's the usual:
cd ComfyUI/custom_nodes
git clone https://github.com/haroonaslam/WorkflowX-Configurator
or search "WorkflowX Configurator" in ComfyUI Manager, then restart and hard-refresh.
The classic failure is a "No valid ffmpeg found" error at execution - it means none of the four ffmpeg sources turned up, usually because your ComfyUI venv lacks imageio_ffmpeg and ffmpeg isn't on PATH. Fix: pip install imageio-ffmpeg into ComfyUI's environment, or install ffmpeg system-wide. Second gotcha: not every ffmpeg build has every encoder. libsvtav1 is a common omission, so if AV1 errors with "encoder not found," fall back to h264 rather than hunting for a new binary. Everything else - frame shape mismatches, unsupported codec settings - fails with an actionable message at execution time rather than silently, which is more than most save nodes bother with. One honest note: this pack is young and barely has a community footprint, so there's no battle-tested hive mind behind it yet. For a critical job, VHS remains the safe, boring choice; for a VHS-compatible encoder with cleaner controls and zero extra installs, this is genuinely worth a try.
Inputs (13)
| Name | Type | Default | Description |
|---|---|---|---|
| images | IMAGE | — | |
| frame_rate | FLOAT | 8 | — |
| filename_prefix | STRING | AnimateDiff | — |
| format | COMBO | video/h264-mp4 | 3 options: video/av1-webm, video/h264-mp4, video/h265-mp4 |
| crf_quality | COMBO | Standard (CRF 23) | 10 options: Draft (CRF 30), Standard (CRF 23), Good (CRF 20), High (CRF 18), Very High (CRF 16), Ultra (CRF 14), +4 |
| pixel_format | COMBO | yuv420p (8-bit) | 2 options: yuv420p (8-bit), yuv420p10le (10-bit) |
| color_range | COMBO | Auto (format default) | 3 options: Auto (format default), Full / pc, Limited / tv |
| save_metadata_preview_image | BOOLEAN | true | — |
| audio_bitrate | COMBO | Source/default | 7 options: Source/default, 96k, 128k, 160k, 192k, 256k, +1 |
| audio_filters | COMBO | [] | 10 options: Denoise light, De-click, High-pass rumble cut, Low-pass hiss cut, De-esser light, Presence boost, +4 |
| save_output | BOOLEAN | true | — |
| audioopt | AUDIO | — | |
| vaeopt | VAE | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| Filenames | VHS_FILENAMES | — |