Nodes/ComfyUI-S3-IO/Video Combine to S3
ComfyUI Node

Video Combine to S3

Video Combine, Now With a Bucket on the Output

By olduvai-jp·Created 8 months ago·Updated 7 months ago· 4
Video Combine to S3
  • images
  • audio
  • meta_batch
  • vae
  • Filenames
frame_rate8
loop_count0
filename_prefixAnimateDiff
format
pingpongfalse
save_outputtrue

Video Combine to S3 is what the end of your video workflow looks like when "save locally" isn't the point. It's VideoHelperSuite's VHS_VideoCombine - the node that turns a pile of frames into an actual video file - with one extra job bolted on: after encoding, it pushes the result up to an S3 bucket. No manual scp after every render, no digging through ComfyUI/output on a machine that's about to be torn down. Render and it's in the bucket.

This is the "output" half of ComfyUI-S3-IO, and it's the more useful half. Loading inputs from S3 is convenient; writing outputs there is what makes shared or ephemeral rendering setups actually work. A spot instance finishes a Wan or AnimateDiff job, uploads the clip, and dies. The clip survives. If you render on one box and review on another, this node is quietly the best part of the pack.

How it works

The class literally subclasses the vendored VideoCombine from VideoHelperSuite and overrides the combine step. You feed it frames (or latents + VAE), it runs VHS's normal ffmpeg encode via the bundled imageio-ffmpeg, and then:

  • every produced file - the video and any sibling -audio track - is uploaded to S3IO_OUTPUT_PREFIX
  • it asks S3 whether the filename already exists, and appends (n) until it doesn't, so re-runs don't clobber
  • it injects UI download entries so ComfyUI offers you the file even though it also lives in the cloud

Under the hood that upload is just boto3, retried up to three times on transient errors. Simple, and it shows - there's not much that can go wrong that isn't an S3 credential problem.

The inputs that matter

Everything from VHS_VideoCombine is here:

  • images - the frame sequence (or latents, with a vae wired in to decode them).
  • frame_rate - default 8. Set it to what your model actually produced; AnimateDiff-era defaults are the trap here.
  • format - the codec menu. image/gif and image/webp for quick loops, video/h264-mp4 for compatibility, video/nvenc_hevc-mp4 if you've got an NVIDIA encoder and want smaller files, video/ffv1-mkv when you want a lossless master. Choose what the clip is for.
  • filename_prefix - the one that surprises people. It takes the same replacements as stock Save nodes: %date:yyyyMMdd% becomes a date subfolder, %PositivePrompt.text% pulls in another node's widget value. A good pattern straight from the README:
    %date:yyyyMMdd%/run_%PositivePrompt.text%
    
  • loop_count - 0 plays once; 1+ loops the clip that many times.
  • pingpong - plays it forward then backward, which is how most "smooth loop" memes actually get made.
  • save_output - leave it on. Turning it off skips the S3 upload too, at which point you should probably just use regular VHS.

Outputs

  • Filenames (VHS_FILENAMES) - the standard VHS file handle. Wire it into VHS_PruneOutputs or whatever file-management nodes you have hanging around.

Install

Same deal as every node in this pack: Manager (search "ComfyUI-S3-IO") or clone into custom_nodes, then pip install -r requirements.txt - that pulls boto3, opencv-python, and imageio-ffmpeg, the latter two being the heavy part of the install. Configure before you run:

export S3IO_ACCESS_KEY_ID="AKIA..."
export S3IO_SECRET_ACCESS_KEY="..."
export S3IO_BUCKET="comfy-bucket"
export S3IO_OUTPUT_PREFIX="outputs"   # where your renders land

S3IO_ENDPOINT_URL covers MinIO and other S3-compatible stores. Nothing is uploaded until all of those are set - misconfigured creds surface as empty dropdowns or upload failures, not silent data loss.

Gotchas

Same pack-wide caveats as its sibling node: Manager flags conflicts with VideoHelperSuite because this pack ships VHS's class names (vendored, not malicious - install one, not both), and it reads AWS credentials straight from your environment. Give it a scoped IAM key that can only touch your bucket; if it ever feels wrong, that's the first thing to check. One real surprise: because filenames get a (n) suffix when they collide, repeated runs of the same workflow accumulate - which is exactly what you want on a shared bucket, and exactly the kind of cruft you'll want a lifecycle rule to clean up.

Categoryvideo

Inputs (10)

NameTypeDefaultDescription
imagesIMAGE
frame_rateFLOAT8
loop_countINT00–100
filename_prefixSTRINGAnimateDiff
formatCOMBO14 options: image/gif, image/webp, video/nvenc_hevc-mp4, video/h264-mp4, video/h265-mp4, video/ffv1-mkv, +8
pingpongBOOLEANfalse
save_outputBOOLEANtrue
audiooptAUDIO
meta_batchoptVHS_BatchManager
vaeoptVAE

Outputs (1)

NameTypeDescription
FilenamesVHS_FILENAMES