Cette page contient des extraits de code et une description des fonctionnalités disponibles pour une application Custom Web Receiver.
- Un élément
cast-media-player
qui représente l'interface utilisateur intégrée du lecteur fournis avec Web Receiver. - Style CSS personnalisé de l'élément
cast-media-player
pour appliquer différents styles Des éléments d'interface utilisateur tels quebackground-image
,splash-image
etfont-family
- Un élément de script permettant de charger le framework Web Receiver.
- Code JavaScript pour intercepter les messages et gérer les événements.
- File d'attente pour lecture automatique
- Options pour configurer la lecture
- Options permettant de définir le contexte Web Receiver.
- Options permettant de définir les commandes compatibles avec l'application Web Receiver.
- Appel JavaScript pour démarrer l'application Web Receiver.
Configuration et options de l'application
Configurer l'application
La
CastReceiverContext
est la classe de plus haut niveau exposée au développeur, et gère le chargement
et gère l'initialisation du SDK Web Receiver. Le SDK
fournit des API permettant aux développeurs d'applications de configurer le SDK via
CastReceiverOptions
Ces configurations sont évaluées une fois par lancement d'application et transmises
le SDK lorsque vous définissez le paramètre facultatif dans l'appel de
start
L'exemple ci-dessous montre comment ignorer le comportement par défaut pour détecter si un
la connexion de l'expéditeur est toujours active. Lorsque Web Receiver n'a pas
été en mesure de communiquer
avec un expéditeur depuis
maxInactivity
secondes, un événement SENDER_DISCONNECTED
est déclenché. La configuration ci-dessous
remplace ce délai. Cela peut être utile lors du débogage
des problèmes, car cela empêche
l'application Web Receiver de fermer la session du débogueur à distance Chrome
aucun expéditeur connecté à l'état IDLE
.
const context = cast.framework.CastReceiverContext.getInstance();
const options = new cast.framework.CastReceiverOptions();
options.maxInactivity = 3600; // Development only
context.start(options);
Configurer le lecteur
Lors du chargement de contenu, le SDK Web Receiver permet de configurer la lecture
des variables telles que DRM
des informations,
les configurations de nouvelle tentative et les gestionnaires de requêtes utilisant
cast.framework.PlaybackConfig
Ces informations sont gérées par
PlayerManager
et est évalué au moment de la création des joueurs. Les joueurs sont créés
chaque fois qu'une nouvelle charge est transmise au SDK Web Receiver. Les modifications
PlaybackConfig
après la création du joueur sont évalués lors de
le chargement du contenu. Le SDK fournit les méthodes suivantes pour modifier le
PlaybackConfig
CastReceiverOptions.playbackConfig
pour remplacer les options de configuration par défaut lors de l'initialisationCastReceiverContext
PlayerManager.getPlaybackConfig()
pour obtenir la configuration actuelle.PlayerManager.setPlaybackConfig()
pour remplacer la configuration actuelle. Ce paramètre s'applique à toutes les chargements ultérieurs ou jusqu'à ce qu'elle soit à nouveau remplacée.PlayerManager.setMediaPlaybackInfoHandler()
pour appliquer des configurations supplémentaires uniquement à l'élément multimédia en cours de chargement en haut des configurations actuelles. Le gestionnaire est appelé juste avant le lecteur. création. Les modifications apportées ici ne sont pas permanentes et ne sont pas incluses dans les requêtes àgetPlaybackConfig()
. Lorsque l'élément multimédia suivant est chargé, ce gestionnaire est rappelé.
L'exemple ci-dessous montre comment définir PlaybackConfig
lors de l'initialisation de
CastReceiverContext
La configuration remplace les requêtes sortantes pour
obtenir des fichiers manifestes. Le gestionnaire spécifie que les requêtes de contrôle d'accès CORS
doivent être effectuées à l'aide d'identifiants
tels que les cookies ou les en-têtes d'autorisation.
const playbackConfig = new cast.framework.PlaybackConfig();
playbackConfig.manifestRequestHandler = requestInfo => {
requestInfo.withCredentials = true;
};
context.start({playbackConfig: playbackConfig});
L'exemple ci-dessous montre comment remplacer PlaybackConfig
à l'aide du getter.
et le setter fournis dans PlayerManager
. Ce paramètre configure le lecteur
reprendre la lecture du contenu après le chargement de 1 segment.
const playerManager =
cast.framework.CastReceiverContext.getInstance().getPlayerManager();
const playbackConfig = (Object.assign(
new cast.framework.PlaybackConfig(), playerManager.getPlaybackConfig()));
playbackConfig.autoResumeNumberOfSegments = 1;
playerManager.setPlaybackConfig(playbackConfig);
L'exemple ci-dessous montre comment remplacer PlaybackConfig
pour une charge spécifique.
à l'aide du gestionnaire d'informations concernant la lecture de contenus multimédias. Le gestionnaire appelle une application
implémenté la méthode getLicenseUrlForMedia
pour obtenir le licenseUrl
à partir du
contentId
de l'élément actuel.
playerManager.setMediaPlaybackInfoHandler((loadRequestData, playbackConfig) => {
const mediaInformation = loadRequestData.media;
playbackConfig.licenseUrl = getLicenseUrlForMedia(mediaInformation.contentId);
return playbackConfig;
});
Écouteur d'événements
Le SDK Web Receiver permet à votre application Web Receiver de gérer les événements du lecteur. La
l'écouteur d'événements prend
cast.framework.events.EventType
(ou un tableau de ces paramètres) spécifiant le ou les événements
doit déclencher l'écouteur. des tableaux préconfigurés de
Les cast.framework.events.EventType
utiles pour le débogage se trouvent dans
cast.framework.events.category
Le paramètre d'événement fournit des informations supplémentaires sur l'événement.
Par exemple, si vous souhaitez savoir
mediaStatus
la modification est diffusée, vous pouvez utiliser la logique suivante pour gérer
événement:
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
});
Interception de messages
Le SDK Web Receiver permet à votre application Web Receiver d'intercepter les messages et
exécuter du code personnalisé sur ces messages. L'intercepteur de messages prend une
cast.framework.messages.MessageType
spécifiant le type de message à intercepter.
L'intercepteur doit renvoyer la requête modifiée ou une promesse qui résout
avec la valeur de requête modifiée. Le fait de renvoyer null
empêchera d'appeler la méthode
gestionnaire de messages par défaut. Pour en savoir plus, consultez Charger des contenus multimédias.
Par exemple, si vous souhaitez modifier les données d'une requête de chargement, vous pouvez utiliser la méthode pour l'intercepter et la modifier:
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();
Gestion des exceptions
Lorsque des erreurs se produisent dans l'intercepteur de messages, votre application réceptrice Web doit renvoyer
une
cast.framework.messages.ErrorType
et
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;
});
});
Interception de messages et écouteur d'événements
Les principales différences entre l'interception de messages et l'écouteur d'événements sont les suivantes : ce qui suit:
- Un écouteur d'événements ne vous permet pas de modifier les données de requête.
- Il est préférable d'utiliser un écouteur d'événements pour déclencher des données analytiques ou une fonction personnalisée.
playerManager.addEventListener(cast.framework.events.category.CORE,
event => {
console.log(event);
});
- L’interception de message vous permet d’écouter un message, de l’intercepter et et modifier les données de requête proprement dites.
- L'interception de messages est idéale pour gérer une logique personnalisée en ce qui concerne demander des données.
Chargement de contenu multimédia
MediaInformation
offre de nombreuses propriétés pour charger des médias dans le
Message cast.framework.messages.MessageType.LOAD
incluant le entity
,
contentUrl
et contentId
.
entity
est la propriété suggérée à utiliser dans votre implémentation pour l'émetteur les applications réceptrices. La propriété est un lien profond qui peut correspondre à une playlist. ou contenus multimédias. Votre application doit analyser cette URL et remplissez au moins l’un des deux autres champs.contentUrl
correspond à l'URL de lecture que le lecteur utilisera pour charger le contenu. Par exemple, cette URL peut pointer vers un fichier manifeste DASH.contentId
Il peut s'agir d'une URL de contenu lisible (semblable à celle decontentUrl
) ou l'identifiant unique du contenu ou de la playlist en cours de chargement. Si vous utilisez cette propriété comme identifiant, votre application doit renseigner une URL lisible danscontentUrl
.
Nous suggérons d'utiliser entity
pour stocker l'ID réel ou les paramètres clés.
Utilisez contentUrl
pour l'URL du média. Vous trouverez un exemple dans le
l'extrait suivant, où entity
est présent dans la requête LOAD
et
Le contenu contentUrl
jouable est récupéré:
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;
});
});
Fonctionnalités de l'appareil
La
getDeviceCapabilities
fournit des informations sur l'appareil Cast connecté et sur la vidéo ou
périphérique audio connecté. La méthode getDeviceCapabilities
est compatible
des informations sur l'Assistant Google, le Bluetooth, ainsi que l'écran et l'audio connectés
appareils.
Cette méthode renvoie un objet que vous pouvez interroger en transmettant l'une des
les énumérations spécifiées pour obtenir la capacité de l'appareil pour cette énumération. Les énumérations sont
défini dans
cast.framework.system.DeviceCapabilities
Cet exemple vérifie si le récepteur Web est capable de lire du contenu HDR et
DolbyVision (DV) avec les touches IS_HDR_SUPPORTED
et IS_DV_SUPPORTED
,
respectivement.
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();
Gérer les interactions des utilisateurs
Un utilisateur peut interagir avec votre application Web Receiver via un expéditeur (Web, Android et iOS), commandes vocales si l'Assistant est activé appareils, commandes tactiles sur les écrans connectés et télécommandes sur Android TV appareils. Le SDK Cast fournit diverses API permettant à l'application Web Receiver d'effectuer les actions suivantes : gérer ces interactions, mettre à jour l'UI de l'application via états des actions utilisateur, et éventuellement envoyer les modifications pour mettre à jour les services de backend.
Commandes multimédias compatibles
Les états des commandes d'interface utilisateur dépendent
MediaStatus.supportedMediaCommands
pour les télécommandes, récepteurs et télécommandes étendus pour les expéditeurs iOS et Android
les applications exécutées sur les appareils tactiles et les applications réceptrices sur les appareils Android TV. Lorsqu'un
un Command
spécifique au niveau du bit est activé dans la propriété, les boutons
associées à cette action sont activées. Si cette valeur n'est pas définie, le bouton est
est désactivé. Ces valeurs peuvent être modifiées sur le récepteur Web en:
- En utilisant
PlayerManager.setSupportedMediaCommands
pour définir la valeurCommands
- Ajouter une nouvelle commande en utilisant
addSupportedMediaCommands
- Supprimer une commande existante à l'aide de
removeSupportedMediaCommands
playerManager.setSupportedMediaCommands(cast.framework.messages.Command.SEEK |
cast.framework.messages.Command.PAUSE);
Lorsque le récepteur prépare le MediaStatus
mis à jour, il inclut l'élément
modifications dans la propriété supportedMediaCommands
. Lorsque l'état est
diffusées, les applis émettrices connectées mettent à jour les boutons de leur UI
en conséquence.
Pour en savoir plus sur les commandes multimédias et les appareils tactiles compatibles, consultez l'article
Accessing UI controls
.
Gérer les états des actions des utilisateurs
Lorsque les utilisateurs interagissent avec l'interface utilisateur ou envoient des commandes vocales, ils peuvent contrôler
la lecture du contenu et des propriétés associés à l'élément en cours de lecture ; Demandes
qui contrôlent la lecture sont gérés automatiquement par le SDK. Demande que
modifier les propriétés de l'élément en cours de lecture, comme une commande LIKE
,
nécessitent que l'application réceptrice les gère. Le SDK fournit une série
pour gérer ces types de requêtes. Pour étayer ces demandes, les éléments suivants
doit être effectuée:
- Définir l'élément
MediaInformation
userActionStates
avec les préférences de l'utilisateur lors du chargement d'un élément multimédia. - Interceptez les messages
USER_ACTION
et déterminez l'action requise. - Mettez à jour le
UserActionState
MediaInformation
pour mettre à jour l'UI.
L'extrait de code suivant intercepte la requête LOAD
et renseigne le champ
MediaInformation
de LoadRequestData
. Dans ce cas, l'utilisateur aime que
du contenu en cours de chargement.
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;
});
L'extrait de code suivant intercepte le message USER_ACTION
et gère l'appel
le backend avec la modification demandée. Il effectue ensuite un appel pour mettre à jour
UserActionState
sur le récepteur.
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;
});
});
L'extrait de code suivant simule un appel à un service de backend. La fonction vérifie
UserActionRequestData
pour voir le type de modification demandée par l'utilisateur.
et n'effectue un appel réseau que si l'action est prise en charge par le 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));
}
});
}
L'extrait de code suivant utilise UserActionRequestData
et ajoute ou
supprime UserActionState
de MediaInformation
. Mettre à jour le
UserActionState
de MediaInformation
modifie l'état du bouton qui
est associé à l'action demandée. Cette modification se reflète dans l'interface
l'interface utilisateur des commandes d'affichage, l'application de télécommande et l'interface utilisateur d'Android TV. Il est également
diffusé via les messages MediaStatus
sortants pour mettre à jour l'UI de
télécommande étendue pour les expéditeurs iOS et 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;
}
Commandes vocales
Les commandes multimédias suivantes sont actuellement prises en charge dans le SDK Web Receiver pour
Appareils avec Assistant Google intégré. Les implémentations par défaut de ces commandes
trouvé dans
cast.framework.PlayerManager
Commande | Description |
---|---|
Lire | Lire ou reprendre la lecture à partir d'une mise en pause |
Pause | Mettre en pause le contenu en cours de lecture. |
Précédent | Passer à l'élément multimédia précédent de la file d'attente |
Suivant | Passer à l'élément multimédia suivant de la file d'attente |
Arrêter | Arrêtez le contenu multimédia en cours de lecture. |
Aucune répétition | Désactiver la répétition des éléments multimédias de la file d'attente une fois la lecture du dernier élément de la file d'attente terminée |
Répéter un seul | Répéter indéfiniment le contenu multimédia en cours de lecture |
Tout répéter | Répéter tous les éléments de la file d'attente après la lecture du dernier élément |
Tout répéter et en mode aléatoire | Une fois la lecture du dernier élément de la file d'attente terminée, passez en mode aléatoire et répétez tous les éléments de la file d'attente. |
Aléatoire | Lisez les éléments multimédias de votre file d'attente en mode aléatoire. |
Activer / Désactiver les sous-titres | Activer / Désactiver les sous-titres pour votre contenu multimédia L'option d'activation ou de désactivation est également disponible pour chaque langue. |
Rechercher jusqu'à une heure absolue | Passer à l'heure absolue spécifiée |
Rechercher vers l'heure par rapport à l'heure actuelle | Avance ou recule de la période spécifiée par rapport à l'heure de lecture actuelle. |
Rejouer | Redémarre le contenu multimédia en cours de lecture ou lit le dernier élément multimédia lu si rien n'est en cours de lecture. |
Définir la vitesse de lecture | Varier la vitesse de lecture des contenus multimédias. Cette opération est généralement gérée par défaut. Vous pouvez utiliser l'intercepteur de messages SET_PLAYBACK_RATE pour ignorer les requêtes de tarifs entrantes. |
Commandes vocales compatibles avec les contenus multimédias
Pour empêcher une commande vocale de déclencher une commande multimédia dans un Assistant :
est activé, vous devez d'abord définir
commandes multimédias compatibles
que vous prévoyez de soutenir. Vous devez ensuite appliquer ces commandes en activant
la
CastReceiverOptions.enforceSupportedCommands
. L'interface utilisateur des expéditeurs de SDK Cast et des appareils tactiles sera remplacée par
reflètent ces configurations. Si l'indicateur n'est pas activé, la voix entrante
s'exécuteront.
Par exemple, si vous autorisez PAUSE
dans vos applications émettrices et
les appareils tactiles, vous devez également configurer votre récepteur
paramètres. Si elle est configurée, toutes les commandes vocales entrantes seront ignorées si elles ne le sont pas
inclus dans la liste des commandes prises en charge.
Dans l'exemple ci-dessous, nous fournissons CastReceiverOptions
au démarrage
la CastReceiverContext
. La commande PAUSE
est désormais compatible
forcé le lecteur de prendre en charge
uniquement cette commande. Si une commande vocale
demande une autre opération telle que SEEK
, elle sera refusée. L'utilisateur sera
informé que la commande n'est pas encore prise en charge.
const context = cast.framework.CastReceiverContext.getInstance();
context.start({
enforceSupportedCommands: true,
supportedCommands: cast.framework.messages.Command.PAUSE
});
Vous pouvez appliquer une logique distincte pour chaque commande que vous souhaitez restreindre. Supprimer
l'option enforceSupportedCommands
et pour chaque commande que vous souhaitez
vous pouvez intercepter les messages entrants. Ici, nous interceptons la requête
fournies par le SDK afin que les commandes SEEK
envoyées aux appareils avec Assistant Google intégré
ne déclenche pas de recherche dans votre application Web Receiver.
Pour les commandes multimédias non compatibles avec votre application, renvoyez un
le motif de l'erreur, par exemple
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;
});
Mise en arrière-plan à partir de l'activité vocale
Si la plate-forme Cast met le son de votre application en arrière-plan grâce à l'Assistant
comme écouter les propos ou répondre,
FocusState
NOT_IN_FOCUS
est envoyé à l'application Récepteur Web lorsque
de l'activité. Un autre message avec IN_FOCUS
est envoyé à la fin de l'activité.
En fonction de votre application et du contenu multimédia en cours de lecture, il se peut que vous souhaitiez
mettre en pause le contenu multimédia lorsque FocusState
est défini sur NOT_IN_FOCUS
en interceptant le message
saisissez FOCUS_STATE
.
Par exemple, mettre en pause la lecture d'un livre audio est une bonne expérience utilisateur L'Assistant répond à la requête d'un utilisateur.
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;
});
Langue des sous-titres spécifiée par la voix
Lorsqu'un utilisateur n'indique pas explicitement la langue des sous-titres,
la langue utilisée pour les sous-titres est la même que celle dans laquelle la commande a été prononcée.
Dans ces scénarios, le
isSuggestedLanguage
du message entrant indique si la langue associée était
suggérées ou explicitement
demandées par l'utilisateur.
Par exemple, isSuggestedLanguage
est défini sur true
pour la commande "Ok Google,
activer les sous-titres », car la langue a été déduite par la langue
a été prononcée. Si la langue est demandée explicitement, par exemple dans "OK",
Google, active les sous-titres en anglais." isSuggestedLanguage
est défini sur false
.
Métadonnées et diffusion vocale
Bien que les commandes vocales soient gérées par défaut par le récepteur Web, vous devez vous assurer que les métadonnées de votre contenu sont complètes et exactes. Cela garantit que commandes vocales sont gérées correctement par l'Assistant, et que les métadonnées s'affiche correctement dans les nouveaux types d'interfaces, comme l'application Google Home comme le Google Home Hub.
Transfert de diffusion
La préservation de l'état de la session est la base du transfert de flux, où les utilisateurs peuvent déplacer des flux audio et vidéo existants d'un appareil à un autre à l'aide de commandes vocales, de Google Home des applications ou des écrans connectés. La lecture du contenu multimédia s'arrête sur un appareil (la source) et continue sur un autre (le destination). N'importe quel appareil Cast équipé du dernier micrologiciel peut servir de source ou de destination dans un le transfert de diffusion.
Le flux d'événements pour le transfert de diffusion est le suivant:
- Sur l'appareil source:
<ph type="x-smartling-placeholder">
- </ph>
- La lecture du contenu multimédia s'arrête.
- L'application Web Receiver reçoit une commande pour enregistrer le contenu multimédia en cours. de l'état.
- L'application Web Receiver est arrêtée.
- Sur l'appareil de destination:
<ph type="x-smartling-placeholder">
- </ph>
- L'application Web Receiver est chargée.
- L'application Web Receiver reçoit une commande pour restaurer le contenu multimédia enregistré. de l'état.
- La lecture du contenu multimédia reprend.
Voici les différents éléments de l'état de l'élément multimédia:
- Position ou code temporel spécifique du titre, de la vidéo ou de l'élément multimédia
- Elles sont placées dans une file d'attente plus large (par exemple, une playlist ou une radio d'artiste).
- Utilisateur authentifié.
- État de la lecture (en cours de lecture ou mise en pause, par exemple)
Activer le transfert de diffusion
Pour implémenter le transfert de flux pour votre Web Receiver:
- Mettre à jour
supportedMediaCommands
à l'aide de la commandeSTREAM_TRANSFER
:playerManager.addSupportedMediaCommands( cast.framework.messages.Command.STREAM_TRANSFER, true);
- Si vous le souhaitez, vous pouvez ignorer les messages
SESSION_STATE
etRESUME_SESSION
. comme décrit dans la section Préserver les sessions . Ne les remplacez que si des données personnalisées ont besoin à stocker dans l'instantané de session. Sinon, la valeur par défaut pour la conservation des états de session est compatible avec le transfert de flux.
Conserver l'état de la session
Le SDK Web Receiver fournit une implémentation par défaut pour les applications Web Receiver afin de préserver l'état d'une session en prenant un instantané de l'état actuel du contenu multimédia, en convertissant l'état dans une requête de chargement et la reprise de la session avec la requête de chargement.
La requête de chargement générée par le récepteur Web peut être remplacée dans le
Interception de messages SESSION_STATE
si nécessaire. Si vous souhaitez ajouter des données personnalisées
dans la requête de chargement, nous vous conseillons de les placer
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;
});
Les données personnalisées
peuvent être récupérées à partir de
loadRequestData.customData
dans l'intercepteur de messages 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;
});
Préchargement du contenu
Web Receiver prend en charge le préchargement des éléments multimédias après la lecture en cours élément de la file d'attente.
L'opération de préchargement précharge plusieurs segments du fichier les éléments à venir. La spécification est effectuée sur preloadTime dans le champ Objet QueueItem (20 secondes par défaut si aucune valeur n'est fournie). L'heure est exprimée en secondes, par rapport à la fin de l'élément en cours de lecture . Seules les valeurs positives sont valide. Par exemple, si la valeur est de 10 secondes, cet élément sera préchargé 10 secondes secondes avant la fin de l'élément précédent. Si le temps de préchargement est plus long que le temps restant pour l'élément currentItem, le préchargement aura lieu dès que possible. Ainsi, si une valeur de préchargement très élevée est spécifiée dans queueItem, peut avoir l'effet que lorsque nous lisons l'élément actuel l'élément suivant est déjà en cours de préchargement. Toutefois, nous laissons le paramètre au développeur, car cette valeur peut affecter la bande passante et les performances de streaming de l'élément en cours de lecture.
Par défaut, le préchargement fonctionne pour les flux HLS, DASH et lissés.
Les fichiers audio et vidéo MP4 standards, tels que MP3, ne sont pas préchargés en tant que fichiers Cast. n'acceptent qu'un seul élément multimédia et ne peuvent pas être utilisés pour le préchargement élément de contenu existant est toujours en cours de lecture.
Messages personnalisés
L'échange de messages est la méthode d'interaction clé pour les applications réceptrices Web.
Un expéditeur envoie des messages à un récepteur Web à l'aide des API expéditeur pour le service
plate-forme utilisée par l'expéditeur (Android, iOS, Web). L'objet événement (qui
est la manifestation d'un message) transmise aux écouteurs d'événements.
élément de données (event.data
) où les données prennent les propriétés de la
un type d'événement spécifique.
Une application Web Receiver peut choisir d'écouter les messages sur un réseau espace de noms. De ce fait, on dit que l'application réceptrice Web sont compatibles avec ce protocole d'espace de noms. Il appartient ensuite aux expéditeurs connectés qui souhaitent de communiquer sur cet espace de noms pour utiliser le protocole approprié.
Tous les espaces de noms sont définis par une chaîne et doivent commencer par "urn:x-cast:
"
suivie de n'importe quelle chaîne. Par exemple :
"urn:x-cast:com.example.cast.mynamespace
".
Voici un extrait de code permettant au récepteur Web d'écouter les messages personnalisés provenant de expéditeurs connectés:
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();
De même, les applications réceptrices Web peuvent tenir les expéditeurs informés de l'état
du récepteur Web en envoyant des messages à des expéditeurs connectés. Un récepteur Web
peut envoyer des messages en utilisant
sendCustomMessage(namespace, senderId, message)
sur
CastReceiverContext
Un Web Receiver peut envoyer des messages à un expéditeur donné, soit en réponse à
d'un message reçu ou en raison
d'un changement d'état d'application. Au-delà du point à point
(avec une limite de 64 Ko), un récepteur Web peut aussi diffuser des messages
tous les expéditeurs connectés.
Cast pour les appareils audio
Pour obtenir de l'aide concernant l'audio, consultez le guide Google Cast pour les appareils audio. en lecture seule.
Android TV
Cette section explique comment Google Web Receiver utilise vos entrées pour la lecture. et Android TV.
Intégrer votre application à la télécommande
Google Web Receiver exécuté sur l'appareil Android TV traduit l'entrée depuis
entrées de commande de l'appareil (télécommande portable, par exemple) pour la lecture de contenus multimédias
messages définis pour l'espace de noms urn:x-cast:com.google.cast.media
, comme suit :
décrits dans la section Messages de lecture multimédia. Votre
l'application doit prendre en charge ces messages pour contrôler le contenu multimédia de l'application
lecture pour autoriser les commandes de lecture de base depuis Android TV
d'entrée.
Consignes relatives à la compatibilité avec Android TV
Voici quelques recommandations et écueils courants à éviter pour vous assurer votre application est compatible avec Android TV:
- Notez que la chaîne user-agent contient à la fois "Android" et "Créférence"; certains sites peuvent être redirigés vers un site réservé aux mobiles, car ils détectent le "Android" libellé. Ne partez pas du principe que "Android" toujours dans la chaîne du user-agent. indique un utilisateur mobile.
- La pile multimédia d'Android peut utiliser un fichier GZIP transparent pour récupérer les données. Assurez-vous que
vos données multimédias peuvent répondre à
Accept-Encoding: gzip
. - Les événements multimédias HTML5 d'Android TV peuvent être déclenchés à des moments différents de ceux Chromecast, cela peut révéler des problèmes qui étaient masqués sur Chromecast.
- Lors de la mise à jour du contenu multimédia, utiliser les événements liés aux contenus multimédias déclenchés par
<audio>/<video>
tels quetimeupdate
,pause
etwaiting
. Évitez d'utiliser la mise en réseau des événements associés tels queprogress
,suspend
etstalled
, car ils ont tendance à en fonction de la plate-forme. Voir Événements multimédias pour en savoir plus sur la gestion des événements multimédias dans votre récepteur. - Lorsque vous configurez les certificats HTTPS du site récepteur, veillez à inclure des certificats CA intermédiaires. Consultez le Page de test SSL Qualsys pour valider: si le parcours de certification Trusted pour votre site inclut une autorité de certification avec la mention "Téléchargement supplémentaire", cela signifie qu'il risque de ne pas se charger plates-formes.
- Alors que Chromecast affiche la page du récepteur sur un plan graphique 720p, les autres Les plates-formes Cast, y compris Android TV, peuvent afficher une page avec une résolution maximale de 1080p. Assurez-vous que la page réceptrice s'adapte de manière harmonieuse à différentes résolutions.