ACES IO — Video Loader (MOV/ProRes)
Drop ProRes and MP4 footage straight into your graph
- file_path
- image
- frame_count
- first_frame
- last_frame
ACES IO - Video Loader is the sibling of the EXR Loader for when your source is a video file instead of a frame sequence: .mov, .mp4, .mxf, .avi, .mkv. The reason this matters more than it sounds: ProRes MOVs - the default deliverable for basically every camera and every NLE - are a blind spot for ComfyUI's built-in loaders. This node decodes them via PyAV (FFmpeg) and hands you the same [B, H, W, C] float32 IMAGE batch the EXR Loader produces, so video footage flows into image-to-image, frame-by-frame upscaling, or your color pipeline without an external ffmpeg step first.
Inputs and behavior
file_path- Browse or type a path to the video. The picker filters to video extensions.frame_mode- all (default) decodes every frame; range decodes everything then slicesfirst_frame…last_frame(note: 0-based and inclusive, unlike the EXR Loader's 1001-style VFX numbering - setfirst_frame=0to start at the first frame).preview_fps- playback speed of the animated WebP preview rendered in the node.
Outputs are image, plus frame_count, first_frame, last_frame (all INT). Because it's an output node, the preview shows inline; the frames themselves are what you wire onward.
One honest limitation: this node loads frames as-is - there's no ocio_config / colorspace input like the EXR Loader has. Video files are almost always display-encoded (sRGB-ish, Rec.709), so the standard pattern is Video Loader → ColorSpace (sRGB → ACEScg) to get into your working space, then on to the Viewer. That's exactly what you'd do with the EXR Loader anyway; you just have to add the step yourself.
Install
Part of BISAM20/ComfyUI-ACES-IO. ComfyUI Manager → Install Custom Nodes → search ComfyUI-ACES-IO, restart. Manual:
cd ComfyUI/custom_nodes
git clone https://github.com/BISAM20/ComfyUI-ACES-IO
cd ComfyUI-ACES-IO
pip install -r requirements.txt
The non-negotiable here is av (PyAV) - video loading hard-fails with a clear "Install with: pip install av" if it's missing. It's in requirements.txt, so Manager handles it; if you installed the pack manually before, re-run pip install -r requirements.txt. The pack's other heavy dependency, PyOpenColorIO, is installed by the Manager hook (pip package opencolorio).
Gotchas
- Memory. "all" mode decodes the whole file into one tensor. A 10-minute 4K clip will happily eat many GB of VRAM/RAM. Use
rangeto pull only the frames you actually process, or trim the source first. - No alpha handling to speak of - frames are decoded to
rgb24, so 4-channel video (ProRes 4444) loses its alpha on load. If you need to preserve alpha from video, the EXR route is the ACES-correct way to carry it anyway. - Color isn't touched. Out of the loader, footage looks like the encoded video because it is the encoded video. Go through ColorSpace → Viewer before judging the grade.
- Every node in this pack re-runs each queue, so if the file changes on disk your next run picks it up - no stale caching.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| file_path | ACES_PATH | — | |
| frame_mode | COMBO | all | 2 options: all, range |
| first_frameopt | INT | 00–999999 | 0-based frame index, used by 'range' mode |
| last_frameopt | INT | 00–999999 | 0-based frame index inclusive, used by 'range' mode |
| preview_fpsopt | FLOAT | 24.01–120 | — |
Outputs (4)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |
| frame_count | INT | — |
| first_frame | INT | — |
| last_frame | INT | — |