---
title: "What is a frame iterator?"
description: "A frame iterator walks a video at a chosen rate and emits one row per frame, with an index and a timestamp on the source clip."
url: "https://pixeltable.com/learn/what-is-a-frame-iterator"
updated: "2026-09-29"
vertical: "Video"
doc: "https://docs.pixeltable.com/howto/cookbooks/video/video-extract-frames"
---

# What is a frame iterator?

A frame iterator walks a video at a chosen rate and emits one row per frame, with an index and a timestamp on the source clip.

Updated: 2026-09-29
Part of [What is an iterator?](https://pixeltable.com/learn/what-is-an-iterator).

## On this page

- [How it works](https://pixeltable.com/learn/what-is-a-frame-iterator#how-it-works)
- [What it is not](https://pixeltable.com/learn/what-is-a-frame-iterator#what-it-is-not)
- [Comparison](https://pixeltable.com/learn/what-is-a-frame-iterator#comparison)
- [Where Pixeltable fits](https://pixeltable.com/learn/what-is-a-frame-iterator#where-pixeltable-fits)
- [Questions](https://pixeltable.com/learn/what-is-a-frame-iterator#questions)

## How it works {#how-it-works}


- You choose frames per second.
- Each frame is a row of a view over the video.
- Models and embedding indexes run on the frame column.

## What it is not {#what-it-is-not}

It is not an ffmpeg command you cron and never reattach to the parent video.

## frame iterator: this, and the thing it is confused with {#comparison}

|  | This | Not this |
| --- | --- | --- |
| Rate | You set it | Every encoded frame, always |
| Parent | The video row | A folder of JPEGs |
| Position | Frame index and timestamp | Lost after extraction |

## Where Pixeltable fits {#where-pixeltable-fits}

Pixeltable’s view sets iterator=frame_iterator(video=Videos.video, fps=1). The frame column is what later columns read.

```python
import pixeltable as pxt
from pixeltable.functions.video import frame_iterator

TableModel = pxt.model_base()

class Videos(TableModel, name='videos'):
    video: pxt.Video

class Frames(
    TableModel,
    name='frames',
    base=Videos,
    iterator=frame_iterator(video=Videos.video, fps=1),
):
    pass
```

## Questions {#questions}

### How does frame iterator work? {#faq-1}

You choose frames per second. Each frame is a row of a view over the video. Models and embedding indexes run on the frame column.

### What is frame iterator often confused with? {#faq-2}

It is not an ffmpeg command you cron and never reattach to the parent video.

## In the blog

- [ClipFinder: Natural-Language Video Moment Search in One app.py](https://pixeltable.com/blog/clipfinder-semantic-video-moment-search)
- [VideoRAG: Where Pixeltable Stores Frames and Indexes](https://pixeltable.com/blog/videorag-where-pixeltable-stores-indexes)
- [Extract Video Keyframes 10x Faster with Pixeltable's frame_iterator](https://pixeltable.com/blog/video-keyframe-extraction-pixeltable)

## Related

- [Documentation](https://docs.pixeltable.com/howto/cookbooks/video/video-extract-frames)
- [Extract Video Keyframes 10x Faster with Pixeltable's frame_iterator](https://pixeltable.com/blog/video-keyframe-extraction-pixeltable)
- [YOLOX Object Detection for Video Analysis: Complete Guide with Pixeltable](https://pixeltable.com/blog/object-detection-videos-yolox)
- [Video intelligence pipeline](https://pixeltable.com/use-cases/video-content-analysis)
