Pistas

Pistas de audio

Para la selección de pistas de audio, el SDK de receptor web proporciona una clase AudioTracksManager que simplifica y optimiza la selección de pistas, lo que te brinda más control y un mejor acceso a las propiedades, como el nombre, la URL y el idioma. Esta clase se usa mejor en el controlador de eventos para el evento cast.framework.events.EventType.PLAYER_LOAD_COMPLETE.

La API proporciona varias formas de consultar y seleccionar las pistas de audio activas. A continuación, se muestra un ejemplo de cómo seleccionar un segmento para que esté activo especificando su ID:

const context = cast.framework.CastReceiverContext.getInstance();
const playerManager = context.getPlayerManager();

playerManager.addEventListener(
  cast.framework.events.EventType.PLAYER_LOAD_COMPLETE, () => {
    const audioTracksManager = playerManager.getAudioTracksManager();

    // Get all audio tracks
    const tracks = audioTracksManager.getTracks();

    // Choose the first audio track to be active by specifying its ID
    audioTracksManager.setActiveById(tracks[0].trackId);
  });
context.start();

La clase AudioTracksManager también proporciona un método getActiveTrack().

Este es un ejemplo de cómo seleccionar la primera pista de audio para un idioma específico, en este caso en inglés:

const context = cast.framework.CastReceiverContext.getInstance();
const playerManager = context.getPlayerManager();

playerManager.addEventListener(
  cast.framework.events.EventType.PLAYER_LOAD_COMPLETE, () => {
    const audioTracksManager = playerManager.getAudioTracksManager();

    // Set the first matching language audio track to be active
    audioTracksManager.setActiveByLanguage('en');
  });
context.start();

La clase AudioTracksManager también proporciona un método getTracksByLanguage(language) que muestra todas las pistas para el idioma especificado.

El código de idioma de audio se recupera del manifiesto multimedia y debe seguir el formato RFC 5646. Los códigos de idioma se pueden presentar en una nomenclatura de 2 caracteres (como "es", "en" o "de") o una nomenclatura de 4 caracteres (como "en-us", "es-es" o "fr-ca").

Si el manifiesto de contenido multimedia sigue un estándar de código de idioma diferente, la app Receptor web debe convertirlo en un código de idioma que cumpla con RFC 5646. El SDK de Web Receptor proporciona un interceptor EDIT_AUDIO_TRACKS para realizar modificaciones:

const context = cast.framework.CastReceiverContext.getInstance();
const playerManager = context.getPlayerManager();
// Intercept the EDIT_AUDIO_TRACKS request
playerManager.setMessageInterceptor(cast.framework.messages.MessageType.EDIT_AUDIO_TRACKS, request => {
  // write logic to convert language codes here
});
context.start();

Cuando se reproduce una pausa publicitaria, cualquier selección de pista de audio, como el idioma, se realiza después de una pausa en el mismo contenido, incluso si los anuncios están en un idioma diferente.

Subtítulos

Para la selección de pistas de subtítulos, el SDK de receptor web proporciona la clase TextTracksManager que simplifica y optimiza la selección de pistas, lo que te brinda más control y un mejor acceso a las propiedades, como el nombre, la URL y el idioma.

La clase TextTracksManager se usa mejor en el controlador de eventos para el evento cast.framework.events.EventType.PLAYER_LOAD_COMPLETE.

La selección de subtítulos en el SDK de Receptor web se simplifica y se optimiza con otras partes del SDK.

La API admite el control de WebVTT, TTML y CEA-608.

La clase TextTracksManager proporciona varias formas de consultar y seleccionar una pista de subtítulos para estar activa. A continuación, se muestra un ejemplo de cómo seleccionar el primer segmento que se activará mediante la especificación de su ID:

const context = cast.framework.CastReceiverContext.getInstance();
const playerManager = context.getPlayerManager();

playerManager.addEventListener(
  cast.framework.events.EventType.PLAYER_LOAD_COMPLETE, () => {
    const textTracksManager = playerManager.getTextTracksManager();

    // Get all text tracks
    const tracks = textTracksManager.getTracks();

    // Choose the first text track to be active by its ID
    textTracksManager.setActiveByIds([tracks[0].trackId]);
  });
