Skip to content

This library is intended to easily create AirPlay2 servers acting like Apple TV

License

Notifications You must be signed in to change notification settings

CodeArtisanX/java-airplay-lib

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

15 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

java-airplay-lib

Build Status Release HitCount License

This library is intended to easily create AirPlay2 servers acting like Apple TV. Tested with iPhone X (iOS 13.3)

How to use?

  • Add java-airplay-lib dependency to your project

  • Make your server discoverable by Bonjour

  String serverName = "@srzhka";
  int airPlayPort = 5001;
  int airTunesPort = 7001;
  AirPlayBonjour airPlayBonjour = new AirPlayBonjour(serverName);
  airPlayBonjour.start(airPlayPort, airTunesPort);
  ...
  airPlayBonjour.stop();

  • Listen airTunesPort and handle RTSP requests. Pass request content bytes to the library and respond with provided content bytes.
  RTSP GET | POST

  String uri = ...
  byte[] requestContent = ...
  switch (uri) {
    case "/info": {
      airPlay.info(.. byte output stream ..);
      // RTSP OK + provided bytes 
    }
    case "/pair-setup": {
      airPlay.pairSetup(.. byte output stream ..);
      // RTSP OK + provided bytes 
    }
    case "/pair-verify": {
      airPlay.pairVerify(.. requestContent input stream ..,
        .. byte output stream ..);
      // RTSP OK + provided bytes 
    }
    case "/fp-setup": {
      airPlay.fairPlaySetup(.. requestContent input stream ..,
        .. byte output stream ..);
      // RTSP OK + provided bytes
    }
    case "/feedback": {
      // RTSP OK
    }
  }
  
  RTSP SETUP
  
    airPlay.rtspSetup(.. requestContent input stream ..,
      .. byte output stream .., int videoDataPort, int videoEventPort,
      int videoTimingPort, int audioDataPort, int audioControlPort); 
    // RTSP OK + provided bytes
      
    if (airPlay.isFairPlayReady()) {
      // start listening mirror data on airPlayPort 
    }
  
  RTSP GET_PARAMETER, RECORD, SET_PARAMETER, TEARDOWN
  
  ...
  
  DECRYPT MIRROR DATA
    
    airPlay.fairPlayDecryptVideoData(byte[] videoData);
    
    airPlay.fairPlayDecryptAudioData(byte[] audioData);

Example server

java-airplay-server with Netty

Currently supports only mirroring with no sound.

Links

Analysis of AirPlay2 Technology

Info

Inspired by many other open source projects analyzing AirPlay2 protocol. Special thanks to OmgHax.c's author 🤯

It took me several months of sleepless nights with debugger and wireshark to make this work.

If you appreciate my work, consider buying me a cup of coffee to keep me recharged

Donate Donate

About

This library is intended to easily create AirPlay2 servers acting like Apple TV

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages

  • Java 100.0%