Benchmarks

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

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.

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).

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?

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

Which iterator?

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