VBВиталий БалаянSoftware Engineer · лог работ
← Лента

AirPlay Receiver для Android TV

Приложение, которое превращает Android TV и Google TV в AirPlay-приёмник — iPhone видит телевизор как Apple TV и транслирует на него экран и звук, даже когда приложение свёрнуто.

iPhone транслирует экран на Android TV по AirPlay

У многих дома 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.

GitHub ↗