Transmisión en vivo

El SDK de Cast incluye API integradas para admitir contenido en vivo. Esto incluye una IU flexible y lista para usar, junto con API que permiten a los desarrolladores crear experiencias en vivo enriquecidas con solo unas pocas líneas de código. La API en vivo admite las horas de inicio y finalización, los metadatos del programa, los controles del DVR y las ventanas que se pueden buscar.

En esta guía, se muestra cómo configurar una transmisión a las API en vivo, incluidas las muestras de código y metadatos para configurar situaciones básicas en vivo, junto con capturas de pantalla que muestran cómo se ve cada situación.

Requisitos previos

Debes estar familiarizado con los conceptos básicos de la implementación de un receptor web antes de revisar esta guía. Además, para ejecutar las muestras de código, deberás tener acceso a una transmisión en vivo que cumpla con uno de los tipos de contenido multimedia compatibles con Cast. En general, la función de transmisión en vivo admite configuraciones de transmisión en vivo típicas para los medios compatibles.

Los siguientes términos se usan en toda la guía:

  • Ventana que se puede buscar: Es el rango de una transmisión en vivo que los usuarios pueden buscar.
  • En vivo: Es la parte más reciente de una transmisión en vivo disponible para el jugador.
  • Play Head: Es una marca de tiempo de la IU para la posición de reproducción actual.

Cómo transmitir una transmisión en vivo

Existen dos maneras de configurar el SDK de Web Receiver para usar la API en vivo con el contenido:

  1. mediante el interceptor de mensajes LOAD en tu aplicación de receptor web (opción recomendada)
  2. mediante una solicitud de carga generada por el remitente o el receptor.

El interceptor proporciona un objeto LoadRequestData que contiene todos los metadatos importantes sobre una solicitud de carga. Para indicar que una solicitud de carga es para una transmisión en vivo, simplemente configura el streamType en el objeto mediaInformation como StreamType.LIVE. MediaInformation.duration debe ser -1, ya que las instancias del reproductor son responsables de calcularlo cuando el contenido es LIVE.

/*
* This interceptor is called before your content is loaded by a Cast device
*/
playerManager.setMessageInterceptor(
   cast.framework.messages.MessageType.LOAD,
   request => { /* cast.framework.messages.LoadRequestData */
       request.media.streamType = cast.framework.messages.StreamType.LIVE;
   return request;
});

Cómo agregar datos de la guía del programa

Las transmisiones en vivo, en especial las de larga duración, como los canales de TV, pueden mostrar metadatos de la guía o programación en pantalla según la posición de reproducción actual de la transmisión en vivo. Es muy recomendable que los proveedores de contenido incluyan metadatos de programación en sus aplicaciones de receptores web para mejorar la experiencia del usuario final.

Puedes configurar los datos de guía iniciales para una transmisión en el interceptor de mensajes de CARGA, de la misma manera que indicamos que la transmisión era una transmisión en vivo en el ejemplo anterior. Las secciones o los programas individuales de la transmisión en vivo se representan como objetos MediaMetadata, que luego se almacenan en una cola. Existe una clase MediaMetadata diferente para los diferentes tipos de programas, p.ej., TvShowMediaMetadata, MovieMediaMetadata, MusicTrackMediaMetadata, etc.

En el siguiente fragmento de código, usamos el objeto MediaMetadata para especificar la hora de inicio de cada programa con una marca de tiempo UNIX con la propiedad sectionStartAbsoluteTime. La duración de un programa se representa en segundos.

// The metadata for a single TV show
const currentShow = new cast.framework.messages.TvShowMediaMetadata();
currentShow.episode = 15;
currentShow.seriesTitle = 'The Odyssey';
currentShow.title = 'Scylla and Charybdis';
currentShow.sectionStartAbsoluteTime = toUnixTimestamp('9:00 PM');
currentShow.sectionDuration = HOUR_IN_SECONDS;

const previousShow = new ...;
const nextShow = new ...;

const containerMetadata = new cast.framework.messages.ContainerMetadata();
containerMetadata.title = 'My TV Channel';
containerMetadata.sections = [previousShow, currentShow, nextShow];

playerManager.getQueueManager().setContainerMetadata(containerMetadata);

Rango de búsqueda en vivo

El SDK de Cast incluye elementos y controles de la IU que permiten al usuario mover el cabezal de reproducción dentro de la transmisión con el Control expandido o los controles de tacto en dispositivos compatibles con el tacto.

