Nodes/DJZ-Nodes/Video Timecode
ComfyUI Node

Video Timecode

Burn a frame-accurate clock onto your footage

By MushroomFleet·Created 2 years ago·Updated 5 months ago· 78
Video Timecode
  • images
  • IMAGE
fps30.0
start_time00:00:00:00
font
font_size32
positionbottom
text_colorwhite
background_opacity0.5
reverse_countfalse

VideoTimecode does one thing and does it well: it stamps a frame-accurate timecode onto every frame of an image batch, in the HH:MM:SS:FF format that post-production actually uses. It's the node you reach for when you're doing VFX passes, sending AI-generated shots to a human editor, or reviewing your own renders and need to be able to say "the glitch is at 00:01:23:12" instead of pointing at a frame number.

The inputs split cleanly into "timing" and "look." Timing: images (your batch), fps (1–120, default 30 - this is what converts frame index into timecode, so it has to match your actual render FPS or the clock drifts), start_time (a string like 00:00:00:00, the frame where counting begins), and reverse_count (a boolean - flip it for a countdown, which is handy for timelapse-to-zero looks or if you're doing a "recording indicator" aesthetic). Look: font (default, plus any .ttf you drop into the pack's TTF/ folder - it auto-lists them), font_size (8–256, default 32), position (top or bottom), text_color (six presets: white, black, red, green, blue, yellow), and background_opacity (0–1, default 0.5 - that's the readability box behind the digits).

Why the background matters: raw white text on a bright frame is unreadable. The node draws a semi-transparent box behind the timecode (at 0.5 it's a good middle ground), and the fallback font chain - default → Arial → DejaVuSans → platform fonts → built-in - means it works even on a bare Linux box with no fancy fonts installed. That font fallback is the sort of robustness that tells you this pack actually got used on real machines.

The mechanism is boring in the best way: PIL + numpy per frame, timecode computed from start_time plus frame_index/fps, output IMAGE same dimensions as input. Frame-accurate, no drift, works on any batch. If this node has a flaw it's that it's too specific - there's no per-frame formatting (like only showing every 10th frame), no export of the timecode as metadata alongside the burned version. If you need machine-readable timecodes you'd grab the text separately; if you need them visible, this is the tool.

The one trap that will actually bite you: fps mismatch. The node doesn't know what frame rate your batch was rendered at - you tell it. Set fps to 30 for a 24fps render and every second of timecode shows ~30 frames of progress, so a 24fps clip displays slow by exactly 20%. Decide the fps when you build the workflow and leave it alone.

Trivia for the curious: this is the rare DJZ node with a perfect search click-through rate - the few people who land on it know exactly what it's for. Install: ComfyUI Manager → "DJZ-Nodes", or cd ComfyUI/custom_nodes && git clone https://github.com/MushroomFleet/DJZ-Nodes && pip install -r requirements.txt. Whole-pack install, but this node itself is featherweight - PIL/numpy only, no GPU load.

Categoryimage/overlay

Inputs (9)

NameTypeDefaultDescription
imagesIMAGE
fpsFLOAT30.01–120
start_timeSTRING00:00:00:00
fontCOMBO1 options: default
font_sizeINT328–256
positionCOMBObottom2 options: top, bottom
text_colorCOMBOwhite6 options: white, black, red, green, blue, yellow
background_opacityFLOAT0.50–1
reverse_countBOOLEANfalse

Outputs (1)

NameTypeDescription
IMAGEIMAGE