-
Notifications
You must be signed in to change notification settings - Fork 31
GitHub Actions
FFmpegKitNext builds every platform script on GitHub Actions. There is one workflow per project-level <platform>.sh script, stored under .github/workflows/<platform>-build-scripts.yml.
Status: These workflows currently live on the
developmentbranch and have not been merged tomainyet. If you are looking atmain, you will not find them under.github/workflows/until the merge lands. Remove this note once they reachmain.
The nix-<platform>.sh wrappers and apple.sh have no workflows. The Nix wrappers enter a pinned profile and then call the same direct scripts, so the direct scripts are the ones that need CI coverage: they are the build path most sensitive to host PATH, package manager, compiler and Autotools differences. apple.sh only packages already-built Apple frameworks; it does not compile anything.
The workflows are generated from the information already published in this wiki:
| Workflow element | Wiki source |
|---|---|
| Runner operating system for each script | Host Support |
| Dependency install step for each job | The matching Prerequisites page, "Requirements Without Nix" |
| Toolchain versions | The matching Prerequisites page |
| Build options passed to the script | The matching <platform>.sh page |
When a build fails in CI because a host tool is missing, the fix belongs in both places: the workflow installs the tool, and the Prerequisites page is corrected so manual non-Nix builds get the same information.
| Job | Runner | Script | Architecture | Libraries |
|---|---|---|---|---|
| android arm64-v8a on ubuntu-24.04 | ubuntu-24.04 |
android.sh |
arm64-v8a |
all except gnutls
|
| android arm64-v8a on macos-26 | macos-26 |
android.sh |
arm64-v8a |
all except gnutls
|
| ios arm64 on macos-26 | macos-26 |
ios.sh |
arm64 |
all except gnutls
|
| tvos arm64 on macos-26 | macos-26 |
tvos.sh |
arm64 |
all except gnutls
|
| macos arm64 on macos-26 | macos-26 |
macos.sh |
arm64 |
all except gnutls
|
| visionos arm64 on macos-26 | macos-26 |
visionos.sh |
arm64 |
all except gnutls
|
| linux x86-64 on ubuntu-24.04 | ubuntu-24.04 |
linux.sh |
x86-64 |
all except linux-gnutls
|
| linux arm64 on ubuntu-24.04-arm | ubuntu-24.04-arm |
linux.sh |
arm64 |
all except linux-gnutls
|
| web wasm32 on ubuntu-24.04 | ubuntu-24.04 |
web.sh |
wasm32 |
all except gnutls
|
| web wasm32 on macos-26 | macos-26 |
web.sh |
wasm32 |
all except gnutls
|
| windows arm64 on windows-11-arm | windows-11-arm |
windows.sh |
arm64 |
all except gnutls
|
The Apple jobs additionally pass --xcframework, so they also exercise the xcframework packaging path.
A GitHub Actions job is cancelled after six hours. Each architecture rebuilds FFmpeg and every enabled external library from source, so building all architectures of a platform in one job exceeds that limit on several platforms. Every job therefore pins a single architecture with --arch, which also makes a failure point at one architecture instead of an entire platform.
The architecture matches the runner where the build is native rather than cross-compiled. linux.sh and windows.sh compile natively, so the host architecture is the target and there is no cross-compilation path: x86-64 needs an x86-64 runner and arm64 needs an arm64 runner. android.sh and the Apple scripts cross-compile, and web.sh always targets wasm32-unknown-emscripten, so their host architecture is unconstrained.
Every job builds with --enable-lib-all --enable-gpl, the widest configuration each script accepts. This exercises the most build code per run, and is the other reason a single architecture per job matters. The GPL-licensed libraries this adds are x264, x265, xvidcore, libvidstab and rubberband.
gnutls is the one exclusion. FFmpeg supports several HTTPS/TLS implementations but only one at a time, and its configure rejects the combination outright:
GnuTLS and OpenSSL must not be enabled at the same time.
Since --enable-lib-all enables both, gnutls is disabled so openssl provides TLS. The option is --disable-lib-gnutls on every platform except Linux, where the system-package variant is named differently and the option is --disable-lib-linux-gnutls.
Note that --enable-lib-all means different work on different platforms. On Linux the --enable-lib-linux-* options resolve against system development packages through pkg-config, so the Linux jobs install those -dev packages in a separate step. On the other platforms the libraries are compiled from source.
Toolchains are pinned so CI matches the versions this project targets, rather than drifting with the runner images:
| Platform | Pinned toolchain |
|---|---|
| Android | SDK Platform 34, Build Tools 35.0.0, NDK 27.3.13750724, CMake 3.22.1, Temurin JDK 21
|
| iOS / tvOS / macOS / visionOS | Xcode 26.6, selected explicitly rather than the macos-26 image default |
| Linux | Distribution toolchain from ubuntu-24.04
|
| Web | Emscripten 5.0.6, matching the version the Nix web profile provides |
| Windows | MSYS2 CLANGARM64 environment, providing aarch64-w64-mingw32-clang
|
The jobs cover every host combination listed in Host Support, with two exceptions:
-
Android on arm64 Linux has no job. The Android NDK ships
darwin-x86_64,linux-x86_64andwindows-x86_64toolchains only, so the Linux Android job runs on the x86-64 image. Android on Apple silicon is unaffected, because the NDK'sdarwinbinaries are universal. -
Web on Windows has no job. Host Support lists Linux and macOS as the supported non-Nix hosts for
web.sh, and Emscripten has no native Windows arm64 build.
windows.sh targets arm64 only. x86-64 is implemented but not yet tested, so it has no job.
Copyright (c) 2026 FFmpegKitNext
- Status
- Versions
- Changelog
- Project Layout
- Using
- Building
- External Libraries
- Patents
- License