CoCo Load EXR Sequence
Animation frames and their AOVs, all in one batch
- sequence
- alpha
- cryptomatte
- layers
- layer names
- raw layer info
- metadata
So you've got an animation sequence rendered as EXRs - say a few hundred frames, each one a multilayer file with beauty, depth, motion vectors and every AOV your renderer could spit out - and you want the whole thing inside ComfyUI as a single batch, not frame-by-frame by hand. That's the exact gap CoCo Load EXR Sequence fills. ComfyUI's core loader handles one image; this node grabs a range of frames, loads them all, and hands you the frames plus every layer in one go.
How it works
You give it a sequence_path with a #### (or ###) wildcard for the frame number - render_####.exr - plus start_frame, end_frame, and frame_step. The pack's SequenceHandler converts that pattern to a glob, finds the actual files on disk, extracts the frame numbers, and loads each selected frame through the same OpenImageIO-based ExrProcessor as the single-file loader. The frames come back stacked along the batch dimension, so downstream video nodes can chew through them like any other batch of frames.
Two details make it feel built for real use. First, it's cache-aware: IS_CHANGED hashes every selected frame's modification time and size along with your parameters, so it only reloads when the files actually changed - handy when you re-render frame 40 of 200. Second, the normalize toggle (default off) rescales HDR values into the 0-1 range, which you'll almost always want before most diffusion nodes, since scene-linear EXRs routinely contain values way past 1.0.
The seven outputs, and which matter
This node is generous with outputs, and the naming tells you how the pack wants you to work:
sequence(IMAGE) - the frames, batched. This is your main output.alpha(MASK) - the alpha channel as a mask.cryptomatte(CRYPTOMATTE) - crypto layers, for the pack's Cryptomatte Layer node.layers(LAYERS) - all non-crypto layers, for Load EXR Layer by Name.layer names(STRING) - the processed layer names; your cheat sheet.raw layer info(STRING) - every channel present, for when naming gets weird.metadata(STRING) - a JSON dump of everything in the files.
Real-world usage of this node tends to be the AOV-to-video pipeline: people load EXR sequences carrying 32-bit depth and motion vectors, then use those passes to drive image-to-video. The pack's own example workflow routes sequence → Colorspace, alpha → MaskToImage, and layers → Load EXR Layer by Name, so the intended flow is clear.
Inputs that matter
sequence_path (with the #### pattern - the # count sets padding: ### pads to 3 digits, #### to 4), start_frame/end_frame to bracket your range, frame_step to skip frames, and normalize for the HDR question. Set start_frame/end_frame to values that exist on disk; it picks frames by number, not by position.
Installing it and the gotchas
Same pack install as everything here - Manager ("CoCoTools") or:
cd ComfyUI/custom_nodes
git clone https://github.com/Conor-Collins/ComfyUI-CoCoTools_IO
pip install -r ComfyUI-CoCoTools_IO/requirements.txt
OpenImageIO is the engine and it's mandatory - the loader raises an ImportError if it's missing, and on portable installs the dependency has to go into python_embeded, not your system Python. Things that trip people up:
- Pattern must be
####/###, not[0-9]or$F-style. The workflow note in the pack spells it out: start frame 1 with###gives001, start frame 1001 with####gives1001. - No matching files → no caching. The node always re-runs when it finds nothing, which is correct behavior but means an empty path will silently reprocess instead of erroring helpfully.
- Memory. A few hundred multilayer EXRs as float32 tensors is not small. With
normalizeon and only thesequenceoutput connected, ComfyUI still builds the layer dicts - if you're frame-hungry and VRAM-tight, trim your range.
It's niche and barely discovered (single-digit impressions), but if you live at the 3D-to-ComfyUI border it's one of the few tools that treats an EXR sequence like a first-class citizen instead of a pile of files.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| sequence_path | STRING | path/to/sequence_####.exr | — |
| start_frame | INT | 10–999999 | — |
| end_frame | INT | 1001–999999 | — |
| frame_step | INT | 11–100 | — |
| normalize | BOOLEAN | false | — |
Outputs (7)
| Name | Type | Description |
|---|---|---|
| sequence | IMAGE | — |
| alpha | MASK | — |
| cryptomatte | CRYPTOMATTE | — |
| layers | LAYERS | — |
| layer names | STRING | — |
| raw layer info | STRING | — |
| metadata | STRING | — |