четверг, 16 июня 2016 г.

Кратко о разработке для ТВ-приставок: Roku

Мои заказчики думали, что Roku — это тоже что-то про Android, но всё оказалось не так. У Roku свой отдельный и полный загадок мир.

Roku Home Screen

Первым делом, конечно, хотелось сделать ту же трансляцию. Однако, в документации не обнаружилось об этом вообще ничего. Притом, что YouTube и Netflix, при наличии установленного на Roku своего канала, устройство обнаруживали и на него транслировали. Ладно,— подумали мы,— напишем тогда себе канал, может в процессе что-нибудь и выясним. Да и вообще пригодится.

Для разработки каналов Roku придумали свой язык BrightScript и написали поддерживающий его плагин для eclipse. Язык не особенно приятный, набор функций в стандартной библиотеке не такой большой, но в целом жить можно. Главное, можно отправлять запросы и легко парсить JSON. Дебаггера нет, но есть функция print и дебажная консолька. Довольно удобна функция публикации приватных каналов, которая позволяет по инвайт-коду легко распространять бета-версии.

Конечно, с самого начала нас больше всего интересуют возможности для UI. Есть несколько вариантов.

Стандартные экраны Roku

Стандартные экраны можно немножко кастомизировать (менять цвета, добавлять кое-где кнопки и т.д.), но в целом это довольно жесткие шаблоны. Исключение составляет только roScreen, на котором можно рисовать. Описание экранов размазано по всей документации, это неудобно, так что перечислю их в таблице:

Класс Как выглядит
roPosterScreen
roSpringboardScreen
roParagraphScreen
roGridScreen
roListScreen
roSearchScreen
roKeyboardScreen
roCodeRegistrationScreen
roVideoScreen
roTextScreen
roScreen Здесь можно рисовать на канвасе и создавать более-менее кастомные интерфейсы

Работа с экранами описана в документации и примерах. Общая схема такова:

Sub ShowPosterScreen()
    port = CreateObject("roMessagePort")     ' слушатель событий
    poster = CreateObject("roPosterScreen")  ' экран
    poster.SetMessagePort(port)              ' прицепили к экрану слушатель

    poster.show()                            ' показали экран
    While True                               ' сели слушать
        message = Wait(0, port)              ' получили событие
        If message.isScreenClosed()          ' определили, что случилось
            Exit While                       ' отреагировали
        else if message.isListItemSelected()
            …
        end if
    End While
End Sub

Для примера приложения на стандартных экранах можно посмотреть Vevo или Fullscreen Selects. В последнем, кстати, экран проигрывания сделан явно с помощью roScreen, и довольно хорошо показывает, что с ним можно наворотить.

Scene Graph

Более гибкий способ создания интерфейсов. Здесь уже есть какие-то UI-компоненты и XML-лэйауты. Можно настраивать анимации и красиво переключающиеся панельки, да и работает всё это гораздо более отзывчиво. Подробнее пока писать об этом не буду, так как тема большая и ещё не совсем уложилась у меня в голове. Возможности и примеры кода можно посмотреть в блоге Roku.

Marmalade

Под Roku можно писать игры на Marmalade. Это всё, что я могу сказать по этой теме.

Закрытый SDK

Если открыть тот же YouTube или Netflix, то окажется, что они совсем не похожи на то, что описано в документации. Говорят, что у подобных больших корпораций есть доступ к специальному SDK. Также есть мнение, что на самом деле это всё HTML. В общем, это ещё одна загадка Roku.

Проблемы

Проблема первая. Уже написав какой-никакой работающий канал, я всё ещё не понимаю, как это поможет сделать стриминг, аналогичный Chromecast. YouTube это умеет, а вот Vevo, сделанный на стандартном BrightScript, — нет. Кажется, это тоже фича только для избранных.

Проблема вторая. В нашем приложении есть несколько видео с YouTube. Так вот Roku напрочь отказывается воспроизводить их в хорошем качестве. Проблема известная, обсуждена много где (вот, например, её проявление). Единственное рабочее решение тут — скачивать mp4 на свой сервер, как-то его перекодировать и проигрывать оттуда. Именно так делают упомянутые выше Fullscreen Selects: несмотря на то, что представленные у них видео явно с YouTube, показывают они их, судя по снифферу, со своего CDN.

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

Комментариев нет: