Esta página contiene fragmentos de código y descripciones de las funciones disponibles para una app receptora web personalizada.
- Un elemento
cast-media-player
que representa la IU del reproductor integrado que se proporcionan con el receptor web. - Estilos personalizados similares a los de CSS para el elemento
cast-media-player
a fin de aplicar ajustes de diseño a varios elementos de la IU, comobackground-image
,splash-image
yfont-family
- Un elemento de secuencia de comandos para cargar el framework del receptor web.
- Código JavaScript para interceptar mensajes y controlar eventos.
- Fila para reproducción automática.
- Opciones para configurar la reproducción.
- Opciones para establecer el contexto del receptor web.
- Opciones para establecer comandos que son compatibles con la app del receptor web.
- Una llamada de JavaScript para iniciar la aplicación del receptor web.
Configuración y opciones de la aplicación
Configura la aplicación
El
CastReceiverContext
es la clase más externa expuesta al desarrollador y administra la carga de
y controla la inicialización del SDK del receptor web. El SDK
proporciona APIs que permiten a los desarrolladores de aplicaciones configurar el SDK a través de
CastReceiverOptions
Estos parámetros de configuración se evalúan una vez por inicio de la aplicación y se pasan a
el SDK cuando configures el parámetro opcional en la llamada a
start
En el siguiente ejemplo, se muestra cómo anular el comportamiento predeterminado para detectar si un
la conexión del remitente
sigue conectada de forma activa. Cuando el receptor web no haya
hayas podido comunicarte con un remitente por
maxInactivity
segundos, se despacha un evento SENDER_DISCONNECTED
. La siguiente configuración
anula este tiempo de espera. Esto puede ser útil para depurar problemas, ya que evita
que la app receptora web cierre la sesión del depurador remoto de Chrome cuando haya
no hay remitentes conectados en el estado IDLE
.
const context = cast.framework.CastReceiverContext.getInstance();
const options = new cast.framework.CastReceiverOptions();
options.maxInactivity = 3600; // Development only
context.start(options);
Configura el reproductor
Cuando se carga contenido, el SDK del receptor web proporciona una forma de configurar la reproducción
como DRM,
información,
de configuración de reintento y solicitudes
cast.framework.PlaybackConfig
Esta información es manejada por
PlayerManager
y se evalúa en el momento en que se crean los jugadores. Se crean los jugadores
cada vez que se pasa una carga nueva al SDK del receptor web. Modificaciones a las
PlaybackConfig
después de que se crea el reproductor se evalúan en la siguiente
carga de contenido. El SDK proporciona los siguientes métodos para modificar la
PlaybackConfig
CastReceiverOptions.playbackConfig
para anular las opciones de configuración predeterminadasCastReceiverContext
PlayerManager.getPlaybackConfig()
para obtener la configuración actual.PlayerManager.setPlaybackConfig()
para anular la configuración actual. Este parámetro de configuración se aplica a todos en las cargas posteriores o hasta que se anule de nuevo.PlayerManager.setMediaPlaybackInfoHandler()
para aplicar configuraciones adicionales solo para el elemento multimedia que se carga la parte superior de la configuración actual. Se llama al controlador justo antes del reproductor. de la creación de cuentas de servicio. Los cambios que se hagan aquí no son permanentes y no se incluyen en las consultas agetPlaybackConfig()
. Cuando se cargue el siguiente elemento multimedia, este controlador cuando se vuelve a llamar.
En el siguiente ejemplo, se muestra cómo configurar PlaybackConfig
cuando se inicializa el
CastReceiverContext
La configuración anula las solicitudes salientes de
obtener manifiestos. El controlador especifica que las solicitudes de Control de acceso de CORS
deben crearse con credenciales como cookies o encabezados de autorización.
const playbackConfig = new cast.framework.PlaybackConfig();
playbackConfig.manifestRequestHandler = requestInfo => {
requestInfo.withCredentials = true;
};
context.start({playbackConfig: playbackConfig});
En el siguiente ejemplo, se muestra cómo anular PlaybackConfig
con el método get
y set en PlayerManager
. Este parámetro configura el reproductor para
reanudar la reproducción de contenido después de que se haya cargado 1 segmento
const playerManager =
cast.framework.CastReceiverContext.getInstance().getPlayerManager();
const playbackConfig = (Object.assign(
new cast.framework.PlaybackConfig(), playerManager.getPlaybackConfig()));
playbackConfig.autoResumeNumberOfSegments = 1;
playerManager.setPlaybackConfig(playbackConfig);
En el siguiente ejemplo, se muestra cómo anular el PlaybackConfig
para una carga específica
con el controlador de información de reproducción multimedia. El controlador llama a una aplicación
implementó el método getLicenseUrlForMedia
para obtener licenseUrl
del
contentId
del elemento actual.
playerManager.setMediaPlaybackInfoHandler((loadRequestData, playbackConfig) => {
const mediaInformation = loadRequestData.media;
playbackConfig.licenseUrl = getLicenseUrlForMedia(mediaInformation.contentId);
return playbackConfig;
});
Receptor de eventos
El SDK de receptor web permite que tu app de receptor web controle los eventos del reproductor. El
el objeto de escucha de eventos toma un
cast.framework.events.EventType
parámetro (o un array de estos parámetros) que especifica los eventos que
debería activar el objeto de escucha. Arrays preconfigurados
cast.framework.events.EventType
, que son útiles para la depuración, se pueden encontrar en
cast.framework.events.category
El parámetro de evento proporciona información adicional sobre el evento.
Por ejemplo, si quieres saber cuándo un
mediaStatus
se transmite el cambio, puedes usar la siguiente lógica para manejar el
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
});
Intercepción de mensajes
El SDK del receptor web permite que tu aplicación del receptor web intercepte mensajes y
ejecutar código personalizado en esos mensajes. El interceptor de mensajes toma un
cast.framework.messages.MessageType
parámetro que especifica el tipo de mensaje que se debe interceptar.
El interceptor debería devolver la solicitud modificada o una promesa que resuelva el problema.
con el valor de la solicitud modificado. Si devuelves null
, no se llamará a
controlador de mensajes predeterminado. Consulta Cómo cargar contenido multimedia para obtener más información.
Por ejemplo, si quieres cambiar los datos de la solicitud de carga, puedes usar el la siguiente lógica para interceptarlo y 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();
Manejo de errores
Cuando se producen errores en el interceptor de mensajes, tu app receptora web debería devolver
una apropiada
cast.framework.messages.ErrorType
y
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;
});
});
Intercepción de mensajes frente a objeto de escucha de eventos
Algunas diferencias clave entre la intercepción de mensajes y el objeto de escucha de eventos son las siguientes: sigue:
- Un objeto de escucha de eventos no te permite modificar los datos de la solicitud.
- Un objeto de escucha de eventos es mejor para activar estadísticas o una función personalizada.
playerManager.addEventListener(cast.framework.events.category.CORE,
event => {
console.log(event);
});
- La intercepción de mensajes te permite escucharlos, interceptarlos y modificar los datos de la solicitud en sí.
- La intercepción de mensajes se utiliza mejor para manejar la lógica personalizada en relación con lo siguiente: solicitar datos.
Carga de contenido multimedia
MediaInformation
proporciona varias propiedades para cargar contenido multimedia en la
cast.framework.messages.MessageType.LOAD
, incluido el entity
,
contentUrl
y contentId
.
- La
entity
es la propiedad sugerida para que uses en la implementación, tanto para las URLs de envío apps receptoras. La propiedad es una URL de vínculo directo que puede ser una playlist o contenido multimedia. La aplicación debe analizar esta URL y propagar al menos uno de los otros dos campos. - La
contentUrl
corresponde a la URL reproducible que usará el reproductor para cargar el contenido. Por ejemplo, esta URL podría dirigir a un manifiesto de DASH. - La
contentId
Puede ser una URL de contenido reproducible (similar a la decontentUrl
propiedad) o un identificador único del contenido o la playlist que se está cargando. Si usas esta propiedad como identificador, tu aplicación debe completar un URL reproducible encontentUrl
.
La sugerencia es usar entity
para almacenar el ID real o los parámetros clave.
Usa contentUrl
para la URL del contenido multimedia. Un ejemplo de esto se muestra en el
el siguiente fragmento, en el que entity
está presente en la solicitud LOAD
y
se recupera contentUrl
reproducible:
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;
});
});
Funciones del dispositivo
El
getDeviceCapabilities
proporciona información del dispositivo en el dispositivo de transmisión conectado y el video o
dispositivo de audio conectado a él. El método getDeviceCapabilities
proporciona compatibilidad
información de Asistente de Google, Bluetooth y la pantalla y el audio conectados
dispositivos.
Este método devuelve un objeto que puedes consultar pasando uno de los
para obtener la capacidad del dispositivo para esa enumeración. Las enumeraciones son
definidos en
cast.framework.system.DeviceCapabilities
En este ejemplo, se comprueba si el dispositivo receptor web es capaz de reproducir contenido HDR y
DolbyVision (DV) con las teclas IS_HDR_SUPPORTED
y IS_DV_SUPPORTED
,
respectivamente.
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();
Cómo controlar la interacción del usuario
Un usuario puede interactuar con tu aplicación de receptor web a través del remitente apps (Web, iOS y Android), comandos por voz compatibles con el Asistente dispositivos, controles de tacto en pantallas inteligentes y controles remotos en Android TV dispositivos. El SDK de Cast proporciona varias APIs para permitir que la app del receptor web realice lo siguiente: para manejar estas interacciones, actualizar la IU de la aplicación con estados de las acciones del usuario, y, de manera opcional, envía los cambios para actualizar cualquier servicio de backend.
Comandos multimedia compatibles
Los estados de los controles de la IU son controlados por el
MediaStatus.supportedMediaCommands
para controladores expandidos, receptores y controles remotos de iOS y Android
apps que se ejecutan en dispositivos táctiles y apps receptoras en dispositivos Android TV. Cuando un elemento
Command
a nivel de bits particular en la propiedad, los botones que son
relacionadas con esa acción estén habilitadas. Si no se establece el valor, entonces el botón
inhabilitado. Estos valores se pueden cambiar en el receptor web de la siguiente manera:
- Usando
PlayerManager.setSupportedMediaCommands
para establecerCommands
- Agregar un nuevo comando con
addSupportedMediaCommands
- Quitar un comando existente con
removeSupportedMediaCommands
playerManager.setSupportedMediaCommands(cast.framework.messages.Command.SEEK |
cast.framework.messages.Command.PAUSE);
Cuando el receptor prepare el MediaStatus
actualizado, incluirá lo siguiente:
cambios en la propiedad supportedMediaCommands
. Cuando el estado es
transmitida, las apps emisoras conectadas actualizarán los botones de su IU
según corresponda.
Para obtener más información sobre dispositivos táctiles y comandos multimedia compatibles, consulta
Accessing UI controls
.
Cómo administrar los estados de acción del usuario
Cuando los usuarios interactúan con la IU o envían comandos por voz, pueden controlar el
reproducción del contenido y las propiedades relacionadas con el elemento que se está reproduciendo. Solicitudes
que controlan la reproducción
son controladas automáticamente por el SDK. Solicitudes que
modificar las propiedades del elemento que se está reproduciendo, como un comando LIKE
,
requerir que la aplicación receptora los maneje. El SDK proporciona una serie de
para manejar estos tipos de solicitudes. Para respaldar estas solicitudes, se requiere lo siguiente:
se debe realizar:
- Establece el
MediaInformation
.userActionStates
con las preferencias del usuario cuando se carga un elemento multimedia. - Intercepta los mensajes
USER_ACTION
y determina la acción solicitada. - Actualiza el
UserActionState
deMediaInformation
para actualizar la IU.
En el siguiente fragmento, se intercepta la solicitud LOAD
y se propaga
MediaInformation
de LoadRequestData
. En este caso, al usuario le gusta
el contenido que se carga.
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;
});
El siguiente fragmento intercepta el mensaje USER_ACTION
y controla las llamadas
el backend con el cambio solicitado. Luego, hace una llamada para actualizar la
UserActionState
en el receptor
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;
});
});
El siguiente fragmento simula una llamada a un servicio de backend. La función verifica
UserActionRequestData
para ver el tipo de cambio que solicitó el usuario
y solo hace una llamada de red
si el backend admite la acción.
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));
}
});
}
El siguiente fragmento toma el UserActionRequestData
y agrega o
quita el UserActionState
de MediaInformation
. Actualiza el
UserActionState
de MediaInformation
cambia el estado del botón que
se asocia con la acción solicitada. Este cambio se refleja en el modelo de
IU de controles de pantalla, IU de Android TV y app de control remoto. También se usa
que se transmite a través de mensajes salientes de MediaStatus
para actualizar la IU del
controlador expandido para remitentes de iOS y 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;
}
Comandos por voz
Los siguientes comandos multimedia son compatibles actualmente con el SDK del receptor web para
Dispositivos compatibles con el Asistente. Las implementaciones predeterminadas de estos comandos son
se encuentran en
cast.framework.PlayerManager
Comando | Descripción |
---|---|
Reproducir | Reproduce o reanuda la reproducción desde el estado de pausa. |
Pausar | Pausa el contenido que se está reproduciendo. |
Anterior | Saltar al elemento multimedia anterior de la fila de contenido multimedia |
Siguiente | Pasa al siguiente elemento multimedia de la fila de contenido multimedia. |
Detener | Detén el contenido multimedia que se está reproduciendo. |
No repetir | Inhabilita la repetición de elementos multimedia en la fila una vez que el último elemento de la fila termine de reproducirse. |
Repetir sencillo | Repetir indefinidamente el contenido multimedia que se está reproduciendo |
Repetir todo | Repite todos los elementos en la fila una vez que se reproduzca el último elemento de la fila. |
Repetir todo y reproducir aleatoriamente | Cuando se termine de reproducir el último elemento de la fila, mezcla la fila y repite todos los elementos de la fila. |
Reproducción aleatoria | Reproduce aleatoriamente los elementos multimedia de tu fila. |
Subtítulos opcionales ACTIVADOS / DESACTIVADOS | Habilita o inhabilita los subtítulos para tu contenido multimedia. Las opciones de habilitar o inhabilitar también están disponibles según el idioma. |
Buscar tiempo absoluta | Salta al tiempo absoluto especificado. |
Búsqueda de la hora relativa a la hora actual | Adelantar o retroceder un período de tiempo especificado en relación con el tiempo de reproducción actual |
Volver a jugar | Reinicia el contenido multimedia que se está reproduciendo o reproduce el último si no se está reproduciendo nada. |
Establece la velocidad de reproducción | Variar la velocidad de reproducción del contenido multimedia Esto se debe controlar de forma predeterminada. Puedes usar el interceptor de mensajes SET_PLAYBACK_RATE para anular las solicitudes de frecuencia entrantes. |
Comandos multimedia compatibles con la voz
Para evitar que un comando por voz active un comando multimedia en un Asistente, sigue estos pasos:
habilitado, primero debes configurar el
comandos de contenido multimedia compatibles
que planeas respaldar. Luego, debes aplicar esos comandos habilitando
el
CastReceiverOptions.enforceSupportedCommands
propiedad. La IU de los dispositivos táctiles y remitentes del SDK de Cast cambiará a
reflejan estas configuraciones. Si la marca no está habilitada, la ventana de
se ejecutarán comandos.
Por ejemplo, si permites PAUSE
desde tus aplicaciones emisoras y
dispositivos táctiles, también debes configurar tu receptor para que refleje esos
configuración. Cuando se configura, se descartará cualquier comando por voz entrante si no lo hace
incluido en la lista de comandos compatibles.
En el siguiente ejemplo, proporcionamos CastReceiverOptions
cuando comenzamos
CastReceiverContext
Agregamos compatibilidad con el comando PAUSE
y
para que el jugador admita solo ese comando. Ahora, si un comando por voz
solicita otra operación, como SEEK
, se rechazará. El usuario será
y se te notifica que el comando aún no es compatible.
const context = cast.framework.CastReceiverContext.getInstance();
context.start({
enforceSupportedCommands: true,
supportedCommands: cast.framework.messages.Command.PAUSE
});
Puedes aplicar lógica independiente para cada comando que quieras restringir. Quitar
la marca enforceSupportedCommands
y para cada comando que quieras ejecutar
restringir, puedes interceptar el mensaje entrante. Aquí interceptamos la solicitud
que proporciona el SDK para que los comandos de SEEK
se envíen a dispositivos compatibles con el Asistente
no actives una búsqueda en tu aplicación del receptor web.
Para los comandos de medios que tu aplicación no admita, devuelve una respuesta
un motivo de error, como
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;
});
Reproducción en segundo plano de la actividad de voz
Si la plataforma de transmisión reproduce en segundo plano el sonido de tu aplicación debido a Asistente
actividad, como escuchar el discurso de un usuario o responder, una
FocusState
el mensaje de NOT_IN_FOCUS
se envía a la aplicación del receptor web cuando la
inicio de la actividad. Se envía otro mensaje con IN_FOCUS
cuando finaliza la actividad.
Según tu aplicación y el contenido multimedia que se esté reproduciendo, es posible que quieras
Pausa el contenido multimedia cuando FocusState
es NOT_IN_FOCUS
interceptando el mensaje
escribe FOCUS_STATE
.
Por ejemplo, no es una buena experiencia del usuario pausar la reproducción de un audiolibro si la Asistente está respondiendo a una consulta del usuario.
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;
});
Idioma de subtítulos especificado por voz
Si un usuario no indica explícitamente el idioma de los subtítulos, el
El idioma que se usa para los subtítulos es el mismo en el que se pronunció el comando.
En estas situaciones,
isSuggestedLanguage
parámetro del mensaje entrante indica si el idioma asociado fue
sugerido o solicitado explícitamente por el usuario.
Por ejemplo, isSuggestedLanguage
se configura como true
para el comando "Hey Google,
activar los subtítulos", porque el idioma se infirió a partir del idioma
en el que se pronunció el comando. Si el idioma se solicita explícitamente, como en "OK"
Google, activa los subtítulos en inglés isSuggestedLanguage
se configura como false
.
Metadatos y transmisión de voz
Si bien el receptor web maneja los comandos de voz de forma predeterminada, deberías Garantizar que los metadatos de tu contenido estén completos y sean precisos. Esto garantiza que los comandos por voz son administrados correctamente por el Asistente y que los metadatos se adapte correctamente a los nuevos tipos de interfaces, como la app de Google Home y con pantallas inteligentes, como Google Home Hub.
Transferencia de transmisión
Preservar el estado de la sesión es la base de la transferencia de transmisión, en la que los usuarios pueden transferir transmisiones de audio y video existentes entre dispositivos mediante comandos por voz, Google Home una app o una pantalla inteligente. 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 funcionar como fuente o destino en un de transmisión continua.
El flujo de eventos para la transferencia de transmisión es el siguiente:
- En el dispositivo de origen:
- El contenido multimedia se detiene.
- La aplicación del receptor web recibe un comando para guardar el contenido multimedia actual. para cada estado.
- Se cerró la aplicación del receptor web.
- En el dispositivo de destino:
- Se cargó la aplicación del receptor web.
- La aplicación del receptor web recibe un comando para restablecer el contenido multimedia guardado. para cada estado.
- Se reanudará la reproducción del contenido multimedia.
Entre los elementos del estado multimedia, se incluyen los siguientes:
- Es la posición o la marca de tiempo específica de la canción, el video o el elemento multimedia.
- Su lugar en una fila más amplia (como una playlist o la radio de un artista)
- El usuario autenticado
- Estado de reproducción (por ejemplo, reproducción o pausado)
Habilitando la transferencia de transmisión
Para implementar la transferencia de transmisión en tu receptor web, sigue estos pasos:
- Actualizar
supportedMediaCommands
con el comandoSTREAM_TRANSFER
:playerManager.addSupportedMediaCommands( cast.framework.messages.Command.STREAM_TRANSFER, true);
- De manera opcional, anula los mensajes
SESSION_STATE
yRESUME_SESSION
interceptores, como se describe en Cómo conservar la sesión estado. Solo anula estos valores si se necesitan datos personalizados se almacene como parte de la instantánea de la sesión. De lo contrario, el valor predeterminado la implementación para preservar los estados de la sesión admitirá la transferencia de transmisión.
Conserva el estado de la sesión
El SDK del receptor web proporciona una implementación predeterminada para las apps del receptor web para conservar los estados de la sesión tomando una instantánea del estado actual del contenido multimedia, convirtiendo el estado en una solicitud de carga y reanudar la sesión con la solicitud de carga.
La solicitud de carga que genera el receptor web se puede anular en el
Interceptor de mensajes SESSION_STATE
si es necesario. Si quieres agregar datos personalizados
en la solicitud de carga, te sugerimos
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;
});
Los datos personalizados se pueden recuperar
loadRequestData.customData
en el interceptor de mensajes 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;
});
Carga previa de contenido
El receptor web admite la precarga de elementos multimedia después de la reproducción actual. elemento en la fila.
La operación de precarga descarga previamente varios segmentos de la los próximos elementos. La especificación se realiza preloadTime en la Objeto QueueItem (valor predeterminado en 20 segundos si no se proporciona). La hora se expresa en segundos, en relación con el final del elemento que se está reproduciendo en ese momento . Solo los valores positivos válido. Por ejemplo, si el valor es 10 segundos, este elemento se precargará 10 segundos segundos antes de que el elemento anterior haya finalizado. Si el tiempo de precarga es mayor que el tiempo restante en el elemento currentItem, la precarga se producirá apenas como sea posible. Entonces, si se especifica un valor muy grande de precarga en el elemento queueItem, podría lograr el efecto de que cuando estamos reproduciendo el elemento actual del que ya está precargando el siguiente elemento. Sin embargo, dejamos la configuración y la elección de esto al desarrollador, ya que este valor puede afectar el rendimiento del ancho de banda y de la transmisión del elemento que se está reproduciendo.
La precarga funcionará para contenido de transmisión HLS, DASH y Smooth de forma predeterminada.
Los archivos de audio y video MP4 normales, como MP3, no se precargarán como Cast los dispositivos admiten un solo elemento multimedia y no se pueden usar para precargar mientras hay una el elemento de contenido existente aún se está reproduciendo.
Mensajes personalizados
El intercambio de mensajes es el método de interacción clave para las aplicaciones del receptor web.
Un remitente envía mensajes a un receptor web a través de las APIs de remitente para el
la plataforma en la que se ejecuta el remitente (Android, iOS o la Web). El objeto de evento (que
es la manifestación de un mensaje) que se pasa a los objetos de escucha de eventos tiene un
elemento de datos (event.data
) en el que los datos adquieren las propiedades del
un tipo de evento específico.
Una aplicación de receptor web puede optar por escuchar mensajes en un espacio de nombres. En ese sentido, se dice que la aplicación receptora web admite ese protocolo de espacio de nombres. Luego, depende de los remitentes conectados que lo deseen. para comunicarse en ese espacio de nombres para usar el protocolo adecuado.
Todos los espacios de nombres se definen con una cadena y deben comenzar con "urn:x-cast:
"
seguida de cualquier cadena. Por ejemplo:
“urn:x-cast:com.example.cast.mynamespace
”
Este es un fragmento de código para que el receptor web escuche los mensajes personalizados de remitentes conectados:
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();
De forma similar, las aplicaciones de receptor web pueden mantener a los remitentes informados sobre el estado
del receptor web enviando mensajes a remitentes conectados. Un receptor web
aplicación puede enviar mensajes usando
sendCustomMessage(namespace, senderId, message)
activado
CastReceiverContext
Un receptor web puede enviar mensajes a un remitente individual, ya sea en respuesta a
un mensaje recibido o debido a un cambio de estado de la aplicación. Más allá de la orientación punto a punto
(con un límite de 64 KB), un receptor web también puede transmitir mensajes a
a todos los remitentes conectados.
Transmitir para dispositivos de audio
Consulta la guía de Google Cast para dispositivos de audio para obtener asistencia con el audio. solo la reproducción.
Android TV
En esta sección, se explica cómo Google Web Receiver usa tus entradas para la reproducción. y Android TV.
Cómo integrar tu aplicación con el control remoto
El Google Web Receiver que se ejecuta en el dispositivo Android TV traduce la entrada de
las entradas de control del dispositivo (es decir, el control remoto de mano) como reproducción de contenido multimedia
los mensajes definidos para el espacio de nombres urn:x-cast:com.google.cast.media
, como
que se describen en Mensajes de reproducción de contenido multimedia Tu
La app debe admitir estos mensajes para controlar los medios
la reproducción para permitir el control de reproducción básico desde el control de Android TV
de datos.
Lineamientos para la compatibilidad con Android TV
Estas son algunas recomendaciones y errores comunes que se deben evitar para garantizar Si tu aplicación es compatible con Android TV:
- Ten en cuenta que la cadena user-agent contiene "Android" y "CrKey"; algunos sitios pueden redireccionar a un sitio solo para dispositivos móviles porque detectan la “Android” etiqueta. No asumas que "Android" En la cadena user-agent siempre indica un usuario de dispositivo móvil.
- La pila de contenido multimedia de Android puede usar una GZIP transparente para recuperar datos. Asegúrate de que
tus datos multimedia pueden responder a
Accept-Encoding: gzip
. - Los eventos multimedia HTML5 de Android TV pueden activarse en momentos diferentes del Chromecast, esto puede revelar problemas ocultos en el Chromecast.
- Cuando actualices el contenido multimedia, usa los eventos relacionados con el contenido multimedia que activa
<audio>/<video>
. elementos, comotimeupdate
,pause
ywaiting
. Evita usar herramientas de redes eventos relacionados, comoprogress
,suspend
ystalled
, ya que suelen ser depende de la plataforma. Consulta Eventos multimedia. para obtener más información sobre cómo controlar eventos multimedia en tu app receptora. - Cuando configures los certificados HTTPS del sitio receptor, asegúrate de incluir certificados de la AC intermedios. Consulta la Página de prueba de SSL de Qualsys para verificar si la ruta de certificación de confianza para tu sitio incluye una AC certificado con la etiqueta "descarga adicional", es posible que no se cargue con dispositivos Android y plataformas de Google Cloud.
- Mientras Chromecast muestra la página del receptor en un plano gráfico de 720p, Las plataformas de transmisión, como Android TV, pueden mostrar la página en hasta 1080p. Asegúrate de que la página del receptor se ajusta bien a las distintas resoluciones.