FL Video Combine
The save button for your video workflow — frames in, playable MP4 out
- images
- audio
- filepath
FL Video Combine is what happens at the end of a video workflow: an image batch goes in, an H.264 MP4 lands on disk, and if you fed it audio, that gets muxed back in too. That's the whole job, and it's a genuinely useful one - it's the natural partner to the pack's FL Load Video, sitting at the far end of the graph and turning your sampled frames back into something you can actually play.
It's a true output node (OUTPUT_NODE), so nothing wires out of it to continue the graph - it terminates, and its only output is the path to the file it just wrote. You'll still want that filepath string though, because it chains cleanly into upload, Discord, or webhook nodes.
How it works
The encoder is PyAV, and it's deliberately narrow: MP4 container, H.264 codec, nothing else. The render_settings JSON validates format must be "mp4" and codec must be "h264", so don't go hunting for a codec dropdown - this is a design decision, not a missing feature. Quality is controlled by CRF (0–51, default 19; lower is better and bigger), and you can write 8-bit or 10-bit (yuv420p10le for the latter). It also embeds your workflow as MP4 metadata (via use_metadata_tags + faststart), so the graph rides along in the file the way it does in a PNG.
One thing that quietly bites people: H.264 demands even dimensions, so odd-width or odd-height frames get padded by a single pixel (replicate-style) before encoding. Your output can come out one pixel bigger than your source batch.
The inputs and settings that matter
images - the IMAGE frame batch, straight out of your sampler's decoded frames or the pack's FL Load Video.
audio (optional) - an AUDIO input that gets muxed in as AAC. Mono, stereo, or 5.1. The companion node's audio output plugs straight in here.
render_settings - the JSON config. The ones you'll set:
filename_prefix- defaultFillVideo; files save asFillVideo_00001_.mp4with an auto-incrementing counter, so it never overwrites.frame_rate- 1 to 120, default 24.crfandbit_depth- quality control; go 10-bit only if your player/editor actually handles it.output_directory- leave empty to use ComfyUI's output folder; set an absolute path to save elsewhere.include_audio,audio_gain_db(‑60 to +12 dB),trim_video_to_audio(cuts the frame count to match the audio length), andsave_metadata.
filepath (output) - the absolute path of the written MP4.
Installing it
Same pack as FL Load Video - Fill-Nodes is a one-stop bundle, and you get this node along with it.
ComfyUI Manager - search "ComfyUI_Fill-Nodes" and install.
Or manually:
cd ComfyUI/custom_nodes
git clone https://github.com/filliptm/ComfyUI_Fill-Nodes
cd ComfyUI_Fill-Nodes
pip install -r requirements.txt
Restart ComfyUI afterward. The requirements list is long (librosa, opencv-python, moviepy, various cloud SDKs) but only what imports actually gets loaded.
Common issues
ModuleNotFoundError: No module named 'av'- the pack'srequirements.txtdoesn't declare PyAV even though the video nodes import it. If the node won't load,pip install avin ComfyUI's Python environment.- The MP4 won't play in your editor - you're almost certainly on 10-bit (
yuv420p10le), which some players and browsers choke on. Dropbit_depthto 8. - Output is one pixel bigger than your frames - the even-dimension padding. Feed it even-sized frames or crop in post.
- Drag-and-drop preview broke after a ComfyUI frontend update - a mid-2026 frontend change broke drops across the pack; the fix was merged upstream, so updating Fill-Nodes restores it.
If all you need is a straight frames-to-MP4 save, core ComfyUI's VHS or its built-in save nodes can do it too - but this one throws in metadata, 10-bit, audio gain, and a custom output directory for the same effort, which is why it earns its spot at the end of the graph.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| images | IMAGE | — | |
| render_settings | STRING | {"version":1,"filename_prefix":"FillVideo","frame_rate":24.0,"format":"mp4","codec":"h264","crf":19,"bit_depth":8,"include_audio":true,"trim_video_to_audio":false,"audio_gain_db":0.0,"output_directory":"","save_output":true,"save_metadata":true} | — |
| audioopt | AUDIO | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| filepath | STRING | — |