This library is intended to easily create AirPlay2 servers acting like Apple TV. Tested with iPhone X (iOS 13.3)
-
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);
java-airplay-server with Netty
Currently supports only mirroring with no sound.
Analysis of AirPlay2 Technology
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