Skip to content

About

First open-source AirPlay receiver implementation for Android with mirroring, video and audio support

Resources

Stars

0 stars

Watchers

0 watching

Forks

 
 

Repository files navigation

AirPlay Receiver for Android

Stars GitHub license build release

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.

Get it on Google Play Get it on F-Droid Get it on GitHub

demo.mp4

Compatibility

  • Android 7.0+, including Android TV
  • AirPlay devices on the same subnet, including iOS/iPadOS, macOS devices, or other sender implementations

Features

  • Screen mirroring with H.264 and H.265 (HEVC) video decoding
  • Audio streaming with AAC-ELD, AAC-LC and ALAC audio decoding
  • Video playback with support for HLS, downloads, and remote controls
  • Music playback with track information, cover art, and remote 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
  • Wired secondary display for macOS/iPadOS devices over USB tethering

Warning

DRM content (e.g. from the Apple TV application) is not supported.

Configure from ADB

On devices without a display, settings can also be changed over ADB. The receiver is protected by android.permission.DUMP so regular installed apps cannot change them. Values are passed as text using --es. Using adb shell:

export KEY="server_name" VALUE="Speaker"
am broadcast -n io.github.jqssun.airplay/.SettingsReceiver -a io.github.jqssun.airplay.SET_SETTING --es key "$KEY" --es value "$VALUE"

To list all settings with their current values as JSON:

am start -n io.github.jqssun.airplay/.MainActivity
am broadcast -n io.github.jqssun.airplay/.SettingsReceiver -a io.github.jqssun.airplay.LIST_SETTINGS

Implementation

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 or a software ALAC decoder, while mirroring video is decoded via MediaCodec and rendered to a SurfaceView. HLS sessions are served through a local playlist proxy.

When using USB tethering, the Android device can act as a reliable secondary display over a wired connection. Apple devices natively support USB tethering over CDC-NCM, so on Android devices that default to RNDIS, you may need to switch to CDC-NCM over ADB:

adb shell settings put global tether_force_usb_functions 1
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
Loading

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 assembleDebug

Check out the CI for more details on reproducible builds.

Credits

  • UxPlay for the AirPlay/RAOP server implementation
  • FFmpeg for the lossless audio decoder
  • Next Player for the video player

Disclaimer: This project is not affiliated with Apple Inc.

About

First open-source AirPlay receiver implementation for Android with mirroring, video and audio support

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages