Android TV — популярная платформа, но с Ambilight на ней всё до сих пор плохо: либо устаревшие приложения, либо нестабильная работа, либо костыли с внешними устройствами. Именно с этой проблемой я и столкнулся…

Ambilight/Ambient light — это технология фоновой подсветки экрана, которая создает эффект расширения изображения за пределы дисплея. Она делает просмотр контента более иммерсивным и снижает усталость глаз при просмотре в темноте. Сегодня я расскажу историю создания приложения Universal Ambient Light — современного решения для Android-устройств, которое поддерживает работу с различными LED-контроллерами.

История создания: от идеи до реализации

Всё началось с покупки TCL телевизора на Google TV (с андроидом под капотом). Почти сразу возникла идея сделать подсветку, т.к. казалось что под андроид уж точно что-то такое уже делали. Начал искать готовое решение, но столкнулся с тем, что большинство приложений либо не работали, либо имели ограничения.

Первая попытка

Я купил приложение Ambient light Application в Google Play , но, к сожалению, оно оказалось нерабочим. Приложение не запускалось корректно, были проблемы с разрешениями и стабильностью работы, особенно на версиях Android 14 и выше, т.к. автор в таргете прописал sdk 34, но не адаптировал приложение под него.

Я начал патчить приложение, пытаясь исправить ситуацию, однако после нескольких попыток стало понятно, что легче найти аналоги, приложение так и не заработало нормально.

Вторая попытка: форк существующего проекта

Затем я нашёл репозиторий hyperion-android-reborn на GitHub. Это был форк оригинального Hyperion Grabber для Android, обновлённый для работы с Android 12+. Проект поддерживал только протокол Hyperion, но мне не хотелось ставить прослойку в виде условной малинки, хотелось прямой поддержки WLED или хотя бы Adalight.

Я сделал форк и совместно с нейронками добавил поддержку WLED с протоколами DDP и UDP Raw. Это было хорошее решение, но кодовая база всё ещё была написана на Java с использованием устаревших подходов, да и на джаве я особо не пишу.

В итоге форк стал рабочим прототипом, но не тем продуктом, который хотелось бы поддерживать и развивать дальше.

В процессе работы над форком я понял, что нужно создать что-то более современное. Так родилась идея написать приложение с нуля на Kotlin с использованием Jetpack Compose для UI, чтобы продолжать вести эту идею, но уже с современными подходами и нормальным UI.

Так и родилось приложение Universal Ambient Light

Universal Ambient Light — это универсальное Android-приложение для создания фоновой подсветки экрана (Ambilight). Приложение захватывает содержимое экрана в реальном времени и передаёт данные на LED-контроллеры для создания эффекта расширенного изображения.

Основные возможности

Приложение поддерживает три основных протокола:

Hyperion

  • Полная поддержка протокола Hyperion NG

  • Настройка приоритета сообщений

  • Подключение по сети (порт 19400 по умолчанию)

WLED

  • Поддержка протоколов DDP (рекомендуется для WLED 0.11+) и UDP Raw

  • Настройка порядка цветов (RGB, GRB, BRG, BGR, RBG, GBR)

  • Поддержка RGBW LED-лент

  • Автоматическое определение порта (4048 для DDP, 19446 для UDP Raw)

Adalight

  • Настройка скорости передачи (Baud Rate, по умолчанию 115200)

  • Подключение через USB OTG

  • Автоматическое определение USB-устройств

Приложение полностью оптимизировано для работы на Android TV:

  • Удобная навигация с пульта ДУ (D-pad)

  • Отображение в Leanback Launcher

  • Адаптивный интерфейс для больших экранов

  • Поддержка сенсорного управления на мобильных устройствах

Настройки LED-конфигурации:

  • Конфигурация по сторонам: настройка количества LED для каждой стороны отдельно

  • Раскладка LED: настройка начального угла, направления (по/против часовой стрелки), включение/выключение отдельных сторон

Настройки сглаживания (Smoothing):

  • Включить сглаживание: включено по умолчанию для плавности переходов

  • Пресеты: Выключено, Быстрый отклик, Сбалансированный (по умолчанию), Плавный

  • Время перехода

  • Задержка вывода — полезно для синхронизации с видео, т.к. к своему удивлению столкнулся что в Jellyfin лента обгоняет видео

  • Частота обновлений

? Дополнительные функции

  • Автозапуск: автоматический старт сервиса при включении устройства

  • Автоматическое переподключение: попытки переподключения при потере связи с контроллером

  • Тестовые эффекты: встроенные визуальные эффекты для проверки работы LED-ленты (радуга, движущаяся полоса, однотонные цвета, дыхание, вертикальные и горизонтальные полосы)

Немного медиа:

Настройка и использование

Первоначальная настройка

  1. Установка приложения

    • Скачайте приложение из Google Play или RuStore, либо соберите из исходников в GitHub

  2. Настройка подключения

    • Откройте приложение и перейдите в Настройки

    • Выберите тип подключения: Hyperion, WLED или Adalight

    • Для сетевых контроллеров (Hyperion/WLED):

      • Введите IP-адрес контроллера

      • Порт установится автоматически (можно изменить)

    • Для Adalight:

      • Подключите устройство через USB OTG

      • Выберите протокол (ADA, LBAPA или AWA)

      • Настройте скорость передачи (Baud Rate)

  3. Конфигурация LED

    • Настройте количество LED для каждой стороны экрана

    • Выберите начальный угол и направление обхода

    • При необходимости отключите отдельные стороны

  4. Настройка сглаживания

    • Выберите пресет сглаживания (рекомендуется "Сбалансированный")

    • При необходимости настройте время перехода и задержку вывода

  5. Запуск

    • Предоставьте разрешение на захват экрана при первом запуске

    • Нажмите кнопку включения для старта захвата

    • Используйте тестовые эффекты для проверки работы LED-ленты

Особенности для разных устройств

Android TV:

  • Приложение автоматически определяет TV-режим и оптимизирует интерфейс

  • Для ввода IP-адресов удобно использовать приложение "Google TV" или "Android TV Remote" на смартфоне

Высококачественное видео (2K/4K/HDR):

Наблюдаются проблемы на многих Android TV при просмотре 2K/4K контента и одновременном захвате экрана - видео начинает сильно лагать, по сути его становится невозможно смотреть. К сожалению, это не ограничение приложения, а аппаратное ограничение MediaProjection и слабых CPU/GPU на большинстве телевизоров.

Заключение

Приложение уже доступно в Google Play и RuStore. Оно решает проблему отсутствия качественного софта для Ambilight на Android и предоставляет современный, гибкий инструмент для создания фоновой подсветки.

Создание Universal Ambient Light — это пример того, как можно решить проблему отсутствия качественного софта, создав собственное решение с использованием современных технологий. Приложение объединяет поддержку разных протоколов, современный UI и гибкие настройки в едином решении.

Если вы хотите создать свою систему Ambilight для Android TV или просто интересуетесь разработкой под Android, рекомендую изучить исходный код проекта и, возможно, внести свой вклад в его развитие.

Приложение подойдёт тем, кто хочет простую и гибкую Ambilight-систему без внешних серверов и лишних прослоек. Если же вам нужна максимальная производительность с 4K HDR без компромиссов — аппаратные решения всё ещё вне конкуренции.

p.s. Да, я использовал нейросети как при написании кода, так и статьи, т.к. изначально приложение делалось "побыстрее" для себя и только потом уже пришла мысль развернуть его полноценно. Если у вас сильная неприязнь к подобным проектам - просто обойдите его стороной, я предупредил честно, моя совесть чиста:)

