Aggiungi funzionalità principali al tuo ricevitore web personalizzato

Questa pagina contiene snippet di codice e descrizioni delle funzioni disponibili per un'app di ricevitore web personalizzato.

  1. Un elemento cast-media-player che rappresenta l'UI del player integrato fornito con WebRicevitore.
  2. Stili personalizzati di tipo CSS per applicare all'elemento cast-media-player uno stile diverso Elementi dell'interfaccia utente come background-image, splash-image e font-family.
  3. Un elemento di script per caricare il framework Web receiver.
  4. codice JavaScript per l'intercettazione dei messaggi e la gestione degli eventi.
  5. Coda per la riproduzione automatica.
  6. Opzioni per configurare la riproduzione.
  7. Opzioni per impostare il contesto del ricevitore web.
  8. Opzioni per impostare i comandi supportati dall'app Web receiver.
  9. Una chiamata JavaScript per avviare l'applicazione Web receiver.
di Gemini Advanced.

Configurazione e opzioni dell'applicazione

Configura l'applicazione

La CastReceiverContext è la classe più esterna esposta allo sviluppatore e gestisce il caricamento le librerie sottostanti e gestisce l'inizializzazione dell'SDK Web receiver. L'SDK fornisce API che consentono agli sviluppatori di applicazioni di configurare l'SDK tramite CastReceiverOptions Queste configurazioni vengono valutate una volta per ogni avvio dell'applicazione e vengono trasmesse a quando imposti il parametro facoltativo nella chiamata a start

L'esempio seguente mostra come eseguire l'override del comportamento predefinito per rilevare se un la connessione del mittente è ancora attiva. Quando il ricevitore web non ha sono riusciti a comunicare con un mittente maxInactivity secondi, viene inviato un evento SENDER_DISCONNECTED. La configurazione seguente esegue l'override di questo timeout. Può essere utile durante il debug di problemi, in quanto impedisce all'app WebRicevitore di chiudere la sessione Chrome Remote Debugger quando Ci sono zero mittenti connessi in stato IDLE.

const context = cast.framework.CastReceiverContext.getInstance();
const options = new cast.framework.CastReceiverOptions();
options.maxInactivity = 3600; // Development only
context.start(options);

Configurare il player

Durante il caricamento dei contenuti, l'SDK WebRicevir fornisce un modo per configurare la riproduzione come DRM informazioni, configurazioni di nuovo tentativo e gestori di richieste cast.framework.PlaybackConfig Queste informazioni vengono trattate PlayerManager e viene valutato al momento della creazione dei player. I player vengono creati Ogni volta che viene passato un nuovo carico all'SDK Web receiver. Modifiche al Dopo la creazione del player, il numero PlaybackConfig viene valutato nel periodo successivo per il caricamento dei contenuti. L'SDK fornisce i seguenti metodi per modificare PlaybackConfig.

  • CastReceiverOptions.playbackConfig per eseguire l'override delle opzioni di configurazione predefinite durante l'inizializzazione CastReceiverContext.
  • PlayerManager.getPlaybackConfig() per ottenere la configurazione attuale.
  • PlayerManager.setPlaybackConfig() per eseguire l'override della configurazione attuale. Questa impostazione è applicata a tutti caricamenti successivi o finché non viene eseguito nuovamente l'override.
  • PlayerManager.setMediaPlaybackInfoHandler() per applicare configurazioni aggiuntive solo all'elemento multimediale caricato su rispetto alle configurazioni attuali. Il gestore viene chiamato appena prima del player per la creazione di contenuti. Le modifiche apportate qui non sono permanenti e non sono incluse nelle query a getPlaybackConfig(). Al caricamento dell'elemento multimediale successivo, viene richiamato.

L'esempio seguente mostra come impostare PlaybackConfig durante l'inizializzazione della CastReceiverContext. La configurazione sostituisce le richieste in uscita per per ottenere i manifest. Il gestore specifica che le richieste Access-Control di CORS deve essere effettuata utilizzando credenziali come cookie o intestazioni di autorizzazione.

const playbackConfig = new cast.framework.PlaybackConfig();
playbackConfig.manifestRequestHandler = requestInfo => {
  requestInfo.withCredentials = true;
};
context.start({playbackConfig: playbackConfig});

L'esempio seguente mostra come eseguire l'override di PlaybackConfig utilizzando il getter e seter forniti in PlayerManager. L'impostazione configura il player Riprendi la riproduzione dei contenuti dopo il caricamento di un segmento.

const playerManager =
    cast.framework.CastReceiverContext.getInstance().getPlayerManager();
const playbackConfig = (Object.assign(
            new cast.framework.PlaybackConfig(), playerManager.getPlaybackConfig()));
playbackConfig.autoResumeNumberOfSegments = 1;
playerManager.setPlaybackConfig(playbackConfig);

L'esempio seguente mostra come eseguire l'override di PlaybackConfig per un carico specifico tramite il gestore delle informazioni sulla riproduzione dei contenuti multimediali. Il gestore chiama un'applicazione implementato il metodo getLicenseUrlForMedia per ottenere il valore licenseUrl contentId dell'elemento corrente.

playerManager.setMediaPlaybackInfoHandler((loadRequestData, playbackConfig) => {
  const mediaInformation = loadRequestData.media;
  playbackConfig.licenseUrl = getLicenseUrlForMedia(mediaInformation.contentId);

  return playbackConfig;
});

Listener di eventi

L'SDK Web receiver consente all'app WebRicevir di gestire gli eventi del player. La un listener di eventi prende un cast.framework.events.EventType (o un array di questi parametri) che specifica gli eventi che deve attivare il listener. Array preconfigurati di cast.framework.events.EventType utili per il debug in cast.framework.events.category Il parametro evento fornisce informazioni aggiuntive sull'evento.

Ad esempio, se vuoi sapere quando mediaStatus di modifica viene trasmessa, puoi utilizzare la logica seguente per gestire dell'evento:

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
});

Intercettazione dei messaggi

L'SDK Web receiver consente alla tua app Web receiver di intercettare i messaggi e codice personalizzato su questi messaggi. L'intercettatore di messaggi prende un cast.framework.messages.MessageType che specifica il tipo di messaggio da intercettare.

L'intercettatore deve restituire la richiesta modificata o una promessa che si risolva con il valore della richiesta modificato. La restituzione di null impedirà la chiamata al metodo gestore di messaggi predefinito. Per ulteriori dettagli, consulta la sezione Caricamento di contenuti multimediali.

Ad esempio, se vuoi modificare i dati della richiesta di caricamento, puoi utilizzare il metodo la seguente logica per intercettarlo e modificarlo:

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();

Gestione degli errori

Quando si verificano errori nell'intercettatore di messaggi, l'app Web receiver dovrebbe restituire un'adeguata cast.framework.messages.ErrorType e 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;
        });
    });

Confronto tra intercettazione dei messaggi e listener di eventi

Ecco alcune differenze chiave tra l'intercettazione dei messaggi e il listener di eventi: che segue:

  • Un listener di eventi non ti consente di modificare i dati della richiesta.
  • Un listener di eventi è ideale per attivare l'analisi o una funzione personalizzata.
di Gemini Advanced.
playerManager.addEventListener(cast.framework.events.category.CORE,
    event => {
        console.log(event);
    });
  • L'intercettazione dei messaggi consente di ascoltare, intercettare un messaggio modificare i dati della richiesta stessa.
  • L'intercettazione dei messaggi è la soluzione migliore per gestire la logica personalizzata in relazione richiedere dati.

Caricamento dei contenuti multimediali in corso...

MediaInformation offre numerose proprietà per caricare contenuti multimediali Messaggio cast.framework.messages.MessageType.LOAD che include entity, contentUrl e contentId.

  • La entity è la proprietà suggerita da usare nell'implementazione sia per il mittente sia per le app ricevibili. La proprietà è un URL di un link diretto che può essere una playlist o contenuti multimediali. L'applicazione deve analizzare questo URL e compila almeno uno degli altri due campi.
  • La contentUrl corrisponde all'URL riproducibile che verrà utilizzato dal player per caricare i contenuti. Ad esempio, questo URL potrebbe indirizzare a un manifest DASH.
  • La contentId può essere un URL di contenuti riproducibili (simile a quello dei contentUrl ) o un identificatore univoco per i contenuti o la playlist che vengono caricati. Se utilizzi questa proprietà come identificatore, l'applicazione deve compilare una URL riproducibile in contentUrl.

