En esta guía para desarrolladores, se describe cómo agregar la compatibilidad de Google Cast a tu app de remitente web con el SDK de Cast.
Terminología
El dispositivo móvil o navegador es el remitente, que controla la reproducción. El dispositivo Google Cast es el receptor, el cual muestra el contenido en la pantalla para su reproducción.
El SDK de Web Sender consta de dos partes: la API de marco de trabajo (cast.framework) y la API de base (chrome.cast). En general, se realizan llamadas a la API de marco de trabajo de nivel superior, más simple y luego la API de nivel inferior de nivel inferior.
El marco de trabajo del remitente se refiere a la API del marco de trabajo, el módulo y los recursos asociados que proporcionan un wrapper relacionado con la funcionalidad de nivel inferior. La app de remitente o la app de Google Cast para Chrome hace referencia a una aplicación web (HTML/JavaScript) que se ejecuta en un navegador Chrome en un dispositivo de envío. Una app receptora web hace referencia a una app HTML o JavaScript que se ejecuta en Chromecast o un dispositivo Google Cast.
El framework del remitente usa un diseño de devolución de llamada asíncrono para informar a la app emisora sobre los eventos y hacer la transición entre varios estados del ciclo de vida de la app de Cast.
Carga la biblioteca
Para que tu app implemente las funciones de Google Cast, debe conocer la ubicación del SDK de remitente web de Google Cast, como se muestra a continuación. Agrega el parámetro de consulta de URL loadCastFramework para cargar la API de Web Sender Framework. Todas las páginas de tu app deben hacer referencia a la biblioteca de la siguiente manera:
<script src="https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1"></script>
Framework
El SDK de Web Sender utiliza el espacio de nombres cast.framework.*. El espacio de nombres representa lo siguiente:
- Métodos o funciones que invocan operaciones en la API
- Objetos de escucha de eventos para funciones de objetos de escucha en la API
El framework consta de los siguientes componentes principales:
- El
CastContext
es un objeto singleton que proporciona información sobre el estado actual de Cast y activa eventos para los cambios de estado de Cast y de sesión de Cast. - El objeto
CastSession
administra la sesión, proporciona información de estado y activa eventos, como cambios en el volumen del dispositivo, el estado de silencio y los metadatos de la app. - El elemento del botón para transmitir, que es un elemento simple HTML personalizado que extiende el botón HTML Si el botón para transmitir proporcionado no es suficiente, puedes usar el estado de transmisión para implementar un botón para transmitir.
RemotePlayerController
proporciona la vinculación de datos para simplificar la implementación del reproductor remoto.
Consulta la referencia de la API del remitente web de Google Cast para obtener una descripción completa del espacio de nombres.
Botón para transmitir
El componente del botón para transmitir de tu app se controla por completo en el framework. Esto incluye la administración de visibilidad, así como el control de eventos de clic.
<google-cast-launcher></google-cast-launcher>
También puedes crear el botón de manera programática:
document.createElement("google-cast-launcher");
Puedes aplicar cualquier estilo adicional, como tamaño o posicionamiento, al elemento según sea necesario. Usa el atributo --connected-color
a fin de elegir el color para el estado de receptor web conectado y --disconnected-color
para el estado desconectado.
Inicialización
Después de cargar la API de framework, la app llamará al controlador window.__onGCastApiAvailable
. Debes asegurarte de que la app configure este controlador en el window
antes de cargar la biblioteca de remitentes.
Dentro de este controlador, inicializas la interacción de Cast llamando al método setOptions(options)
de CastContext
.
Por ejemplo:
<script>
window['__onGCastApiAvailable'] = function(isAvailable) {
if (isAvailable) {
initializeCastApi();
}
};
</script>
Luego, inicializa la API de la siguiente manera:
initializeCastApi = function() {
cast.framework.CastContext.getInstance().setOptions({
receiverApplicationId: applicationId,
autoJoinPolicy: chrome.cast.AutoJoinPolicy.ORIGIN_SCOPED
});
};
Primero, la app recupera la instancia singleton del objeto CastContext
que proporciona el framework. Luego, usa setOptions(options)
con un objeto CastOptions
para establecer la applicationID
.
Si usas el receptor multimedia predeterminado, que no requiere registro, se usa una constante predefinida por el SDK de remitente web, como se muestra a continuación, en lugar de applicationID
:
cast.framework.CastContext.getInstance().setOptions({
receiverApplicationId: chrome.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID
});
Control multimedia
Una vez que se inicializa CastContext
, la app puede recuperar el CastSession
actual en cualquier momento mediante getCurrentSession()
.
var castSession = cast.framework.CastContext.getInstance().getCurrentSession();
Se puede usar CastSession
para cargar contenido multimedia al dispositivo de transmisión conectado mediante loadMedia(loadRequest)
.
Primero, crea un MediaInfo
con contentId
y contentType
, así como con cualquier otra información relacionada con el contenido. Luego, crea un LoadRequest
a partir de este y establece toda la información relevante para la solicitud. Por último, llama a loadMedia(loadRequest)
en tu 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); });
El método loadMedia
mostrará una promesa que se puede usar para realizar las operaciones necesarias a fin de obtener un resultado exitoso.
Si se rechaza la promesa, el argumento de la función será una chrome.cast.ErrorCode
.
Puedes acceder a las variables de estado del reproductor en RemotePlayer
.
Todas las interacciones con el RemotePlayer
, incluidas las devoluciones de llamada y los comandos de eventos multimedia, se manejan con RemotePlayerController
.
var player = new cast.framework.RemotePlayer();
var playerController = new cast.framework.RemotePlayerController(player);
RemotePlayerController
le otorga a la app el control total de medios de PLAY, PAUSE, STOP y SEEK para el contenido multimedia cargado.
- REPRODUCIR/PAUSA:
playerController.playOrPause();
- DETENER:
playerController.stop();
- SOLICITAR:
playerController.seek();
RemotePlayer
y RemotePlayerController
se pueden usar con marcos de trabajo de vinculación de datos, como Polymer o Angular, para implementar un reproductor remoto.
Este es un fragmento de código para 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>
Estado de medios
Durante la reproducción de contenido multimedia, se producen varios eventos que se pueden capturar si configuras objetos de escucha para varios eventos cast.framework.RemotePlayerEventType
en el objeto RemotePlayerController
.
Para obtener la información del estado del contenido multimedia, usa el evento cast.framework.RemotePlayerEventType
.MEDIA_INFO_CHANGED
, que se activa cuando cambia la reproducción y cuando 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;
});
Cuando ocurran eventos como pausar, reproducir, reanudar o buscar, la app deberá actuar en función de ellos y sincronizarse entre ella y la app receptora web en el dispositivo de transmisión. Consulta Actualizaciones de estado para obtener más información.
Cómo funciona la administración de sesiones
El SDK de Cast presenta el concepto de una sesión de transmisión, cuyo establecimiento combina los pasos para conectarse a un dispositivo, iniciar (o unirse) a una app de receptor web, conectarse a esa app e inicializar un canal de control de contenido multimedia. Consulta la Guía del ciclo de vida de la aplicación del receptor web para obtener más información sobre las sesiones de transmisión y el ciclo de vida del receptor web.
La sesión CastContext
administra la sesión, que tu app puede recuperar mediante cast.framework.CastContext.getInstance()
.
Las sesiones individuales se representan con subclases de la clase Session
. Por ejemplo, CastSession
representa sesiones con dispositivos de transmisión. Tu app puede acceder a la sesión de transmisión actualmente activa mediante CastContext.getCurrentSession()
.
A fin de supervisar el estado de la sesión, agrega un objeto de escucha a CastContext
para el tipo de 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;
}
})
Para la desconexión, como cuando el usuario hace clic en el botón para detener la transmisión desde el diálogo de transmisión, puedes agregar un objeto de escucha del tipo de evento RemotePlayerEventType
.IS_CONNECTED_CHANGED
en el objeto de escucha. En tu objeto de escucha, verifica si RemotePlayer
está desconectado. Si es así, actualiza el estado del reproductor local según sea necesario. Por ejemplo:
playerController.addEventListener(
cast.framework.RemotePlayerEventType.IS_CONNECTED_CHANGED, function() {
if (!player.isConnected) {
console.log('RemotePlayerController: Player disconnected');
// Update local player to disconnected state
}
});
Si bien el usuario puede controlar directamente la finalización de Cast mediante el botón para transmitir marco de trabajo, el remitente puede detener la transmisión con el objeto CastSession
actual.
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);
}
Transferencia de transmisión
Preservar el estado de la sesión es la base de la transferencia de transmisión, mediante la cual los usuarios pueden mover transmisiones de audio y video existentes a través de dispositivos mediante comandos por voz, la app de Google Home o pantallas inteligentes. El contenido multimedia deja de reproducirse en un dispositivo (la fuente) y continúa en otro (el destino). Cualquier dispositivo de transmisión con el firmware más reciente puede servir como fuentes o destinos en una transferencia de transmisión.
Para obtener el nuevo dispositivo de destino durante la transferencia de transmisión, llama a CastSession#getCastDevice()
cuando se llame al evento cast.framework.SessionState
.SESSION_RESUMED
.
Consulta Transferencia de transmisión en el receptor web para obtener más información.