Рубрика развивается при поддержке

Что в Smart TV тебе моём, или что можно запихнуть в телевизор

Добрый день, коллеги! Меня зовут Алексей, и я занимаюсь телевизорами, а именно разработкой Smart TV — приложений («давайте похлопаем Алексею»).

В закладки

Но что такое Smart TV? Какое оно, сферическое Smart TV — приложение в вакууме?

Не буду томить вас ожиданием: в основном такого рода приложения предназначены для показа видеоконтента. В любых вариациях. Записанное, живое вещание, телепередачи, фильмы, мультфильмы, рекламные ролики, и прочая, прочая Тысячи их!

Но разве Smart TV только для этого?

Да, безусловно, телевизор лучше всего показывает именно видеоконтент, и с этим он хорошо справляется, но только ли для этого мы можем его использовать?

(Сейчас все счастливые владельцы приставок и HDMI-кабелей кинут в меня свои тухлые помидоры, скажут «Отписка!» и счастливые уйдут, а мы продолжим.)

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

О моих (и не только) скромных потугах речь и пойдёт ниже.

ТВ — игра

Действительно, первое, что приходит на ум — игра! Большой экран, возможность кросс-доменных запросов (так как Smart TV —приложение, по сути, — локальная HTML-страница) и худо-бедно стандартное управление (пульт) позволяют нам реализовать игровой сценарий.

В большинстве своём это казуальные игры вроде 1024, либо вариации на тему Tower Defence. Негусто. К сожалению, накрутить супер 3D с шейдерами, тенями и динамическим освещением получится разве что только на самых последних моделях... следующего года.

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

Поэтому, если вы хотите охватить максимальное количество моделей, готовьтесь к кровавой оптимизации всего и вся. Чистый, нативный Canvas станет вашим лучшим другом. Обёртки над ним работают, но крайне прожорливо. Особенно удручает неудовлетворительная работа методов rotate и transform, поэтому анимацию планируйте спрайтовую и повороты спрайтов реализуйте только в самом крайнем случае.

Однажды мы делали игру на «Ночь карьеры». С ней удалось съездить к замечательным коллегам из Web Standarts Days и выступить с докладом.

Визуально игра представляет из себя игровое поле, вмещённое в размер экрана, нет скролла, без преград. Задний план разделён на несколько слоёв, чтобы реализовать 3D-эффект. На сцене генерируются летающие мишени (утки), по которым пользователь может стрелять.

Логотип игры с утками
​Общий вид приложения

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

Управление реализовали с помощью телефона, а для максимального охвата мобильных устройств реализовали клиент в виде адаптивного сайта. Реализовали мы его на WebSockets и добавили фишку — управление через изменение положения телефона.

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

Также выяснилось, что в игре «дует ветер»: в расчётах на телефонах накапливалась ошибка и прицелы постепенно «сдувало» в одну сторону, что вынуждало игроков постепенно поворачиваться. Некоторые играли, стоя спиной к ТВ.

Мораль: используйте датчики ориентации в браузерах телефонов как можно реже.

«Убийцы уток» за работой

В приложении используется анимация посредством замены спрайтов. Такой способ оказался достаточно производительным. Мы тестировали приложение с сотней и более летающих уток. В реальности в игре их было всего десять. Проблемы с производительностью возникли, когда прибежала дизайнер и возопила: «Хочу, чтобы планета крутилась!»

Закрутить спрайт проблем не составило. Проблема случилась, когда мы запустили приложение на относительно старом ТВ. Оказалось, что поворот спрайта 900 на 900 пикселей он обрабатывает чуть более, чем никак.

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

Отсюда другая мораль: не вращайте большие спрайты.

Ещё одна фишка проекта заключалась в том, что игровая логика обсчитывается... на ТВ. В этом случае сервер выступает просто в роли передатчика данных между клиентами и ТВ.

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

ТВ — экран

Казалось бы, это уже банально, но нет. Как обычно, всё скрывается в деталях. Экран для чего? Какую функцию несёт? Для чего предназначен?

Приведу лишь несколько примеров.

Поздравлялка

На день Святого Валентина мы сделали онлайн-поздравлялку в компании, используя имеющиеся телевизоры в качестве трансляторов поздравлений.

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

Главная проблема заключалась в неприятной особенности телевизоров уходить в «спящий режим». Если Samsung разрешает отключать эту функцию с помощью метода setScreenSaver, остальные платформы не особо позволяют это делать.

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

Карта

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

Мы снова делали игру на «Ночь карьеры» и в этот раз решили совместить телевизоры, телефоны и VR. Суть заключалась в том, что игрок в VR-шлеме летает на драконе и отстреливает принцесс, которыми управляют игроки с телефонов. Кто убил дракона — надевает шлем. И так по кругу.

Скромно замечу, что со своей функцией (собрать максимальное количество народа у нашего стенда и удерживать их максимально долго) приложение справилось. О чём красноречиво говорят цифры статистики. (Подробнее о драконах, истребляющих принцесс.)

