Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/serezhka/java-airplay-lib

This library is intended to easily create AirPlay2 servers acting like Apple TV
https://github.com/serezhka/java-airplay-lib

airplay airplay-receiver airplay-server airplay2 airplaymirror appletv mirroring

Last synced: 26 days ago
JSON representation

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

Awesome Lists containing this project

README

        

# java-airplay-lib

[![build](https://github.com/serezhka/java-airplay-lib/actions/workflows/build.yaml/badge.svg)](https://github.com/serezhka/java-airplay-lib/actions/workflows/build.yaml)
[![Release](https://jitpack.io/v/serezhka/java-airplay-lib.svg)](https://jitpack.io/#serezhka/java-airplay-lib)
![ViewCount](https://views.whatilearened.today/views/github/serezhka/java-airplay-lib.svg)
[![License](https://img.shields.io/badge/license-MIT-blue.svg)](http://opensource.org/licenses/MIT)

####


14.12.2022: Check out new java-airplay project: https://github.com/serezhka/java-airplay


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

## How to use?

* Add java-airplay-lib [dependency](https://jitpack.io/#serezhka/java-airplay-lib) to your project

* Make your server discoverable by [Bonjour](https://ru.wikipedia.org/wiki/Bonjour)

```java
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.

```java

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.isFairPlayVideoDecryptorReady()) {
// start listening video data on videoDataPort
}

if (airPlay.isFairPlayAudioDecryptorReady()) {
// start listening audio data on audioDataPort
}

RTSP GET_PARAMETER, RECORD, SET_PARAMETER, TEARDOWN

...

DECRYPT MIRROR DATA

airPlay.decryptVideo(byte[] video);

airPlay.decryptAudio(byte[] audio, int audioLength);
```

## Example server

[java-airplay-server](https://github.com/serezhka/java-airplay-server) with Netty

## Links

[Analysis of AirPlay2 Technology](http://www.programmersought.com/article/2084789418/)

## Info

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