Миграция на веб-приемник

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

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

Веб-приемник предоставляет 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 и типы, поддерживаемые свойством источника медиа-элемента (MP3, MP4, Icecast и т. д.). ..). Полный список см. в разделе «Поддерживаемые носители для Google Cast» . В настоящее время CAF не поддерживает проигрыватель, предоставленный пользователем.

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

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

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

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

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

Следующие службы версии 2 заменены соответствующими службами 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 ). Веб-приемник может иметь несколько прослушивателей событий для события (прослушиватель не влияет на событие) и один перехватчик на каждое сообщение. Перехватчик может обновлять запрос или обрабатывать его (возвращать измененный запрос, сообщение об успехе или сообщение об ошибке), а также может быть асинхронным обработчиком, возвращающим обещание.

Перехватчик запросов загрузки — это наиболее распространенное место для добавления логики, специфичной для приложения. Для запросов на загрузку от отправителя перехватчик нагрузки может преобразовать идентификатор контента в 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;
    });

Настраиваемый обработчик статуса мультимедиа версии 2 также заменен перехватчиком сообщений о статусе мультимедиа. Приложения веб-приемника, которые не хотят раскрывать 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>

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