Si consiglia di utilizzare entity per archiviare l'ID reale o i parametri chiave. usa contentUrl per l'URL dei contenuti multimediali. Un esempio è mostrato nel nello snippet seguente in cui è presente entity nella richiesta LOAD e nel La riproducibile contentUrl è stata recuperata:

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;
        });
    });

Funzionalità del dispositivo

La getDeviceCapabilities fornisce informazioni sul dispositivo sul dispositivo di trasmissione connesso e il video o dispositivo audio collegato. Il metodo getDeviceCapabilities fornisce assistenza informazioni per l'Assistente Google, il Bluetooth, il display e l'audio connessi dispositivi mobili.

Questo metodo restituisce un oggetto su cui puoi eseguire query passando uno dei enum specificate per ottenere la funzionalità del dispositivo per quell'enum. Le enum sono definiti in cast.framework.system.DeviceCapabilities

In questo esempio viene controllato se il dispositivo ricevitore web è in grado di riprodurre contenuti HDR e DolbyVision (DV) con i tasti IS_HDR_SUPPORTED e IS_DV_SUPPORTED, rispettivamente.

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();

Gestione delle interazioni degli utenti

Un utente può interagire con la tua applicazione di ricezione web tramite il mittente (Web, Android e iOS), comandi vocali su app con l'assistente integrato dispositivi, controlli touch su smart display e telecomandi su Android TV dispositivi mobili. L'SDK Cast fornisce varie API per consentire all'app WebRicevitore di gestire queste interazioni, aggiornare l'UI dell'applicazione stati delle azioni degli utenti, e, facoltativamente, inviare le modifiche per aggiornare eventuali servizi di backend.

Comandi multimediali supportati

Gli stati dei controlli dell'interfaccia utente sono guidati MediaStatus.supportedMediaCommands per controller espansi, ricevitore e telecomando mittente iOS e Android app in esecuzione su dispositivi touch e ricevi app su dispositivi Android TV. Quando è abilitato nella proprietà un particolare Command a bit a bit, i pulsanti che a questa azione siano abilitate. Se il valore non è impostato, il pulsante è disattivata. Questi valori possono essere modificati sul ricevitore web:

  1. Utilizzo PlayerManager.setSupportedMediaCommands per impostare lo specifico Commands
  2. Aggiungi un nuovo comando utilizzando addSupportedMediaCommands
  3. Rimuovere un comando esistente utilizzando removeSupportedMediaCommands
playerManager.setSupportedMediaCommands(cast.framework.messages.Command.SEEK |
  cast.framework.messages.Command.PAUSE);

Quando il destinatario prepara l'oggetto MediaStatus aggiornato, includerà il componente modifiche nella proprietà supportedMediaCommands. Quando lo stato è trasmesso, le app dei mittenti collegate aggiorneranno i pulsanti nella loro UI di conseguenza.

Per ulteriori informazioni sui comandi multimediali supportati e sui dispositivi touch, vedi Accessing UI controls guida.

Gestione degli stati delle azioni degli utenti

Quando gli utenti interagiscono con l'interfaccia utente o inviano comandi vocali, possono controllare riproduzione dei contenuti e delle proprietà relativi all'elemento in riproduzione. Richieste che controllano la riproduzione vengono gestiti automaticamente dall'SDK. Richieste che modificare le proprietà dell'elemento correntemente in riproduzione, ad esempio un comando LIKE richiede che l'applicazione ricevente li gestisca. L'SDK fornisce una serie le API per gestire questi tipi di richieste. A supporto di queste richieste, questa operazione:

  • Imposta MediaInformation userActionStates con le preferenze di un utente quando carica un elemento multimediale.
  • Intercetta USER_ACTION messaggi e determina l'azione richiesta.
  • Aggiorna MediaInformation UserActionState per aggiornare l'UI.
