Skip to main content

CLI tool for encoding videos with ffmpeg and scoring quality with VMAF

Project description

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)

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

ffvm-0.2.3.tar.gz (97.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

ffvm-0.2.3-py3-none-any.whl (19.9 kB view details)

Uploaded Python 3

File details

Details for the file ffvm-0.2.3.tar.gz.

File metadata

  • Download URL: ffvm-0.2.3.tar.gz
  • Upload date:
  • Size: 97.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for ffvm-0.2.3.tar.gz
Algorithm Hash digest
SHA256 c6a70ed88728fb4960b4d267551f5de0ba0d46d4b4f71201e0cc5530db682222
MD5 c0a687a953cfcfaba6f6c5dc70bef7c3
BLAKE2b-256 573b5cbd1eb5c1d9844460e1733fa0eb693ed9e523a7f117cbcc0c651a18154d

See more details on using hashes here.

Provenance

The following attestation bundles were made for ffvm-0.2.3.tar.gz:

Publisher: publish.yml on birkdev/ffvm

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ffvm-0.2.3-py3-none-any.whl.

File metadata

  • Download URL: ffvm-0.2.3-py3-none-any.whl
  • Upload date:
  • Size: 19.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for ffvm-0.2.3-py3-none-any.whl
Algorithm Hash digest
SHA256 3b3a834177c4891204fc2a2ac49dd9b5cb7c164b5466fdb534a4baf269e66fc7
MD5 6b719db276c27a95873701da046d4d36
BLAKE2b-256 79ef419f8512fc95fea6522dad8467da501a70f1d46c3f78938a9b72374d0769

See more details on using hashes here.

Provenance

The following attestation bundles were made for ffvm-0.2.3-py3-none-any.whl:

Publisher: publish.yml on birkdev/ffvm

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page