Questa guida per gli sviluppatori descrive come aggiungere il supporto di Google Cast alla tua app Mittente web utilizzando l'SDK Cast.
Terminologia
Il dispositivo mobile o browser è il mittente, che controlla la riproduzione; il dispositivo Google Cast è il destinatario, che mostra i contenuti sullo schermo per la riproduzione.
L'SDK Web Sender è costituito da due parti: l'API Framework (cast.framework) e l'API Base (chrome.cast) In generale, effettui chiamate sull'API Framework di livello superiore e più semplice, che viene poi elaborata dall'API Base di livello inferiore.
Il framework mittente si riferisce all'API Framework, al modulo e alle risorse associate che forniscono un wrapper per le funzionalità di livello inferiore. L'app mittente o l'app Google Cast Chrome si riferisce all'app web (HTML/JavaScript) in esecuzione all'interno di un browser Chrome su un dispositivo mittente. Un'app Ricevitore web si riferisce a un'app HTML/JavaScript in esecuzione su Chromecast o su un dispositivo Google Cast.
Il framework del mittente utilizza un design asincrono di callback per informare l'app del mittente degli eventi e per passare da uno stato all'altro del ciclo di vita dell'app di trasmissione.
Carica la raccolta
Per poter implementare le funzionalità di Google Cast, l'app deve conoscere la posizione dell'SDK Google Cast per il mittente web, come mostrato di seguito. Aggiungi il parametro di ricerca URL loadCastFramework per caricare anche l'API Web Sender Framework. Tutte le pagine della tua app devono fare riferimento alla raccolta nel seguente modo:
<script src="https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1"></script>
Framework
L'SDK Web Sender utilizza lo spazio dei nomi cast.framework.*. Lo spazio dei nomi rappresenta quanto segue:
- Metodi o funzioni che richiamano le operazioni sull'API
- listener di eventi per funzioni listener nell'API
Il framework è costituito da questi componenti principali:
CastContext
è un oggetto singleton che fornisce informazioni sullo stato attuale di trasmissione e attiva eventi per lo stato di trasmissione e le modifiche dello stato di trasmissione.- L'oggetto
CastSession
gestisce la sessione, fornisce informazioni sullo stato e attiva eventi, come le modifiche al volume del dispositivo, lo stato di disattivazione dell'audio e i metadati dell'app. - L'elemento pulsante Trasmetti, che è un semplice elemento HTML personalizzato che estende il pulsante HTML. Se il pulsante Trasmetti non è sufficiente, puoi utilizzare lo stato di trasmissione per implementare un pulsante Trasmetti.
RemotePlayerController
fornisce l'associazione di dati per semplificare l'implementazione del player remoto.
Consulta il riferimento API Google Cast Web Sender per una descrizione completa dello spazio dei nomi.
Pulsante Trasmetti
Il componente del pulsante Trasmetti nell'app è gestito interamente dal framework. Ciò include la gestione della visibilità, nonché la gestione degli eventi di clic.
<google-cast-launcher></google-cast-launcher>
In alternativa, puoi creare il pulsante in modo programmatico:
document.createElement("google-cast-launcher");
Se necessario, puoi applicare qualsiasi ulteriore stile, ad esempio dimensioni o posizionamento. Utilizza l'attributo --connected-color
per scegliere il colore dello stato del ricevitore web collegato e --disconnected-color
per lo stato disconnesso.
Inizializzazione
Dopo aver caricato l'API del framework, l'app chiamerà il gestore window.__onGCastApiAvailable
. Devi assicurarti che l'app imposti questo gestore
su window
prima di caricare la libreria dei mittenti.
All'interno di questo gestore, inizializza l'interazione di Cast chiamando il metodo setOptions(options)
di CastContext
.
Ad esempio:
<script>
window['__onGCastApiAvailable'] = function(isAvailable) {
if (isAvailable) {
initializeCastApi();
}
};
</script>
Quindi, inizializza l'API come segue:
initializeCastApi = function() {
cast.framework.CastContext.getInstance().setOptions({
receiverApplicationId: applicationId,
autoJoinPolicy: chrome.cast.AutoJoinPolicy.ORIGIN_SCOPED
});
};
Innanzitutto, l'app recupera l'istanza singleton dell'oggetto CastContext
fornito dal framework. Utilizza quindi
setOptions(options)
con un oggetto
CastOptions
per
impostare applicationID
.
Se utilizzi il ricevitore multimediale predefinito, che non richiede la registrazione,
utilizzi una costante predefinita dall'SDK del mittente web, come mostrato di seguito, anziché
applicationID
:
cast.framework.CastContext.getInstance().setOptions({
receiverApplicationId: chrome.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID
});
Controllo dei contenuti multimediali
Dopo aver inizializzato CastContext
, l'app può recuperare l'elemento CastSession
corrente in qualsiasi momento utilizzando getCurrentSession()
.
var castSession = cast.framework.CastContext.getInstance().getCurrentSession();
CastSession
può essere utilizzato per caricare contenuti multimediali sul dispositivo di trasmissione connesso utilizzando
loadMedia(loadRequest)
.
Per prima cosa, crea un
MediaInfo
,
utilizzando contentId
e contentType
, nonché eventuali altre informazioni
relative ai contenuti. Quindi, crea un elemento LoadRequest
, impostando tutte le informazioni pertinenti per la richiesta. Infine, chiama il numero loadMedia(loadRequest)
dal tuo CastSession
.
var mediaInfo = new chrome.cast.media.MediaInfo(currentMediaURL, contentType);
var request = new chrome.cast.media.LoadRequest(mediaInfo);
castSession.loadMedia(request).then(
function() { console.log('Load succeed'); },
function(errorCode) { console.log('Error code: ' + errorCode); });
Il metodo loadMedia
restituirà un
Promise
che può essere utilizzato per eseguire tutte le operazioni necessarie per un risultato riuscito.
Se la promessa viene rifiutata, l'argomento della funzione sarà
chrome.cast.ErrorCode
.
Puoi accedere alle variabili dello stato del player in RemotePlayer
.
Tutte le interazioni con la RemotePlayer
, inclusi i comandi e i callback degli eventi multimediali, vengono gestite con RemotePlayerController
.
var player = new cast.framework.RemotePlayer();
var playerController = new cast.framework.RemotePlayerController(player);
L'elemento RemotePlayerController
fornisce all'app il controllo completo dei contenuti multimediali caricati, ovvero PLAY, PAUSA, FERMA e CERCA.
- RIPRODUCI/PAUSA:
playerController.playOrPause();
- STOP:
playerController.stop();
- CERCA:
playerController.seek();
RemotePlayer
e RemotePlayerController
possono essere utilizzati con i framework di associazione di dati, come Polymer o Angular, per implementare un player remoto.
Ecco uno snippet di codice per Angular:
<button id="playPauseButton" class="playerButton" ng-disabled="!player.canPause" ng-click="controller.playOrPause()"> {{player.isPaused ? 'Play' : 'Pause'}} </button> <script> var player = new cast.framework.RemotePlayer(); var controller = new cast.framework.RemotePlayerController(player); // Listen to any player update, and trigger angular data binding update.controller.addEventListener( cast.framework.RemotePlayerEventType.ANY_CHANGE, function(event) { if (!$scope.$$phase) $scope.$apply(); }); </script>
Stato dei contenuti multimediali
Durante la riproduzione di contenuti multimediali, si verificano vari eventi che possono essere acquisiti impostando gli elementi di ascolto per vari eventi cast.framework.RemotePlayerEventType
sull'oggetto RemotePlayerController
.
Per ottenere informazioni sullo stato dei contenuti multimediali, usa l'evento cast.framework.RemotePlayerEventType
.MEDIA_INFO_CHANGED
, che si attiva quando cambia la riproduzione e quando cambia CastSession.getMediaSession().media
.
playerController.addEventListener(
cast.framework.RemotePlayerEventType.MEDIA_INFO_CHANGED, function() {
// Use the current session to get an up to date media status.
let session = cast.framework.CastContext.getInstance().getCurrentSession();
if (!session) {
return;
}
// Contains information about the playing media including currentTime.
let mediaStatus = session.getMediaSession();
if (!mediaStatus) {
return;
}
// mediaStatus also contains the mediaInfo containing metadata and other
// information about the in progress content.
let mediaInfo = mediaStatus.media;
});
Quando si verificano eventi quali pausa, riproduzione, ripresa o ricerca, l'app deve intervenire e sincronizzarsi tra se stessa e l'app del ricevitore web sul dispositivo di trasmissione. Per ulteriori informazioni, consulta Aggiornamenti di stato.
Come funziona la gestione delle sessioni
L'SDK Cast introduce il concetto di sessione Google Cast, il cui scopo consiste nel combinare i passaggi per connettersi a un dispositivo, lanciare (o partecipare) a un'app Ricevitore web, connettersi a quell'app e inizializzare un canale di controllo dei contenuti multimediali. Consulta la guida al ciclo di vita dell'applicazione per ulteriori informazioni sulle sessioni di trasmissione e sul ciclo di vita del ricevitore web.
Le sessioni sono gestite dalla classe CastContext
, che la tua app può recuperare tramite cast.framework.CastContext.getInstance()
.
Le singole sessioni sono rappresentate da sottoclassi del corso Session
. Ad esempio, CastSession
rappresenta le sessioni con dispositivi di trasmissione. La tua app può accedere alla sessione di trasmissione attualmente attiva tramite CastContext.getCurrentSession()
.
Per monitorare lo stato della sessione, aggiungi un listener a CastContext
per il tipo di evento CastContextEventType
.SESSION_STATE_CHANGED
.
var context = cast.framework.CastContext.getInstance();
context.addEventListener(
cast.framework.CastContextEventType.SESSION_STATE_CHANGED,
function(event) {
switch (event.sessionState) {
case cast.framework.SessionState.SESSION_STARTED:
case cast.framework.SessionState.SESSION_RESUMED:
break;
case cast.framework.SessionState.SESSION_ENDED:
console.log('CastContext: CastSession disconnected');
// Update locally as necessary
break;
}
})
Per la disconnessione, ad esempio quando l'utente fa clic sul pulsante "Interrompi trasmissione" dalla
finestra di dialogo Trasmetti, puoi aggiungere un listener per il
tipo di evento
RemotePlayerEventType
.IS_CONNECTED_CHANGED
nel listener. Nel listener, controlla se RemotePlayer
è disconnesso. In questo caso, aggiorna lo stato del player locale, se necessario. Ad esempio:
playerController.addEventListener(
cast.framework.RemotePlayerEventType.IS_CONNECTED_CHANGED, function() {
if (!player.isConnected) {
console.log('RemotePlayerController: Player disconnected');
// Update local player to disconnected state
}
});
Mentre l'utente può controllare direttamente la terminazione di Cast tramite il pulsante di trasmissione del framework, il mittente stesso può interrompere la trasmissione utilizzando l'oggetto CastSession
corrente.
function stopCasting() {
var castSession = cast.framework.CastContext.getInstance().getCurrentSession();
// End the session and pass 'true' to indicate
// that Web Receiver app should be stopped.
castSession.endSession(true);
}
Trasferimento dello streaming
La conservazione dello stato della sessione è la base del trasferimento dello streaming, in cui gli utenti possono spostare gli stream audio e video esistenti sui vari dispositivi utilizzando i comandi vocali, l'app Google Home o smart display. La riproduzione dei contenuti multimediali viene interrotta su un dispositivo (l'origine) e continua su un altro (la destinazione). Qualsiasi dispositivo di trasmissione con il firmware più recente può fungere da origine o destinazione in un trasferimento di streaming.
Per ottenere il nuovo dispositivo di destinazione durante il trasferimento dello streaming, chiama
CastSession#getCastDevice()
quando viene chiamato
l'evento cast.framework.SessionState
.SESSION_RESUMED
.
Per ulteriori informazioni, consulta Trasferimento dello streaming sul ricevitore web.