di Gemini Advanced.

Il seguente snippet intercetta la richiesta LOAD e compila il campo MediaInformation di LoadRequestData. In questo caso, all'utente piace contenuti in fase di caricamento.

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;
    });

Il seguente snippet intercetta il messaggio USER_ACTION e gestisce le chiamate al backend con la modifica richiesta. quindi effettua una chiamata per aggiornare UserActionState sul ricevitore.

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;
    });
});

Lo snippet seguente simula una chiamata a un servizio di backend. La funzione controlla UserActionRequestData per visualizzare il tipo di modifica richiesto dall'utente ed effettua una chiamata di rete solo se l'azione è supportata dal 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));
    }
  });
}

Il seguente snippet prende il UserActionRequestData e aggiunge o rimuove UserActionState da MediaInformation. Aggiornamento del UserActionState di MediaInformation cambia lo stato del pulsante che è associato all'azione richiesta. Questo cambiamento si riflette nell' UI dei controlli del display, app per il controllo remoto e UI di Android TV. È inoltre possibile trasmesso tramite messaggi MediaStatus in uscita per aggiornare l'UI controller espanso per mittenti iOS e 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;
}

Comandi vocali

I seguenti comandi multimediali sono attualmente supportati nell'SDK Web receiver per Dispositivi con l'assistente integrato. Le implementazioni predefinite di questi comandi sono presenti in cast.framework.PlayerManager

Comando Descrizione
Riproduci Riproduci o riprendi la riproduzione dallo stato di pausa.
Metti in pausa Metti in pausa i contenuti attualmente in riproduzione.
Indietro Vai all'elemento multimediale precedente nella coda multimediale.
Avanti Passare all'elemento multimediale successivo nella coda multimediale.
Interrompi Interrompi i contenuti multimediali attualmente in riproduzione.
Nessuna ripetizione Disattiva la ripetizione degli elementi multimediali in coda una volta terminata la riproduzione dell'ultimo elemento in coda.
Ripeti singolo Ripeti all'infinito i contenuti multimediali attualmente in riproduzione.
Ripeti tutto Ripeti tutti gli elementi in coda dopo aver riprodotto l'ultimo elemento in coda.
Ripeti tutti e Riproduzione casuale Una volta terminata la riproduzione dell'ultimo elemento in coda, riproduci la coda in ordine casuale e ripeti tutti gli elementi in coda.
Riproduzione casuale Riprodurre in ordine casuale gli elementi multimediali nella coda multimediale.
ATTIVA / DISATTIVA Sottotitoli codificati Attiva / disattiva i sottotitoli codificati per i tuoi contenuti multimediali. L'opzione Attiva / Disattiva è disponibile anche in base alla lingua.
Vai al tempo assoluto Passa al momento assoluto specificato.
Vai all'ora in relazione all'ora attuale Vai avanti o indietro del periodo di tempo specificato rispetto al tempo di riproduzione attuale.
Gioca di nuovo Riavvia i contenuti multimediali attualmente in riproduzione o riproduci l'ultimo elemento multimediale riprodotto se al momento non è in riproduzione nulla.
Impostare la velocità di riproduzione Varia la velocità di riproduzione dei contenuti multimediali. Questa opzione deve essere gestita per impostazione predefinita. Puoi utilizzare l'intercettatore di messaggi SET_PLAYBACK_RATE per eseguire l'override delle richieste di tariffe in entrata.

Comandi multimediali supportati tramite comandi vocali

Per impedire a un comando vocale di attivare un comando multimediale su un assistente: dispositivo abilitato, devi prima impostare comandi multimediali supportati che intendi supportare. Devi quindi applicare questi comandi abilitando il CastReceiverOptions.enforceSupportedCommands proprietà. L'UI sui mittenti dell'SDK Cast e sui dispositivi compatibili con il tocco cambierà in per riflettere queste configurazioni. Se il flag non è abilitato, la chiamata in arrivo .

Ad esempio, se consenti PAUSE dalle applicazioni del mittente e sui dispositivi touch, devi anche configurare il ricevitore in modo che riflettano impostazioni. Una volta configurato, i comandi vocali in arrivo verranno eliminati se non è presente inclusi nell'elenco dei comandi supportati.

Nell'esempio riportato di seguito forniamo il CastReceiverOptions quando iniziamo CastReceiverContext. Abbiamo aggiunto il supporto per il comando PAUSE che il player supporti solo quel comando. Se un comando vocale richiede un'altra operazione come SEEK. Questa operazione verrà rifiutata. L'utente verrà che il comando non è ancora supportato.

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

context.start({
  enforceSupportedCommands: true,
  supportedCommands: cast.framework.messages.Command.PAUSE
});

Puoi applicare una logica separata a ogni comando che vuoi limitare. Rimuovi il flag enforceSupportedCommands e per ogni comando che vuoi puoi intercettare il messaggio in arrivo. Qui intercettiamo la richiesta forniti dall'SDK in modo che i comandi SEEK vengano inviati ai dispositivi con l'assistente integrato non attivano una ricerca nella tua applicazione Web ricevitore.

Per i comandi multimediali non supportati dall'applicazione, restituisci un'istanza causa dell'errore, ad esempio 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;
  });

Background dell'attività vocale

Se la piattaforma Cast esegue in background l'audio della tua applicazione grazie all'assistente attività come ascoltare il parlato o rispondere dall'utente, una FocusState il messaggio di NOT_IN_FOCUS viene inviato all'applicazione Web Ricevitore quando inizia l'attività. Al termine dell'attività viene inviato un altro messaggio con l'indirizzo IN_FOCUS. A seconda dell'applicazione e dei contenuti multimediali riprodotti, potresti voler metti in pausa i contenuti multimediali quando FocusState è NOT_IN_FOCUS intercettando il messaggio digita FOCUS_STATE.

Ad esempio, mettere in pausa la riproduzione dell'audiolibro sarebbe una buona esperienza utente se L'assistente sta rispondendo a una query dell'utente.

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;
  });

Lingua dei sottotitoli specificata dalla voce

Quando un utente non indica esplicitamente la lingua per i sottotitoli, viene restituito La lingua utilizzata per i sottotitoli codificati è la stessa in cui è stato pronunciato il comando. In questi scenari, isSuggestedLanguage del messaggio in arrivo indica se la lingua associata è stata suggeriti o esplicitamente richiesti dall'utente.

Ad esempio, isSuggestedLanguage è impostato su true per il comando "Hey Google, attiva i sottotitoli codificati", perché la lingua è stata dedotta dalla lingua il comando vocale. Se la lingua viene richiesta esplicitamente, ad esempio "Ok Google, attiva i sottotitoli in inglese" isSuggestedLanguage impostata su false.

Metadati e trasmissione vocale

Sebbene i comandi vocali siano gestiti dal ricevitore web per impostazione predefinita, Assicurati che i metadati dei tuoi contenuti siano completi e accurati. Ciò garantisce che i comandi vocali vengono gestiti correttamente dall'assistente e i metadati vengono visualizzate correttamente nei nuovi tipi di interfacce, come l'app Google Home e come Google Home Hub.

Trasferimento dello streaming

La conservazione dello stato della sessione è alla base del trasferimento dello streaming, dove gli utenti possono spostare gli stream audio e video esistenti su più dispositivi con i comandi vocali e Google Home all'app o a smart display. La riproduzione dei contenuti multimediali si interrompe su un dispositivo (l'origine) e continua su un altro (lo destinazione). Qualsiasi dispositivo di trasmissione con il firmware più recente può fungere da sorgente o destinazione in un trasferimento dello streaming.

