Timeline Viewer π¬
Scrub your generated video like it's a real NLE β Timeline Viewer is the preview VHS never gave you
- images
- audio
If you generate video in ComfyUI - AnimateDiff, Wan, LTX, whatever's hot this month - you know the ritual. Queue up a long batch, wait, and then stare at the tiny inline player from VHS VideoCombine, which gives you roughly play/pause and not much else. Finding the exact frame where the motion breaks means squinting and clicking. Timeline Viewer (class TimelineViewer) is a single-node answer to that specific annoyance: an interactive player with a real scrubber, built as an explicit alternative to the VHS preview.
It's not another video encoder. It's a review tool - the thing you drop at the end of your graph when you want to actually look at what you made, the way you'd review a render in an edit suite.
How it works
Feed it your frame batch and it encodes an MP4 with ffmpeg (H.264, yuv420p, CRF 18) via a bundled imageio_ffmpeg binary or your system ffmpeg. Then a small JS frontend (js/timeline_viewer.js) paints a DOM widget right onto the node: video, a play button, a frame counter, and a click-and-drag timeline canvas. The scrubber shows a waveform if you passed audio, plus tick marks with real frame numbers. Drag it and the video seeks live.
Two details show the author thought about actual use. The frame counter uses the global offset - if you trim with frame_in, the readout still matches your original sequence instead of restarting at zero. And the loop toggle is reactive: flip it and the running video's loop property updates without re-rendering the graph. It's an output node with no tensor outputs - it wires to nothing, it just plays.
The inputs that matter
Most of the schema is set-and-forget. The ones you'll actually touch:
- images - your decoded frame batch (what normally feeds
VHS_VideoCombine). - audio (optional) - a ComfyUI
AUDIOtrack. Powers the waveform and gets muxed into the MP4. - frame_rate - fps for the encode, default 24.
- frame_in / frame_out - trim the range you want. The tooltip on
frame_outsays it in Spanish: 0 = hasta el final (0 = until the end). Off-by-one trap alert: leaveframe_outat 0 for the full sequence. - max_width (default 1920) - if your frames are wider, it downscales with LANCZOS before encoding. Preview bandwidth, not a quality setting - it only ever shrinks.
- loop, filename_prefix, save_output - playback, the output filename, and whether it lands in
output/(true) or the temp dir.
Install
The easiest path is ComfyUI Manager: search timeline_viewer_AV_comfyUI, install, restart. Same thing by hand:
cd ComfyUI/custom_nodes
git clone https://github.com/Alvidi/timeline_viewer_AV_comfyUI
# restart ComfyUI
It shows up under the Video category. No requirements.txt, no model files, no heavy downloads - just numpy (you have it), ffmpeg (bundled via imageio_ffmpeg or system), and torchaudio if you want audio. That's the whole install story.
Where people get burned
- Audio silently disappears. Audio processing is wrapped in a try/except: if
torchaudioisn't installed, the node prints[TimelineViewer] Audio errorin the console and carries on with no waveform and a silent video. If you wire audio and hear nothing, that's it -pip install torchaudio. - No ffmpeg β a Spanish error. The failure message is
ffmpeg no encontrado(the author's Spanish bleeds into the tooltips too - Ancho maximo del preview). ComfyUI's portable build ships ffmpeg, so this is rare, but if you hit it, get ffmpeg on your PATH. - Stale UI vs stale logic. Python changes (inputs, trimming) need a ComfyUI restart; JS changes need a hard browser refresh (
Ctrl+Shift+R). If the player looks old after an update, refresh first.
The author's "optimized for network drives" claim checks out in the code: the encode writes to /tmp first and moves the finished file into place, so you're not hammering a network mount mid-encode.
Is it world-changing? No. It's a focused utility that fixes one real pain: previewing long video batches without reaching for another tool. If you live in video workflows, it earns its spot next to VHS.
Inputs (9)
| Name | Type | Default | Description |
|---|---|---|---|
| images | IMAGE | β | |
| frame_rate | FLOAT | 24.01β120 | β |
| loop | BOOLEAN | false | β |
| filename_prefix | STRING | TimelineViewer | β |
| save_output | BOOLEAN | true | β |
| frame_in | INT | 00β99999 | β |
| frame_out | INT | 00β99999 | 0 = hasta el final |
| max_width | INT | 1920256β4096 | Ancho maximo del preview |
| audioopt | AUDIO | β |
Outputs (0)
No outputs