Skip to content

Playback and Codecs

RadicalMuffinMan edited this page Aug 8, 2026 · 3 revisions

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.

Backend by platform

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 on Apple platforms

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.

Dolby Vision Profile 7 on Android TV

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.

Codec support

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.

Audio passthrough

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.

Subtitles

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.

Tuning playback

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.

Clone this wiki locally