Nodes/Melite Utility Nodes/🎞️ Melite Frame Sheet (view arm)
ComfyUI Node

🎞️ Melite Frame Sheet (view arm)

See what a saved video actually looks like

By JayDataEngineerΒ·Created 2 months agoΒ·Updated 3 days agoΒ· 1
🎞️ Melite Frame Sheet (view arm)
    • sheet
    β—„videoβ–Ί
    β—„stamps6β–Ί
    β—„width320β–Ί

    Six frames tiled into one image is the fastest way to answer "is this clip any good?" - no scrubbing a player, no re-running the graph, and a contact sheet you can actually compare between runs. MeliteFrameSheet takes a saved video file and returns that sheet as an IMAGE you can preview or save like any other image.

    Why it's a node and not a script

    Because shelling out to ffmpeg from inside a graph is a dependency you don't want, and because the answer needs to be a graph artifact. This node decodes in-process with PyAV and composes the sheet as an output the rest of ComfyUI's image plumbing understands - throw a PreviewImage (or a save) after it and you're done. It's part of the pack's "view arm": a small set of nodes whose job is to let a workflow show you something it already produced.

    How it works

    Point it at a video - an absolute path, or a path relative to ComfyUI's output directory, which is the convenient case since that's where your renders land. If the file isn't there, it refuses rather than building you a blank sheet, which is the right call for a viewer node.

    It decodes the whole file with PyAV, then picks stamps frames at even intervals across the clip's length: for k stamps over N frames it takes indices round(i * (N-1) / (k-1)), so you get the first frame, the last frame, and evenly spaced samples between. Each picked frame is resized to width pixels wide with the aspect ratio preserved, then padded to match the tallest frame so the rows line up. Two frames per row, rows stacked, and a lone odd frame at the end gets padded to full row width instead of leaving half a black bar.

    That's the layout: a sheet 2 Γ— width pixels across, with as many rows as it takes.

    Inputs and output

    video - STRING. Absolute, or relative to the output directory. This is the only input you'll touch most of the time.

    stamps - INT, 1 to 12, default 6. How many frames tile the sheet. Six is a good default for a two-second clip; go to 10–12 for something long and slow, and drop to 3–4 when you want each frame big enough to read detail.

    width - INT, 64 to 1920, default 320. Per-frame width in pixels, aspect kept. 320 is a fine review size; bump it if you're judging faces or fine texture and you don't mind a wider sheet.

    sheet - IMAGE. One image. Wire it into a preview or a save.

    If stamps is larger than the number of frames in the file, it clamps down rather than duplicating frames - ask for 12 on a 5-frame clip and you get 5.

    Installing it

    cd /path/to/ComfyUI/custom_nodes
    git clone https://github.com/JayDataEngineer/melite-utility-nodes.git
    

    Restart ComfyUI, or install Melite Utility Nodes from ComfyUI Manager. This node needs the pack's av (PyAV) dependency to decode anything; the pack's requirements.txt declares it and Manager installs it for you. Without PyAV the node fails with a plain message rather than a traceback about a missing module - that's a deliberate guard, not an accident.

    Where it bites

    • It decodes the entire video to keep six frames. That's the honest cost, and it's why this is a review tool rather than something you leave in a batch loop over a hundred clips. On a short clip it's instant; on a two-minute render it's a real wait.
    • Video files only. Hand it an audio-only container and you get a message saying the sheet arm decodes films only. That error is a translation, by the way - PyAV's own complaint for that case is a bare "tuple index out of range", so if you see this node's version of it, the pack caught it for you.
    • Output-dir-relative is the ergonomic path but not the only one. Absolute paths work fine, including files outside ComfyUI entirely. If a relative path fails, it failed - there's no fuzzy matching across input/ and output/ here.
    • The sheet is a snapshot, not a scrubber. If you need motion timing rather than content, this shows you six moments and stays silent about everything between them. Combine it with the pack's waveform node when the clip has audio - a visual sheet plus an envelope catches most "the render is subtly broken" cases in one glance.
    • A view arm, in a pack with no community footprint. Nobody on the forums is going to tell you how to use it, but the node is small enough to read end to end, and its error messages spell out the fix.
    Categorymelite/view

    Inputs (3)

    NameTypeDefaultDescription
    videoSTRINGPath to a saved video (absolute, or output-dir relative)
    stampsINT61–12How many evenly spaced frames tile the sheet
    widthINT32064–1920Per-frame width in px (aspect kept)

    Outputs (1)

    NameTypeDescription
    sheetIMAGEβ€”