-
Notifications
You must be signed in to change notification settings - Fork 73
Playback and Codecs
Moonfin selects the best playback backend for each platform. Android, Windows, Linux, and web use media_kit (libmpv), Android TV uses a native Media3 and ExoPlayer backend with hardware codec probing and audio passthrough, iOS, Apple TV, and macOS use AetherEngine, a native Apple playback engine, and Samsung TV (Tizen) uses the native AVPlay player. On macOS, media_kit remains only for trailers and theme music.
| Platform | Backend | Notes |
|---|---|---|
| Android, Windows, Linux, Web | media_kit (libmpv) | Broad codec coverage without relying on platform-specific frameworks |
| Android TV / Google TV | Native Media3 and ExoPlayer | Dolby Vision Profile 7 direct play, hardware codec probing, audio passthrough, HDR detection |
| iOS, Apple TV (tvOS), macOS | AetherEngine (native Apple engine) | Dolby Vision Profile 7 conversion, TrueHD direct play on iOS, HEVC transcodes |
| Tizen (Samsung TV) | Native AVPlay (video_player_tizen) |
See the limitations in Installation |
AetherEngine converts Dolby Vision Profile 7 dual layer to Profile 8.1 in real time via libdovi, so dual layer content keeps Dolby Vision. TrueHD direct plays on iOS, and HEVC transcodes work on Apple platforms.
Profile 7 is the Dolby Vision flavor found in UHD Blu-ray remuxes, and no Android client could direct play it because ExoPlayer refuses the profile outright. Moonfin rewrites the Dolby Vision metadata as the stream arrives, so those files direct play and the server does no work. The video is never re-encoded.
What happens depends on the device:
| Device | Result |
|---|---|
| Profile 7 decoder, such as an Nvidia Shield | Played untouched |
| Profile 8 decoder and a Dolby Vision display | Metadata converted to Profile 8.1, real Dolby Vision |
| Anything else | Metadata stripped, the HDR10 picture underneath plays as plain HEVC |
Dual layer MKV remuxes keep their Dolby Vision data in block additions, which the stock reader discards. Moonfin reads it back out and converts it the same way.
The Dolby Vision Profile 7 direct play setting controls this. Auto picks the route for your device, Enabled forces direct play, and Disabled restores the old transcode. An advanced switch always takes the HDR10 path if a converted stream ever looks wrong on your setup.
Playback reports record which route was taken, where the metadata came from, and what the converter produced, so a problem file can be diagnosed from a log alone.
The libmpv path gives broad codec coverage without relying on platform-specific frameworks:
| Category | Supported Formats |
|---|---|
| Video | H.264, HEVC (H.265), VP8, VP9, AV1, MPEG-2, MPEG-4, VC-1 |
| Audio | AAC, MP3, FLAC, Opus, Vorbis, AC3 (Dolby Digital), EAC3 (Dolby Digital Plus), DTS, TrueHD, PCM (16-/24-bit), ALAC |
| Containers | MP4, MKV, WebM, AVI, MOV, TS / M2TS, WMV / ASF |
| Subtitles | SRT, ASS / SSA, VTT / WebVTT, TTML, SUB, plus bitmap (PGS, DVB, VobSub) on desktop |
| HDR | Dolby Vision, HDR10+, HDR10, HLG - automatic detection and signaling |
| HW Accel | VA-API, QSV, NVENC, VideoToolbox, V4L2, RKMPP |
The Android TV backend probes the device's own decoders rather than assuming a fixed list, so what direct plays follows the hardware. Formats it can't demux, such as ASF and WMV, are handed back to the server for a remux instead of failing on the device.
On the TV backends (Android TV via Media3 and Apple TV via AetherEngine), Moonfin supports bitstream audio passthrough for AC3, EAC3, DTS, DTS-HD, TrueHD, and Atmos to AV receivers.
Android TV has two modes. Auto follows what the hardware probe reports, which suits most setups. Manual exposes a toggle per codec for the cases where a device misreports what its receiver accepts. Anything not bitstreamed is decoded in software and sent as PCM, so a track always plays even when passthrough is unavailable.
Because every audio codec Moonfin can decode is advertised to the server, an audio track alone no longer forces a video transcode. When audio does need converting, the video stream is copied rather than re-encoded.
Embedded ASS fonts reach the libass renderer on Apple platforms, so styled subtitles render with their intended fonts. Bitmap subtitles like PGS are positioned on the video itself rather than the whole player view. During Live TV, embedded CEA-608/708 closed captions display on all platforms.
On Windows, Linux, and Android when the mpv playback engine is selected, you can supply your own mpv.conf for custom shaders, scaling algorithms, and tone mapping. This doesn't apply to iOS, Apple TV, or macOS, which use AetherEngine. See Custom mpv Configuration.