Nodes/MKRShift_Nodes/Freeze Frame
ComfyUI Node

Freeze Frame

Hold a frame into a clip, for those I-can't-believe-that-shot moments

By criskb·Created 7 months ago·Updated 5 months ago· 0
Freeze Frame
  • video
  • video
  • output_path
  • summary
frame_index0
hold_duration_sec1.00
fallback_fps24.0
output_formatgif
filename_prefixMKR_freeze_frame
subfolder
overwritefalse

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.

CategoryMKRShift Nodes/Media/Video/Edit

Inputs (8)

NameTypeDefaultDescription
video*
frame_indexINT00–10000000
hold_duration_secFLOAT1.000.01–600
fallback_fpsFLOAT24.01–240
output_formatCOMBOgif5 options: gif, webp, mp4, mov, webm
filename_prefixSTRINGMKR_freeze_frame
subfolderSTRING
overwriteBOOLEANfalse

Outputs (3)

NameTypeDescription
videoMKR_VIDEO
output_pathSTRING
summarySTRING