В начале 2013 года в новостной ленте блога Intel мы сообщили о новой версии технологии WiDi, которая, в том числе, получила совместимость с родственным стандартом Miracast. Тогда эта информация прошла незамеченной, и на наш взгляд, весьма напрасно, поскольку картина в области беспроводных дисплеев кардинально изменилась. И одно из изменений — появление Miracast на Android. Давайте попробуем разобраться, как соотносятся друг с другом Miracast и WiDi, каким функционалом на пару обладают и как создавать приложения под Android с их использованием.
Многообразие функций и возможностей
О стандарте WiDi мы уже рассказывали достаточно: следили за новостями, рассматривали с точки зрения разработчика и даже тестировали живой серийный адаптер. Теперь для начала опишем в нескольких словах технологию Miracast.
Общая коцепция Miracast
Miracast представляет собой технологию передачи мультимедийной информации (аудио и видео) посредством WiFi. В качестве транспорта в нем используется стандарт WiFi Direct, позволяющий двум устройствам обмениваться данными друг с другом без помощи дополнительной сетевой инфраструктуры. Попросту говоря, Mirocast можно представить, как беспроводной HDMI.
Miracast еще довольно молод: официальная сертификация Miracast устройств альянсом WiFi Alliance началась чуть более года назад. Для передачи видео используется кодек Н.264, звук может быть двух- или пятиканальным. Miracast является открытым стандартом, не принадлежащим какой-либо компании; его привлекательность еще более повысилась после того, как в прошлом году его поддержка была добавлена в ОС Android 4.2. Замечу сразу, что в Android 4.2 на конкретном устройстве не гарантируется наличие Miracast – это надо выяснять дополнительно. Полный список сертифицированных устройств- как передатчиков, так и приемников можно посмотреть на сайте WiFi Alliance.
Архитектура Miracast (со стороны передатчика)
Совместимость Miracast и WiDi версии 3.5 означает общность базового функционала в устройствах обоих стандартов. Какие дополнительные плюшки есть в WiDi, но отсутствуют в Miracast? На сей день их три:
- обязательная поддержка HD видео вплоть до 1080p (хотя стандарт Miracast допускает высокое разрешение, но не обязывает все устройства поддерживать его);
- поддержка системы защиты контента HDCP (High-bandwidth Digital Content Protection);
- наличие двух дополнительных видео режимов – расширенного и многозадачного (о них чуть позже).
Таким образом, можно сказать, что WiDi в настоящее время является функциональным продолжением Miracast.
WiDi поддерживается большинством существующих мобильных платформ Intel (и наверняка будет поддерживаться последующими). Как уже отмечалось в тестировании, технология относится к разряду «однокнопочных», то есть предельно простых для пользователей.
Процесс подключения беспроводного дисплея на примере Samsung Galaxy S4
Ну а теперь пришло время поговорить о режимах. Нативным для WiDi/Miracast является Режим Клонирования – на удаленном дисплее отображается та же картинка, что и на локальном, с тем же разрешением.
Двойной режим также относится к основным; в нем на удаленном дисплее проигрывается контент, а основной служит для управления и вывода служебной информации. Данный режим поддерживается через Android Presentation API.
Расширенный режим имеется только в WiDi (и, соответственно, доступен только для устройств на платформе Intel Atom). В нем видео режим включается автоматически, когда пользователь запускает мультимедийный контент на плеере, использующим Android Media Player framework. Разрешение картинки остается «родным» вплоть до 1080р. При этом локальный рендеринг видео может отключаться для сокращения энергопотребления.
Наконец, самый продвинутый – Многозадачный Режим, при котором видео плеер посылает изображение на удаленный дисплей, а на локальном в это время пользователь делает, что хочет: просматривает интернет, принимает звонки или даже смотрит совсем другое видео, тоже в FullHD разрешении!
Варианты использования режима двух дисплеев:
Режим двух дисплеев подходит не только для просмотра видео. Совершенно несложно набросать список жизненных его применений:
- просмотр интернет на большом экране (смартфон выступает в роли тачпада);
- заполнение форм или набор небольших текстов (смартфон – сенсорная клавиатура);
- игры (смартфон – сенсорный геймпад/джойстик);
- мобильное рабочее место (смарфтон – компьютер, к нему по Bluetooth подключена периферия).
Создаем Android приложение для двух дисплеев
Поддержка второго беспроводного дисплея в Android 4.2 (API Level 17) реализована с помощью с помощью класса Presentation, позволяющего:
- внедрить поддержку второго дисплея в приложения, не заботясь о способе, которым он будет физически подключен;
- работать с MHL, HDMI, Slimport или Miracast совместимыми устройствами;
- осуществлять управление вторым дисплеем независимо от первого.
Presentation является базовым классом и должен быть расширен:
public class DemoPresentation extendsPresentation {
Также необходима ассоциация с классом Display при создании. Presentation наследуется от Dialog, а что касается Dialog, то его жизненный цикл привязан к Activity.
Перед тем, как задействовать Presentation, вам необходимо выбрать дисплей, что может быть сделано двумя способами:
1. MediaRouter API (в API 16) – система сама выберет лучший дисплей за вас
// Get the media router service.
MediaRouter mMediaRouter = (MediaRouter)getSystemService(Context.MEDIA_ROUTER_SERVICE);
// Use the MediaRouter that supports live video
MediaRouter.RouteInfomRouteInfo =mMediaRouter.getSelectedRoute(MediaRouter.ROUTE_TYPE_LIVE_VIDEO);
Display presentationDisplay= mRouteInfo.getPresentationDisplay();
2. Display Manager API (в API 17) – перечень дисплеев.
// Get the display manger service.
DisplayManager mDisplayManager = (DisplayManger)getSystemService(Context.DISPLAY_SERVICE);
// enumerate the displays
Display[] displays =mDisplayManager.getDisplays(DisplayManger.DISPLAY_CATEGORY_PRESENTATION);
Добавление MediaRouteButton в приложение:
//Sets Media Route Button to second screen mode
mediaRouteActionProvider.setRouteTypes(MediaRouter.ROUTE_TYPE_LIVE_VIDEO); //Launches the Wireless display setting intent
startActivity(newIntent
("android.settings.WIFI_DISPLAY_SETTINGS"));
В res/menu/default.xml:
<item
android:title="Media Route Settings"
android:actionProviderClass="android.app.MediaRouteActionProvider"
android:showAsAction="always" />
Как заставить Presentation API работать:
Далее, используя MediaRouter.addCallback, необходимо мониторить:
- onRouteUnselected
- onRouteSelected
- onRoutePresentationDisplayChanged
А внутри активности, которая владеет Presentation:
- onResume
- onPause
API для управления WiFi дисплеями присутствуют внутри Android AOSP, но не являются частью Android framework. Параметры беспроводного дисплея могут быть вызваны через Intent android.settings.WIFI_DISPLAY_SETTINGS, но и он также не входит во фреймворк. Некоторые производители используют другие варианты: Samsung – com.samsung.wfd.LAUNCH_WFD_PICKER_DLG, HTC – com.htc.wifidisplay.CONFIGURE_MODE_NORMAL.
Все API, приведенные на рисунке ниже, являются внутренними для Android 4.2/4.3. Они являются частью AOSP и распространяются свободно, однако не входят во фреймворки и работать не обязаны.
В заключение отметим, что тестировать приложения для двух дисплеев можно как на реальном железе, поддерживающем данный функционал, так и на эмуляции, доступной начиная с Android 4.2 в опциях разработчика. Вы можете выбрать разрешение и dpi второго виртуального дисплея, и получите оверлей с его отображением.
Автор: saul