Il flusso di eventi per il trasferimento dello streaming è:

  1. Sul dispositivo di origine:
    1. La riproduzione dei contenuti multimediali viene interrotta.
    2. L'applicazione WebRicevitore riceve un comando per salvare i contenuti multimediali correnti stato.
    3. L'applicazione WebRicevitore è stata arrestata.
  2. Sul dispositivo di destinazione:
    1. L'applicazione WebRicevitore è stata caricata.
    2. L'applicazione WebRicevitore riceve un comando per ripristinare i contenuti multimediali salvati stato.
    3. La riproduzione dei contenuti multimediali riprende.

Gli elementi dello stato dei contenuti multimediali includono:

  • Posizione specifica o timestamp del brano, del video o dell'elemento multimediale.
  • Deve essere inserito in una coda più ampia (ad esempio una playlist o una radio di un artista).
  • L'utente autenticato.
  • Stato di riproduzione (ad esempio riproduzione o pausa).

Abilitazione del trasferimento dello streaming in corso...

Per implementare il trasferimento dello streaming per il tuo ricevitore web:

  1. Aggiorna supportedMediaCommands con il comando STREAM_TRANSFER:
    playerManager.addSupportedMediaCommands(
    cast.framework.messages.Command.STREAM_TRANSFER, true);
  2. Se vuoi, puoi eseguire l'override dei messaggi SESSION_STATE e RESUME_SESSION come descritto in Conservazione della sessione . Sostituiscile solo se i dati personalizzati richiedono affinché possano essere archiviati come parte dello snapshot della sessione. Altrimenti, l'impostazione predefinita l'implementazione per la conservazione degli stati della sessione supporterà il trasferimento dello streaming.

Conservazione dello stato della sessione

L'SDK Web receiver fornisce un'implementazione predefinita per le app Web receiver Conserva gli stati delle sessioni scattando un'istantanea dello stato dei contenuti multimediali corrente, convertendo lo stato in una richiesta di caricamento e il ripristino della sessione con tale richiesta.

La richiesta di caricamento generata dal ricevitore web può essere ignorata in SESSION_STATE intercettore di messaggi, se necessario. Se vuoi aggiungere dati personalizzati nella richiesta di caricamento, suggeriamo di inserirli 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;
    });

I dati personalizzati possono essere recuperati loadRequestData.customData nell'intercettatore di messaggi 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;
    });

Precaricamento dei contenuti

Il ricevitore web supporta il precaricamento degli elementi multimediali dopo la riproduzione corrente l'elemento in coda.

L'operazione di precaricamento pre-scarica diversi segmenti per i prossimi elementi. La specifica viene eseguita nella preloadTime nel parametro Oggetto QueueItem (il valore predefinito è 20 secondi se non viene fornito). Il tempo è espresso in secondi, rispetto alla fine dell'elemento attualmente in riproduzione . Solo i valori positivi sono valida. Ad esempio, se il valore è 10 secondi, questo elemento verrà precaricato 10 secondi prima del termine dell'elemento precedente. Se il tempo di precaricamento è superiore rispetto al tempo rimanente per l'elemento attuale, il precaricamento avverrà non appena possibile. Quindi, se viene specificato un valore molto elevato di precaricamento in codeItem, ottenere l'effetto di ogni volta che riproduciamo l'elemento corrente sta già precaricando l'elemento successivo. Tuttavia, lasciamo l'impostazione e la scelta lo sviluppatore, poiché questo valore può influire sulla larghezza di banda e sulle prestazioni dei flussi di dati dell'elemento attualmente in riproduzione.

Per impostazione predefinita, il precaricamento funziona per i contenuti HLS, DASH e in streaming fluido.

I normali file video e audio MP4, ad esempio gli MP3, non verranno precaricati come Cast supportano un solo elemento multimediale e non possono essere utilizzati per precaricare mentre il contenuto esistente è ancora in riproduzione.

Messaggi personalizzati

Lo scambio di messaggi è il metodo di interazione chiave per le applicazioni Web receiver.

Un mittente invia i messaggi a un ricevitore web utilizzando le API del mittente per piattaforma utilizzata dal mittente (Android, iOS, Web). L'oggetto evento (che è la manifestazione di un messaggio) che viene passato ai listener di eventi ha un elemento dati (event.data) in cui i dati assumono le proprietà dell'elemento un tipo di evento specifico.

