A native media player built on AetherEngine, for macOS and iOS/iPadOS.
Drop or open a video or audio file, play it, switch audio and subtitle tracks, scrub with live thumbnail previews, and grab full-resolution frames.
macOS: universal binary (Apple Silicon + Intel), macOS 14.0+. iOS/iPadOS: universal app, iOS 17.0+.
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. You can also try the beta on TestFlight (an App Store release is on the way).
iOS/iPadOS: join the public TestFlight beta (an App Store release is on the 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. - 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. - 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). - 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.
- Stats for Nerds. A live inspector window (Cmd+Shift+I) showing the active backend and decoder, resolution, frame rate, dynamic range, display mode, video and audio bitrate, channels, A/V sync, dropped frames, and buffer state.
- 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 |
| Escape | Exit fullscreen, else stop |
| 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. A tracks sheet lists audio and subtitle tracks, with an "Off" option for subtitles and support for attaching a sidecar
.srt. - 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.
- 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 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' buildDEVELOPER_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).
