Element ref convert
Element ref convert is the adapter that turns your reference panel into wires
- info
- first_frame
- last_frame
- ref_image_0
- ref_image_1
- ref_image_2
- ref_image_3
- ref_image_4
- ref_image_5
- ref_image_6
- ref_image_7
- ref_image_8
- ref_video_0
- ref_video_1
- ref_video_2
- ref_video_audio_0
- ref_video_audio_1
- ref_video_audio_2
- ref_audio_0
- ref_audio_1
- ref_audio_2
- drive_audio
- prompt
- info
You can't plug a panel into a sampler. Element Multi REF holds your frames, reference images, reference videos, their audio and a prompt, and outputs it all as one bundle on one wire - great for legibility, useless to the model node at the end, which wants specific tensors on specific sockets. Element ref convert is the un-bundler: one EMR_REF in, 21 typed ports plus a prompt and a status manifest out.
It's the explode half of the bundle-on-one-wire pattern, with one difference: everything here is material, so the conversion is where the actual file loading happens.
What it does with the bundle
It walks a fixed slot order (frames, images, videos, paired video audio, reference audio, driving audio) and loads each material off disk using the edit parameters the panel recorded.
For images: read the file, composite the paint overlay, apply the crop floored to the panel's div by value, resize to your Out W × H. For video slots, PyAV decodes the trimmed range and frames land on a grid derived from your output fps; any grid slot the decoder never fills is forward-filled from the previous frame, so a variable-frame-rate source comes out as an evenly-spaced [T, H, W, 3] float sequence instead of a stuttering mess.
The nice shortcut: leave ref_video_audio_N empty and if the video in ref_video_N has an audio track, the converter pairs them itself and outputs that track, trimmed to the video's edit range. You only import the video.
The node has exactly one input, info - the tooltip says to connect it to Element Multi REF's REF_ALL_IN_ONE.
The outputs
Outputs are grouped the way the panel is: first_frame and last_frame as IMAGE; ref_image_0 through ref_image_8 as IMAGE; ref_video_0 through _2 as IMAGE frame sequences (they feed a VAE Encode or whatever your reference-video path uses); ref_video_audio_0 through _2, ref_audio_0 through _2 and drive_audio as AUDIO; then two STRINGs, prompt and info. Wire two or three into the model's reference conditioning, the prompt into your CLIP encode, and leave the rest dangling.
info is the one people miss: a JSON manifest of what actually came through - per-slot has, dimensions, frame counts or durations, plus a missing array. If a run behaves oddly, read that string first.
The empty-slot behaviour, which is both the feature and the trap
Every port always outputs something. An empty or failed slot emits a 64×64 black image, or one second of 44.1 kHz silence, and prints [ElementRefConvert] slot 'ref_image_3' empty/failed ... → placeholder to the terminal. The point: a half-filled reference set doesn't blow up your graph - an H3 ref2va or LTX first/last workflow runs whether or not you filled nine image slots.
The flip side: a missing reference isn't an error. Your sampler conditions on a valid black frame or a second of silence, and you get a plausible-looking bad generation instead of a stack trace. If output looks degraded for no reason, check the terminal and the manifest's missing list. Nothing else will warn you.
Installing it
It ships inside ComfyUI_Element_easy - Manager, search ComfyUI_Element_easy, install, restart; or:
cd ComfyUI/custom_nodes
git clone https://github.com/supElement/ComfyUI_Element_easy
cd ComfyUI_Element_easy
pip install -r requirements.txt
Both nodes in this pair live in the same file, so they install, load and fail together. The dependencies that matter are av (PyAV decodes reference video and audio, no ffmpeg install required) and opencv-python; ffmpeg on PATH only helps as a fallback decoder for odd audio containers. Like its sibling, the module imports comfy_api.latest, so it needs a current ComfyUI - the pack loads modules defensively, and on an old build both nodes vanish from the node list with only a [Element_easy] 模块 Element_multi_ref 加载失败 line in the console.
Common issues
Everything is black frames and silence. Nothing is filled, or the source files moved. Materials are stored as absolute paths, so relocating files breaks slots silently - re-drop them and check the info manifest. If one video slot is black, look for no frames decoded in the console: PyAV couldn't seek to your trim range and the fallback decode came back empty.
Frame count surprises. A video slot outputs at the fps the panel recorded (0 = source fps), resampled onto the panel's quantization - H3 at 17n+5, LTXV at 8n+1. Trim without quantizing and you get your length, not an on-grid one - and off-lattice counts are a hard failure on LTX 2.3, not a rounding. Quantize in the panel, not after this node.
Long reference clips get clipped. Hard cap: 1200 frames per video slot, rest dropped.
The prompt port is empty. The prompt lives on the panel and travels in the bundle, each preset carrying its own. Leave it blank and this port is a blank string - not a bug.
Inputs (1)
| Name | Type | Default | Description |
|---|---|---|---|
| info | EMR_REF | Connect from Element Multi REF 'REF_ALL_IN_ONE'. |
Outputs (23)
| Name | Type | Description |
|---|---|---|
| first_frame | IMAGE | — |
| last_frame | IMAGE | — |
| ref_image_0 | IMAGE | — |
| ref_image_1 | IMAGE | — |
| ref_image_2 | IMAGE | — |
| ref_image_3 | IMAGE | — |
| ref_image_4 | IMAGE | — |
| ref_image_5 | IMAGE | — |
| ref_image_6 | IMAGE | — |
| ref_image_7 | IMAGE | — |
| ref_image_8 | IMAGE | — |
| ref_video_0 | IMAGE | — |
| ref_video_1 | IMAGE | — |
| ref_video_2 | IMAGE | — |
| ref_video_audio_0 | AUDIO | — |
| ref_video_audio_1 | AUDIO | — |
| ref_video_audio_2 | AUDIO | — |
| ref_audio_0 | AUDIO | — |
| ref_audio_1 | AUDIO | — |
| ref_audio_2 | AUDIO | — |
| drive_audio | AUDIO | — |
| prompt | STRING | — |
| info | STRING | — |