Freeze Frame
Hold a frame into a clip, for those I-can't-believe-that-shot moments
- video
- video
- output_path
- summary
Every edit has that one frame you want to sit on for a beat - the perfect expression, the moment the comp resolves. In a real NLE this is a two-second job; inside ComfyUI it's usually a fiddly detour through frame extraction, a bunch of image nodes, and a re-assembly. MKRFreezeFrame collapses the whole detour into one node: give it a video and a frame index, and it writes a short clip that holds that single frame.
This is a small node, and it knows it. There's no AI anywhere in it - it's a purely deterministic finishing utility in the pack's media-edit lane, the kind of thing you slot in before export to fix pacing without leaving the graph.
How it works
It decodes the input video to frames, picks the one at frame_index (clamped to the clip, so you can't overshoot), and duplicates it enough times to fill hold_duration_sec at the clip's frame rate. So at 24fps with a 1-second hold you get 24 copies of the same frame - which encodes to a perfectly still segment. Set frame_index from a detector, or by eyeballing a preview, and it just works.
The fallback_fps (default 24) only matters when the source doesn't report a rate - it's the "if you can't tell me, I'll assume this" number, and it's what the hold duration is computed against in that case. Worth setting to your project's real rate if you're feeding unusual sources.
The output_format dropdown is gif by default, with webp, mp4, mov and webm as options. Two honest notes: gif at high fps and long holds gets chunky fast (it's a GIF), and the MP4-family formats need ffmpeg installed - otherwise the node warns and drops back to gif. Same pack-wide ffmpeg story as MKRExportPreset.
Outputs: video (the MKR_VIDEO payload of your freeze clip), output_path (where it was written, under ComfyUI's output dir), and summary (JSON string with the frame index, hold duration, fps, and any warnings). filename_prefix, subfolder, overwrite and filename_label are your standard MKRShift naming controls.
Installing
It's part of MKRShift Nodes, so:
cd ComfyUI/custom_nodes
git clone https://github.com/criskb/MKRShift_Nodes
Then restart ComfyUI - or use ComfyUI Manager and search "MKRShift_Nodes." No extra Python packages beyond the stock ComfyUI stack.
The trap to avoid
The output is genuinely a still - no motion, no grain, no camera wobble. If you're freezing a frame inside a shot that has any movement, the cut from moving video to a rock-solid still reads as a stutter, because real cameras don't sit perfectly still. If that's your plan, run the freeze through a light film-grain or gate-weave pass afterwards so it doesn't look like a technical glitch. If you want the node to detect the stills for you rather than picking by hand, that's the sibling node MKRFreezeFrameDetector - and honestly, in a busy timeline, that's the one you'll reach for first.
Inputs (8)
| Name | Type | Default | Description |
|---|---|---|---|
| video | * | — | |
| frame_index | INT | 00–10000000 | — |
| hold_duration_sec | FLOAT | 1.000.01–600 | — |
| fallback_fps | FLOAT | 24.01–240 | — |
| output_format | COMBO | gif | 5 options: gif, webp, mp4, mov, webm |
| filename_prefix | STRING | MKR_freeze_frame | — |
| subfolder | STRING | — | |
| overwrite | BOOLEAN | false | — |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| video | MKR_VIDEO | — |
| output_path | STRING | — |
| summary | STRING | — |