The easiest way to get ffmpeg v8 installed through python.
> pip install static-ffmpegimport static_ffmpeg
# ffmpeg installed on first call to add_paths(), threadsafe.
static_ffmpeg.add_paths() # blocks until files are downloaded
# or static_ffmpeg.add_paths(weak=True) to only add if ffmpeg/ffprobe not already on path
# Now ffmpeg and ffprobe will use static_ffmpeg versions.
os.system("ffmpeg -i myfile.mp4 ...")Or if you want more lazy behavior to install on first use, or you don't want to modify system paths, use static_ffmpeg
import static_ffmpeg
# ffmpeg installed on first call, threadsafe.
os.system("static_ffmpeg -i myfile.mp4 ...")You can also use it on the command line
> pip install static-ffmpeg
> static_ffmpeg -i file.mp4 ...
> static_ffprobe ...
> static_ffmpeg_paths
FFMPEG=c:\users\niteris\dev\static_ffmpeg\static_ffmpeg\bin\win32\ffmpeg.exe
FFPROBE=c:\users\niteris\dev\static_ffmpeg\static_ffmpeg\bin\win32\ffprobe.exeThis tool installs binaries for ffmpeg and ffprobe binary (with all plugins and codecs) into the running platform. The platform binaries are installed on first use and is done without requiring elevated permissions.
This package is designed to allow tools that rely on ffmpeg to have a fully featured ffmpeg available by just including this package. No seperate install of ffmpeg is needed.
Your ffmpeg tool would have to rely on the user to install ffmpeg, with the right build settings to ensure your tool functions correctly. This is a major pain for ffmpeg based tools (missing codecs for example) and this library solves this problem.
As of now, binaries are available for:
win32(Windows x64)darwin(macOS Intel x64)darwin_arm64(macOS Apple Silicon)linux(Linux x64, Ubuntu 20+)linux_arm64(Linux ARM64/aarch64)- Pull requests to support for other platforms are welcome! To add support please see related git repo: ffmpeg_bins.
There is both an python api and a command line api. After installing this package the command line aliases will be available:
static_ffmpegoperates just likeffmpegstatic_ffprobeoperates just likeffprobe.static_ffmpeg_pathsprints out the paths of the ffmpeg binaries.
> static_ffmpeg_paths
FFMPEG=c:\users\niteris\dev\static_ffmpeg\static_ffmpeg\bin\win32\ffmpeg.exe
FFPROBE=c:\users\niteris\dev\static_ffmpeg\static_ffmpeg\bin\win32\ffprobe.exeHere's how to get the binaries and execute them.
# Using the alias method
import os
# Platform binaries will be installed the first run.
os.system("static_ffmpeg -version") # static_ffmpeg is an alias for this tools ffmpeg.
os.system("static_ffprobe -version")# Using the program location method
import subprocess
from static_ffmpeg import run
# Platform binaries are installed on the first run of below.
ffmpeg, ffprobe = run.get_or_fetch_platform_executables_else_raise()
# ffmpeg, ffprobe will be paths to ffmpeg and ffprobe.
subprocess.check_output([ffmpeg, "-version"])
subprocess.check_output([ffprobe, "-version"])By default static-ffmpeg downloads the same per-platform zips it always has,
from the frozen ffmpeg_bins repo, so
existing installs keep resolving to the exact same URLs — those are never
moved.
New installs can additionally resolve binaries through a
manifest.json catalog, which lets
the download source, versions, and integrity hashes change without a client
release. The client detects a platform tuple (os / arch / libc, so glibc
and musl Linux builds are distinguished), resolves it against the catalog, and
verifies the artifact's sha256 before use. If the manifest is disabled,
unreachable, or does not describe the current platform, it falls back to the
legacy URL — resolution is never worse than before.
Manifest resolution is opt-in until the ffmpeg-bins2 catalog + CDN are live.
Point it at a catalog with:
export STATIC_FFMPEG_MANIFEST_URL="https://<cdn>/ffmpeg/manifest.json"See manifest.example.json for the catalog format and
issue #20 for the full
migration plan.
- Clone this project
git clone https://github.com/zackees/static_ffmpeg cd static_ffmpeg- Then run tox
tox
To test it in a virtual environment, use this easy helper:
To easily setup a virtual environment, please run
python setupvirtualenv.pyThen run ./activate.sh to activate the shell.
ffmpeg and ffprobe are both version: 8.0
- 3.0:
- FFmpeg upgraded to 8.0
- Added ARM64 support for macOS (Apple Silicon) and Linux (aarch64)
- New platform keys:
darwin_arm64,linux_arm64 - Automatic CPU architecture detection
- 2.7: Bugfix, increase the timeout to download for slow connections to 10 minutes.
- 2.6: Bugfix,
add_paths(...)can now be called multiple times without polluting the os env path. - 2.5:
add_paths()now has optionalweakparameter (default False). If True thenffmpeg/ffprobebinaries are only only if eitherffmpegORffprobedoesn't already exist on path - 2.3: Adds
static_ffmpeg.add_paths() - 2.2: Addressed bug 9 in some cases static_ffmpeg couldn't handle spaces in mp4 names.
- 2.1: Addressed bug 7 on Win32 for not handling spaces in directory names in the site packages path.
- 2.0:
- ffmpeg upgraded to 5.0
- added ffprobe (static_ffprobe or get run.get_platform_executables_or_raise() to get the binary location)
- Now downloads platform specific binary to reduce install size (reduced 2/3rds of the install size vs 1.0)
- 1.0:
- ffmpeg 4.4 released + tests