Логотип игры с принцессами
​Общий вид стенда

Приложение для ТВ обеспечивало демонстрацию общей сцены боя для всех желающих.

В этом проекте мы столкнулись с необходимостью оптимизации ранее стабильно и хорошо работающего кода. При увеличении количества игроков заметно ухудшались показатели производительности приложения. Выделили основные пути оптимизации:

  • Уменьшение объёма передаваемой информации с сервера на клиенты и с клиентов на сервер.
  • Минимизация создания новых объектов в приложении.

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

Игровой процесс: на ТВ слева — вид из VR-очков, на ТВ по центру — карта сцены.

Интерактивный задний план

Вы совершенно справедливо можете спросить: «Ты там вообще работаешь, нет?» На что я с искренним недосыпом на лице отвечу: «Конечно, работаю!» Но об этом чуть позже. А пока нам снова не сиделось и захотелось реализовать интерактивный задний фон для квадрокоптера.

Логотип игры
​Изображение, растянутое на три экрана

Идея была в том, чтобы показывать в телевизоре саму усадьбу Деда Мороза, которая бы реагировала на отлёт и прилёт квадрокоптера.

Основной интерес был в том, чтобы «растянуть» картинку на три телевизора разных производителей.

Сделали мы это путём разбиения всей сцены на «комнаты». Каждый телевизор показывал «комнату» со своим номером. Номера «комнат» можно было менять, таким образом, телевизоры в принципе могли показывать одинаковые части одной сцены, но мы показывали всю сцену последовательно.

Команды на перемещение окружения сцен (зверушек, движение Луны и дым из труб) передавались с сервера по любимым WebSockets.

Поскольку мы знали время прилёта и отлёта квадрокоптера, появилась идея сделать «ветер» в телевизорах, который бы «сдувал» дым из труб при близкой работе винтов.

Опять-таки команда на взлёт с квадрокоптера через сервер спускалась на клиенты.

И тут тоже возникли сложности с производительностью. «Старая» webOS 2013 года крайне тяжело рендерила большую картинку (5760 на 1080). Пришлось специально для неё нарезать задник в размер экрана и подставлять строго его.

Тем не менее всё, что относилось к Smart TV и бэкенду, мы успешно реализовали.

ТВ — охранник

Однако самый интересный проект был совершенно неигровой, а что ни на есть полезный. Приложение занималось охраной дома. Да, именно телевизор. Да, именно охранял.

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

  • Громко орёт.
  • Посылает пользователю SMS.
  • Пишет письмо с приложенными фотографиями инцидента.
  • Пишет сообщение в Facebook, тоже со снимками.
  • Делает всё это сразу или в любых вариациях.

Сам ТВ в этот момент усиленно прикидывается валенком и вообще не работающим. В приложении были обработаны случаи выключения ТВ от интернета или просто от питания. Приложение поддерживало мультиязычность. Установило его себе несколько десятков тысяч человек.

Но и тут было не всё просто. При подключении камеры и попытке получения в браузере стрима с неё, как известно, вываливается системный попап с подтверждением действия.

Особенность в том, что ТВ блокируют все всплывающие окна. Поэтому приложение было реализовано только на платформе Samsung с использованием либо встроенной в ТВ камеры, либо специальной камеры, поставляемой Samsung.

Ещё одним минусом стала, опять же, производительность ТВ. На относительно старых телевизорах (2013 года) можно было м-е-е-е-е-е-е-дленно прокрасться мимо камеры и телевизор бы «прохлопал» этот момент. Но в целом идея просто блестящая.

Вывод

Телевизоры уже давно переросли свою основную функцию — показывать картинку с канала, показывать видео или быть вторым монитором.

Их возможности и производительность постоянно растут, а круг применения ограничен только вашей фантазией. Любые задачи можно решить при должной проработке идеи и соответствующей реализации. Дерзайте и достигайте успеха!

Всем телеки!

P. S. Может быть, у тебя, читатель, были необычные задачи для Smart TV, когда телевизор приходилось использовать в несвойственной для него роли? Поделись! Расскажи!

Материал опубликован пользователем.
Нажмите кнопку «Написать», чтобы поделиться мнением или рассказать о своём проекте.

Написать
{ "author_name": "Центр Высоких Технологий", "author_type": "self", "tags": ["\u0442\u0435\u043b\u0435\u0432\u0438\u0437\u043e\u0440\u044b","smarttv"], "comments": 6, "likes": 12, "favorites": 16, "is_advertisement": false, "subsite_label": "services", "id": 89993, "is_wide": false, "is_ugc": true, "date": "Thu, 31 Oct 2019 13:13:21 +0300", "is_special": false }
Облачная платформа
Основа для цифровизации бизнеса
Объявление на vc.ru
Финансы
Где брать деньги на бизнес
История в трёх частях.
0
{ "id": 89993, "author_id": 244899, "diff_limit": 1000, "urls": {"diff":"\/comments\/89993\/get","add":"\/comments\/89993\/add","edit":"\/comments\/edit","remove":"\/admin\/comments\/remove","pin":"\/admin\/comments\/pin","get4edit":"\/comments\/get4edit","complain":"\/comments\/complain","load_more":"\/comments\/loading\/89993"}, "attach_limit": 2, "max_comment_text_length": 5000, "subsite_id": 200396, "last_count_and_date": null }
6 комментариев
Популярные
По порядку
Написать комментарий...
0

