Provides builds of libmpv for macOS & iOS, used by media_kit, compatible with commercial use for playback, and GPL use for encoding.
Heavily inspired by Homebrew and IINA.
Note
If you plan to use Nix only temporarily, prefer the Determinate Systems installer which ships a built-in uninstaller, unlike the official one.
$ nix develop -c make VERSION=v0.0.1
$ tree resultresult
├── libmpv-libs_v0.0.1_ios-arm64-audio-default.tar.gz
├── libmpv-libs_v0.0.1_ios-arm64-audio-encodersgpl.tar.gz
├── libmpv-libs_v0.0.1_ios-arm64-audio-full.tar.gz
├── libmpv-libs_v0.0.1_ios-arm64-video-default.tar.gz
├── libmpv-libs_v0.0.1_ios-arm64-video-encodersgpl.tar.gz
├── libmpv-libs_v0.0.1_ios-arm64-video-full.tar.gz
├── libmpv-libs_v0.0.1_iossimulator-amd64-audio-default.tar.gz
├── libmpv-libs_v0.0.1_iossimulator-amd64-audio-encodersgpl.tar.gz
├── libmpv-libs_v0.0.1_iossimulator-amd64-audio-full.tar.gz
├── libmpv-libs_v0.0.1_iossimulator-amd64-video-default.tar.gz
├── libmpv-libs_v0.0.1_iossimulator-amd64-video-encodersgpl.tar.gz
├── libmpv-libs_v0.0.1_iossimulator-amd64-video-full.tar.gz
├── libmpv-libs_v0.0.1_iossimulator-arm64-audio-default.tar.gz
├── libmpv-libs_v0.0.1_iossimulator-arm64-audio-encodersgpl.tar.gz
├── libmpv-libs_v0.0.1_iossimulator-arm64-audio-full.tar.gz
├── libmpv-libs_v0.0.1_iossimulator-arm64-video-default.tar.gz
├── libmpv-libs_v0.0.1_iossimulator-arm64-video-encodersgpl.tar.gz
├── libmpv-libs_v0.0.1_iossimulator-arm64-video-full.tar.gz
├── libmpv-libs_v0.0.1_iossimulator-universal-audio-default.tar.gz
├── libmpv-libs_v0.0.1_iossimulator-universal-audio-encodersgpl.tar.gz
├── libmpv-libs_v0.0.1_iossimulator-universal-audio-full.tar.gz
├── libmpv-libs_v0.0.1_iossimulator-universal-video-default.tar.gz
├── libmpv-libs_v0.0.1_iossimulator-universal-video-encodersgpl.tar.gz
├── libmpv-libs_v0.0.1_iossimulator-universal-video-full.tar.gz
├── libmpv-libs_v0.0.1_macos-amd64-audio-default.tar.gz
├── libmpv-libs_v0.0.1_macos-amd64-audio-encodersgpl.tar.gz
├── libmpv-libs_v0.0.1_macos-amd64-audio-full.tar.gz
├── libmpv-libs_v0.0.1_macos-amd64-video-default.tar.gz
├── libmpv-libs_v0.0.1_macos-amd64-video-encodersgpl.tar.gz
├── libmpv-libs_v0.0.1_macos-amd64-video-full.tar.gz
├── libmpv-libs_v0.0.1_macos-arm64-audio-default.tar.gz
├── libmpv-libs_v0.0.1_macos-arm64-audio-encodersgpl.tar.gz
├── libmpv-libs_v0.0.1_macos-arm64-audio-full.tar.gz
├── libmpv-libs_v0.0.1_macos-arm64-video-default.tar.gz
├── libmpv-libs_v0.0.1_macos-arm64-video-encodersgpl.tar.gz
├── libmpv-libs_v0.0.1_macos-arm64-video-full.tar.gz
├── libmpv-libs_v0.0.1_macos-universal-audio-default.tar.gz
├── libmpv-libs_v0.0.1_macos-universal-audio-encodersgpl.tar.gz
├── libmpv-libs_v0.0.1_macos-universal-audio-full.tar.gz
├── libmpv-libs_v0.0.1_macos-universal-video-default.tar.gz
├── libmpv-libs_v0.0.1_macos-universal-video-encodersgpl.tar.gz
├── libmpv-libs_v0.0.1_macos-universal-video-full.tar.gz
├── libmpv-xcframeworks_v0.0.1_ios-universal-audio-default.tar.gz
├── libmpv-xcframeworks_v0.0.1_ios-universal-audio-encodersgpl.tar.gz
├── libmpv-xcframeworks_v0.0.1_ios-universal-audio-full.tar.gz
├── libmpv-xcframeworks_v0.0.1_ios-universal-video-default.tar.gz
├── libmpv-xcframeworks_v0.0.1_ios-universal-video-encodersgpl.tar.gz
├── libmpv-xcframeworks_v0.0.1_ios-universal-video-full.tar.gz
├── libmpv-xcframeworks_v0.0.1_macos-universal-audio-default.tar.gz
├── libmpv-xcframeworks_v0.0.1_macos-universal-audio-encodersgpl.tar.gz
├── libmpv-xcframeworks_v0.0.1_macos-universal-audio-full.tar.gz
├── libmpv-xcframeworks_v0.0.1_macos-universal-video-default.tar.gz
├── libmpv-xcframeworks_v0.0.1_macos-universal-video-encodersgpl.tar.gz
└── libmpv-xcframeworks_v0.0.1_macos-universal-video-full.tar.gz$ nix flake show
$ nix develop -c make TARGET=mk-out-archive-libs-macos-universal-video-default
$ tree resultlibmpv-<format>_<version>_<os>-<arch>-<variant>-<flavor>.tar.gz
| Component | Notes | Value |
|---|---|---|
| format | Output format of built files | libs, xcframeworks |
| version | Semantic version | v0.0.1, … |
| os | Operating system | ios, iossimulator, macos |
| arch | Architecture | arm64, amd64, universal |
| variant | Usage context | audio, video |
| flavor | Available decoders and encoders | default, full, encodersgpl |
Inclusion:
- Variants:
$audio \subset video$ - Flavors:
$audio \subset full \subset encodersgpl$
| Platform | Arch | Min Version | Notes |
|---|---|---|---|
| macOS | amd64 | 10.9 |
Required by uchardet |
| arm64 | |||
| iOS | arm64 | 9.0 |
Required by ffmpeg |
| iOS Simulator | amd64 | 9.0 |
Required by ffmpeg |
| arm64 | 12.0 |
Required by xcodebuild -create-xcframework |
flowchart LR
subgraph legend[Legend]
direction TB
subgraph links
Q(node):::decoders -- "required" --> R(node):::decoders
S(node):::decoders -. "optional" .-> T(node):::decoders
end
subgraph variants
U(audio & video):::decoders
V{{video only}}:::decoders
end
subgraph flavors
W(default, full):::decoders
X(encodersgpl):::encoders
end
end
subgraph content[ ]
direction LR
A(mpv):::decoders -.-> B{{uchardet}}:::decoders
A -.-> C{{libass}}:::decoders
A --> D(ffmpeg):::decoders
E(fftools-ffi):::encoders --> D
%% libass
G -.-> F{{libpng}}:::decoders
C --> G{{freetype}}:::decoders
C --> H{{fribidi}}:::decoders
C --> I{{harfbuzz}}:::decoders
G -.-> I
%% ffmpeg
D -.-> J(mbedtls):::decoders
D -.-> K{{dav1d}}:::decoders
D -.-> L{{libxml2}}:::decoders
D -.-> M(libvorbis):::encoders
D -.-> N{{libvpx}}:::encoders
D -.-> O{{libx264}}:::encoders
M --> P(libogg):::encoders
end
classDef decoders stroke:#888
classDef encoders stroke:#14a,stroke-width:3px
classDef legend fill:transparent,stroke:#8882
classDef content fill:transparent,stroke:transparent
classDef card fill:transparent,stroke:#888a
legend:::legend
content:::content
links:::card
variants:::card
flavors:::card
-
mpv: A free (as in freedom) media player for the command line. It supports a wide variety of media file formats, audio and video codecs, and subtitle types
-
ffmpeg: A cross-platform solution for converting, streaming, and recording audio and video, with support for a wide range of codecs and formats
-
fftools-ffi: FFmpeg's command-line interface exposed as a shared library for FFI usage
-
libass: A library for rendering subtitles in videos, with support for advanced text formatting and positioning features (made optional with a patch)
-
fribidi: A library for handling bidirectional text (such as Arabic or Hebrew) in Unicode strings, with support for complex shaping and layout
-
freetype: A library for rendering high-quality text in graphics applications, with support for a wide range of font formats and glyph rendering techniques
-
harfbuzz: A library for shaping and laying out text in multiple languages and scripts, with support for advanced typography features such as ligatures and kerning
-
libpng: A library for reading and writing PNG (Portable Network Graphics) images, providing efficient image compression and lossless data handling
-
dav1d: A library for cross-platform AV1 decoding
-
libogg: Reference implementation of the Ogg media container
-
libvorbis: Reference implementation of the Ogg Vorbis audio format
-
libvpx: Reference implementation of the VP8 and VP9 video formats
-
libx264: Free software library for encoding video streams into the H.264/MPEG-4 AVC compression format
-
mbedtls: An open source, portable, easy to use, readable and flexible TLS library
-
libxml2: A library for processing XML data, used by ffmpeg to support the Dash protocol
-
uchardet: A C++ port of the Universal Character Encoding Detector (used by Mozilla Firefox and Thunderbird) for detecting the encoding of input text
| Dependency | Licence | Commercial use |
|---|---|---|
| mpv | LGPL-2.1 (-Dgpl=false) |
✅ |
| ffmpeg | LGPL-2.1 (--enable-gpl & --enable-nonfree omitted) |
✅ |
| libass | ISC | ✅ |
| freetype | FreeType | ✅ |
| harfbuzz | MIT | ✅ |
| fribidi | LGPL-2.1 | ✅ |
| libpng | zlib/libpng | ✅ |
| mbedtls | Apache 2.0 | ✅ |
| uchardet | MPL-1.1, GPL-2, LGPL-2.1 | ✅ |
| libxml2 | MIT | ✅ |
| dav1d | BSD-2-clause | ✅ |
| Dependency | Licence | Commercial use |
|---|---|---|
| mpv | LGPL-2.1 (-Dgpl=false) |
✅ |
| ffmpeg | GPL-2.1 (--enable-nonfree omitted) |
❌ |
| libass | ISC | ✅ |
| freetype | FreeType | ✅ |
| harfbuzz | MIT | ✅ |
| fribidi | LGPL-2.1 | ✅ |
| libpng | zlib/libpng | ✅ |
| mbedtls | Apache 2.0 | ✅ |
| uchardet | MPL-1.1, GPL-2, LGPL-2.1 | ✅ |
| libxml2 | MIT | ✅ |
| dav1d | BSD-2-clause | ✅ |
| fftools-ffi | LGPL-2.1 | ✅ |
| libx264 | GPL-2.0+ | ❌ |
| libvpx | BSD-3-clause | ✅ |
| libvorbis | BSD-3-clause | ✅ |
| libogg | BSD-3-clause | ✅ |
-
Some dependencies, which are not needed at the moment, may be added in the future:
-
libbluray: A library for reading and parsing Blu-ray discs, with support for advanced features such as BD-J menus and seamless branching
-
libarchive: A library for reading various archive formats, including tar and zip, with support for compression and metadata, and a flexible API for reading and extracting archive contents
-
-
We use
mesonas much as possible in order to simplify cross-compilation, at the cost of some heaviness regarding legacy packages
As the dependency of mpv on libass is deeply embedded in the code, the simplest solution was to:
- Remove the dynamic linking in
meson.build. - Include the
ass/ass.handass/ass_types.hheaders directly in the code - Remove the call to
ass_library_versioninplayer/command.c - Remove the calls to
ass_library_init, called bymp_ass_init, insub/osd_libass.candsub/sd_ass.c
- https://github.com/stps/mpv-ios-scripts
- https://github.com/iina/homebrew-mpv-iina
- https://github.com/mpv-android/mpv-android
- https://github.com/jnozsc/mpv-nightly-build
- https://github.com/smplayer-dev/mpv
- https://github.com/smplayer-dev/smplayer
- https://github.com/ldwardx/mpv-build-mac-iOS
- https://github.com/birros/godot_tl/tree/ca2fc4151bd8141241151dd6e29768608600473a/toolchains
- https://github.com/Vargol/ffmpeg-apple-arm64-build
- https://github.com/arthenica/ffmpeg-kit