У многих дома Android TV, а в кармане iPhone, и они плохо дружат: AirPlay из коробки работает только с Apple TV и редкими «умными» телевизорами. Я сделал приложение, которое закрывает этот разрыв: телевизор начинает притворяться Apple TV, и iPhone, iPad или Mac подключаются к нему через обычный «Повтор экрана».
Проект открытый и сейчас в активной разработке. Основной стенд для тестов — Philips 65PUD7029/71.
Как это работает
- Телевизор становится Apple TV. Приложение анонсирует себя в локальной сети по Bonjour (mDNS) так же, как это делает настоящая приставка. iPhone находит телевизор в списке устройств без настроек и IP-адресов.
- Повтор экрана. Видео с iPhone приходит на телевизор и выводится аппаратным декодером. Картинка плавная, задержка минимальная.
- Звук. Музыка и звук из приложений передаются по RAOP, тому же протоколу, что у AirPlay-колонок, и играют через динамики телевизора.
- Работает в фоне. Приёмник живёт как foreground-сервис и сам стартует при включении телевизора. Не нужно держать приложение открытым: берёшь iPhone, выбираешь телевизор, и он сам выводит картинку поверх всего.
- Интерфейс для пульта. Экраны сделаны под Android TV: крупные элементы, навигация с пульта и подсказка, как включить повтор экрана на iPhone.
Стек
Android / UI
- Kotlin — основной язык приложения.
- Jetpack Compose и Compose for TV (
androidx.tv.foundation,androidx.tv.material) — интерфейс под пульт и большой экран. - Media3 / ExoPlayer с поддержкой HLS — воспроизведение видео, когда iPhone передаёт ссылку, а не экран.
- MediaCodec / AudioTrack — аппаратное декодирование H.264-потока зеркалирования и вывод PCM-звука.
- Foreground Service (
specialUse), BOOT_COMPLETED-ресивер, Wi-Fi MulticastLock, отрисовка поверх других приложений — то, что держит приёмник живым в фоне и находимым в сети. - minSdk 24, targetSdk 36, сборка Gradle Kotlin DSL.
Нативная часть (C/C++, Android NDK)
- CMake + JNI — мост между Kotlin и нативным сервером.
- Нативная реализация протоколов AirPlay и RAOP (RTSP/RTP): рукопожатие, сессии, приём видео- и аудиопотоков.
- mDNSResponder (Bonjour) — встроенный mDNS, чтобы телевизор появлялся в списке AirPlay-устройств.
- Криптография протокола: FairPlay-рукопожатие, Curve25519, Ed25519, AES-CTR, SHA/HMAC — для пары и расшифровки потоков.
- Аудиокодеки: ALAC (Apple Lossless) и FDK-AAC (AAC-ELD для зеркалирования).
- Сборка под armeabi-v7a и arm64-v8a, то есть под все массовые ТВ-приставки и телевизоры.
В основе нативной части лежат открытые реализации протокола. Я собрал их в одно приложение, адаптировал под Android TV и написал вокруг них весь Android-слой.
Разработка с ИИ. Приложение активно собиралось и оптимизировалось вместе с нейросетями: CodeX, Claude Opus 4.6 и Gemini 3.1 Pro.
Что дальше
Известная проблема — YouTube в режиме AirPlay пока не работает, это следующий пункт в списке. Дальше стабильность на разных моделях телевизоров и публикация в Google Play.
