# scikit-video puts FFmpeg behind a numpy shaped API for quality metrics

> scikit-video is a Python video processing module built on scipy, numpy and FFmpeg, with the no-reference quality metrics and scene detection that researchers expect from a scikit style library. Version 1.2.0 changed four metric values outright, so upgrading is a data decision, not a routine pull.

**scikit-video/scikit-video** — Video Processing in Python

- Repository: https://github.com/scikit-video/scikit-video
- Website: http://www.scikit-video.org
- Stars: 713 · Forks: 154
- Language: Python
- License: BSD-3-Clause
- Published: 2026-10-21 · Updated: 2026-10-21 · Language: en
- Canonical page: https://hysenlabs.com/projects/scikit-video-scikit-video

## A scikit-style library for work that normally needs command lines

scikit-video is a Python module for video processing built on top of scipy, numpy and FFmpeg, and it borrows its coding styles and conventions from scikit-image and scikit-learn. The problem it addresses is mundane and common: extracting frames and measuring them usually means shelling out to FFmpeg, stitching results back together by hand, and writing a different pipeline for every metric. A library shaped like the scikit family removes that translation layer. The audience is researchers and engineers in scientific computing who need frame data as arrays they can pass to numpy and scipy, plus a set of analysis routines that are hard to implement from scratch. The repository topics name the territory precisely: ffmpeg-wrapper, python, quality-assessment, scene-detection, scientific-computing, video, video-processing. The licence is the 3-clause BSD, the project is distributed under it, and the copyright line runs 2015 to 2026, which tells you the project is old enough to have history and young enough to be current.

## Four metrics changed their answers in version 1.2.0

The most important thing in the release notes is a breaking change that is easy to miss because the function signatures did not change. Version 1.2.0 is titled the metric accuracy overhaul, and it covers NIQE, BRISQUE, VIIDEO and Video-BLIINDS, whose implementations were validated against their reference MATLAB implementations and fixed where they diverged. The fixes were concrete: a reference NIQE model, an antialiased half-scale resize, a faithful VIIDEO port, and motion tie-breaking. The consequence is stated without hedging. These four metrics return different, and by the project's account more accurate, values than in 1.1.x, and scores and features are not comparable across the 1.1.x and 1.2.x boundary, even though the signatures are unchanged. That is the worst kind of break for a metrics library, because nothing raises, nothing warns, and every historical number in a spreadsheet or database quietly stops meaning the same thing. By contrast, MSE, PSNR, SSIM, MS-SSIM and ST-RRED were validated as already correct and are unchanged. If you have a dashboard of quality scores that predates the upgrade, you have a decision to make: invalidate the history or pin the version.

## FFmpeg is the backend and the deprecations point at where it goes next

The dependency picture is simple and has a direction. FFmpeg 2.8 or newer on the system PATH is required and is described as the primary tested backend. The libav and avconv backend is deprecated and will be removed in a future release. mediainfo, via the mprobe helper, is optional and also deprecated with removal planned. Version 1.3.0 extends that cleanup to a hardcoded container-extension allowlist, which is now deprecated with a DeprecationWarning, and unknown extensions warn and defer to FFmpeg instead of raising. Two details from that release are worth a careful read. Binaries are resolved only from absolute PATH entries and never from the current working directory, which is a PATH security fix, and it means a stray ffmpeg executable sitting in your project directory can no longer be picked up. And roughly 1,000 lines of dead, vendored and Python 2 era code were removed, with a pyflakes lint gate in CI added to keep it that way. The trend is unambiguous: one backend, the standard one, and less magic around file extensions.

## Reading video into numpy without writing the plumbing

The module's core value is that video data becomes ordinary arrays that flow into the rest of the scientific Python stack. The 1.1.12 to 1.1.15 line is where that matured, and the changes are worth knowing because they describe the actual data flow. The package was modernised for current Python of 3.10 and newer, NumPy 2.x and SciPy with no breaking API changes. Packaging moved to a modern pyproject.toml. Input handling was expanded to non-local I/O, meaning URLs and file-like objects, and pathlib.Path support was added. Audio passthrough arrived through an audiosrc= argument, which matters for pipelines that need to keep the sound track while analysing the picture. A Python 3 correctness pass was carried out, and input validation now raises exceptions instead of failing quietly. Version 1.2.1 continued the compatibility work with NumPy 2.5, where linalg.eig always returns complex and symmetric eigendecompositions have to use eigh, and it also removed an unused opencv-python-headless dependency, fixed FFmpeg version and binary detection, and made errors clearer on bad backend names and unsupported channel counts.

## Installing it and running the test suite

Installation is a pip install from PyPI, and the source route is a clone and a local install. For development, an editable install pulls in the test dependencies:

```bash
    pip install scikit-video
```

```bash
    git clone https://github.com/scikit-video/scikit-video.git
    cd scikit-video
    pip install .
```

```bash
    pip install -e ".[test]"
```

The test suite then runs with pytest against the package's own test directory:

```bash
    pytest -v skvideo/tests
```

Tests that need FFmpeg or libav are skipped automatically when the binary is not on the system PATH, which is a good sign for a library whose core dependency is an external program. One migration trap is documented for anyone who installed before version 1.1.10, since there can be an import conflict with the older sk-video package. The fix is to uninstall the old one:

```bash
    pip uninstall sk-video
```

Then check that the import resolves where you expect it, which is a two line check:

```python
    import skvideo
    print(skvideo.__file__)
```

The declared runtime requirements in the package metadata are numpy at 1.22 or newer, scipy at 1.9 or newer and Pillow at 9.0 or newer, with a Python floor of 3.10. The supported interpreter versions run from 3.10 to 3.14, and the package is classified as Beta in its classifiers, with the intended audience listed as developers and science and research.

## What scikit-video does not do, and what to use instead

Two boundaries matter. The first is that scikit-video is a measurement and analysis library, not a transcoder or an editing tool. It reads video and computes properties of it, and the roadmap confirms the direction: spatial-temporal filtering helpers, speedup routines using cython and possibly opencl, more ffmpeg interfacing, and more algorithms with more thorough benchmarks. If your task is to cut, concatenate, re-encode or publish a video with filters, the tool for that is FFmpeg itself, with a Python wrapper such as ffmpeg-python on top, and scikit-video is at best a way to inspect the result. The second boundary is the reference implementation question. The project validated its metrics against reference MATLAB implementations and corrected divergences, which is exactly what you want from a metrics library, but it also means a different library that copied the older, less accurate behaviour will give different numbers from the same file. When comparing scikit-video results against another implementation, check the version of the other implementation first. The library is a good fit when your pipeline is analysis, and the wrong tool when your pipeline is production encoding.

## Conclusion

Adopt scikit-video if your work needs no-reference video quality scores, scene detection or frame level analysis in numpy arrays, and you can accept a dependency on FFmpeg on the system PATH. Do not adopt it if you are shipping a reproducible score series that spans the 1.1.x and 1.2.x boundary, because NIQE, BRISQUE, VIIDEO and Video-BLIINDS return different values after 1.2.0, and do not use the libav or mediainfo backends since both are deprecated with removal planned for 1.4.0. Before you upgrade, read CHANGELOG.rst, decide whether you will invalidate stored scores or pin to 1.1.x, and confirm that ffmpeg resolves from an absolute PATH entry on your machines.

## FAQ

### How do I install scikit-video?

Install it from PyPI with `pip install scikit-video`, or clone the repository and run `pip install .` in the checkout. An editable install with the test extras is `pip install -e ".[test]"`, and the suite then runs with `pytest -v skvideo/tests`.

### What does version 1.2.0 of scikit-video change?

It is a metric accuracy overhaul. NIQE, BRISQUE, VIIDEO and Video-BLIINDS were validated against their reference MATLAB implementations and fixed where they diverged, so they now return different and more accurate values than in 1.1.x. Signatures are unchanged but scores are not comparable across that boundary.

### Which backends does scikit-video support and which are going away?

FFmpeg 2.8 or newer on the system PATH is the primary tested backend. The libav and avconv backend is deprecated, mediainfo is optional and deprecated, and the hardcoded container-extension allowlist is deprecated with removal planned for 1.4.0, after which unknown extensions warn and defer to ffmpeg.

### What are the requirements for scikit-video?

Python 3.10 or newer, numpy 1.22 or newer, scipy 1.9 or newer and Pillow 9.0 or newer, plus FFmpeg 2.8 or newer installed on the system PATH. Version 1.2.1 added compatibility with NumPy 2.5, where linalg.eig always returns complex.

### How do I fix an import conflict with the old sk-video package?

If you installed scikit-video before version 1.1.10, uninstall the older package with `pip uninstall sk-video`, then confirm that `skvideo` resolves to the expected location by printing skvideo.__file__.

## Sources

- [License: BSD-3-Clause](https://github.com/scikit-video/scikit-video/blob/master/LICENSE)
- [Project website](http://www.scikit-video.org)
- [README](https://github.com/scikit-video/scikit-video/blob/master/README.md)
- [Releases](https://github.com/scikit-video/scikit-video/releases)
- [scikit-video/scikit-video on GitHub](https://github.com/scikit-video/scikit-video)

---

Hysen Labs editorial analysis, written from the project's own repository and release notes. Cite the canonical page: https://hysenlabs.com/projects/scikit-video-scikit-video
