Еще совсем недавно желание посмотреть фильм на большом экране в гостиной неизбежно разжигало диванные споры о выборе подходящего медиаплеера. По большому счету число вариантов было не столь велико (все-таки одинаковая элементная база), и победители, равно как и аутсайдеры, определялись довольно быстро. С появлением Android’а в моду вошли так называемые TV-Stick’и (или «донглы»), то есть устройства размером с флешку, имеющие на борту HDMI-разъем и мобильную ОС в придачу — этакие смартфоны без экрана.

Китайские интернет-магазины предлагают стики на любой вкус, цвет и конфигурацию за небольшие деньги (правда, в корзину также стоит добавить беспроводную клавиатуру/мышь или универсальный пульт). Омрачает всеобщую радость лишь то, что Android на экране телевизора смотрится отлично, а вот управлять им совершенно неудобно (чего стоит перемещение курсора крестовиной на пульте). Одна небезызвестная корпорация добра (Google, если что ;)) решила пойти своим путем и выпустила гаджет со схожей функциональностью, но более дружелюбный для пользователя — Chromecast. Сегодня мы рассмотрим это устройство с точки зрения программиста и даже напишем код под него.

 

Chromecast

По словам Википедии, Chromecast — цифровой медиаплеер, предназначенный для воспроизведения потокового видео- или аудиоконтента с помощью Wi-Fi из интернета либо из локальной сети. При этом никаких органов управления он не имеет, то есть, в отличие от TV-Stick’ов, требует внешнего управляющего устройства, такого как компьютер или смартфон.

Chromecast «светит» HDMI-разъемом
Chromecast «светит» HDMI-разъемом

По определению, основным источником видеоконтента для Chromecast из интернета служит YouTube. Если браузер или официальное мобильное приложение обнаружат в сети работающий Chromecast, в интерфейс будет добавлена соответствующая кнопка, запускающая трансляцию на большой экран. Помимо YouTube, донгл от Google поддерживают такие сервисы, как Twitch, Amediateka, Deezer, и многие другие.

Трансляция с YouTube
Трансляция с YouTube

Что касается локальных файлов, то самый простой способ воспроизвести что-либо медийное через Chromecast — это перетащить видео- или аудиофайл в окошко браузера Chrome с установленным плагином Google Cast и нажать все ту же заветную кнопочку. И никаких плясок с бубном вокруг DLNA-устройств!

Запуск трансляции из браузера Chrome
Запуск трансляции из браузера Chrome

У этой простоты, правда, есть и неприятная сторона — Chromecast поддерживает далеко не все кодеки сжатия. Например, видео в контейнерах MKV и MP4 воспроизводится уверенно, тогда как AVI устройство не переваривает. В этом случае потребуется установить транскодер (например, BubbleUPnP Server), конвертирующий видео на лету, или использовать специализированный сервис (например, Videostream). Вообще, «Хакер» уже касался этой темы, разбирая все мыслимые и немыслимые лайфхаки Chromecast, — повторяться не будем, а перейдем непосредственно к нашей теме.

INFO

Если ты не в курсе, Chromecast дешев по сравнению с аналогами: цены на версию 2013 года начинаются с 2000 ₽, а версию 2015 года можно найти за 3000 ₽. На «Авито» цены еще ниже — посмотри, если не боишься связываться с б/у.

 

Постановка задачи

Итак, допустим, у нас есть внушительная коллекция фильмов (разумеется, не торренты и не мелодрамы с отважными немецкими сантехниками ;), а, скажем, лицензионные… мультики), которую мы хотим через Chromecast посмотреть на большом экране.

Так как Chromecast работает с потоковым видео, нам потребуется поднять локальный сервер на компьютере (подойдет даже такой легковесный, как HTTP File Server). В моем случае ничего настраивать вообще не пришлось: весь видеоконтент хранится на домашнем сетевом диске (NAS) с уже работающим сервером на базе Apache. Будем считать, что этот этап мы успешно прошли и новоиспеченный сервер отдает видео по ссылкам вида:

http://192.168.1.2/01 - What’s the Score, Pooh.mkv
http://192.168.1.2/02 - Boo to You Too! Winnie the Pooh.mkv
http://192.168.1.2/03 - Pooh Day Afternoon.mkv

и так далее (кстати, вместо IP можно использовать сетевое имя).

 

Cast SDK vs. Cast Companion Library

Для работы с Chromecast существует официальный инструмент — Cast SDK, анонсированный Google сразу же после выхода донгла на рынок. SDK включает объемную документацию и изобилует множеством примеров на все случаи тележизни. С другой стороны, инструментарий страдает некоторой «низкоуровневостью» и предполагает написание (копи-пасты, чего уж там) объемного кода взаимодействия с устройством — обнаружение в сети, регистрация, настройка, колбэки и прочее, что несколько выходит за рамки простого воспроизведения медиаконтента на экране телевизора.

К счастью, Google не была бы Google, если бы и здесь не решила облегчить жизнь Android-разработчикам, выпустив вполне удобную обертку в виде библиотеки Cast Companion Library. Говоря избитой фразой, теперь разработчики могут сосредоточиться на написании функциональности приложения, а не обвязки.

Нам Cast Companion Library подходит как нельзя лучше, так что не забудь скачать pdf-мануал и скорее запускай Android Studio.

 

