External Video (ComfyUI Deploy x VHS)
The VHS-Powered Video Input That Actually Decodes Frames
- meta_batch
- vae
- IMAGE
- frame_count
- audio
- video_info
- LATENT
This is the serious video node in the ComfyUI Deploy pack: "External Video (ComfyUI Deploy x VHS)". The source openly credits VideoHelperSuite - it's essentially VHS's Load Video node, wrapped in the deploy external-input contract so an API caller can hand you a video by URL while you keep full control over how it's decoded. Wire this into an img2vid or frame-interpolation workflow and the video becomes a per-request input.
How it works
Like its path-based sibling, if the incoming input_id or default_value_url starts with http, the node downloads the video into ComfyUI's input directory. Otherwise it resolves default_video - the dropdown of .webm, .mp4, .mkv and .gif files in your input folder - and decodes it through an OpenCV frame generator backed by ffmpeg (the pack's imageio-ffmpeg dependency provides one, or it uses a system ffmpeg if available). Decoding is memory-guarded so it stops rather than OOM on long videos.
The output bundle is the full VHS spread: IMAGE (frame tensors), frame_count (INT), audio (AUDIO, lazy-loaded), video_info (VHS_VIDEOINFO metadata), and LATENT. Here's the fork that decides which you use: connect the optional vae input and the node VAE-encodes frames into the LATENT output (IMAGE comes back empty); leave vae unplugged and you get raw IMAGE tensors and an empty LATENT. Most video work wants the VAE-connected path - feed that LATENT into a sampler for img2vid.
The inputs that matter
force_rate(0) - target fps; 0 keeps source.force_size- resize policy: Disabled, fixed aspect like512x?, or Custom withcustom_width/custom_height.frame_load_cap,skip_first_frames,select_every_nth- cap the load, skip the first frames, or thin the sequence. Defaults (0/0/1) load everything.vae- plug this in to get LATENT out.meta_batch,default_video,default_value_url,display_name,description- the VHS batch-manager hook, the local file dropdown, the URL fallback, and the form text.
Installing
Manager → "ComfyUI Deploy", or:
cd ComfyUI/custom_nodes
git clone https://github.com/BennyKok/comfyui-deploy
Restart. This node is the reason the pack pulls opencv-python and imageio-ffmpeg - those are real dependencies here. To use meta_batch and the VHS_VIDEOINFO plumbing fully you'll also want actual VideoHelperSuite installed; the types resolve fine without it for basic loading, but batch management needs the real pack.
Gotchas
Decoding video is memory-hungry; the memory guard will stop execution on huge files rather than crash, which reads as an error until you add frame_load_cap or select_every_nth. And the size widgets cap at 8192, so don't expect 4K passthrough without force_size deciding what to do about it. If all you need is a file path for a merge/save node, use the lighter External Video (ComfyUI Deploy) path variant instead - this one decodes, and decoding costs.
Inputs (14)
| Name | Type | Default | Description |
|---|---|---|---|
| input_id | STRING | input_video | — |
| force_rate | INT | 00–60 | — |
| force_size | COMBO | 10 options: Disabled, Custom Height, Custom Width, Custom, 256x?, ?x256, +4 | |
| custom_width | INT | 5120–8192 | — |
| custom_height | INT | 5120–8192 | — |
| frame_load_cap | INT | 00–9007199254740991 | — |
| skip_first_frames | INT | 00–9007199254740991 | — |
| select_every_nth | INT | 11–9007199254740991 | — |
| meta_batchopt | VHS_BatchManager | — | |
| vaeopt | VAE | — | |
| default_videoopt | COMBO | 0 options: | |
| display_nameopt | STRING | — | |
| descriptionopt | STRING | — | |
| default_value_urlopt | STRING | — |
Outputs (5)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | — |
| frame_count | INT | — |
| audio | AUDIO | — |
| video_info | VHS_VIDEOINFO | — |
| LATENT | LATENT | — |