Комментарии (20)


  1. Pelectronik
    31.01.2026 10:42

    Проект у тебя крутой, так держать! Использовать нейросети — это не плохо)


    1. vasmarfas Автор
      31.01.2026 10:42

      Спасибо) На самом деле и не очень хорошо, если часто, но в рамках проекта для себя и побыстрее - пойдёт


  1. VBDUnit
    31.01.2026 10:42

    Интересно узнать, как обстоят дела с лагом и FPS, а также с HDR — оно там по‑настоящему его обрабатывает или в SDR переводит? То есть именно сам процесс быстрого захвата картинки и анализа. Сам использую DIY подсветку на ПК, были мысли перенести анализ картинки из ПК в сами экраны, но неясно насколько хорошо это будет работать, и стоит ли результат всех танцев с бубном.


    1. vasmarfas Автор
      31.01.2026 10:42

      Касательно лага - у себя практически не наблюдал, напротив у меня при восроизведении видео с Jellyfin клиента - подсветка обгоняет картинку) Поэтому и добавил параметры задержки.

      А HDR должен автоматически конвертироваться в SDR через MediaProjection API (8-битный RGBA_8888).


      1. VBDUnit
        31.01.2026 10:42

        Касательно лага — у себя практически не наблюдал, напротив у меня при восроизведении видео с Jellyfin клиента — подсветка обгоняет картинку) Поэтому и добавил параметры задержки.

        Ага, то есть анализируется, по‑видимому, не то, что непосредственно на экране, а картинка из буфера плеера. Скажите пожалуйста, Вы случайно не тестировали софт, когда происходит трансляция картинки с внешнего HDMI источника (например, ПК)?

        А HDR должен автоматически конвертироваться в SDR через MediaProjection API (8-битный RGBA_8888).

        Ясно, спасибо за информацию. Загуглил — вроде бы да, MediaProjection кроме RGBA_8888 в другие форматы пока не умеет :(


        1. vasmarfas Автор
          31.01.2026 10:42

          Скажите пожалуйста, Вы случайно не тестировали софт, когда происходит трансляция картинки с внешнего HDMI источника (например, ПК)?

          Тестировал, к сожалению, не работает. Вероятно, там включается отдельный обработчик/модуль и сигнал идёт мимо ОС Андроид, тут уже лучше ставить на ПК тот же hyperion и с него на WLED вещать. Но, думаю, оно может зависеть ещё и от конкретной реализации в конкретном телевизоре, не сильно углублялся в этот вопрос


          1. VBDUnit
            31.01.2026 10:42

            Спасибо за информацию!

            Жаль, была надежда что хотя бы в AndroidTV это вменяемо сделано :) На WebOS официально это не работает, насколько я знаю, и народ ставит ломанные прошивки с эксплоитами, с которыми очень не хотелось связываться.

            Я думаю, что так сделано для минимизации лага при отображении картинки с ПК. Штош, продолжаем сидеть на DirectX, видимо альтернатив пока не предвидится.


  1. 2Grey
    31.01.2026 10:42

    Как убрать фокус из любого текстового поля?

    Например "Задержка вывода (мс)".

    1. Ввел значение в поле

    2. Жму Enter на цифровой клавиатуре и клавиатура скрывается.

    3. Нажатия Вверх или вниз не перемещаются на кнопки Cancel или Ок.

    Сохранить значение в текстовом поле не могу.

    Так же невозможно настроить Раскладку LED, т.к
    дальше первого текстового поля на экране никуда не деться.


    1. vasmarfas Автор
      31.01.2026 10:42

      Странно, у меня просто когда нажимаю Enter можно кнопкой вниз переместиться, видимо какие-то нюансы других платформ.

      Добавлю в версию 1.0.2 возможность по Enter сразу применять значения тогда. А какой у вас ТВ кстати и какая версия Android?


      1. 2Grey
        31.01.2026 10:42

        Устройство: TCL P635
        Android TV: 11
        Источник приложения: Google Play.

        Ещё из моментов, при выключении приложения (Большая кнопка по центру основного экрана), подсветка продолжает гореть


        1. vasmarfas Автор
          31.01.2026 10:42

          Ещё из моментов, при выключении приложения (Большая кнопка по центру основного экрана), подсветка продолжает гореть

          Если у вас WLED - то попробуйте зайти напрямую на его веб-интерфейс и включить там условный чёрный цвет. Вероятно ТВ подсветку уже отпустил и она переключилась на эффект выбранный в WLED


  1. Fox_Alex
    31.01.2026 10:42

    Я был там 3000 лет назад. А точнее 20+ лет тому назад. Еще не было RGB-лент, все делалось на группах широкоугольных светодиодов. Еще не было контроллеров даже с USB - данные шли с ком-порта. На компе был сраный VB6 и DirectDraw или че-то подобное, было очень трудно сделать так чтоб оно не тормозило и считало адекватный цвет по заданной области. Но я это сделал!


    1. vasmarfas Автор
      31.01.2026 10:42

      Звучит круто) Вы из тех самых великих программистов 90х-нулевых, которые код ассемблера в голове компилировали?)


      1. Fox_Alex
        31.01.2026 10:42

        Не, я тогда еще в школу ходил) Просто рано полез в микроконтроллеры. AVR освоил когда еще ардуины в природе не было.

        Телек первый с эмбилайтом на какой-то выставке вживую наблюдал и че-то зацепило. Труднее всего было сделать софт. Комп тогда был слабенький, а я в высших материях с трудом разбирался. В лоб снимать скриншоты конечно-же не прокатило, но через DirectDraw дергать цвета отдельных пикселей получилось. В итоге работало более-менее шустро до 100 пикселей на зону. Но для нормального адекватного цвета надо было 200-250. И это для разрешений тех времен.

        Дальше было решено перестать мучить комп, ему и без этого было тяжко. Сначала в железе я пытался оцифровывать VGA, но выходило крайне топорно. Дальше идея была парсить видеопоток DVI на ПЛИС. По-началу даже что-то пошло, но проект забуксовал от недостатка знаний и времени. К тому моменту я уже заканчивал первый курс и начал работать. Ядерная спектрометрия оказалась интереснее и проект улетел в долгий ящик.


  1. DannyMontana
    31.01.2026 10:42

    отличный проект, обязательно надо будет затестить, тк у меня тоже полукастом с ардуино контроллером, который к тому же глючит, делал ручками, ии еще не было особо.


    1. vasmarfas Автор
      31.01.2026 10:42

      Спасибо, тогда буду ждать результата тестов и отзыва в гп)


  1. drlight17
    31.01.2026 10:42

    Однозначно лайк! Эхх... Где ж вы были несколько лет назад!.. Из-за проблем приложений под Android TV n лет назад я в итоге с ибея комплект с камерой заказал (Govee Ambilight или как-то так). Работает до сих пор, но задержка конечно ощутимая и качество детализации так себе.


    1. vasmarfas Автор
      31.01.2026 10:42

      Спасибо, пару лет назад у меня андроид тв не было)

      По идее у вас на руках же уже готовый контроллер, в теории можно попробовать его в WLED зашить или Adalight и подключить к ТВ


  1. Mike-M
    31.01.2026 10:42

    я использовал нейросети как при написании кода, так и статьи

    Как нейросеть могла пропустить элементарную ошибку в последнем слове: "это не ограничение приложенийя"?


    1. vasmarfas Автор
      31.01.2026 10:42

      Я писал, что использовал, а не всё полностью через нейронки сделал) Уже поправил