A native media player built on AetherEngine, for macOS and iOS/iPadOS.
Open a video or audio file, a disc image or a stream URL and it plays, with Dolby Vision and HDR, height channels from TrueHD Atmos and DTS:X, every audio and subtitle track, and live thumbnail previews on the scrub bar.
macOS: universal binary (Apple Silicon + Intel), macOS 15.0+. iOS/iPadOS: universal app, iOS 18.0+.
- Plays almost anything, as it is. MKV, MP4, AVI, WMV, FLV, transport streams and more, with HEVC, H.264, AV1, VP9 and VC-1 video, decoded in hardware where the Mac or iPhone can and in software where it cannot. No conversion step, no transcoding server.
- HDR and Dolby Vision. HDR10, HDR10+, HLG and Dolby Vision play in HDR on a display that can show it. An iPhone or iPad with an HDR screen plays Dolby Vision as such; a Mac reports no Dolby Vision display, so there it plays the HDR10 base layer, with an experimental switch for the full composition.
- Height channels from TrueHD Atmos and DTS:X. The heights of a Blu-ray soundtrack are kept in a 7.1.4 bed and played as spatial audio, on AirPods or on the built-in speakers. Needs macOS or iOS 26.
- Every track. Switch audio and subtitle tracks while playing, attach an
.srt, and draw ASS/SSA subtitles with their own fonts and placement. - Disc images. A decrypted DVD-Video or Blu-ray
.isoopens with its titles and chapters. - Files, folders and URLs. Open from Finder or the Files app, step through a folder, or paste an
http/httpsURL, live IPTV streams included. - In 26 languages, with no account and no tracking.
macOS: grab the latest notarized .dmg from the Releases page, drag AetherPlayer to your Applications folder, and launch it. The .dmg keeps itself current through built-in auto-updates (Sparkle), so you only have to download it once. The Mac App Store version is on its way; until then, TestFlight carries the same build.
iOS/iPadOS: join the public TestFlight beta (the App Store release is on its way), or build and run it from source (see Build below).
- Wide-format playback. FFmpeg-backed decoding through AetherEngine, with an on-screen
native/swbadge so you can see which rendering path a file took. - Audio too, with system Now Playing. Open a music or audio file and AetherPlayer shows a dedicated Now Playing view (embedded cover art over a blurred backdrop, or a generated gradient when there is none). Playback wires into Control Center, the lock screen, and the keyboard media keys via
MPNowPlayingInfoCenter. - Lip-sync correction. J and K nudge the audio 50 ms earlier or later against the picture, for a soundbar or an AVR that adds video-processing latency. The value is shown on screen as you change it, and it is kept across sessions, because the error belongs to your audio chain and not to the file. Also in the Audio menu, with a reset.
- Audio and subtitle track switching from the menu bar or the tracks popover, with an "Off" option for subtitles. Drop an
.srtonto a playing video to attach it as a sidecar track, and pick the subtitle size from the Window menu. - Subtitle appearance. Settings (Cmd-,) sets size, font (System or the bundled Atkinson Hyperlegible), weight, color, background (box, outline, shadow or none) and vertical position for text subtitles, applied to the line on screen. ASS/SSA tracks draw with the fonts, colors and placement they ship with, on the picture rather than the window; a switch shows them as plain text in your own style instead.
- Disc titles and chapters. Open a decrypted DVD-Video or Blu-ray
.iso(from the Open dialog, a drop onto the window, or Finder's Open With) and the tracks popover lists its titles (pick one to switch) and the playing title's chapters (click to jump). - Several windows side by side. File ▸ New Window (Cmd+N) opens another player with its own engine, so two files play next to each other. The menu bar and Stats for Nerds act on the window you used last, a file opened from Finder plays in the front window while it is empty and in a new window of its own otherwise, the media keys follow the window that started playing or was used last, and closing a window ends its playback.
- Scrub bar with live preview. Hover the timeline for a thumbnail, click to seek, or drag to scrub.
- Frame capture. Save the current frame at full resolution (Cmd+Shift+S, or the camera button).
- Recents with thumbnails. Recently opened files show disk-cached keyframe thumbnails for quick visual recognition.
- Resume where you left off. Reopen a file and pick up at your last position.
- Folder playlists. Open a folder and step through its videos with Cmd+Left / Cmd+Right.
- Tunable buffering. Preferences (Cmd+,) set how far ahead to buffer, for slow or unstable network sources. On iOS and iPadOS the same settings live behind the gear button in the Home toolbar.
- Pick how multichannel audio is delivered. Formats that cannot be carried in fMP4 (TrueHD, DTS and DTS-HD MA, MP2, WMA, raw PCM) are re-encoded on the way to the player, and Preferences chooses on what. Surround compatibility (the default) uses Dolby Digital Plus, which an AV receiver or a soundbar decodes itself, works on nearly any setup, and folds 7.1 to 5.1. Lossless uses FLAC, which stays bit-perfect and keeps 7.1 whole, and suits headphones and built-in speakers; a sink that only accepts a Dolby bitstream falls back to stereo. Atmos objects survive neither, and an Atmos source that plays untouched never reaches this choice.
- Height channels from TrueHD Atmos and DTS:X. A TrueHD Atmos or DTS:X track keeps its heights in a 7.1.4 bed played as spatial audio: TrueHD's own 7.1 is split between floor and ceiling by where the objects' energy lies, and DTS:X's four height channels are taken out of its 7.1. The automatic track pick prefers such a track over the others in the same language, and the track menu labels it Atmos or DTS:X. On by default and lossy; turned off in Preferences, both play through the multichannel choice above. Needs macOS or iOS 26.
- Dolby Vision composition (experimental). No Mac reports a Dolby Vision display, so a Profile 8.1 source plays as its HDR10 base layer and the per-frame metadata is discarded. A Preferences switch hands the composition to AVPlayer instead. Off by default; on a display without the headroom for it, expect a shifted picture.
- Stats for Nerds. A live inspector window (Cmd+Shift+I) showing the active backend and decoder, resolution, frame rate, dynamic range, pixel format, bit depth and colour description, display mode, video and audio bitrate, audio codec profile (DTS:X, TrueHD Atmos), channels, sample rate and format, how the audio reaches the renderer, the lip-sync offset, A/V sync, dropped frames, and buffer state.
- A silent file says why it is silent. When a source carries audio that nothing in the chain can decode, playback used to continue silently with the reason only in the log. It now says so on screen, and the Stats inspector keeps the answer for the rest of the session.
- In your language. The interface is translated into 26 languages: English, Czech, Danish, Dutch, Finnish, French, German, Greek, Croatian, Hungarian, Italian, Japanese, Korean, Norwegian, Polish, Portuguese (Brazil and Portugal), Romanian, Russian, Slovak, Spanish, Swedish, Turkish, Ukrainian and Chinese (Simplified and Traditional). It follows the system language, or the per-app language in System Settings.
- Stays out of the way. Controls auto-hide during video playback and reappear on mouse movement.
- A diagnostics log you can hand over. Every build writes the engine's diagnostics to a file; Help ▸ Reveal Diagnostics Log in Finder or Save Diagnostics Log picks it up. See Reporting a playback problem.
| Action | Effect |
|---|---|
| Space / click | Play / pause |
| Double-click / F | Toggle fullscreen |
| Left / Right | Seek -/+ 10s |
| Cmd+Left / Cmd+Right | Previous / next in folder |
| Up / Down | Volume +/- 5% |
| M | Mute / unmute |
| J / K | Audio 50 ms earlier / later (lip-sync) |
| Escape | Exit fullscreen, else stop |
| Cmd+N | New player window |
| Cmd+O | Open file |
| Cmd+Shift+O | Open folder |
| Cmd+Shift+S | Save current frame |
| Cmd+, | Preferences |
| Cmd+Shift+T | Toggle always on top |
| Cmd+Shift+I | Stats for Nerds |
The system media keys and Control Center transport also drive play / pause and track stepping, handy for audio.
A universal iPhone + iPad app (same source tree, sharing the playback core with the macOS app):
- Open local files or a URL. Pick a video or audio file from the Files app, or paste an
http/httpsURL. While a remote open is in flight (a live tuner can take a few seconds to tune), Home shows an "Opening stream" pill with a cancel button. - Live streams (tuner / IPTV). A "Live stream" toggle in Open URL loads straight on the engine's live path with a 30-minute DVR window, one tune-in, no size probing; URLs that resolved live once are remembered and open live automatically from then on. Sources that turn out live without the toggle are detected and reloaded. Live playback gets a live-aware transport bar: a behind-live offset instead of a duration, scrubbing across the DVR window, and a LIVE badge (red dot at the edge, gray while behind) that jumps back to the live edge. Teletext captions on live broadcasts render like any other subtitle track.
- Custom playback chrome, matching the macOS design. A transport bar with a scrubber (monospaced leading/trailing timecodes), a floating scrub-thumbnail preview while dragging, play/pause, and -/+10s skip. A top bar with Close, AirPlay, and Tracks. Controls tap to show/hide and auto-hide during playback, and a replay button appears when playback reaches the end.
- Picture in Picture, AirPlay, and lock-screen Now Playing. Playback is still hosted in an
AVPlayerViewControllerunder the hood, so PiP, AirPlay routing, and Control Center / lock-screen Now Playing come for free. Only AVKit's own visible chrome is hidden; its backend stays in place. - Track switching and lip-sync. A tracks sheet lists audio and subtitle tracks, with an "Off" option for subtitles and support for attaching a sidecar
.srt, plus a 50 ms audio-delay stepper for the latency Bluetooth headphones add. The settings sheet carries the same subtitle appearance options as the Mac. - The same audio as on the Mac. Height channels from TrueHD Atmos and DTS:X as spatial audio (iOS 26), the multichannel choice between Dolby Digital Plus and lossless FLAC, and tunable buffering, behind the gear button in the Home toolbar.
- Edge-swipe gestures. A vertical swipe on the left edge adjusts brightness, on the right edge volume; the wide center stays a dead zone so a tap or a minimize swipe never nudges a level.
- Recents. Recently opened files show up on Home with cached thumbnails for quick re-open.
- In your language. The same 26 languages as on the Mac, following the system language or the per-app language in Settings.
- A diagnostics log you can hand over. The button in the Home toolbar shares the same log the macOS app writes. See Reporting a playback problem.
A file that will not play, freezes, stalls or picks the wrong decoder is almost always answerable from the log, and almost never from a description. Every build (not just debug ones) writes the engine's own diagnostics to a file:
- macOS: Help ▸ Reveal Diagnostics Log in Finder, or Help ▸ Save Diagnostics Log… to put a copy somewhere you can attach it from.
- iOS/iPadOS: the share button in the Home toolbar.
Open the file that misbehaves, let it fail, then export. The log opens with the app version, the engine release behind it, the OS, the hardware and the display's HDR eligibility, and carries the load decisions, the served playlist and any error code the player raised. It names the media files you opened, and no path around them.
Attach it to an issue at github.com/superuser404notfound/AetherPlayer/issues.
Generated by XcodeGen:
brew install xcodegen
xcodegen generate
xcodebuild -project AetherPlayer.xcodeproj -scheme AetherPlayer -destination 'platform=macOS' build
xcodebuild -project AetherPlayer.xcodeproj -scheme AetherPlayer-iOS -destination 'generic/platform=iOS' buildAll strings live in one String Catalog, Sources/Shared/Resources/Localizable.xcstrings, shared by the macOS and iOS apps. Xcode writes its keys in sorted order on every extraction, so a key added anywhere else turns the next build into a whole-file diff: after editing the catalog by hand, run swift Scripts/xcstrings-sort.swift Sources/Shared/Resources/Localizable.xcstrings. LocalizationCatalogTests fails on a key that is out of order, misses a locale, or loses a format specifier.
DEVELOPER_ID="Developer ID Application: Your Name (TEAMID)" \
NOTARY_PROFILE="NOTARY_PROFILE" \
./Scripts/build-dmg.shProduces a notarized, stapled universal .dmg. Set DEVELOPER_ID for a signed local build; add NOTARY_PROFILE to notarize for distribution.
Vibe-coded and maintained by Vincent Herbst in close pair-programming with Claude (Anthropic). The heavy lifting (demux, decode, HDR, audio) lives in AetherEngine; this repo is the macOS and iOS/iPadOS shell around it.
LGPL-3.0, matching AetherEngine. FFmpeg reaches the app through FFmpegBuild as dynamically linked frameworks under LGPL-2.1-or-later (no GPL components).
