A fully featured free and open-source implementation of AirPlay for Android that turns your device into an AirPlay-compatible display and speaker, based on UxPlay. It is the first open-source AirPlay 2 receiver for Android and Android TV, and works with iOS/iPadOS, macOS devices as well as other sender implementations.
demo.mp4
- Android 7.0+, including Android TV
- AirPlay devices on the same subnet, including iOS/iPadOS, macOS devices, or other sender implementations
- Screen mirroring with H.264 and H.265 (HEVC) video decoding
- Video streaming with support for live streams and remote playback controls
- Audio streaming with AAC-ELD, AAC-LC and ALAC audio decoding
- Music streaming with track information, cover art, and remote playback controls
- Support for Android TV with directional pad navigation and seeking controls
- Support for Picture-in-Picture, automatic resolution and mode switching
- Optional PIN authentication
- Video resolution, overscan, and frame rate control
- Audio latency control and support for software decoder fallback
- Debug overlay with real-time statistics (FPS, bitrate, codec, resolution, frame count, audio volume, etc.)
- Android native media session integration with notification controls
Warning
DRM content (e.g. from the Apple TV application) is not supported.
This application uses the C-based UxPlay library to implement the AirPlay/RAOP protocol, with a JNI bridge to the Android application layer. Audio can be decoded via MediaCodec (AAC) or the Apple ALAC decoder (software fallback), while mirroring video is decoded via MediaCodec and rendered to a SurfaceView. HLS sessions are served through a local playlist proxy.
flowchart LR
AppleDevice["Apple Device (Sender)"]
UxPlay["UxPlay (C/JNI)<br/>RAOP + mDNS<br/>FairPlay + HLS"]
AndroidApp["Android (Receiver)<br/>MediaCodec + AudioTrack<br/>ExoPlayer (HLS)"]
AppleDevice -- "RAOP / HLS" --> UxPlay
UxPlay --> AndroidApp
CMake is used for native C/C++ components under app/src/main/cpp. Submodules must be initialized before building.
git submodule update --init --recursive
./gradlew assembleDebugCheck out the CI for more details on reproducible builds.
Disclaimer: This project is not affiliated with Apple Inc.