Skip to main content

ffvm

A CLI tool for encoding videos with ffmpeg and scoring quality with VMAF. Supports single files, batch processing, and automatic CRF sweeping to hit a target VMAF score.

Results table

Installation

Requires ffmpeg (built with libvmaf) and ffprobe in PATH.

pip install ffvm

Commands

encode

Encode a single video file.

ffvm encode input.mp4 output.mp4 --vcodec libsvtav1 --crf 28 --preset 5 --extra "-svtav1-params tune=0:enable-qm=1:qm-min=0" --extra "-write_tmcd 0"

Options:

  • --vcodec — Video codec: copy, libx264, libx265, libsvtav1, libvpx-vp9, libaom-av1, librav1e (default: libx264)
  • --crf — Constant Rate Factor (default: 23)
  • --preset — Encoder preset, e.g. 5
  • --extra — Extra ffmpeg arguments (repeatable), e.g. --extra "-svtav1-params tune=0"
  • --acodec — Audio codec: copy, aac, libopus, libvorbis, flac, pcm_s16le, libmp3lame (default: copy)
  • --ab — Audio bitrate, e.g. 160k
  • --resolution — Output resolution, e.g. 1920x1080
  • --compare — Run VMAF comparison after encoding

batch

Encode all videos in a directory.

ffvm batch ./videos --vcodec libsvtav1 --crf 30 --compare

Output files are named {original}_{codec}_{crf}.{ext}. Additional options:

  • --output-dir — Write encoded files to a different directory
  • --recursive — Search subdirectories for videos
  • --overwrite — Skip overwrite confirmations
  • --compare — Run VMAF on each encode and display a results table

sweep

Find the optimal CRF for a video using binary search against a VMAF target. Extracts representative segments, tests CRF values, and encodes the full video at the best CRF found.

ffvm sweep input.mp4 output.mp4 --target-vmaf 95.0 --crf-min 20 --crf-max 35

Options:

  • --target-vmaf — Target VMAF score (default: 93.0)
  • --crf-min — Lower bound of CRF search range (default: 23)
  • --crf-max — Upper bound of CRF search range (default: 32)

batch-sweep

Run CRF sweep on every video in a directory. Each video gets its own optimal CRF.

ffvm batch-sweep ./videos --vcodec libsvtav1 --target-vmaf 95.0

How sweep works

  1. Extracts 1-7 short segments (scaled by video length) from the middle 80% of the video
  2. Binary searches through the CRF range, encoding and VMAF-scoring each segment per iteration
  3. Converges when crf_max - crf_min <= 1
  4. Encodes the full video at the resulting CRF

Roadmap

  • RAM disk support for intermediate files
  • Test suite (unit tests for pure functions, integration tests for encode pipeline)
  • Better error handling for ffmpeg subprocess failures
  • Robust VMAF score parsing
  • Logging for long-running operations (sweep, batch)
  • UI improvements (progress display, summary tables)

Metadata

Release files for ffvm 0.2.3

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for ffvm 0.2.3
File Size Uploaded
ffvm-0.2.3.tar.gz 97.7 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for ffvm 0.2.3
File Interpreter ABI Platform
ffvm-0.2.3-py3-none-any.whl Python 3 none any Details

Total release size: 117.7 kB

Release files / ffvm-0.2.3.tar.gz

Download URL ffvm-0.2.3.tar.gz
Size 97.7 kB
Tags Source
SHA-256 checksum
How to use checksums
c6a70ed88728fb4960b4d267551f5de0ba0d46d4b4f71201e0cc5530db682222
BLAKE2b-256 checksum
How to use checksums
573b5cbd1eb5c1d9844460e1733fa0eb693ed9e523a7f117cbcc0c651a18154d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Mar 24, 2026.

Transparency log

Release files / ffvm-0.2.3-py3-none-any.whl

Download URL ffvm-0.2.3-py3-none-any.whl
Size 19.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
3b3a834177c4891204fc2a2ac49dd9b5cb7c164b5466fdb534a4baf269e66fc7
BLAKE2b-256 checksum
How to use checksums
79ef419f8512fc95fea6522dad8467da501a70f1d46c3f78938a9b72374d0769
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Mar 24, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.2.3 This release

2 release files

0.2.2

2 release files

0.2.1

2 release files

0.2.0

2 release files

0.1.1

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page