Эта страница содержит фрагменты кода и описания функций, доступных для пользовательского приложения Web Receiver.
- Элемент
cast-media-player
, представляющий встроенный пользовательский интерфейс проигрывателя, поставляемый с Web Receiver. - Пользовательский CSS-стиль для элемента
cast-media-player
для оформления различных элементов пользовательского интерфейса, таких какbackground-image
,splash-image
иfont-family
. - Элемент скрипта для загрузки платформы Web Receiver.
- Код JavaScript для перехвата сообщений и обработки событий.
- Очередь на автоигру.
- Варианты настройки воспроизведения.
- Параметры для установки контекста веб-приемника.
- Параметры для установки команд, поддерживаемых приложением Web Receiver.
- Вызов JavaScript для запуска приложения Web Receiver.
Конфигурация и параметры приложения
CastReceiverContext
— это самый внешний класс, доступный разработчику, он управляет загрузкой базовых библиотек и инициализацией пакета SDK для веб-приемника.
Если API веб-приемника обнаружит, что отправитель отключен, он вызовет событие SENDER_DISCONNECTED
. Если веб-приемник не может связаться с отправителем в течение времени, которое мы описали как maxInactivity
секунд, он также вызовет событие SENDER_DISCONNECTED
. Во время разработки рекомендуется установить для maxInactivity
высокое значение, чтобы приложение Web Receiver не закрывалось при отладке приложения с помощью удаленного отладчика Chrome:
const context = cast.framework.CastReceiverContext.getInstance();
const options = new cast.framework.CastReceiverOptions();
options.maxInactivity = 3600; //Development only
context.start(options);
Однако для опубликованного приложения Web Receiver лучше не устанавливать maxInactivity
и вместо этого полагаться на значение по умолчанию. Обратите внимание, что параметры веб-приемника задаются в приложении только один раз.
Другая конфигурация — это cast.framework.PlaybackConfig
. Это можно установить следующим образом:
const playbackConfig = new cast.framework.PlaybackConfig();
playbackConfig.manifestRequestHandler = requestInfo => {
requestInfo.withCredentials = true;
};
context.start({playbackConfig: playbackConfig});
Эта конфигурация влияет на воспроизведение каждого контента и, по сути, обеспечивает поведение переопределения. Список вариантов поведения, которые разработчики могут переопределить, см. в определении cast.framework.PlaybackConfig
. Чтобы изменить конфигурацию между содержимым, можно использовать PlayerManager
, чтобы получить его текущую playbackConfig
, изменить или добавить переопределение и сбросить playbackConfig
следующим образом:
const playerManager =
cast.framework.CastReceiverContext.getInstance().getPlayerManager();
const playbackConfig = (Object.assign(
new cast.framework.PlaybackConfig(), playerManager.getPlaybackConfig()));
playbackConfig.autoResumeNumberOfSegments = 1;
playerManager.setPlaybackConfig(playbackConfig);
Обратите внимание, что если PlaybackConfig
не был переопределен, getPlaybackConfig()
возвращает нулевой объект. И любое свойство в PlaybackConfig that
undefined
, будет использовать значения по умолчанию.
Прослушиватель событий
SDK Web Receiver позволяет вашему приложению Web Receiver обрабатывать события проигрывателя. Прослушиватель событий принимает параметр cast.framework.events.EventType
(или массив этих параметров), указывающий события, которые должны инициировать прослушиватель. Предварительно настроенные массивы cast.framework.events.EventType
, полезные для отладки, можно найти в cast.framework.events.category
. Параметр события предоставляет дополнительную информацию о событии.
Например, если вы хотите знать, когда передается изменение mediaStatus
, вы можете использовать следующую логику для обработки события:
const playerManager =
cast.framework.CastReceiverContext.getInstance().getPlayerManager();
playerManager.addEventListener(
cast.framework.events.EventType.MEDIA_STATUS, (event) => {
// Write your own event handling code, for example
// using the event.mediaStatus value
});
Перехват сообщений
Пакет SDK для веб-приемника позволяет вашему приложению веб-приемника перехватывать сообщения и выполнять пользовательский код для этих сообщений. Перехватчик сообщений принимает параметр cast.framework.messages.MessageType
, указывающий, какой тип сообщения следует перехватывать.
Перехватчик должен вернуть измененный запрос или обещание, которое разрешается с измененным значением запроса. Возврат null
предотвратит вызов обработчика сообщений по умолчанию. Дополнительные сведения см. в разделе Загрузка носителя .
Например, если вы хотите изменить данные запроса на загрузку, вы можете использовать следующую логику для их перехвата и изменения:
const context = cast.framework.CastReceiverContext.getInstance();
const playerManager = context.getPlayerManager();
playerManager.setMessageInterceptor(
cast.framework.messages.MessageType.LOAD, loadRequestData => {
const error = new cast.framework.messages.ErrorData(
cast.framework.messages.ErrorType.LOAD_FAILED);
if (!loadRequestData.media) {
error.reason = cast.framework.messages.ErrorReason.INVALID_PARAM;
return error;
}
if (!loadRequestData.media.entity) {
return loadRequestData;
}
return thirdparty.fetchAssetAndAuth(loadRequestData.media.entity,
loadRequestData.credentials)
.then(asset => {
if (!asset) {
throw cast.framework.messages.ErrorReason.INVALID_REQUEST;
}
loadRequestData.media.contentUrl = asset.url;
loadRequestData.media.metadata = asset.metadata;
loadRequestData.media.tracks = asset.tracks;
return loadRequestData;
}).catch(reason => {
error.reason = reason; // cast.framework.messages.ErrorReason
return error;
});
});
context.start();
Обработка ошибок
Когда в перехватчике сообщений возникают ошибки, ваше приложение Web Receiver должно возвращать соответствующие cast.framework.messages.ErrorType
и cast.framework.messages.ErrorReason
.
playerManager.setMessageInterceptor(
cast.framework.messages.MessageType.LOAD, loadRequestData => {
const error = new cast.framework.messages.ErrorData(
cast.framework.messages.ErrorType.LOAD_CANCELLED);
if (!loadRequestData.media) {
error.reason = cast.framework.messages.ErrorReason.INVALID_PARAM;
return error;
}
...
return fetchAssetAndAuth(loadRequestData.media.entity,
loadRequestData.credentials)
.then(asset => {
...
return loadRequestData;
}).catch(reason => {
error.reason = reason; // cast.framework.messages.ErrorReason
return error;
});
});
Перехват сообщений и прослушиватель событий
Некоторые ключевые различия между перехватом сообщений и прослушивателем событий заключаются в следующем:
- Прослушиватель событий не позволяет изменять данные запроса.
- Прослушиватель событий лучше всего использовать для запуска аналитики или пользовательской функции.
playerManager.addEventListener(cast.framework.events.category.CORE,
event => {
console.log(event);
});
- Перехват сообщений позволяет прослушивать сообщение, перехватывать его и изменять сами данные запроса.
- Перехват сообщений лучше всего использовать для обработки пользовательской логики в отношении данных запроса.
Загрузка носителя
MediaInformation
предоставляет множество свойств для загрузки мультимедиа в сообщении cast.framework.messages.MessageType.LOAD
, включая entity
, contentUrl
и contentId
.
entity
— это предлагаемое свойство для использования в вашей реализации как для приложений-отправителей, так и для приложений-получателей. Свойство представляет собой URL-адрес глубокой ссылки, который может быть либо плейлистом, либо определенным мультимедийным контентом.
contentUrl
предназначен для воспроизводимого URL-адреса и может использоваться после того, как станет доступным.
contentId
устарел из-за неоднозначности того, является ли значение URL-адресом носителя, реальным идентификатором или ключевым параметром для пользовательского поиска.
Предлагается использовать entity
для хранения реального идентификатора или ключевых параметров, а также использовать contentUrl
для URL-адреса носителя. Пример этого показан в следующем фрагменте, где entity
присутствует в запросе LOAD
и извлекается воспроизводимый contentUrl
:
playerManager.setMessageInterceptor(
cast.framework.messages.MessageType.LOAD, loadRequestData => {
...
if (!loadRequestData.media.entity) {
// Copy the value from contentId for legacy reasons if needed
loadRequestData.media.entity = loadRequestData.media.contentId;
}
return thirdparty.fetchAssetAndAuth(loadRequestData.media.entity,
loadRequestData.credentials)
.then(asset => {
loadRequestData.media.contentUrl = asset.url;
...
return loadRequestData;
});
});
Возможности устройства
Метод getDeviceCapabilities
предоставляет информацию о подключенном устройстве Cast и подключенном к нему видео- или аудиоустройстве. Метод getDeviceCapabilities
предоставляет информацию о поддержке для Google Assistant, Bluetooth и подключенных устройств отображения и аудио.
Этот метод возвращает объект, который вы можете запросить, передав одно из указанных перечислений, чтобы получить возможности устройства для этого перечисления. Перечисления определены в cast.framework.system.DeviceCapabilities
.
В этом примере проверяется, может ли устройство Web Receiver воспроизводить HDR и DolbyVision (DV) с ключами IS_HDR_SUPPORTED
и IS_DV_SUPPORTED
соответственно.
const context = cast.framework.CastReceiverContext.getInstance();
context.addEventListener(cast.framework.system.EventType.READY, () => {
const deviceCapabilities = context.getDeviceCapabilities();
if (deviceCapabilities &&
deviceCapabilities[cast.framework.system.DeviceCapabilities.IS_HDR_SUPPORTED]) {
// Write your own event handling code, for example
// using the deviceCapabilities[cast.framework.system.DeviceCapabilities.IS_HDR_SUPPORTED] value
}
if (deviceCapabilities &&
deviceCapabilities[cast.framework.system.DeviceCapabilities.IS_DV_SUPPORTED]) {
// Write your own event handling code, for example
// using the deviceCapabilities[cast.framework.system.DeviceCapabilities.IS_DV_SUPPORTED] value
}
});
context.start();
Обработка взаимодействия с пользователем
Пользователь может взаимодействовать с вашим приложением Web Receiver через приложения-отправители (веб-приложения, Android и iOS), голосовые команды на устройствах с поддержкой Assistant, сенсорное управление на смарт-дисплеях и пульты дистанционного управления на устройствах Android TV. Cast SDK предоставляет различные API-интерфейсы, позволяющие приложению Web Receiver обрабатывать эти взаимодействия, обновлять пользовательский интерфейс приложения с помощью состояний действий пользователя и, при необходимости, отправлять изменения для обновления любых серверных служб.
Поддерживаемые мультимедийные команды
Состояния элементов управления пользовательского интерфейса управляются MediaStatus.supportedMediaCommands
для расширенных контроллеров отправителя iOS и Android, приложений получателя и удаленного управления, работающих на сенсорных устройствах, и приложений получателя на устройствах Android TV. Когда конкретная побитовая Command
включена в свойстве, кнопки, связанные с этим действием, включены. Если значение не установлено, то кнопка отключена. Эти значения можно изменить в веб-приемнике следующим образом:
- Использование
PlayerManager.setSupportedMediaCommands
для установки определенныхCommands
- Добавление новой команды с помощью
addSupportedMediaCommands
- Удаление существующей команды с помощью
removeSupportedMediaCommands
.
playerManager.setSupportedMediaCommands(cast.framework.messages.Command.SEEK |
cast.framework.messages.Command.PAUSE);
Когда получатель подготовит обновленный MediaStatus
, он будет включать изменения в свойстве supportedMediaCommands
. Когда статус передается, подключенные приложения-отправители соответствующим образом обновляют кнопки в своем пользовательском интерфейсе.
Дополнительные сведения о поддерживаемых мультимедийных командах и сенсорных устройствах см. в руководстве Accessing UI controls
.
Управление состояниями действий пользователя
Когда пользователи взаимодействуют с пользовательским интерфейсом или отправляют голосовые команды, они могут управлять воспроизведением содержимого и свойств, связанных с воспроизводимым элементом. Запросы, управляющие воспроизведением, обрабатываются SDK автоматически. Запросы, которые изменяют свойства текущего воспроизводимого элемента, такие как команда LIKE
, требуют, чтобы приложение-получатель обрабатывало их. SDK предоставляет ряд API для обработки таких типов запросов. Для поддержки этих запросов необходимо сделать следующее:
- Перехватывать сообщения
USER_ACTION
и определять запрошенное действие. - Обновите
MediaInformation
UserActionState
, чтобы обновить пользовательский интерфейс.
Приведенный ниже фрагмент перехватывает сообщение USER_ACTION
и обрабатывает вызов серверной части с запрошенным изменением. Затем он делает вызов для обновления UserActionState
на приемнике.
playerManager.setMessageInterceptor(cast.framework.messages.MessageType.USER_ACTION,
(userActionRequestData) => {
// Obtain the media information of the current content to associate the action to.
let mediaInfo = playerManager.getMediaInformation();
// If there is no media info return an error and ignore the request.
if (!mediaInfo) {
console.error('Not playing media, user action is not supported');
return new cast.framework.messages.ErrorData(messages.ErrorType.BAD_REQUEST);
}
// Reach out to backend services to store user action modifications. See sample below.
return sendUserAction(userActionRequestData, mediaInfo)
// Upon response from the backend, update the client's UserActionState.
.then(backendResponse => updateUserActionStates(backendResponse))
// If any errors occurred in the backend return them to the cast receiver.
.catch((error) => {
console.error(error);
return error;
});
});
Приведенный ниже фрагмент кода имитирует вызов серверной службы. Функция проверяет UserActionRequestData
, чтобы увидеть тип изменения, запрошенного пользователем, и выполняет сетевой вызов только в том случае, если действие поддерживается серверной частью.
function sendUserAction(userActionRequestData, mediaInfo) {
return new Promise((resolve, reject) => {
switch (userActionRequestData.userAction) {
// Handle user action changes supported by the backend.
case cast.framework.messages.UserAction.LIKE:
case cast.framework.messages.UserAction.DISLIKE:
case cast.framework.messages.UserAction.FOLLOW:
case cast.framework.messages.UserAction.UNFOLLOW:
case cast.framework.messages.UserAction.FLAG:
case cast.framework.messages.UserAction.SKIP_AD:
let backendResponse = {userActionRequestData: userActionRequestData, mediaInfo: mediaInfo};
setTimeout(() => {resolve(backendResponse)}, 1000);
break;
// Reject all other user action changes.
default:
reject(
new cast.framework.messages.ErrorData(cast.framework.messages.ErrorType.INVALID_REQUEST));
}
});
}
Фрагмент ниже берет UserActionRequestData
и либо добавляет, либо удаляет UserActionState
из MediaInformation
. Обновление UserActionState
MediaInformation
изменяет состояние кнопки, связанной с запрошенным действием. Это изменение отражено в пользовательском интерфейсе управления интеллектуальным дисплеем, приложении дистанционного управления и пользовательском интерфейсе Android TV. Он также передается через исходящие сообщения MediaStatus
для обновления пользовательского интерфейса расширенного контроллера для отправителей iOS и Android.
function updateUserActionStates(backendResponse) {
// Unwrap the backend response.
let mediaInfo = backendResponse.mediaInfo;
let userActionRequestData = backendResponse.userActionRequestData;
// If the current item playing has changed, don't update the UserActionState for the current item.
if (playerManager.getMediaInformation().entity !== mediaInfo.entity) {
return;
}
// Check for existing userActionStates in the MediaInformation.
// If none, initialize a new array to populate states with.
let userActionStates = mediaInfo.userActionStates || [];
// Locate the index of the UserActionState that will be updated in the userActionStates array.
let index = userActionStates.findIndex((currUserActionState) => {
return currUserActionState.userAction == userActionRequestData.userAction;
});
if (userActionRequestData.clear) {
// Remove the user action state from the array if cleared.
if (index >= 0) {
userActionStates.splice(index, 1);
}
else {
console.warn("Could not find UserActionState to remove in MediaInformation");
}
} else {
// Add the UserActionState to the array if enabled.
userActionStates.push(
new cast.framework.messages.UserActionState(userActionRequestData.userAction));
}
// Update the UserActionState array and set the new MediaInformation
mediaInfo.userActionStates = userActionStates;
playerManager.setMediaInformation(mediaInfo, true);
return;
}
Голосовые команды
Следующие мультимедийные команды в настоящее время поддерживаются в SDK веб-приемника для устройств с поддержкой Assistant. Реализации этих команд по умолчанию находятся в cast.framework.PlayerManager
.
Команда | Описание |
---|---|
Играть | Воспроизведение или возобновление воспроизведения из состояния паузы. |
Пауза | Приостановить воспроизводимый в данный момент контент. |
Предыдущий | Перейти к предыдущему элементу мультимедиа в очереди мультимедиа. |
Следующий | Перейти к следующему элементу мультимедиа в очереди мультимедиа. |
Останавливаться | Остановите воспроизводимый в данный момент медиафайл. |
Повторить Нет | Отключить повторение элементов мультимедиа в очереди после завершения воспроизведения последнего элемента в очереди. |
Повтор сингла | Бесконечное повторение текущего воспроизводимого мультимедиа. |
Повторить все | Повторить все элементы в очереди после воспроизведения последнего элемента в очереди. |
Повторить все и перемешать | Как только последний элемент в очереди будет воспроизведен, перетасуйте очередь и повторите все элементы в очереди. |
Перемешать | Перемешайте элементы мультимедиа в очереди мультимедиа. |
Скрытые субтитры ВКЛ/ВЫКЛ | Включить / отключить скрытые субтитры для ваших медиафайлов. Включить/отключить также можно по языку. |
Стремитесь к абсолютному времени | Переход к указанному абсолютному времени. |
Поиск времени относительно текущего времени | Переходит вперед или назад на указанный период времени относительно текущего времени воспроизведения. |
Играть снова | Перезапустите воспроизводимый в данный момент медиафайл или воспроизведите последний воспроизводимый медиафайл, если в данный момент ничего не воспроизводится. |
Установить скорость воспроизведения | Варьируйте скорость воспроизведения мультимедиа. Это должно обрабатываться по умолчанию. Вы можете использовать перехватчик сообщений SET_PLAYBACK_RATE для переопределения входящих запросов скорости. |
Поддерживаемые мультимедийные команды с помощью голоса
Чтобы голосовая команда не запускала мультимедийную команду на устройстве с включенным помощником, необходимо сначала настроить поддерживаемые мультимедийные команды , которые вы планируете поддерживать. Затем вы должны применить эти команды, включив свойство CastReceiverOptions.enforceSupportedCommands
. Пользовательский интерфейс отправителей Cast SDK и сенсорных устройств изменится, чтобы отразить эти конфигурации. Если флаг не установлен, входящие голосовые команды будут выполняться.
Например, если вы разрешаете PAUSE
в своих приложениях-отправителях и устройствах с сенсорным экраном, вы также должны настроить получателя, чтобы он отражал эти настройки. При настройке любые входящие голосовые команды будут отброшены, если они не включены в список поддерживаемых команд.
В приведенном ниже примере мы предоставляем CastReceiverOptions
при запуске CastReceiverContext
. Мы добавили поддержку команды PAUSE
и заставили проигрыватель поддерживать только эту команду. Теперь, если голосовая команда запрашивает другую операцию, такую как SEEK
она будет отклонена. Пользователь будет уведомлен о том, что команда еще не поддерживается.
const context = cast.framework.CastReceiverContext.getInstance();
context.start({
enforceSupportedCommands: true,
supportedCommands: cast.framework.messages.Command.PAUSE
});
Вы можете применить отдельную логику для каждой команды, которую вы хотите ограничить. Удалите флаг enforceSupportedCommands
, и для каждой команды, которую вы хотите ограничить, вы сможете перехватывать входящее сообщение. Здесь мы перехватываем запрос, предоставленный SDK, чтобы команды SEEK
, отправленные на устройства с поддержкой Assistant, не запускали поиск в вашем приложении Web Receiver.
Для мультимедийных команд, которые ваше приложение не поддерживает, возвращайте соответствующую причину ошибки, например NOT_SUPPORTED
.
playerManager.setMessageInterceptor(cast.framework.messages.MessageType.SEEK,
seekData => {
// Block seeking if the SEEK supported media command is disabled
if (!(playerManager.getSupportedMediaCommands() & cast.framework.messages.Command.SEEK)) {
let e = new cast.framework.messages.ErrorData(cast.framework.messages.ErrorType
.INVALID_REQUEST);
e.reason = cast.framework.messages.ErrorReason.NOT_SUPPORTED;
return e;
}
return seekData;
});
Фон из голосовой активности
Если платформа Cast создает фоновый звук вашего приложения из-за действий помощника, таких как прослушивание речи пользователя или его реплика, при запуске действия в приложение Web Receiver отправляется сообщение FocusState
NOT_IN_FOCUS
. Другое сообщение с IN_FOCUS
отправляется, когда действие заканчивается. В зависимости от вашего приложения и воспроизводимого мультимедиа вы можете захотеть приостановить мультимедиа, когда FocusState
имеет NOT_IN_FOCUS
, перехватив тип сообщения FOCUS_STATE
.
Например, полезно приостановить воспроизведение аудиокниги, если помощник отвечает на запрос пользователя.
playerManager.setMessageInterceptor(cast.framework.messages.MessageType.FOCUS_STATE,
focusStateRequestData => {
// Pause content when the app is out of focus. Resume when focus is restored.
if (focusStateRequestData.state == cast.framework.messages.FocusState.NOT_IN_FOCUS) {
playerManager.pause();
} else {
playerManager.play();
}
return focusStateRequestData;
});
Голосовой язык субтитров
Если пользователь явно не указывает язык субтитров, язык, используемый для субтитров, совпадает с языком, на котором была произнесена команда. В этих сценариях параметр isSuggestedLanguage
входящего сообщения указывает, был ли связанный язык предложен или явно запрошен пользователем.
Например, isSuggestedLanguage
имеет значение true
для команды «Окей, Google, включи субтитры», потому что язык определяется языком, на котором была произнесена команда. Субтитры на английском языке», isSuggestedLanguage
имеет значение false
.
Метаданные и озвучка
Хотя голосовые команды по умолчанию обрабатываются веб-приемником, вы должны убедиться, что метаданные вашего контента полны и точны. Это гарантирует правильную обработку голосовых команд помощником и правильное отображение метаданных в новых типах интерфейсов, таких как приложение Google Home и интеллектуальные дисплеи, такие как Google Home Hub.
Потоковая передача
Сохранение состояния сеанса является основой потоковой передачи, когда пользователи могут перемещать существующие аудио- и видеопотоки между устройствами с помощью голосовых команд, приложения Google Home или интеллектуальных дисплеев. Воспроизведение мультимедиа прекращается на одном устройстве (источнике) и продолжается на другом (целевом). Любое устройство Cast с последней прошивкой может служить источником или получателем потоковой передачи.
Поток событий для потоковой передачи:
- На исходном устройстве:
- Медиа перестает воспроизводиться.
- Приложение Web Receiver получает команду на сохранение текущего состояния мультимедиа.
- Приложение Web Receiver закрыто.
- На целевом устройстве:
- Приложение веб-приемника загружено.
- Приложение Web Receiver получает команду на восстановление сохраненного состояния носителя.
- Медиа возобновляет воспроизведение.
К элементам состояния СМИ относятся:
- Конкретное положение или временная метка песни, видео или медиафайла.
- Его место в более широкой очереди (такой как плейлист или радио исполнителя).
- Аутентифицированный пользователь.
- Состояние воспроизведения (например, воспроизведение или пауза).
Включение потоковой передачи
Чтобы реализовать потоковую передачу для вашего веб-приемника:
- Обновите
supportedMediaCommands
с помощью командыSTREAM_TRANSFER
:playerManager.addSupportedMediaCommands( cast.framework.messages.Command.STREAM_TRANSFER, true);
- При необходимости переопределите перехватчики сообщений
SESSION_STATE
иRESUME_SESSION
, как описано в разделе Сохранение состояния сеанса . Переопределяйте их только в том случае, если пользовательские данные необходимо сохранить как часть моментального снимка сеанса. В противном случае реализация по умолчанию для сохранения состояний сеанса будет поддерживать потоковую передачу.
Сохранение состояния сеанса
Пакет SDK для веб-приемника предоставляет реализацию по умолчанию для приложений веб-приемника для сохранения состояний сеанса путем создания моментального снимка текущего состояния мультимедиа, преобразования состояния в запрос на загрузку и возобновления сеанса с запросом на загрузку.
Запрос на загрузку, сгенерированный веб-приемником, при необходимости можно переопределить в перехватчике сообщений SESSION_STATE
. Если вы хотите добавить пользовательские данные в запрос на загрузку, мы предлагаем поместить их в loadRequestData.customData
.
playerManager.setMessageInterceptor(
cast.framework.messages.MessageType.SESSION_STATE,
function (sessionState) {
// Override sessionState.loadRequestData if needed.
const newCredentials = updateCredentials_(sessionState.loadRequestData.credentials);
sessionState.loadRequestData.credentials = newCredentials;
// Add custom data if needed.
sessionState.loadRequestData.customData = {
'membership': 'PREMIUM'
};
return sessionState;
});
Пользовательские данные можно получить из loadRequestData.customData
в перехватчике сообщений RESUME_SESSION
.
let cred_ = null;
let membership_ = null;
playerManager.setMessageInterceptor(
cast.framework.messages.MessageType.RESUME_SESSION,
function (resumeSessionRequest) {
let sessionState = resumeSessionRequest.sessionState;
// Modify sessionState.loadRequestData if needed.
cred_ = sessionState.loadRequestData.credentials;
// Retrieve custom data.
membership_ = sessionState.loadRequestData.customData.membership;
return resumeSessionRequest;
});
Предварительная загрузка контента
Веб-приемник поддерживает предварительную загрузку элементов мультимедиа после текущего элемента воспроизведения в очереди.
Операция предварительной загрузки предварительно загружает несколько сегментов предстоящих элементов. Спецификация выполняется для значения preloadTime в объекте QueueItem (по умолчанию 20 секунд, если оно не указано). Время выражается в секундах относительно конца текущего воспроизводимого элемента. Допустимы только положительные значения. Например, если значение равно 10 секундам, этот элемент будет предварительно загружен за 10 секунд до завершения предыдущего элемента. Если время предварительной загрузки превышает время, оставшееся для текущего элемента, предварительная загрузка произойдет как можно скорее. Таким образом, если для элемента queueItem указано очень большое значение предварительной загрузки, можно добиться эффекта, когда при воспроизведении текущего элемента мы уже предварительно загружаем следующий элемент. Однако мы оставляем настройку и выбор этого параметра на усмотрение разработчика, поскольку это значение может повлиять на пропускную способность и производительность потоковой передачи текущего элемента воспроизведения.
По умолчанию предварительная загрузка будет работать для потокового контента HLS, DASH и Smooth.
Обычные видео- и аудиофайлы MP4, такие как MP3, не будут предварительно загружены, поскольку устройства Cast поддерживают только один элемент мультимедиа и не могут использоваться для предварительной загрузки во время воспроизведения существующего элемента контента.
Пользовательские сообщения
Обмен сообщениями является ключевым методом взаимодействия для приложений Web Receiver.
Отправитель отправляет сообщения веб-получателю, используя API-интерфейсы отправителя для платформы, на которой работает отправитель (Android, iOS, Интернет). Объект события (который является проявлением сообщения), который передается прослушивателям событий, имеет элемент данных ( event.data
), в котором данные приобретают свойства определенного типа события.
Приложение Web Receiver может прослушивать сообщения в указанном пространстве имен. Благодаря этому считается, что приложение Web Receiver поддерживает этот протокол пространства имен. Затем любые подключенные отправители, желающие обмениваться данными в этом пространстве имен, должны использовать соответствующий протокол.
Все пространства имен определяются строкой и должны начинаться с « urn:x-cast:
», за которой следует любая строка. Например, " urn:x-cast: com.example.cast.mynamespace
".
Вот фрагмент кода для веб-приемника для прослушивания пользовательских сообщений от подключенных отправителей:
const context = cast.framework.CastReceiverContext.getInstance();
const CUSTOM_CHANNEL = 'urn:x-cast:com.example.cast.mynamespace';
context.addCustomMessageListener(CUSTOM_CHANNEL, function(customEvent) {
// handle customEvent.
});
context.start();
Точно так же приложения веб-приемника могут информировать отправителей о состоянии веб-приемника, отправляя сообщения подключенным отправителям. Приложение веб-приемника может отправлять сообщения с помощью sendCustomMessage(namespace, senderId, message)
в CastReceiverContext
. Веб-приемник может отправлять сообщения отдельному отправителю либо в ответ на полученное сообщение, либо в связи с изменением состояния приложения. Помимо обмена сообщениями «точка-точка» (с ограничением в 64 КБ), веб-приемник также может транслировать сообщения всем подключенным отправителям.
Трансляция для аудиоустройств
См. руководство по Google Cast для аудиоустройств , чтобы узнать о поддержке воспроизведения только аудио.
Андроид ТВ
В этом разделе обсуждается, как Google Web Receiver использует ваши входные данные для воспроизведения, а также совместимость с Android TV.
Интеграция вашего приложения с пультом дистанционного управления
Веб-приемник Google, работающий на устройстве Android TV, преобразует входные данные с управляющих входов устройства (например, ручного пульта дистанционного управления) в сообщения о воспроизведении мультимедиа, определенные для пространства имен urn:x-cast:com.google.cast.media
, как описано в разделе Сообщения о воспроизведении мультимедиа . Ваше приложение должно поддерживать эти сообщения для управления воспроизведением мультимедиа в приложении, чтобы обеспечить базовое управление воспроизведением с управляющих входов Android TV.
Рекомендации по совместимости с Android TV
Вот несколько рекомендаций и распространенных ошибок, которых следует избегать, чтобы ваше приложение было совместимо с Android TV:
- Имейте в виду, что строка пользовательского агента содержит как «Android», так и «CrKey»; некоторые сайты могут перенаправлять на сайт только для мобильных устройств, поскольку они обнаруживают ярлык «Android». Не думайте, что «Android» в строке пользовательского агента всегда указывает на мобильного пользователя.
- Медиа-стек Android может использовать прозрачный GZIP для получения данных. Убедитесь, что ваши медиаданные могут отвечать на
Accept-Encoding: gzip
. - Медиа-события Android TV HTML5 могут запускаться в другое время, чем Chromecast, это может выявить проблемы, которые были скрыты в Chromecast.
- При обновлении мультимедиа используйте связанные с мультимедиа события, запускаемые элементами
<audio>/<video>
, такие какtimeupdate
,pause
иwaiting
. Избегайте использования связанных с сетью событий, таких какprogress
,suspend
иstalled
, поскольку они, как правило, зависят от платформы. См. Медиа-события для получения дополнительной информации об обработке медиа-событий в вашем приемнике. - При настройке HTTPS-сертификатов сайта-получателя обязательно включите промежуточные сертификаты ЦС. См. тестовую страницу Qualsys SSL , чтобы проверить: если доверенный путь сертификации для вашего сайта включает сертификат ЦС с пометкой «дополнительная загрузка», то он может не загружаться на платформах на базе Android.
- В то время как Chromecast отображает страницу получателя в графической плоскости 720p, другие платформы Cast, включая Android TV, могут отображать страницу до 1080p. Убедитесь, что ваша страница получателя корректно масштабируется при разных разрешениях.