context.start();

La clase TextTracksManager también proporciona un método getActiveTracks().

A continuación, se muestra un ejemplo de cómo seleccionar la primera pista de texto para un idioma específico:

const context = cast.framework.CastReceiverContext.getInstance();
const playerManager = context.getPlayerManager();

playerManager.addEventListener(
  cast.framework.events.EventType.PLAYER_LOAD_COMPLETE, () => {
    const textTracksManager = playerManager.getTextTracksManager();

    // Set the first matching language text track to be active
    textTracksManager.setActiveByLanguage('en');
  });
context.start();

La clase TextTracksManager también proporciona un método getTracksByLanguage(language) que muestra todas las pistas para el idioma especificado.

El código de idioma del texto se recupera del manifiesto multimedia y debe seguir el formato RFC 5646. Los códigos de idioma se pueden presentar en una nomenclatura de 2 caracteres (como "es", "en" o "de"), o una nomenclatura de 4 caracteres (como "en-us", "es-es" o "fr-ca").

Si el manifiesto multimedia sigue un estándar de código de idioma diferente, la app Receptor web debe convertir las solicitudes entrantes en ese estándar. Estas solicitudes, como los comandos por voz, usan códigos de idioma RFC 5646. El SDK de receptor web proporciona un interceptor EDIT_TRACKS_INFO para traducir las solicitudes al estándar del manifiesto:

const context = cast.framework.CastReceiverContext.getInstance();
const playerManager = context.getPlayerManager();
// intercept the EDIT_TRACKS_INFO request
playerManager.setMessageInterceptor(cast.framework.messages.MessageType.EDIT_TRACKS_INFO, request => {
  // write logic to convert language codes here
});
context.start();

La API permite que un desarrollador agregue de forma dinámica pistas de subtítulos opcionales, en este caso para diferentes idiomas y pistas fuera de banda, y luego seleccione una pista como la nueva pista activa:

const context = cast.framework.CastReceiverContext.getInstance();
const playerManager = context.getPlayerManager();

playerManager.addEventListener(
  cast.framework.events.EventType.PLAYER_LOAD_COMPLETE, () => {

    // Create text tracks object
    const textTracksManager = playerManager.getTextTracksManager();

    // Create track 1 for English text
    const track1 = textTracksManager.createTrack();
    track1.trackContentType = 'text/vtt';
    track1.trackContentId = 'http://example.com/en.vtt';
    track1.language = 'en';

    // Create track 2 for Spanish text
    const track2 = textTracksManager.createTrack();
    const track2Id = track2.trackId;
    track2.trackContentType = 'text/vtt';
    track2.trackContentId = 'http://example.com/spa.vtt';
    track2.language = 'spa';

    // Add tracks
    textTracksManager.addTracks([track1, track2]);

    // Set the first matching language text track to be active
    textTracksManager.setActiveByLanguage('en');
  });
context.start();

Cuando se reproduce una pausa publicitaria, las selecciones de una pista de texto, como el idioma, que se realizan antes de una pausa, persisten después del pausa para el mismo contenido, incluso si los anuncios están en un idioma diferente.

Subtítulos forzados

Los subtítulos forzados o la narrativa forzada son superposiciones de texto que se muestran para que el usuario pueda entender cuándo se usa un lenguaje alternativo o para clarificar el audio. A diferencia de los subtítulos opcionales, un usuario no necesita habilitar los subtítulos forzados, ya que se seleccionan automáticamente según las preferencias de audio del usuario.

Para agregar subtítulos forzados a tu aplicación de Cast, deberás incluirlos como parte de tu manifiesto. En tu manifiesto, establece la función de la pista en forced-subtitle. Cuando el SDK de Cask detecte estas pistas, las identificará como subtítulos forzados. No se requiere trabajo de los remitentes, ya que el SDK de Cast separará los subtítulos forzados y los subtítulos opcionales. Esto significa que un usuario no podrá seleccionar un subtítulo forzado.

Cuando se habilitan los subtítulos forzados, se inhabilitan para evitar la superposición de subtítulos. Cuando están desactivados y se proporcionan subtítulos forzados en el manifiesto, se muestran según la preferencia de idioma del audio del usuario.