ComfyUI Video Combine Node: Every Setting, CRF and Loop Count
Every input of the Video Combine node with its default, what crf does per format, loop_count, pingpong, ffmpeg errors, and when native Save Video is enough.
Quick answer
The ComfyUI Video Combine node is not built into ComfyUI. It comes from ComfyUI-VideoHelperSuite by Kosinkadink (node id VHS_, shown as "Video Combine 🎥🅥🅗🅢"). It takes a batch of frames and writes a GIF, an animated WebP, or a video through ffmpeg. Its defaults date from the AnimateDiff era: frame_ 8, loop_ 0, filename_ "AnimateDiff", pingpong off, save_ on. For an H.264 MP4, pick video/. That format's crf defaults to 19, and lower means better quality and bigger files.
Two things trip people up most:
- Set
frame_to the model's rate. The default 8 plays a Wan 2.2 14B clip, made for 16 fps, at half speed and twice the length.rate - The
video/formats need ffmpeg. Without it the run stops with* ffmpeg is required for video outputs and could not be found.
You may not need the node at all. Since v0.3.31 (May 2025), ComfyUI has its own Create Video and Save Video nodes, and every Wan 2.2 template it ships uses them. Video Combine is still the node for GIFs, H.265, ProRes, NVENC encoding, pingpong and loop_.
We read VideoHelperSuite's source at its latest commit (4d907be, 2026-09-02), ComfyUI 0.39.0's source (released 2026-10-05), the official templates and the ffmpeg encoding guides on 2026-10-10. We have not timed any encode or measured file sizes ourselves.
The node and its version
| Item | Value |
|---|---|
| ItemRepository | ValueKosinkadink/ |
| ItemVersion | Value1.7.9 in pyproject, the latest on the Comfy Registry (2025-12-17) |
ItemLatest commit on main | Value4d907be, 2026-09-02 |
| ItemPython dependencies | Valueopencv-, imageio- |
| ItemLicence | ValueGPL-3.0 |
| ItemOutput | ValueFilenames (VHS_): whether save_ was on, plus every file |
If the node shows red in a downloaded workflow, the pack is not installed or did not import. Our missing nodes page covers both.
Every input, with its default
From videohelpersuite/:
| Input | Default | Range or options | What it does |
|---|---|---|---|
Inputimages | Default— | Range or optionsIMAGE or LATENT | What it doesThe frames |
Inputframe_ | Default8 | Range or options1 and up | What it doesFrames shown per second. Higher plays faster and shorter |
Inputloop_ | Default0 | Range or options0 to 100 | What it doesExtra repeats. Its meaning differs between image and video formats, see below |
Inputfilename_ | DefaultAnimateDiff | Range or optionsText | What it doesFile name; subfolder/ and %date:…% work as on Save Image |
Inputformat | Defaultfirst in list | Range or optionsimage/, image/, then the video/ formats | What it doesContainer and codec. Picking a video/ format adds its own widgets |
Inputpingpong | Defaultoff | Range or optionson, off | What it doesPlays forward, then backward, for a clean loop |
Inputsave_ | Defaulton | Range or optionson, off | What it doesOff writes to ComfyUI's temp folder instead of output/ |
Inputaudio | Defaultoptional | Range or optionsAUDIO | What it doesMuxed into a second file, see below |
Inputvae | Defaultoptional | Range or optionsVAE | What it doesTakes latents and decodes them in batches, which saves system RAM on long clips |
Inputmeta_ | Defaultoptional | Range or optionsMeta Batch Manager | What it doesSplits very long sequences into parts |
The vae input is not always faster. The node's own documentation warns that each Video Combine decodes again, and that changing any output setting re-runs the decode.
loop_ count and pingpong, exactly
- GIF and WebP (
image/, saved with Pillow):* loop_goes into the file's loop field. Pillow's documentation says 0 means loop forever. So the default 0 gives an endlessly looping GIF.count - Video formats (
video/):* loop_adds ffmpeg'scount loopfilter, which repeats the frames inside the file. 0 means play once; 2 means the clip appears three times and the file is three times as long. pingpongappends the frames in reverse, without repeating the first or last frame.Nframes become2N − 2: an 81-frame Wan clip becomes 160 frames.
The formats and their extra widgets
From the JSON files in video_. The first option of a list is its default.
| Format | Encoder | Quality control | Default | pix_ options | Other widgets |
|---|---|---|---|---|---|
Formatvideo/ | Encoderlibx264 | Quality controlcrf 0–100 on the node | Default19 | pix_fmt optionsyuv420p, yuv420p10le | Other widgetssave_, trim_ |
Formatvideo/ | Encoderlibx265 | Quality controlcrf 0–100 on the node | Default22 | pix_fmt optionsyuv420p10le, yuv420p | Other widgetssave_; preset fixed at medium |
Formatvideo/ | Encoderffmpeg's WebM default | Quality controlcrf 0–100 on the node | Default20 | pix_fmt optionsyuv420p, yuva420p (transparency) | Other widgetssave_, trim_ |
Formatvideo/ | Encoderlibsvtav1 | Quality controlcrf 0–100 on the node | Default23 | pix_fmt optionsyuv420p10le, yuv420p | Other widgetsinput_ (8bit, 16bit), save_ |
Formatvideo/ | Encoderh264_ | Quality controlbitrate 1–999 | Default10, in megabits | pix_fmt optionsyuv420p, p010le | Other widgetsmegabit (on), save_ |
Formatvideo/ | Encoderhevc_ | Quality controlbitrate 1–999 | Default10, in megabits | pix_fmt optionsyuv420p, p010le | Other widgetsmegabit (on), save_ |
Formatvideo/ | Encoderav1_ | Quality controlbitrate 1–999 | Default10, in megabits | pix_fmt optionsyuv420p, p010le | Other widgetsmegabit (on), save_ |
Formatvideo/ | Encoderprores_ | Quality controlprofile | Defaulthq | pix_fmt options— | Other widgetsProfiles lt, standard, hq, 4444, 4444xq |
Formatvideo/ | Encoderffv1 (lossless) | Quality control— | Default— | pix_fmt options24 options, default rgba64le | Other widgetslevel, coder, context, gop_, slices, slicecrc, trim_ |
Formatvideo/ | Encoderffmpeg GIF, generated palette | Quality controldither | Defaultsierra2_ | pix_fmt options— | Other widgetsNine dither modes |
Formatvideo/ | Encodergifski | Quality controlquality 1–100 | Default90 | pix_fmt options— | Other widgetsListed only if the gifski program is found |
Formatvideo/, video/ | EncoderPNG sequence | Quality control— | Default— | pix_fmt options— | Other widgetsOne numbered PNG per frame |
Formatimage/ | EncoderPillow | Quality controllossless | Defaulton | pix_fmt options— | Other widgets— |
So bitrate only exists on the three NVENC formats, and those have no crf. With megabit off, the same number is read as kilobits per second. video/ names no codec, so ffmpeg uses the WebM container's default, which is VP9 when ffmpeg was built with it. The README says you can add your own format by dropping a JSON file in the same style into video_.
What crf means for size and quality
CRF, constant rate factor, holds a quality level and lets the bitrate move. From ffmpeg's encoding guides:
| Encoder | Documented CRF range | Encoder default | Notes from the guide |
|---|---|---|---|
| Encoderx264 (H.264), 8-bit | Documented CRF range0–51; 0 is lossless | Encoder default23 | Notes from the guide17 or 18 is visually lossless or nearly so; +6 roughly halves the size |
| Encoderx264, 10-bit | Documented CRF range0–63 | Encoder default— | Notes from the guide0 is not lossless in High 10 |
| Encoderx265 (H.265) | Documented CRF range0–51, also for 10-bit | Encoder default28 | Notes from the guide28 should look like x264 at 23 at about half the size |
| EncoderVP9 | Documented CRF range0–63 | Encoder default— | Notes from the guide15–35 recommended, 31 for 1080p |
| EncoderSVT-AV1 | Documented CRF range0–63 | Encoder default35 | Notes from the guideLower is better and bigger |
Video Combine's defaults (19 for H.264, 22 for H.265, 20 for WebM, 23 for AV1) are all lower than the encoders' own, so its files are larger and closer to lossless than a bare ffmpeg command would give. VideoHelperSuite's documentation describes each default as visually lossless.
The node's slider goes to 100 for every format. ffmpeg's guides stop at 51 for x264 and x265 and at 63 for VP9 and AV1, so stay inside those. We have not tested what the encoders do above them.
Audio and the extra files
One Video Combine run can write three files in output/:
AnimateDiff_: the first frame, carrying the workflow. Turn it off in the VideoHelperSuite settings ("Save png of first frame for metadata").00001 .png AnimateDiff_: the video without sound.00001 .mp4 AnimateDiff_: only when00001- audio .mp4 audiois connected. ffmpeg copies the video stream and adds the sound, as AAC in MP4, Opus in AV1 WebM, Vorbis in VP9 WebM.
The node pads the audio with silence to the video's length. With trim_ on (H.264, WebM and FFV1 only), it does not pad, so the file ends where the audio ends. The documentation also warns that a wrong frame_ puts audio out of sync. A setting called "Keep required intermediate files after successful execution" deletes the silent copy when you turn it off.
ffmpeg: where the node finds it
From videohelpersuite/, at start-up:
- If
VHS_is set, that path is used and nothing else is checked.FORCE_ FFMPEG_ PATH - Otherwise it collects every ffmpeg it can find: the one bundled with the
imageio-Python package, the one on your systemffmpeg PATH, and anffmpegorffmpegin the folder ComfyUI was started from..exe - If more than one is found, it runs each with
-and picks the one with the most useful encoders (VP9, H.264, H.265, SVT-AV1, Opus), favouring newer builds.version
Set VHS_ to force the bundled copy. If none is found, the start-up log says No valid ffmpeg found., the video/ formats still appear in the list, and they fail when the node runs. The fix is any of the three sources above, installed into the same Python or PATH that ComfyUI runs with:
python - m pip install imageio- ffmpeg
A launcher that does not read your shell profile may not see a system ffmpeg on PATH. That was the cause in VideoHelperSuite issue #188, on a Mac started from StabilityMatrix.
Common errors
| Error or symptom | Cause and fix |
|---|---|
Error or symptomffmpeg is required for video outputs and could not be found. | Cause and fixNo ffmpeg found at start-up. Install imageio- in ComfyUI's Python or add ffmpeg to PATH, then restart |
| Error or symptomffmpeg says the encoder is unknown or not found, on an NVENC format | Cause and fixThe ffmpeg in use was built without NVENC. In issue #485, a maintainer said from memory that the auto-installed ffmpeg has NVENC on Windows but not on Linux. Use a system ffmpeg that lists h264_, or video/ |
Error or symptomvideo/ missing from the list | Cause and fixThe gifski program is not on PATH. Install it, or point VHS_ at it |
Error or symptomOutput images were not of valid resolution and have had padding applied | Cause and fixA width or height is odd. The node pads by edge pixels to an even size; set even dimensions upstream to avoid it |
| Error or symptomThe clip plays in slow motion | Cause and fixframe_ left at 8. Set it to the model's rate, or to the rate after interpolation |
| Error or symptomThe node is red | Cause and fixThe pack is missing or failed to import; see missing nodes |
A video that saves but is all black is a sampler or VAE problem, not an encoding one. Our black video output page covers it.
The native route: Create Video and Save Video
Added in ComfyUI pull request #7844 and first released in v0.3.31 (2025-05-03). They use PyAV, the av Python package that ComfyUI already requires, so no separate ffmpeg is needed.
| Node | Input | Default | Options |
|---|---|---|---|
| NodeCreate Video | Inputimages | Default— | OptionsIMAGE |
| Node | Inputfps | Default30 | Options1 to 120 |
| Node | Inputaudio | Defaultoptional | OptionsAUDIO |
| Node | Inputbit_ | Defaultauto | Optionsauto, 8, 10. Auto is 8-bit for sRGB, 10-bit for HDR |
| Node | Inputcolor_ | DefaultsRGB | OptionssRGB, HDR (BT.2020 HLG), HDR PQ |
| NodeSave Video | Inputfilename_ | Defaultvideo/ | OptionsSame formatting as Save Image |
| Node | Inputformat | Defaultauto | Optionsauto, mp4, mkv, webm. Auto means MP4, or WebM for AV1 |
| Node | Inputcodec | Defaultauto | Optionsauto, h264, av1; WebM takes auto or av1 only |
| Node | Inputencoding mode | Defaultauto | Optionsauto, or re-, which shows crf: H.264 0–51 (default 18), AV1 0–63 (default 24) |
How they got here:
- v0.30.0 (2026-08-03) added the
crfoption to Save Video. - v0.34.0 (2026-08-26) added AV1, MKV, WebM and HDR, and made Create Video's
bit_a choice.depth - v0.39.0 (2026-10-05) made CRF 18 for H.264 and 24 for AV1 the default even when you leave
crfalone. Before that, an unsetcrffell back to the encoder's own default.
Audio goes in as AAC in MP4 and MKV, and as Opus in WebM. Save Video embeds the workflow unless ComfyUI runs with --disable-, and with the default prefix writes files like video/.
The Wan 2.2 templates set Create Video's fps to 16 for the 14B models and 24 for the 5B, and leave Save Video on auto. Of the 680 workflow files in Comfy- on 2026-10-10, 258 use Save Video and 21 use Video Combine, mostly utility and community templates such as the older FILM interpolation one. The MiniMax H3 templates on our workflows page also end in Create Video and Save Video, which carries H3's sound track into the MP4.
Which one to use
| You want | Use |
|---|---|
| You wantAn MP4 from a Wan, LTX or H3 template | UseSave Video. It is already there and needs no install |
| You wantA GIF | UseVideo Combine, image/, video/ or video/ |
| You wantA looping clip, forward then back | UseVideo Combine with pingpong |
| You wantH.265, ProRes, lossless FFV1 or a PNG sequence | UseVideo Combine |
| You wantEncoding on the GPU with NVENC | UseVideo Combine, with an ffmpeg that has NVENC |
| You wantAV1, MKV or HDR | UseEither; Save Video since v0.34.0 |
| You wantLong clips without holding every frame in RAM | UseVideo Combine's vae input, or meta_ |
| You wantAn animated WebP only | UseComfyUI's own Save Animated WEBP also works (fps default 6) |
If you interpolate frames first, multiply the frame rate by the same factor on whichever node you use. Our frame interpolation page has the arithmetic for Wan's 16 and 24 fps clips.
What nobody has published
- File sizes and a quality score for the same Wan or LTX clip saved with Video Combine's H.264 default (CRF 19) and Save Video's (CRF 18).
- A timing of NVENC against
libx264inside Video Combine on a named consumer GPU.
Encoding is not part of the system requirements checker, whose only preset is MiniMax H3.
Licence
VideoHelperSuite and ComfyUI are both released under GPL-3.0. We do not host any of these files; install the pack through ComfyUI-Manager or from its repository.
GenVidKit is an independent guide. It is not affiliated with Comfy Org, Kosinkadink or the VideoHelperSuite contributors, the FFmpeg project, Alibaba's Wan team or MiniMax.
Sources
All read on 2026-10-10.
- Kosinkadink/ComfyUI-VideoHelperSuite — README,
pyproject,.toml videohelpersuite/,nodes .py utils,.py documentation,.py web/and every file injs/ VHS .core .js video_: inputs, defaults, formats, ffmpeg search, audio and settings.formats/ - ComfyUI-VideoHelperSuite on the Comfy Registry — latest published version.
- VideoHelperSuite issue #188 and issue #485 — ffmpeg not found from a launcher, and missing NVENC encoders.
- ComfyUI
comfy_,extras/ nodes_ video .py comfy_andapi/ latest/_ input_ impl/ video_ types .py requirements— Create Video and Save Video inputs, codec mapping, CRF defaults and PyAV..txt - ComfyUI pull requests #7844, #15191, #15741 and #16663, and ComfyUI releases — when each change landed and the first release with it.
- Comfy-Org/workflow_templates — which templates use which save node, and the Wan 2.2 frame rates.
- Save Video and Create Video node references, ComfyUI documentation.
- ffmpeg H.264, H.265, VP9 and AV1 encoding guides — CRF ranges, defaults and the size rule.
- ffmpeg
loopfilter andlibavformat/— whatmatroskaenc .c loop_does in video files, and WebM's default codec.count - Pillow image file formats — the GIF and WebP
loopfield.