---
title: "Video frame extraction throughput"
description: "Reduced run, 1 clip, 108 frames, 0.24 s wall, 450 frames/s. Intel(R) Xeon(R) Processor, 4 cores, 15.6 GB, Linux 6.12.94+, Python 3.12.3, pixeltable 0.7.21."
url: "https://www.pixeltable.com/benchmarks/video-frame-extraction-throughput"
updated: "2026-10-28"
doc: "https://docs.pixeltable.com/howto/cookbooks/video/video-extract-frames"
---

# Video frame extraction throughput

One clip (scripts/release-bench/fixtures/sample.mp4) produced 108 frames through frame_iterator() plus a 64x36 thumbnail column in 0.24 s wall (450 frames per wall second). Pixeltable 0.7.21 on Intel(R) Xeon(R) Processor, 4 cores, 15.6 GB. This is not a multi-hour library measurement.

Updated: 2026-10-28

## How to run

- `python benchmarks/run.py --write`
- `Or: PIXELTABLE_HOME=$(mktemp -d) python benchmarks/scenarios/video_frames.py --clips 1 --out /tmp/vid.json --scale reduced`

## Results

1 clip, 108 frames, 0.24 s wall, 0.21 s CPU, 450 frames per wall second.

| Measure | Value |
| --- | --- |
| Clips | 1 |
| Frames | 108 |
| Insert | 0.24 s wall, 0.21 s CPU |
| Frames per wall second | 450 |

## Methods

- **Scale of this page:** reduced: 1 clip
- **Clip:** scripts/release-bench/fixtures/sample.mp4
- **Iterator:** frame_iterator() every frame, plus a 64x36 thumbnail column
- **Machine:** Intel(R) Xeon(R) Processor, 4 cores, 15.6 GB, Linux 6.12.94+, Python 3.12.3, pixeltable 0.7.21
- **Recorded:** 2026-10-28, command python benchmarks/run.py --write

## Limitations

- One short clip. A production library is longer files, more codecs, and disk that is not this VM.
- Each step ran once, with no warmup, so every time is one sample. scripts/release-bench repeats its runs.
- The thumbnail is 64x36. A larger resize would change the 450 frames-per-second figure.
- Do not compare this number to the /engineering video-to-frames series without reading both methods. That series uses CPU time across releases on a Mac.

## Where Pixeltable fits

If you only need ffmpeg on the command line, Pixeltable is the wrong tool. Use it when each still has to stay tied to the source clip and later columns (thumbnails, detectors, an index).

```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),
):
    thumb = frame.resize((64, 36))
```

## Questions

### Is this real-time playback speed? {#faq-1}

No. It is frames extracted and thumbnailed per wall second on this VM for one clip.

### Which iterator? {#faq-2}

pixeltable.functions.video.frame_iterator on every frame, not fps=1. The class-based form is in the snippet below.

## Related

- [How do I extract keyframes from video?](https://www.pixeltable.com/learn/how-to/extract-keyframes-from-video)
- [Every Pixeltable release, measured](https://www.pixeltable.com/engineering)

Docs: https://docs.pixeltable.com/howto/cookbooks/video/video-extract-frames
