Ta strona zawiera fragmenty kodu i opisy funkcji dostępnych dla niestandardową aplikację odbiornika internetowego.
- Element
cast-media-player
reprezentujący wbudowany interfejs odtwarzacza z odbiornikiem internetowym. - Niestandardowy styl CSS elementu
cast-media-player
, który pozwala nadać różne elementy interfejsu takie jakbackground-image
,splash-image
orazfont-family
- Element skryptu do wczytywania platformy Web Receiver.
- z kodem JavaScript do przechwytywania wiadomości i obsługi zdarzeń.
- Kolejka do autoodtwarzania.
- Opcje konfigurowania odtwarzania.
- Opcje ustawiania kontekstu odbiornika internetowego.
- Opcje ustawiania poleceń obsługiwanych przez aplikację Web Receiver.
- Wywołanie JavaScriptu do uruchomienia aplikacji Web Receiver.
Konfiguracja i opcje aplikacji
Konfigurowanie aplikacji
CastReceiverContext
to najbardziej zewnętrzna klasa udostępniona deweloperowi i zarządza ona wczytywaniem
i obsługuje inicjowanie pakietu SDK odbiornika internetowego. Pakiet SDK
udostępnia interfejsy API, które pozwalają programistom aplikacji skonfigurować
CastReceiverOptions
Konfiguracje są oceniane raz na uruchomienie aplikacji i przekazywane do
SDK podczas ustawiania opcjonalnego parametru w wywołaniu funkcji
start
Poniższy przykład pokazuje, jak zastąpić domyślne zachowanie przy wykrywaniu, czy
połączenie z nadawcą jest nadal aktywne. Jeśli odbiornik internetowy nie
udało się skomunikować z nadawcą przez
maxInactivity
sek., wysyłane jest zdarzenie SENDER_DISCONNECTED
. Konfiguracja poniżej
zastępuje ten limit czasu. Może to być przydatne podczas debugowania problemów, ponieważ uniemożliwia
aplikacji Web Receiver na zamknięcie sesji zdalnego debugowania Chrome.
nie ma połączonych nadawców w stanie IDLE
.
const context = cast.framework.CastReceiverContext.getInstance();
const options = new cast.framework.CastReceiverOptions();
options.maxInactivity = 3600; // Development only
context.start(options);
Konfigurowanie odtwarzacza
Podczas ładowania treści pakiet SDK Web Receiver umożliwia skonfigurowanie odtwarzania
zmienne takie jak DRM
informacje,
ponawiania konfiguracji i modułów obsługi żądań za pomocą
cast.framework.PlaybackConfig
.
Tymi informacjami zajmuje się
PlayerManager
i jest oceniana w momencie utworzenia graczy. Tworzenie graczy
za każdym razem, gdy do pakietu SDK odbiornika internetowego trafia nowe dane. Modyfikacje
PlaybackConfig
po utworzeniu gracza są oceniane w następnej kolejności
wczytywania treści. Pakiet SDK udostępnia następujące metody modyfikowania
PlaybackConfig
CastReceiverOptions.playbackConfig
aby zastąpić domyślne opcje konfiguracji przy inicjowaniuCastReceiverContext
PlayerManager.getPlaybackConfig()
aby uzyskać bieżącą konfigurację.PlayerManager.setPlaybackConfig()
aby zastąpić bieżącą konfigurację. To ustawienie jest stosowane do wszystkich w przypadku kolejnych załadowań lub dopóki nie zostanie ponownie zastąpione.PlayerManager.setMediaPlaybackInfoHandler()
aby zastosować dodatkowe konfiguracje tylko do elementu multimedialnego, który jest wczytywany z bieżącej konfiguracji. Moduł obsługi jest wywoływany tuż przed odtwarzaczem proces tworzenia. Wprowadzone tutaj zmiany nie są trwałe i nie są uwzględniane w zapytaniach dogetPlaybackConfig()
. Podczas wczytywania następnego elementu multimedialnego ten moduł obsługi jest wywoływany ponownie.
Poniższy przykład pokazuje, jak ustawić PlaybackConfig
podczas inicjowania
CastReceiverContext
Konfiguracja zastępuje żądania wychodzące dla
uzyskania plików manifestu. Moduł obsługi wskazuje, że żądania kontroli dostępu CORS
należy użyć za pomocą danych uwierzytelniających, takich jak pliki cookie lub nagłówki autoryzacji.
const playbackConfig = new cast.framework.PlaybackConfig();
playbackConfig.manifestRequestHandler = requestInfo => {
requestInfo.withCredentials = true;
};
context.start({playbackConfig: playbackConfig});
Przykład poniżej pokazuje, jak zastąpić wartość PlaybackConfig
za pomocą metody getter.
i seter podaliśmy w PlayerManager
. To ustawienie konfiguruje odtwarzacz
wznów odtwarzanie treści po załadowaniu jednego segmentu.
const playerManager =
cast.framework.CastReceiverContext.getInstance().getPlayerManager();
const playbackConfig = (Object.assign(
new cast.framework.PlaybackConfig(), playerManager.getPlaybackConfig()));
playbackConfig.autoResumeNumberOfSegments = 1;
playerManager.setPlaybackConfig(playbackConfig);
Przykład poniżej pokazuje, jak zastąpić PlaybackConfig
w przypadku określonego obciążenia
za pomocą modułu obsługi informacji o odtwarzaniu multimediów. Moduł obsługi wywołuje aplikację
została zaimplementowana metoda getLicenseUrlForMedia
, by uzyskać licenseUrl
z
contentId
bieżącego elementu.
playerManager.setMediaPlaybackInfoHandler((loadRequestData, playbackConfig) => {
const mediaInformation = loadRequestData.media;
playbackConfig.licenseUrl = getLicenseUrlForMedia(mediaInformation.contentId);
return playbackConfig;
});
Detektor zdarzeń
Pakiet Web Receiver SDK umożliwia aplikacji odbiornik internetowy obsługę zdarzeń odtwarzacza.
detektor zdarzeń pobiera
cast.framework.events.EventType
parametru (lub tablicy tych parametrów), który określa zdarzenia, które
powinno aktywować detektor. Wstępnie skonfigurowane tablice wartości
cast.framework.events.EventType
przydatne do debugowania znajdziesz tutaj:
cast.framework.events.category
Parametr zdarzenia zawiera dodatkowe informacje o zdarzeniu.
Jeśli na przykład chcesz wiedzieć, kiedy
mediaStatus
która jest transmitowana, możesz użyć następującej funkcji logicznej, aby obsłużyć
zdarzenie:
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
});
Przechwytywanie wiadomości
SDK odbiornika internetowego pozwala aplikacji odbiornika na przechwytywanie wiadomości i
na uruchamianie w tych wiadomościach niestandardowego kodu. Funkcja przechwytująca wiadomości pobiera
cast.framework.messages.MessageType
określający typ komunikatu, który ma zostać przechwycony.
Funkcja przechwytująca powinna zwrócić zmodyfikowane żądanie lub obietnicę rozstrzygnięcia
ze zmodyfikowaną wartością żądania. Jeśli zwrócisz null
, uniemożliwisz wywołanie
jako domyślny moduł obsługi wiadomości. Więcej informacji znajdziesz w artykule Wczytywanie multimediów.
Jeśli np. chcesz zmienić dane żądania wczytywania, możesz użyć polecenia następujące logiki w celu jego przechwycenia i zmodyfikowania:
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();
Obsługa błędów
Gdy w narzędziu do przechwytywania wiadomości wystąpią błędy, aplikacja Web Receiver powinna zwrócić
odpowiedni
cast.framework.messages.ErrorType
oraz
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;
});
});
Przechwytywanie wiadomości a detektor zdarzeń
Niektóre kluczowe różnice między przechwytywaniem wiadomości a detektorem zdarzeń to: następujące:
- Detektor zdarzeń nie pozwala na modyfikowanie danych żądania.
- Detektor zdarzeń najlepiej nadaje się do aktywowania analiz lub funkcji niestandardowych.
playerManager.addEventListener(cast.framework.events.category.CORE,
event => {
console.log(event);
});
- Przechwytywanie wiadomości pozwala odsłuchać wiadomość i przechwycić ją same zmieniać dane żądania.
- Przechwytywanie wiadomości najlepiej wykorzystać do obsługi niestandardowej logiki w odniesieniu do żądania danych.
Wczytuję multimedia
MediaInformation
ma wiele właściwości umożliwiających wczytywanie multimediów
cast.framework.messages.MessageType.LOAD
wiadomość, w tym entity
,
contentUrl
i contentId
.
entity
to sugerowana właściwość do użycia w implementacji zarówno dla nadawcy, aplikacji odbiorników. Usługa to URL precyzyjnego linku, który może być playlistą i treści multimedialnych. Aplikacja powinna przeanalizować ten adres URL i wypełnić co najmniej jedno z pozostałych pól.contentUrl
odpowiada adresowi URL odtwarzania, którego odtwarzacz użyje do wczytania treści. Na przykład ten adres URL może wskazywać plik manifestu DASH.contentId
może być adresem URL treści demonstracyjnej (podobne do adresu wcontentUrl
właściwość) lub unikalny identyfikator wczytywanej treści bądź playlisty. Jeśli używasz tej właściwości jako identyfikatora, aplikacja powinna wypełniać odtwarzanego adresu URL w elemenciecontentUrl
.
Zalecamy używanie właściwości entity
do przechowywania prawdziwego identyfikatora lub kluczowych parametrów.
użyj contentUrl
jako adresu URL multimediów. Ten przykład widać w
ten fragment kodu, w którym w żądaniu LOAD
znajduje się parametr entity
,
pobrany element contentUrl
z możliwością odtworzenia:
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;
});
});
Funkcje urządzenia
getDeviceCapabilities
dostarcza informacje z urządzenia o podłączonym urządzeniu przesyłającym oraz o filmie lub
podłączonego do niego urządzenia audio. Metoda getDeviceCapabilities
zapewnia pomoc
informacje dotyczące Asystenta Google, Bluetootha, połączonego wyświetlacza i dźwięku
urządzenia.
Ta metoda zwraca obiekt, o który można zapytać, przekazując jedną z
określonych wyliczeniowych, aby uzyskać możliwości urządzenia dla tej wartości. Wyliczenia są następujące
zdefiniowane w
cast.framework.system.DeviceCapabilities
W tym przykładzie sprawdzamy, czy odbiornik internetowy może odtwarzać treści HDR,
DolbyVision (DV) z kluczami IS_HDR_SUPPORTED
i 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();
Obsługa interakcji użytkownika
Użytkownik może wchodzić w interakcję z aplikacją odbiornika internetowego, używając nadawcy aplikacji (internetowych, na Androida i iOS), poleceń głosowych w Asystencie urządzeń, sterowania dotykowego na inteligentnych ekranach i pilotów na Androidzie TV urządzenia. SDK Cast udostępnia różne interfejsy API, które umożliwiają aplikacji Web Receiver tych interakcji, należy zaktualizować UI aplikacji stany działań użytkownika, i opcjonalnie wysłać zmiany, aby zaktualizować usługi backendu.
Obsługiwane polecenia multimedialne
Stany elementów sterujących interfejsu są generowane przez
MediaStatus.supportedMediaCommands
dla rozszerzonych kontrolerów, odbiorników i pilota dla nadawców na iOS i Androida
aplikacje działające na urządzeniach dotykowych i aplikacje do odbiorników na urządzeniach z Androidem TV. Gdy
określony bit bitowy Command
jest włączony we właściwości, a przyciski, które są
powiązane z tym działaniem. Jeśli wartość nie jest ustawiona, przycisk jest
wyłączono. Te wartości można zmienić w odbiorniku internetowym przez:
- Zastosowanie
PlayerManager.setSupportedMediaCommands
aby ustawić konkretnyCommands
- Dodaj nowe polecenie za pomocą
addSupportedMediaCommands
- Usuwanie istniejącego polecenia przy użyciu
removeSupportedMediaCommands
playerManager.setSupportedMediaCommands(cast.framework.messages.Command.SEEK |
cast.framework.messages.Command.PAUSE);
Gdy odbiorca przygotowuje zaktualizowane MediaStatus
, będzie zawierać
zmian w usłudze supportedMediaCommands
. Gdy stan to
transmisja zostanie zaktualizowana, połączone aplikacje nadawców zaktualizują przyciski w swoim interfejsie
odpowiednio się zmienia.
Więcej informacji o obsługiwanych poleceniach multimedialnych i urządzeniach dotykowych znajdziesz w artykule
Accessing UI controls
Google.
Zarządzanie stanami działań użytkowników
Gdy użytkownicy korzystają z interfejsu lub wysyłają polecenia głosowe, mogą sterować
odtwarzania treści i właściwości związanych z odtwarzanym elementem. Prośby
które sterują odtwarzaniem, są obsługiwane automatycznie przez SDK. Prośby, które
modyfikować właściwości odtwarzanego aktualnie elementu, np. polecenia LIKE
,
wymagają od aplikacji odbierającej ich obsługi. Pakiet SDK udostępnia szereg funkcji
interfejsów API do obsługi tego typu żądań, Aby zapewnić ich obsługę, należy:
należy wykonać:
- Ustaw
MediaInformation
userActionStates
. z preferencjami użytkownika podczas wczytywania elementu multimedialnego. - Przechwyć
USER_ACTION
wiadomości i określ wymagane działanie. - Aby zaktualizować interfejs użytkownika, zaktualizuj
MediaInformation
UserActionState
.
Ten fragment kodu przechwytuje żądanie LOAD
i wypełnia parametr
MediaInformation
użytkownika LoadRequestData
. W tym przypadku użytkownikowi podoba się
ładowana zawartość.
playerManager.setMessageInterceptor(
cast.framework.messages.MessageType.LOAD, (loadRequestData) => {
const userActionLike = new cast.framework.messages.UserActionState(
cast.framework.messages.UserAction.LIKE);
loadRequestData.media.userActionStates = [userActionLike];
return loadRequestData;
});
Ten fragment kodu przechwytuje komunikat USER_ACTION
i obsługuje wywołania
do backendu z żądaną zmianą. Następnie wywołuje metodę aktualizacji
UserActionState
na odbiorniku.
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;
});
});
Ten fragment kodu symuluje wywołanie usługi backendu. Funkcja sprawdza
UserActionRequestData
, by sprawdzić rodzaj zmiany, o którą prosił użytkownik.
i wywołuje wywołanie sieciowe tylko wtedy, gdy działanie jest obsługiwane przez backend.
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));
}
});
}
Ten fragment kodu pobiera UserActionRequestData
i dodaje lub
usuwa element UserActionState
z: MediaInformation
. Aktualizuję
Element UserActionState
dotyczący właściwości MediaInformation
zmienia stan przycisku, którego
jest powiązane z żądanym działaniem. Ta zmiana jest odzwierciedlona w inteligentnych
UI elementów sterujących wyświetlaczem, aplikacja do pilota i interfejs Androida TV. Jest także
transmitowane za pomocą wiadomości wychodzących MediaStatus
w celu zaktualizowania UI
rozszerzonego kontrolera dla nadawców na iOS i Androida.
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;
}
Polecenia głosowe
Poniższe polecenia multimedialne są obecnie obsługiwane w pakiecie Web Receiver SDK na
Urządzenia z Asystentem. Domyślne implementacje tych poleceń to
znaleziono w
cast.framework.PlayerManager
Polecenie | Opis |
---|---|
Google Play | Odtwarzanie lub wznowienie odtwarzania od momentu wstrzymania. |
Wstrzymaj | Wstrzymaj odtwarzane treści. |
Wstecz | Przejdź do poprzedniego elementu multimedialnego w kolejce. |
Dalej | Przejdź do następnego elementu w kolejce multimediów. |
Zatrzymaj | Zatrzymaj odtwarzane multimedia. |
Nie powtarzaj niczego | Wyłącz powtarzanie elementów multimedialnych w kolejce po zakończeniu odtwarzania ostatniego elementu w kolejce. |
Powtórz jeden raz | Powtarzaj cały czas odtwarzane multimedia. |
Powtórz wszystko | Powtórz wszystkie elementy w kolejce po odtworzeniu ostatniego elementu w kolejce. |
Powtórz wszystko i odtwórz losowo | Po zakończeniu odtwarzania ostatniego elementu w kolejce należy je losowo odtwarzać, a następnie powtórzyć wszystkie elementy w kolejce. |
Odtwarzaj losowo | Losowe odtwarzanie elementów multimedialnych w kolejce multimediów. |
Napisy WŁĄCZONE / WYŁĄCZONE | Włącz / wyłącz napisy w multimediach. Opcje włączania i wyłączania są również dostępne w poszczególnych językach. |
Przewijanie do bezwzględnego czasu | Przechodzi do określonego czasu bezwzględnego. |
Przewiń do czasu w odniesieniu do czasu bieżącego | Przewija do przodu lub do tyłu o określony przedział czasu w stosunku do bieżącego czasu odtwarzania. |
Zagraj jeszcze raz | Uruchom ponownie aktualnie odtwarzane multimedia lub odtwórz ostatnio odtwarzany element, jeśli nic obecnie nie jest odtwarzane. |
Ustawianie szybkości odtwarzania | Zróżnicowanie szybkości odtwarzania multimediów. To ustawienie powinno być obsługiwane domyślnie. Do zastępowania przychodzących próśb o stawkę możesz użyć przechwytującego wiadomości SET_PLAYBACK_RATE . |
Obsługiwane polecenia multimedialne z użyciem głosu
Aby zapobiec uruchamianiu poleceń głosowych przez polecenie głosowe w Asystencie:
urządzenia, musisz najpierw
obsługiwane polecenia multimedialne
które zamierzasz obsługiwać. Następnie musisz wymusić te polecenia, włączając
CastReceiverOptions.enforceSupportedCommands
usłudze. Interfejs nadawców i urządzeń dotykowych z pakietem Cast SDK zmieni się na
odzwierciedlają te konfiguracje. Jeśli flaga nie jest włączona, głos przychodzących
będzie wykonywać polecenia.
Jeśli na przykład zezwalasz na PAUSE
w aplikacjach nadawców
na urządzeniach dotykowych, musisz też skonfigurować odbiornik,
ustawieniach. Po skonfigurowaniu wszystkie przychodzące polecenia głosowe będą pomijane, jeśli nie będą
na liście obsługiwanych poleceń.
W poniższym przykładzie podajemy CastReceiverOptions
, zaczynając
CastReceiverContext
. Dodaliśmy obsługę polecenia PAUSE
oraz
wymuszenie obsługi przez odtwarzacz tylko tego polecenia. Jeśli polecenie głosowe
zażąda wykonania innej operacji, takiej jak SEEK
, zostanie odrzucona. Użytkownik zostanie
powiadomienie, że to polecenie nie jest jeszcze obsługiwane.
const context = cast.framework.CastReceiverContext.getInstance();
context.start({
enforceSupportedCommands: true,
supportedCommands: cast.framework.messages.Command.PAUSE
});
Do każdego polecenia, które chcesz ograniczyć, możesz zastosować osobną logikę. Usuń
flagę enforceSupportedCommands
oraz w przypadku każdego polecenia, które chcesz wykonać
pozwalają przechwycić wiadomości przychodzące. Przechwytujemy tam żądanie,
udostępniane przez pakiet SDK, dzięki czemu polecenia SEEK
są wysyłane urządzeniom z Asystentem
nie aktywuj wyszukiwania w aplikacji Web Receiver.
W przypadku poleceń multimedialnych, których Twoja aplikacja nie obsługuje, zwróć odpowiednie
przyczyna błędu, na przykład
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;
});
Tło z aktywności związanej z głosem
Jeśli platforma Cast przesyła dźwięk z aplikacji w tle z powodu działania Asystenta
aktywność, np. słuchanie wypowiedzi użytkownika,
odpowiadanie na niego,
FocusState
wiadomość NOT_IN_FOCUS
jest wysyłana do aplikacji odbiornika internetowego, gdy
rozpocznie się aktywność. Po zakończeniu aktywności otrzymasz kolejną wiadomość z adresem IN_FOCUS
.
W zależności od aplikacji i odtwarzanych multimediów możesz
wstrzymaj multimedia, gdy FocusState
ma wartość NOT_IN_FOCUS
przez przechwycenie wiadomości
wpisz FOCUS_STATE
.
Warto na przykład wstrzymać odtwarzanie audiobooka, jeśli Asystent odpowiada na pytanie użytkownika.
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;
});
Język napisów
Jeżeli użytkownik nie określi wyraźnie języka napisów,
język napisów to ten, w którym zostało wymówione polecenie.
W takich sytuacjach
isSuggestedLanguage
parametru wiadomości przychodzącej wskazuje, czy powiązany język
zaproponowanych lub wyraźnie wymaganych przez użytkownika.
np. pole isSuggestedLanguage
ma wartość true
w przypadku polecenia „OK Google,
włącz napisy”, ponieważ język został wywnioskowany na podstawie języka
było wypowiadane polecenie. Jeśli język jest wyraźnie wymagany, na przykład „OK”
Google, włącz angielskie napisy”, isSuggestedLanguage
ma wartość false
.
Metadane i przesyłanie głosu
Choć polecenia głosowe są domyślnie obsługiwane przez odbiornik internetowy, Upewnij się, że metadane Twoich treści są pełne i dokładne. Dzięki temu Asystent obsługuje polecenia głosowe prawidłowo, a metadane wyświetlają się w nowych typach interfejsów, takich jak aplikacja Google Home np. Google Home Hub.
Przenoszenie strumienia
Zachowywanie stanu sesji jest podstawą transferu, gdzie użytkownicy mogą przenosić istniejące strumienie audio i wideo między urządzeniami, używając poleceń głosowych. Google Home Aplikacja lub inteligentne ekrany. Multimedia przestaje się odtwarzać na jednym urządzeniu (źródle) i kontynuuje na innym ( miejsce docelowe). Każde urządzenie przesyłające z najnowszą wersją oprogramowania może służyć jako źródło lub miejsce docelowe w przesyłanie strumienia.
Przepływ zdarzeń związanych z przeniesieniem strumienia wygląda tak:
- Na urządzeniu źródłowym:
- Odtwarzanie multimediów zostanie przerwane.
- Aplikacja Web Receiver otrzymuje polecenie zapisu bieżących multimediów stanu.
- Aplikacja Web Receiver jest wyłączona.
- Na urządzeniu docelowym:
- Aplikacja odbiornika internetowego jest wczytana.
- Aplikacja odbiornik internetowy otrzymuje polecenie przywrócenia zapisanych multimediów stanu.
- Multimedia wznowią odtwarzanie.
Do elementów stanu multimediów należą:
- Konkretna pozycja lub sygnatura czasowa utworu, filmu lub elementu multimedialnego.
- umieszczenie go w szerszej kolejce (np. w playlisty lub w radiu wykonawcy).
- Uwierzytelniony użytkownik.
- Stan odtwarzania (np. odtwarzanie lub wstrzymanie).
Włączam przenoszenie strumienia
Aby wdrożyć przesyłanie strumienia na odbiorniku internetowym:
- Aktualizuj
supportedMediaCommands
za pomocą poleceniaSTREAM_TRANSFER
:playerManager.addSupportedMediaCommands( cast.framework.messages.Command.STREAM_TRANSFER, true);
- Opcjonalnie zastąp komunikaty
SESSION_STATE
iRESUME_SESSION
. moduły przechwytujące zgodnie z opisem w sekcji Zachowywanie sesji stanu. Zastąp je tylko wtedy, gdy potrzebne są dane niestandardowe który ma być przechowywany w ramach zrzutu sesji. W przeciwnym razie domyślna implementacja zachowywania stanów sesji będzie obsługiwać przenoszenie strumienia.
Zachowywanie stanu sesji
SDK odbiornika internetowego zapewnia domyślną implementację, zachowanie stanów sesji dzięki zrzutowi bieżącego stanu mediów, stanu do żądania wczytywania i wznowienie sesji z tym żądaniem.
Żądanie obciążenia wygenerowane przez odbiornik internetowy można zastąpić w
SESSION_STATE
– w razie potrzeby przechwytujący wiadomości. Jeśli chcesz dodać dane niestandardowe
do żądania wczytywania, proponujemy umieszczenie ich
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;
});
Dane niestandardowe można pobrać z
loadRequestData.customData
w mechanizmie przechwytującym wiadomości 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;
});
Wstępne wczytanie treści
Odbiornik internetowy obsługuje wstępne ładowanie elementów multimedialnych po zakończeniu bieżącego odtwarzania. elementu w kolejce.
Operacja wstępnego wczytywania pobiera wstępnie kilka segmentów nadchodzące elementy. Specyfikacja jest wykonywana na stronie preloadTime w Obiekt QueueItem (jeśli nie zostanie podany, domyślna wartość to 20 sekund). Czas jest wyrażony w sekundach, względem końca aktualnie odtwarzanego elementu . Tylko wartości dodatnie prawidłowe. Jeśli np. wartość wynosi 10 sekund, ten element zostanie wstępnie wczytany 10 sekund do zakończenia poprzedniego elementu. Jeśli czas wstępnego wczytywania jest dłuższy niż czas do końca bieżącego elementu, wstępne wczytanie nastąpi, gdy tylko jak to tylko możliwe. Jeśli więc w elemencie matchingItem jest określona bardzo duża wartość wstępnego wczytywania, można osiągnąć efekt za każdym razem, gdy odtwarzamy bieżący element, wstępnie wczytuje się następny element. Pozostawiamy jednak ustawienia i opcje wyboru deweloperowi, ponieważ ta wartość może wpływać na przepustowość i wydajność strumieniowania. aktualnie odtwarzanego elementu.
Wstępne wczytywanie będzie domyślnie działać w przypadku treści HLS, DASH i płynne przesyłanie strumieniowe treści.
Zwykłe pliki wideo i audio MP4 (np. MP3) nie będą wstępnie wczytywane jako Cast urządzenia obsługują tylko jeden element multimedialny i nie można ich używać do wstępnego wczytywania, istniejący element treści jest nadal odtwarzany.
Komunikaty niestandardowe
Wymiana wiadomości to kluczowa metoda interakcji w aplikacjach odbiornika internetowego.
Nadawca wysyła wiadomości do odbiornika internetowego, używając interfejsów API nadawcy dla
platforma używana przez nadawcę (Android, iOS, internet). Obiekt zdarzenia (który
jest demonstracją wiadomości), która jest przekazywana do detektorów zdarzeń,
elementu danych (event.data
), w którym dane przyjmują właściwości obiektu
określonego typu zdarzenia.
Aplikacja odbiornika internetowego może zdecydować się na nasłuchiwanie wiadomości z określonego serwera przestrzeni nazw. Dzięki temu aplikacja Web Receiver obsługują protokół tego protokołu przestrzeni nazw. Zależy to od tego, czy wszyscy połączeni nadawcy chcą, do komunikowania się w tej przestrzeni nazw przy użyciu odpowiedniego protokołu.
Wszystkie przestrzenie nazw są zdefiniowane za pomocą ciągu znaków i muszą się zaczynać od „urn:x-cast:
”
po którym następuje dowolny ciąg. Przykład:
„urn:x-cast:com.example.cast.mynamespace
”.
Oto fragment kodu, który pozwala odbiornikowi internetowemu nasłuchiwać niestandardowych wiadomości powiązani nadawcy:
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();
Podobnie aplikacje odbiornika internetowego mogą informować nadawców o stanie
odbiornika internetowego, wysyłając wiadomości do połączonych nadawców. Odbiornik internetowy
aplikacja może wysyłać wiadomości za pomocą
sendCustomMessage(namespace, senderId, message)
włączono
CastReceiverContext
Odbiorca internetowy może wysyłać wiadomości do określonego nadawcy w odpowiedzi na
po otrzymaniu wiadomości lub zmianie stanu aplikacji. Dalej niż z punktu do punktu
(z limitem 64 kb), odbiornik internetowy może też przesyłać wiadomości do
wszystkich połączonych nadawców.
Przesyłanie na urządzenia audio
Aby uzyskać pomoc dotyczącą dźwięku, zapoznaj się z przewodnikiem po Google Cast na urządzenia audio tylko odtwarzanie.
Android TV
W tej sekcji omówiono sposób, w jaki odbiornik internetowy Google wykorzystuje dane wejściowe do odtwarzania, i zgodność z Androidem TV.
Integracja aplikacji z pilotem
Odbiornik internetowy Google uruchomiony na urządzeniu z Androidem TV tłumaczy dane wejściowe z
wejściami sterowania urządzenia (tj. pilota w ręku) podczas odtwarzania multimediów
komunikatów zdefiniowanych dla przestrzeni nazw urn:x-cast:com.google.cast.media
, zgodnie
opisane w artykule Komunikaty dotyczące odtwarzania multimediów. Twoje
aplikacja musi obsługiwać te komunikaty, aby kontrolować multimedia
odtwarzania, aby można było sterować odtwarzaniem z poziomu sterowania Androidem TV
danych wejściowych.
Wytyczne dotyczące zgodności z Androidem TV
Oto kilka zaleceń i typowych pułapek, których należy unikać, aby zapewnić Twoja aplikacja jest zgodna z Androidem TV:
- Pamiętaj, że ciąg znaków klienta użytkownika zawiera zarówno słowo „Android”, i „CrKey”, niektóre strony mogą przekierowywać do witryny tylko na komórki, ponieważ wykrywają „Android” . Nie zakładaj, że „Android” w ciągu znaków klienta użytkownika wskazuje użytkownika mobilnego.
- Stos multimediów na Androidzie może używać do pobierania danych przezroczystego GZIP. Upewnij się,
Twoje dane multimedialne mogą reagować na funkcję
Accept-Encoding: gzip
. - Zdarzenia multimediów w Androidzie TV mogą być wyzwalane w innym czasie niż Chromecast, mogą to ujawnić problemy, które były na nim ukryte.
- Podczas aktualizowania multimediów używaj zdarzeń związanych z multimediami uruchamianych przez funkcję
<audio>/<video>
takie jaktimeupdate
,pause
iwaiting
. Unikaj korzystania z sieci powiązane zdarzenia, takie jakprogress
,suspend
istalled
, które zwykle są w zależności od platformy. Zobacz Wydarzenia dotyczące multimediów . - Podczas konfigurowania certyfikatów HTTPS witryny odbiorcy pamiętaj o uwzględnieniu pośrednich certyfikatów CA. Zobacz strony testowej Qualsys SSL do zweryfikuj: jeśli ścieżka certyfikacji Twojej witryny zawiera urząd certyfikacji certyfikat z etykietą „dodatkowe pobranie”, może nie zostać załadowany na platform.
- Podczas gdy Chromecast wyświetla stronę odbiornika na płaszczyźnie graficznej 720p, Platformy przesyłające, takie jak Android TV, mogą wyświetlać stronę w rozdzielczości do 1080p. Sprawdź, czy Twoja strona odbiorcy płynnie skaluje się do różnych rozdzielczości.