Переход на веб-ресивер

В этом руководстве объясняется, как перенести приложение Cast Receiver v2 на последнюю версию приложения Web Receiver.

Новый SDK Cast Application Framework (CAF), также известный как Web Receiver v3, является крупным обновлением SDK Receiver v2. Web Receiver SDK — это простой и оптимизированный SDK для разработки мультимедиа-приложений Web Receiver.

Веб-приемник предоставляет API, который более совместим с новыми API-интерфейсами отправителя CAF. Он обеспечивает полную интеграцию плеера (MPL и Shaka), а также полную реализацию и поддержку голосовых команд Cast media и Google Assistant. CAF SDK также предоставляет пользовательский интерфейс по умолчанию, который можно легко настроить с помощью CSS, и службу привязки данных для упрощения реализации пользовательского интерфейса.

Зачем мигрировать?

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

CAF легко интегрирует проигрыватели MPL и Shaka для поддержки более широкого спектра типов контента, включая прямую трансляцию HTTP (TS и CMAF), MPEG-DASH, Smooth Streaming и типы, поддерживаемые свойством источника Media Element (MP3, MP4, Icecast и т. д.). ..). Полный список см. в разделе Поддерживаемые носители для Google Cast . В настоящее время CAF не поддерживает предоставленный пользователем проигрыватель.

Переход на CAF добавит поддержку голосового управления с помощью Google Assistant. Любая новая голосовая команда Google Assistant будет автоматически поддерживаться при использовании CAF.

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

Что изменилось?

API веб-приемника пытается следовать соглашениям, введенным отправителями CAF для Android и iOS , и сильно отличается от v2.

Веб-приемник использует новое пространство имен cast.framework вместо пространства имен cast.receiver для всех открытых API. Многие из объектов данных, которые использовались v2, такие же в CAF и представлены в пространстве имен cast.framework.messages (в основном они находились в cast.receiver.media ).

Следующие службы v2 заменены соответствующими службами CAF:

  • Класс CastReceiverManager заменяется CastReceiverContext , который представляет собой синглтон, управляющий сеансом приведения, отправителями, отправкой пользовательских сообщений и глобальными системными событиями. CastReceiverOptions можно использовать для предоставления контексту глобальных параметров приложения (таких как очередь, версия получателя, конфигурация воспроизведения и т. д.).
  • Класс MediaManager заменяется классом PlayerManager , который является свойством синглтона CastReceiverContext и управляет медиа-сеансом, медиа-запросами, голосовыми запросами Google Assistant ( CommandAndControlManager в версии 2) и запускает медиа-события. Конфигурация для игроков ( cast.player.api.Host в MPL) предоставляется PlaybackConfig , который может предоставляться глобально или для каждого запроса на загрузку.

PlayerManager также предоставляет новые классы подчиненного менеджера:

const context = cast.framework.CastReceiverContext.getInstance();
const playerManager = context.getPlayerManager();

// Set global options.
const options = new cast.framework.CastReceiverOptions();
options.versionCode = DEVELOPERS_APP_VERSION;

context.start(options);

Бизнес-логика получателя

Receiver v2 предоставляет обработчики событий (такие как CastReceiverManager.onReady или MediaManager.onLoad ) для добавления бизнес-логики. В CAF обработчики событий заменены прослушивателями событий ( CastReceiverContext.addEventListener ) и перехватчиками сообщений ( PlayerManager.setMessageInterceptor ). Web Receiver может иметь несколько прослушивателей событий для события (слушатель не влияет на событие) и один перехватчик для каждого сообщения. Перехватчик может обновить запрос или обработать его (возвратить измененный запрос, сообщение об успешном выполнении или сообщение об ошибке) и может быть асинхронным обработчиком, который возвращает обещание.

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

playerManager.setMessageInterceptor(
    cast.framework.messages.MessageType.LOAD,
    request => {
      // Resolve entity to content id
      if (request.media.entity && !request.media.contentId) {
        return getMediaByEntity(request.media.entity).then(
            media => {
              request.media.contentId = media.url;
              return request;
            });
      }
      return request;
    });

Настраиваемый обработчик статуса мультимедиа v2 также заменен перехватчиком сообщений для сообщения о статусе мультимедиа. Приложения веб-приемника, которые не хотят предоставлять URL-адрес мультимедиа в статусе мультимедиа, могут предоставить преобразователь URL-адресов ( PlayerManager.setMediaUrlResolver ), который предоставляет URL-адрес мультимедиа для запроса загрузки. Этот URL-адрес используется CAF для внутренних целей и не указывается в статусе носителя.

playerManager.setMessageInterceptor(
    cast.framework.messages.MessageType.MEDIA_STATUS,
    status => {
      // Disable seek.
      status.supportedMediaCommands &=
          ~cast.framework.messages.Command.SEEK
      return status;
    });

События

Web Receiver предоставляет обширный набор событий как из CastReceiverContext так и из PlayerManager . Приложения веб-приемника могут иметь несколько прослушивателей для любого события, а также могут предоставлять один прослушиватель для нескольких событий. (См. cast.framework.events.category для некоторых групп событий.)

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

Приложение Web Receiver может добавлять прослушиватели событий для обработки (например, добавлять определение текстовых дорожек после завершения загрузки) или для аналитики.

// Log all media commands
playerManager.addEventListener(
    cast.framework.events.category.REQUEST,
    event => logEvent(event.type));

Пользовательская шина сообщений

CAF не предоставляет шину сообщений в API, вместо этого он предоставляет CastReceiverContext.addCustomMessageListener для добавления прослушивателя сообщений для определенного пространства имен (только один для каждого пространства имен) и CastReceiverContext.sendCustomMessage для отправки сообщения в пространстве имен. Все пространства имен должны быть объявлены перед запуском веб-приемника (то есть перед вызовом CastReceiverContext.start ). Пространства имен могут быть объявлены путем добавления к ним прослушивателя сообщений или могут быть предоставлены в качестве начального параметра в CastReceiverOptions.customNamespaces .

const options = new cast.framework.CastReceiverOptions();
options.customNamespaces = {
    CUSTOM_NS: cast.framework.system.MessageType.JSON
};
context.start(options);

context.sendCustomMessage(CUSTOM_NS, {
  type: 'status'
  message: 'Playing'
});

Пользовательский интерфейс по умолчанию

CAF предоставляет пользовательский интерфейс веб-приемника по умолчанию, который отображает индикатор выполнения воспроизведения и метаданные мультимедиа по мере необходимости. Пользовательский интерфейс по умолчанию предоставляется в виде пользовательского элемента ( <cast-media-player> ), который может быть оформлен в стиле CSS.

<style>
   cast-media-player { --splash-image: url("splash.png"); }
</style>
<cast-media-player></cast-media-player>

Для дополнительной настройки приложение Web Receiver может реализовать собственный пользовательский интерфейс. Веб-приемник предоставляет класс cast.framework.ui.PlayerDataBinder , помогающий привязать объект пользовательского интерфейса к состоянию воспроизведения веб-приемника.