El SDK de Cast incluye APIs integradas para admitir contenido en vivo. Esto incluye un una IU flexible y lista para usar, junto con APIs que permiten a los desarrolladores crear recursos experiencias en vivo con solo algunas líneas de código. La API en vivo permite mostrar horas de inicio y finalización, metadatos de programas, controles de DVR y ventanas que se pueden buscar.
En esta guía, se muestra cómo configurar una transmisión a las APIs en vivo, lo que incluye muestras de código y metadatos para configurar situaciones de transmisiones en vivo principales, junto con capturas de pantalla que demuestren cómo es cada situación.
Requisitos previos
Conocer los conceptos básicos para implementar un Se requiere un receptor web para poder revisar esto . Además, para ejecutar las muestras de código, necesitarás acceso a un que se ajuste a uno de los tipos de contenido multimedia compatibles con Cast. En general, la función En vivo admite configuraciones típicas de transmisiones en vivo para el contenido multimedia compatible.
Los siguientes términos se usan en toda la guía:
- Ventana de búsqueda: Es el rango de una transmisión en vivo en la que los usuarios pueden buscar.
- Live Edge: Es la parte más reciente de una transmisión en vivo disponible para el reproductor.
- Reproducir cabeza: Es una marca de tiempo de la IU para la posición de reproducción actual.
Cómo transmitir una transmisión en vivo
Hay dos formas de configurar el SDK de Web Receiver para usar la API en vivo para contenido:
- con el interceptor de mensajes
LOAD
en tu aplicación receptora web (opción recomendada) - con una solicitud de carga generada en el lado del remitente o del receptor.
El interceptor proporciona un
LoadRequestData
que contiene todos los metadatos importantes de una solicitud de carga. Para
indica que una solicitud de carga es para una transmisión en vivo, solo tienes que
streamType
en la
mediaInformation
objeto de
StreamType.LIVE
MediaInformation.duration
debe ser -1
, ya que las instancias del reproductor son
responsable de calcularlo cuando el contenido sea 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 de programas
Las transmisiones en vivo, especialmente las de larga duración, como los canales de TV, pueden hacer lo siguiente: mostrar la guía en pantalla/metadatos de programación basados en la reproducción actual en una transmisión en vivo. Se recomienda encarecidamente que los proveedores de contenido incluyan Programación de metadatos en sus aplicaciones de receptor web para un mejor usuario final una experiencia fluida a los desarrolladores.
Puedes configurar los datos iniciales de la guía para una transmisión en el mensaje LOAD
interceptor, de la misma manera en 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
representados como
MediaMetadata
que luego se almacenan
cola.
Hay una clase MediaMetadata
diferente para diferentes tipos de programas, p.ej.,
TvShowMediaMetadata
,
MovieMediaMetadata
,
MusicTrackMediaMetadata
,
etcétera
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 el
sectionStartAbsoluteTime
propiedad. 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 en la transmisión mediante el Control expandido o controles de tacto en dispositivos táctiles.
El
LiveSeekableRange
representa el intervalo de tiempo en una transmisión durante el cual un usuario puede realizar búsquedas. En la
Web Receiver, puedes acceder a información sobre el rango que se puede buscar a través de
PlayerManager.getLiveSeekableRange()
:
que devuelve un
LiveSeekableRange
. Estas son las propiedades principales del objeto que se deben tener en cuenta:
- start: la hora de inicio (en segundos) del rango relativo al el comienzo de la transmisión en segundos.
- end: El tiempo máximo posible (en segundos) que el jugador puede buscar según los segmentos disponibles en relación con el inicio de la transmisión.
- isMovingWindow: un valor booleano que indica si el rango que admite búsquedas (es decir, se quitan del manifiesto los segmentos más antiguos) con la transmisión, debe ser true para todas las transmisiones en vivo.
- isLiveDone: un valor booleano que indica si la transmisión en vivo ha finalizado, lo que significa que no se generan segmentos nuevos.
El tamaño del rango que admite búsquedas, representado como el tiempo entre start
y
end
, se determina por la cantidad de segmentos disponibles en la transmisión y
moverse con la transmisión. Por ejemplo, si, al inicio de la transmisión, el bloque
rango es {start:0, end: 600, isMovingWindow: false, isLiveDone: false}
, diez
segundos después del inicio de la transmisión puede volverse {start: 10, end: 610,
isMovingWindow: true, isLiveDone: false}
. Es importante tener en cuenta el inicio y
las horas de finalización del intervalo que admite búsquedas se actualizan según el tiempo que demore
generar un segmento nuevo. Por lo tanto, si la longitud típica de un segmento para tu transmisión
es de 10 segundos, las horas de inicio y finalización se actualizarán cada 10 segundos conforme
en la nube.
Inhabilitar el salto
Para inhabilitar la búsqueda en una transmisión, debes quitar la función de búsqueda. desde los comandos multimedia compatibles en el receptor web:
// disable seeking in the LOAD messageInterceptor
playerManager.removeSupportedMediaCommands(cast.framework.messages.Command.SEEK, true);
Se está quitando el comando multimedia compatible para los indicadores SEEK
a las aplicaciones emisoras
y pantallas táctiles para inhabilitar la búsqueda, pero no inhabilita los comandos por voz,
como “Hey Google, retrocede 30 segundos”. Consulta la
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
LiveStatusEvent
que contiene el rango actual que admite búsquedas.
Evento | Descripción |
---|---|
LIVE_ENDED |
Se activa cuando termina una transmisión en vivo. En este punto, el valor end en LiveSeekableRange dejará de actualizarse. los usuarios aún podrán ver contenido dentro del rango de búsqueda en vivo. |
LIVE_IS_MOVING_WINDOW_CHANGED |
Se activa cuando el rango que admite búsquedas de una transmisión en vivo cambia de una ventana fija a una móvil, o viceversa. En el caso de una transmisión en vivo, esto sucederá cuando el jugador detecte que el manifiesto está quitando los segmentos anteriores. |
Situaciones de transmisiones en vivo
Existen ocho tipos de situaciones posibles para las transmisiones en vivo, cada una de las cuales se establecen estableciendo tres parámetros 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 dentro de la ventana de búsqueda de la transmisión en vivo.
Consulta Cómo agregar datos de la guía del programa para ver cómo realizar la configuración. esos valores.
A continuación, se incluyen descripciones y capturas de pantalla de las situaciones que se admiten en la transmisión en vivo en la API de Cloud. Las variables T1 y T2 se usan para representar la marca de tiempo en el izquierda y derecha de la IU, respectivamente.
Hora de inicio | Hora de finalización | Buscable | T1 | T2 | |
---|---|---|---|---|---|
Situación 1 | No | No | No | Cabeza de juego | No se muestra |
Situación 7 | Sí | Sí | No | Mostrar hora de inicio | Mostrar hora de finalización |
Situación 8 | Sí | Sí | Sí | Mostrar hora de inicio | Mostrar hora de finalización |
Situación uno
Hora de inicio | Hora de finalización | Buscable | T1 | T2 |
---|---|---|---|---|
No | No | No | Cabeza de juego | No se muestra |
La situación 1 no tiene una hora de inicio ni de finalización, y los usuarios no pueden realizar búsquedas dentro del en tiempo real. Cuando un usuario detiene una transmisión, se reanudará la reproducción desde el perímetro en vivo. en el que se detuvo la transmisión.
Situación siete
Hora de inicio | Hora de finalización | Buscable | T1 | T2 |
---|---|---|---|---|
Sí | Sí | 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. Los dos Las marcas de tiempo en la IU, T1 y T2, representan el tiempo de reproducción y el total actuales. la duración del programa, respectivamente. Si un usuario pausa o reanuda la reproducción, reanudar en la conexión en vivo de la transmisión. En el ejemplo anterior, la sección roja de la barra de búsqueda representa la parte de la transmisión desde que el usuario comenzó mirando.
Situación ocho
Hora de inicio | Hora de finalización | Buscable | T1 | T2 |
---|---|---|---|---|
Sí | Sí | Sí | Cabeza de juego | Duración del programa |
La situación siete tiene una hora de inicio y una de finalización, y se pueden realizar búsquedas en ella. Las dos marcas de tiempo en la IU, los niveles 1 y 2 representan el tiempo de reproducción actual y el programa total respectivamente. Si un usuario pausa o reanuda la reproducción, se reanudará la transmisión. en el momento en que hicieron una pausa si está dentro de la ventana que se puede buscar (el área en rojo en la barra deslizante representa el lugar hasta el que un usuario puede buscar información y el área en blanco. representa dónde pueden buscar.
Configura una situación
La configuración de una transmisión como una situación en vivo específica se realiza en tres partes:
- Establecer tipo de transmisión: Marca la transmisión como transmisión en vivo.
- Agregar datos de la guía del programa: Establece una hora de inicio.
y la duración en el objeto
MediaMetadata
. - Configurar la función de búsqueda: habilita o inhabilitar la búsqueda.
Comportamiento de reproducción
Mientras esté en pausa, los metadatos de reproducción seguirán actualizados en la IU. Incluye los tiempos del cabezal de reproducción y los tiempos perimetrales en vivo. Al reanudar la transmisión, hay hay algunos comportamientos para tener en cuenta que varían según la configuración de la transmisión.
Transmisiones que pueden buscarse
Después de que se reanuda una transmisión que se puede buscar:
- El perímetro activo se actualizará a la ubicación en tiempo real y al rango de búsqueda. se ajustarán según corresponda.
- Si el cabezal de reproducción salta más allá del programa actual, se actualizará la barra de arrastre con los metadatos del nuevo programa (incluida la hora de inicio y la de finalización si disponibles).
- Si una ventana que admite búsquedas tiene una longitud 'X', el rango se extenderá hasta "X" como máximo, o al comienzo del programa, lo que sea menor.
- Si el usuario estuvo detenido el tiempo suficiente como para que la hora actual ya no sea en la ventana que se puede buscar, la transmisión se reanudará en el momento más temprano (a la izquierda). de la ventana que se puede buscar.
Ir a
LiveSeekableRange.end
para reanudar la reproducción en el perímetro 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 buscables
Después de que se reanuda una transmisión no buscable:
- En este caso, la reproducción se reanudará en el perímetro activo.
- Si el borde activo salta más allá del programa actual, la barra de arrastre se debe se actualizaron con los metadatos del nuevo programa (incluida la hora de inicio y la de tiempo si está disponible).
Cambios en la plataforma de las APIs y personalizar la IU en vivo
El SDK de Cast tiene compatibilidad integrada para crear interfaces de usuario personalizadas, en lugar de con la IU lista para usar. Sin embargo, es importante seguir Lista de tareas de diseño de UX de Cast cuando personalices interfaz de usuario.
Receptor web
En el receptor web, la
PlayerData
incluye los siguientes campos para permitir que los desarrolladores extiendan sus
interfaces para transmisiones en vivo:
- isLive: Es una marca que indica si la transmisión actual es una transmisión en vivo. en comparación con VOD.
- liveSeekableRange: el rango que se puede buscar que se mostrará en la demarcación de pantalla la ventana de DVR.
- mediaStartAbsoluteTime: Cuándo comenzó la sección en tiempo absoluto (UNIX Epoch).
- sectionStartTimeInMedia: hora de inicio de la sección en segundos en relación con la hora de inicio del contenido multimedia.
- sectionDuration: Es la duración de la sección en segundos.
Además, asegúrate de tener en cuenta la dos eventos en vivo cuando personalices la IU.
SDK de Android
Como parte de la funcionalidad En vivo, el uso del widget de la barra de búsqueda de Android en la
UIMediaController
dejó de estar disponible. En su lugar, usa CastSeekBar
.