El LiveSeekableRange representa el rango de tiempo en una transmisión en el que un usuario puede realizar búsquedas. En el receptor web, puedes acceder a información sobre el rango que se puede buscar a través de PlayerManager.getLiveSeekableRange(), que muestra un objeto LiveSeekableRange. Las propiedades principales del objeto que debes conocer son las siguientes:

  • start: la hora de inicio (en segundos) del rango correspondiente al comienzo de la transmisión en segundos.
  • end: es el tiempo máximo posible (en segundos) que el reproductor puede buscar, según los segmentos disponibles, en relación con el comienzo de la transmisión.
  • isMoveWindow: un valor booleano que indica si se mueve el rango que se puede buscar (es decir, si se quitan los segmentos más antiguos del manifiesto) con la transmisión, debería ser true para todas las transmisiones en vivo.
  • isLiveDone: Es un valor booleano que indica si finalizó la transmisión en vivo, lo que significa que no se generan segmentos nuevos.

El tamaño del rango que se puede buscar, representado como el tiempo entre start y end, está determinado por la cantidad de segmentos disponibles en la transmisión y se moverá con la transmisión. Por ejemplo, si, al comienzo de la transmisión, el rango que se puede buscar es {start:0, end: 600, isMovingWindow: false, isLiveDone: false}, diez segundos después de que comience la transmisión, puede convertirse en {start: 10, end: 610, isMovingWindow: true, isLiveDone: false}. Es importante tener en cuenta que las horas de inicio y finalización del rango que admite búsquedas se actualizan en función del tiempo que lleva generar un segmento nuevo. Por lo tanto, si la duración típica de un segmento para tu transmisión es de 10 segundos, las horas de inicio y finalización también se actualizarán cada 10 segundos.

Inhabilitar la búsqueda

Para inhabilitar la búsqueda en una transmisión, debes quitar la función de búsqueda de los comandos de contenido multimedia compatibles en el receptor web:

// disable seeking in the LOAD messageInterceptor
playerManager.removeSupportedMediaCommands(cast.framework.messages.Command.SEEK, true);

Se quitará el comando multimedia compatible de las señales SEEK a las aplicaciones emisoras y las pantallas táctiles para inhabilitar la búsqueda, pero no se desactivarán los comandos por voz, como "Ok Google, busca 30 segundos". Consulta la guía sobre comandos multimedia compatibles con la voz para obtener detalles sobre cómo inhabilitar los comandos multimedia para la voz.

Eventos de framework en vivo

Se incluyen dos eventos, LIVE_ENDED y LIVE_IS_MOVING_WINDOW_CHANGED, en la API en vivo. A ambos eventos se les pasa un objeto LiveStatusEvent, que contiene el rango que se puede buscar en vivo.

Evento Descripción
LIVE_ENDED Se activa cuando finaliza una transmisión en vivo. En este punto, el valor de end en LiveSeekableRange dejará de actualizarse; los usuarios aún podrán ver contenido dentro del rango que se puede buscar en vivo.
LIVE_IS_MOVING_WINDOW_CHANGED Se activa cuando el rango que puede buscarse de una transmisión en vivo cambia de una ventana fija a una ventana móvil, o viceversa. En el caso de las transmisiones en vivo, esto ocurre cuando el reproductor detecta que el manifiesto quita segmentos anteriores.

Situaciones con transmisiones en vivo

Existen ocho tipos de situaciones posibles para las transmisiones en vivo, cada una de las cuales se establece mediante tres opciones de configuración principales:

  • La transmisión tiene una hora de inicio
  • La transmisión tiene una hora de finalización.
  • Los usuarios pueden realizar búsquedas en la ventana de búsqueda de la transmisión en vivo

Consulta Agrega datos de la guía del programa para obtener información sobre cómo configurar esos valores.

A continuación, se incluyen descripciones y capturas de pantalla de las situaciones admitidas por la API de Live. Las variables T1 y T2 se utilizan para representar la marca de tiempo de la izquierda y la derecha de la IU respectivamente.

Hora de inicio Hora de finalización Disponible para búsquedas T1 T2
Situación 1 No No No Cabeza de juego No se muestra
Situación 2 No No Play Head No se muestra
Situación 3 No No Play Head No se muestra
Situación 4 No Play Head No se muestra
Situación 5 No No Mostrar hora de inicio Play Head
Situación 6 No Mostrar hora de inicio Play Head
Situación 7 No Mostrar hora de inicio Mostrar hora de finalización
Situación 8 Mostrar hora de inicio Mostrar hora de finalización

Situación 1

Hora de inicio Hora de finalización Disponible para búsquedas T1 T2
No No No Cabeza de juego No se muestra

La situación 1 no tiene una hora de inicio o finalización y los usuarios no pueden realizar búsquedas en la transmisión. Cuando un usuario detiene una transmisión, la reproducción se reanuda desde el borde en vivo, en lugar de hacerlo desde donde se pausó la transmisión.

Situación siete

Una TV muestra la IU en vivo de Chromecast para la situación 7 con la hora del reloj Un teléfono celular que muestra la IU en vivo para la situación 7 con la hora del reloj

Hora de inicio Hora de finalización Disponible para búsquedas T1 T2
No Cabeza de juego Duración del programa