Un'applicazione Web Ricevitore può scegliere di ascoltare i messaggi su un nello spazio dei nomi. In questo modo, si dice che l'applicazione WebRicevitore che supportano il protocollo dello spazio dei nomi. Spetta quindi a tutti i mittenti connessi che desiderano per comunicare su quello spazio dei nomi per usare il protocollo appropriato.

Tutti gli spazi dei nomi sono definiti da una stringa e devono iniziare con "urn:x-cast:" seguito da una qualsiasi stringa. Ad esempio: "urn:x-cast:com.example.cast.mynamespace".

Ecco uno snippet di codice per il ricevitore web da cui ascoltare i messaggi personalizzati mittenti collegati:

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();

Analogamente, le applicazioni Web ricevitore possono tenere informati i mittenti sullo stato del ricevitore web inviando messaggi ai mittenti connessi. Un ricevitore web applicazione può inviare messaggi utilizzando sendCustomMessage(namespace, senderId, message) attivo CastReceiverContext. Un ricevitore web può inviare messaggi a un singolo mittente, in risposta a un messaggio ricevuto o a causa di una modifica dello stato dell'applicazione. Oltre il punto (con un limite di 64 kB), un ricevitore web può anche trasmettere messaggi da tutti i mittenti connessi.

Trasmetti per i dispositivi audio

Consulta la guida ai dispositivi Google Cast per audio per il supporto dell'audio. solo per la riproduzione.

Android TV

In questa sezione viene spiegato in che modo il ricevitore web di Google utilizza i tuoi input per la riproduzione. e Android TV.

Integrazione dell'applicazione con il telecomando

Il ricevitore web Google in esecuzione sul dispositivo Android TV traduce l'input da gli ingressi di controllo del dispositivo (ossia il telecomando) per la riproduzione di contenuti multimediali messaggi definiti per lo spazio dei nomi urn:x-cast:com.google.cast.media, descritto in Messaggi relativi alla riproduzione di contenuti multimediali. Il tuo l'applicazione deve supportare questi messaggi per controllare i contenuti multimediali dell'applicazione riproduzione per consentire il controllo di riproduzione di base con quello di Android TV di input.

Linee guida per la compatibilità con Android TV

Di seguito sono riportati alcuni consigli e insidie comuni da evitare per garantire la tua applicazione è compatibile con Android TV:

  • Tieni presente che la stringa dello user agent contiene sia "Android" e "CHighlight"; alcuni siti potrebbero reindirizzare a un sito solo per dispositivi mobili perché rilevano il "Android" dell'etichetta. Non dare per scontato che "Android" nella stringa user agent indica un utente di dispositivi mobili.
  • Lo stack multimediale di Android potrebbe utilizzare GZIP trasparente per recuperare i dati. Assicurati che i tuoi dati multimediali possono rispondere a Accept-Encoding: gzip.
  • Gli eventi multimediali HTML5 di Android TV potrebbero essere attivati in tempi diversi rispetto a Chromecast, questa operazione potrebbe rivelare problemi nascosti su Chromecast.
  • Quando aggiorni i contenuti multimediali, usa gli eventi relativi ai contenuti multimediali attivati da <audio>/<video> come timeupdate, pause e waiting. Evita di utilizzare il networking eventi correlati come progress, suspend e stalled, che tendono a essere dipende dalla piattaforma. Vedi Eventi multimediali per ulteriori informazioni sulla gestione degli eventi multimediali nel ricevitore.
  • Quando configuri i certificati HTTPS del sito destinatario, assicurati di includere certificati CA intermedi. Consulta le Pagina di test SSL Qualsys per verifica se il percorso di certificazione certificato per il tuo sito include un'autorità di certificazione certificato con l'etichetta "download aggiuntivo", potrebbe non caricarsi piattaforme di terze parti.
  • Mentre Chromecast mostra la pagina del ricevitore su un piano grafico da 720p, Le piattaforme di trasmissione, tra cui Android TV, potrebbero visualizzare la pagina fino a 1080p. Assicurati la pagina del destinatario scala agevolmente a diverse risoluzioni.