Sender и Receiver Applications

Приложения для Chromecast бывают двух видов: Sender (передатчики) и Receiver (приемники).

Те, которые работают непосредственно на девайсе, относятся ко второму типу. Обычно они пишутся на связке HTML5/JavaScript и отвечают за графический интерфейс программы на экране ТВ, а также всячески взаимодействуют с передатчиками — обрабатывают управляющие сообщения, обеспечивают обратную связь (характерно для приложений и игр).

Передатчики (Sender Application) настраивают контент для воспроизведения на ТВ посредством ссылок или потокового видео (аудио), формируют очередь, контролируют работу Chromecast. Официально поддерживаются мобильными ОС Android и iOS (Windows Mobile опять «где-то рядом») и платформой Chrome.

В статье рассматривается создание Sender Application.

 

Шаг 1. Создаем проект

Для нашей задачи создадим новый проект, состоящий из одной активности и плавающей кнопки (FAB). Вся суть интерфейса представлена на скрине ниже (традиционно — исходный код доступен по ссылке).

В файле build.gradle подключаем Companion Library:

compile 'com.google.android.libraries.cast.companionlibrary:ccl:2.9.1'

Кроме того, понадобятся библиотеки совместимости:

compile 'com.android.support:appcompat-v7:24.2.1'
compile 'com.android.support:support-v4:24.2.1'
Пока ничто не указывает на Chromecast
Пока ничто не указывает на Chromecast

Традиционно для работы в сети спрашиваем у пользователя разрешение:

<uses-permission android:name="android.permission.INTERNET" />
 

Шаг 2. Настраиваем VideoCastManager

Всей логикой взаимодействия с Chromecast занимается специальный класс VideoCastManager. Он же отслеживает состояние устройства в сети, дергает колбэки — в общем, сильно упрощает жизнь программисту своим API. Как следует из документации, является почетным синглтоном. Чтобы не зависеть от жизненного цикла активности или фрагмента, имеет смысл инициализировать VideoCastManager в объекте Application, также одиночке:

public class MyApplication extends Application {
    private static final String applicationId = CastMediaControlIntent.DEFAULT_MEDIA_RECEIVER_APPLICATION_ID;

    @Override
    public final void onCreate() {
        super.onCreate();

        CastConfiguration options = new CastConfiguration.Builder(applicationId)
            .enableAutoReconnect()
            .enableDebug()
            .enableLockScreen()
            .enableWifiReconnection()
            .enableNotification()
            .addNotificationAction(CastConfiguration.NOTIFICATION_ACTION_PLAY_PAUSE, true)
            .addNotificationAction(CastConfiguration.NOTIFICATION_ACTION_DISCONNECT, true)
            .build();

        VideoCastManager.initialize(this, options);
    }
    ...
}

Класс CastConfiguration определяет конфигурацию работы приложения с Chromecast. В частности:

enableAutoReconnect восстанавливает соединение после разрыва, а enableWifiReconnection() — после смены Wi-Fi-сети;
enableDebug включает отладочный режим (требует регистрации устройства — см. врезку);
enableLockScreen разрешает управление воспроизведением на экране блокировки (без ввода пароля);
enableNotification — то же самое, но в области оповещений.

В последнем случае addNotificationAction определяет те органы управления (кнопки), которые пользователь увидит в шторке смартфона. В нашем случае это пауза/воспроизведение (NOTIFICATION_ACTION_PLAY_PAUSE) и отключение от девайса (NOTIFICATION_ACTION_DISCONNECT). Всего же определены шесть стандартных действий: Play/Pause, Next, Previous, Fast Forward, Rewind и Disconnect.

Описание остальных свойств и констант можно подсмотреть в исходнике библиотеки на GitHub’е.

Отдельно стоит упомянуть параметр applicationId, передаваемый в конструктор CastConfiguration. Это, как следует из названия, уникальный идентификатор приложения. Получить его можно, отправив СМС на короткий номер Google ;), или посетив небезызвестную консоль разработчика (для справки — пошаговая инструкция).

Но делать это совсем не обязательно, если приложение использует стандартный проигрыватель (так называемый Default Media Receiver) со стандартным интерфейсом пользователя (примерно как на YouTube). А вот если ты захочешь при воспроизведении лицезреть свой логотип или, например, нарисовать свои скевоморфные кнопочки управления — регистрация обязательна. В нашем случае возможностей стандартного проигрывателя хватает с лихвой, поэтому смело передаем CastMediaControlIntent.DEFAULT_MEDIA_RECEIVER_APPLICATION_ID и двигаемся дальше.

Продолжение доступно только подписчикам

Вариант 1. Оформи подписку на «Хакер», чтобы читать все материалы на сайте

Подписка позволит тебе в течение указанного срока читать ВСЕ платные материалы сайта. Мы принимаем оплату банковскими картами, электронными деньгами и переводами со счетов мобильных операторов. Подробнее о подписке

Вариант 2. Купи один материал

Заинтересовала информация, но нет возможности оплатить подписку? Тогда этот вариант для тебя! Обрати внимание: этот способ покупки доступен только для материалов, опубликованных более двух месяцев назад.


Оставить мнение

Check Also

Google уверяет, что новые версии Android реже страдают от малвари

Компания Google поделилась статистикой, согласно которой менее всего заражениям подвергают…