La situación siete tiene una hora de inicio y una de finalización, pero no se puede buscar. Las dos marcas de tiempo en la IU, T1 y T2, representan el tiempo del cabezal de reproducción actual y la duración total del programa, respectivamente. Si un usuario pausa o reanuda la reproducción, esta se reanudará en el perímetro de la transmisión en vivo. En el ejemplo anterior, la sección roja de la barra deslizante busca la parte de la transmisión desde que el usuario comenzó a mirar.

Situación ocho

Una TV que muestra la IU en vivo de Chromecast para la situación 8 con la hora del reloj Un teléfono celular que muestra la IU en vivo para la situación 8 con la hora del reloj

Hora de inicio Hora de finalización Disponible para búsquedas T1 T2
Cabeza de juego Duración del programa

La situación siete tiene una hora de inicio, una hora de finalización y se puede buscar. Las dos marcas de tiempo en la IU, T1 y T2, representan el tiempo de reproducción actual y la duración total del programa, respectivamente. Si un usuario pausa o reanuda la reproducción, la transmisión se reanudará en el momento en que se encuentre dentro de la ventana que se puede buscar. El área roja en la barra de búsqueda representa el punto en el que el usuario puede realizar una búsqueda y el área en blanco representa el punto en el que puede buscar.

Configura una situación

La configuración de una transmisión como un escenario específico en vivo se realiza en tres partes:

  1. Set Stream Type: marca la transmisión como en vivo.
  2. Agregar datos de guía del programa: establece una hora de inicio y una duración en el objeto MediaMetadata.
  3. Configurar la funcionalidad de búsqueda: habilita o inhabilita la búsqueda.

Comportamiento de la reproducción

Mientras la app esté en pausa, se actualizarán los metadatos de reproducción, incluidos los tiempos de reproducción y de los bordes del contenido en vivo. Cuando se reanuda la transmisión, hay algunos comportamientos que debes tener en cuenta que varían según la configuración de la transmisión.

Transmisiones que se pueden buscar

Cuando se reanuda una transmisión que admite búsquedas:

  • El borde activo se actualizará a la ubicación en vivo y el rango que se buscará se ajustará según corresponda.
  • Si el cabezal de reproducción salta más allá del programa actual, se actualizará la barra deslizante con los metadatos del nuevo programa (incluida la hora de inicio y de finalización, si están disponibles).
  • Si una ventana que admite búsquedas tiene una longitud "X", el rango que puede buscarse se extenderá hasta como "X" o al comienzo del programa, lo que sea menor.
  • Si el usuario estuvo en pausa durante el tiempo suficiente para que la hora actual ya no esté en la ventana de búsqueda, la transmisión se reanudará en el primer momento (extremo izquierdo) de la ventana de búsqueda.

Busca LiveSeekableRange.end para reanudar la reproducción en el borde en vivo después de reanudarla.

let playerManager = cast.framework.CastReceiverContext.getInstance().getPlayerManager();
// Intercept the message to PLAY
playerManager.setMessageInterceptor(cast.framework.messages.MessageType.PLAY, (requestData) => {
  ...
  if (playerManager.getLiveSeekableRange()) {
    // Resume playback at the live edge
    playerManager.seek(playerManager.getLiveSeekableRange().end);
  } else {
    return requestData;
  }
  ...
});

Transmisiones no detectables

Cuando se reanuda una transmisión no apta para búsquedas:

  • En este caso, se reanudará la reproducción en vivo.
  • Si el perímetro en vivo salta más allá del programa actual, se debe actualizar la barra deslizante con los metadatos del programa nuevo (incluida la hora de inicio y de finalización, si están disponibles).

Cambios en la superficie de la API y personalización de la IU en vivo

El SDK de Cast tiene compatibilidad integrada para crear interfaces de usuario personalizadas en lugar de usar la IU lista para usar. Sin embargo, es importante seguir la lista de tareas de diseño de la experiencia del usuario de Cast cuando se personaliza la interfaz.

Receptor web

En el receptor web, PlayerData incluye los siguientes campos a fin de permitir que los desarrolladores extiendan sus interfaces personalizadas para las transmisiones en vivo:

  • isLive: Es una marca que indica si la transmisión actual es una transmisión en vivo, a diferencia de VOD.
  • liveSeekableRange: el rango que se puede buscar en la pantalla que delimita la ventana de DVR.
  • mediaStartAbsoluteTime: cuándo comenzó la sección en el tiempo absoluto (Epoch de UNIX).
  • sectionStartTimeInMedia: Hora de inicio de la sección en segundos en relación con la hora de inicio del contenido multimedia.
  • sectionDuration: La duración de la sección en segundos.

Además, asegúrate de tener en cuenta los dos eventos en vivo cuando personalices la IU.

SDK de Android

Como parte de la funcionalidad en vivo, el uso del widget de barra de búsqueda de Android en UIMediaController dejó de estar disponible. En su lugar, usa CastSeekBar.