Алексей, а как бы с Вами связаться? В профиле нет контактных данных, на сайте в персоналиях нет ни одного Алексея...

Ответить
4

Меня зовут Трусов Алексей, я работаю в компании Центр Высоких Технологий (Ижевск), занимаюсь smart TV, и параллельно являюсь старшим преподавателем в Удмуртском Государственном Университете (Кафедра Информационных Систем и Сетей).
Преподаю всякое-разное программирование в силу своих скромных возможностей. (=
А связаться со мной можно по мылу: altrusov@htc-cs.ru

Ответить
0

Одно не понял. В Samsung'ах - tizen, в LG - WebOS, в Sony и некоторых других производителх - Android OS. Почему WebSocket? Тормоза только через него? Или если использовать нативную разработку то тоже есть проблемы? Используется ли наивная разработка хоть в каких то узких местах?

Ответить
0

Добрый день. Тормоза обычно возникали из-за графики (ну и кривых рук =) ).
Сокеты сами по себе работают на ТВ стабильно и хорошо.
Если под нативной разработкой понимать применение чистого JavaScript, то мы только его и использовали практически везде.
Samsung и LG разрешают использовать самописные библиотеки, которые могут использовать уже аппаратные мощности на более низкой уровне. Для Samsung надо писать для C или C++, а для LG - на node.js

Ответить
0

Так в этом и вопрос. Почему не нативный SDK? Дорого? Сложно писать под каждую платформу?

Ответить
0

Нативный SDK мы используем для каждой платформы.
Это, скорее, не SDK, но набор библиотек.
Самое важное в них - это функционал для работы с видео. Он реализован очень хорошо и стабильно. Полезные функции для работы с BACK и EXIT-ом. У Tizen очень много функций, связанный с взаимодействием со свернутым приложением.
В общем, SDK на телеках для работы с телеками, а не для каких-то там красот. Все сурово, по челябински )

Ответить
{ "page_type": "article" }

Прямой эфир

[ { "id": 1, "label": "100%×150_Branding_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox_method": "createAdaptive", "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "ezfl" } } }, { "id": 2, "label": "1200х400", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "ezfn" } } }, { "id": 3, "label": "240х200 _ТГБ_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fizc" } } }, { "id": 4, "label": "Article Branding", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "p1": "cfovx", "p2": "glug" } } }, { "id": 5, "label": "300x500_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "ezfk" } } }, { "id": 6, "label": "1180х250_Interpool_баннер над комментариями_Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "bugf", "p2": "ffyh" } } }, { "id": 7, "label": "Article Footer 100%_desktop_mobile", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fjxb" } } }, { "id": 8, "label": "Fullscreen Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fjoh" } } }, { "id": 9, "label": "Fullscreen Mobile", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fjog" } } }, { "id": 10, "disable": true, "label": "Native Partner Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyb" } } }, { "id": 11, "disable": true, "label": "Native Partner Mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyc" } } }, { "id": 12, "label": "Кнопка в шапке", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "p1": "bscsh", "p2": "fdhx" } } }, { "id": 13, "label": "DM InPage Video PartnerCode", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox_method": "createAdaptive", "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "bugf", "p2": "flvn" } } }, { "id": 14, "label": "Yandex context video banner", "provider": "yandex", "yandex": { "block_id": "VI-223676-0", "render_to": "inpage_VI-223676-0-1104503429", "adfox_url": "//ads.adfox.ru/228129/getCode?pp=h&ps=bugf&p2=fpjw&puid1=&puid2=&puid3=&puid4=&puid8=&puid9=&puid10=&puid21=&puid22=&puid31=&puid32=&puid33=&fmt=1&dl={REFERER}&pr=" } }, { "id": 15, "label": "Баннер в ленте на главной", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "p1": "byudx", "p2": "ftjf" } } }, { "id": 16, "label": "Кнопка в шапке мобайл", "provider": "adfox", "adaptive": [ "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "p1": "byzqf", "p2": "ftwx" } } }, { "id": 17, "label": "Stratum Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fzvb" } } }, { "id": 18, "label": "Stratum Mobile", "provider": "adfox", "adaptive": [ "tablet", "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fzvc" } } }, { "id": 19, "disable": true, "label": "Тизер на главной", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "p1": "cbltd", "p2": "gazs" } } }, { "id": 20, "label": "Кнопка в сайдбаре", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "p1": "cgxmr", "p2": "gnwc" } } } ] { "page_type": "default" }