Extract Frame
Grab the still that seeds the next clip
- video
- image
The most useful single-frame trick in AI video is the loop: generate a clip, grab its last frame, feed that frame back into an image-to-video node, and keep extending. Extract Frame is the middle step of that trick, and it's the node you'll wire more often than you expect.
What it does
It pulls one still out of a COMFYTV_VIDEO and hands it back as a COMFYTV_IMAGE snapshot - which is exactly what a Video Stage's I2V workflow wants as its images input. Under the hood it's PyAV decoding a single frame on disk and writing a PNG, so it costs zero VRAM and runs in a moment. The "zero GPU" part matters on a machine where VRAM is already split between generation and editing.
Two inputs do the real work:
- position -
last(the default, and the one you want for extension),first,middle, orcustom. - at_seconds - the timestamp when
position=custom; otherwise ignored. Range 0–3600.
The output is one image of type COMFYTV_IMAGE. From there it can go to an Upscale or Image Edit stage, or straight back into Video Stage's images input for the extend dance.
Where it fits in a workflow
ComfyTV even automates the loop for you: the ↪ Extend toolbar action extracts the source's last frame, spawns a new Video Stage, and wires the frame in as the I2V starting image. You can do it manually too, and the manual version is worth understanding because you often don't want the last frame - you want the one at 4.3 seconds where the composition finally settled. That's what custom + at_seconds is for.
A couple of grounded quirks. If you ask for a timestamp beyond the clip's duration, PyAV clamps to the valid range and you'll likely land near the last frame - not an error, just not where you aimed. And the output is a snapshot type, not a tensor: to feed the frame into a normal LoadImage-style graph you'd Bridge it, though inside ComfyTV it connects natively.
Install and setup
Pack-standard install: cd ComfyUI/custom_nodes && git clone https://github.com/jtydhr88/ComfyTV, restart ComfyUI. It appears under ComfyTV → Video. No model downloads - this is a media-processing stage, not a generation one. The one dependency to be aware of is PyAV itself, which the pack leans on for all its video work; it ships in most modern ComfyUI installs, and if a node errors with No module named 'av', a pip install av into your ComfyUI venv fixes it.
Troubleshooting
- "needs upstream video" - the node reads its upstream snapshot; make sure the upstream Video Stage or Load Video was actually run and the wire is connected.
- Frame looks wrong / not the frame you picked - double-check whether
positionis oncustom(it usesat_seconds) versuslast/middle. - Can't wire the still into a native node - expected; use a Bridge to convert
COMFYTV_IMAGEto a tensor.
Small node, single job, and it unlocks the whole "still → video" loop that most of this pack's interesting work builds on.
Inputs (6)
| Name | Type | Default | Description |
|---|---|---|---|
| force_run_token | INT | 00–2147483647 | Internal — bumped on Run to invalidate ComfyUI's input cache. |
| project_id | STRING | Internal — populated by the projectStore on the frontend. | |
| parent_output_id | INT | 00–2147483647 | Internal — lineage parent set by spawn handlers on the frontend. |
| position | COMBO | last | Which frame to grab. 'custom' uses at_seconds. |
| at_seconds | FLOAT | 0.000–3600 | Custom timestamp in seconds. Ignored unless position=custom. |
| videoopt | COMFYTV_VIDEO | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| image | COMFYTV_IMAGE | — |