Integración con ExoPlayer

En este documento, se proporciona una descripción general de las colas y la compatibilidad con la integración de DRM.

Mejoras de DRM

La demostración de transmisión de ExoPlayer se actualizó para utilizar una forma estructurada de pasar la configuración de DRM mediante MediaInfo de ExoPlayer a una aplicación receptora. La muestra de Cast también usa un receptor de demostración que incluye el mismo código en esta descripción general, lo que te permite probar la compatibilidad con DRM. Sin embargo, si quieres transmitir contenido protegido por DRM, debes compilar y alojar tu propio receptor web.

Antes de comenzar, sería útil que te familiarices con la documentación sobre la compatibilidad de DRM en Google Cast y ExoPlayer. En esta descripción general, se muestra cómo conectar la configuración de DRM de ExoPlayer con un receptor web. Para obtener información sobre cómo usar DRM en ExoPlayer, consulta el sitio web oficial de ExoPlayer.

Proporciona la configuración de DRM

La app de demostración de ExoPlayer contiene código de muestra que indica cómo proporcionar configuración de DRM como parte de un MediaItem. Las cuatro opciones que puedes configurar son las siguientes:

  • Encabezados: Un diccionario de encabezados que se aplican a la solicitud HTTPS para recuperar la licencia de DRM.
  • URL de la licencia: La URL que se usa para adquirir la licencia.
  • Sistema de protección: El esquema de protección DRM que se usa para proteger el contenido (por ejemplo, Widevine).

La configuración de DRM que proporcionas a ExoPlayer se envía a tu aplicación receptora como una propiedad en customData en el objeto MediaInformation como parte de una solicitud de carga. De forma predeterminada, esta propiedad se denomina exoPlayerConfig, que coincide con la siguiente definición.

/**
 * Extended configuration settings for ExoPlayer.
 */
ExoPlayerConfig class {
   constructor() {
    /**
     * Dictionary of headers to apply to the license request.
     * @type {!Object|undefined}
     */
    this.headers;

    /**
     * The URL for your DRM server.
     * @type {string|undefined}
     */
    this.licenseUrl;

    /**
     * Preferred protection system to use for decrypting content.
     * @type {!cast.framework.ContentProtection|undefined}
     */
    this.protectionSystem;

    /**
     * Indicates whether CORS Access-Control requests should be made using
     * credentials such as cookies or authorization headers.
     *
     * If withCredentials is set to true then Access-Control-Allow-Origin cannot
     * be set to '*'.
     * @type {boolean|undefined}
     */
    this.withCredentials;
  }
}

Configuración inicial

Según la solución de DRM que uses, es posible que debas configurar un licenseRequestHandler y un mediaPlaybackInfoHandler. licenseRequestHandler te permite personalizar la forma en que CAF solicita una licencia a tu servidor de claves de licencia. mediaPlaybackInfoHandler te permite modificar el PlaybackConfig por elemento multimedia si, por ejemplo, cada contenido debe usar una URL de servidor de licencias diferente.

Para capturar una copia del ExoPlayerConfig de cada objeto de solicitud de carga, crea un interceptor de solicitud de carga en tu aplicación del SDK de Web Receiver.

El primer paso es registrar los controladores antes de iniciar la aplicación de Cast.

const context = cast.framework.CastReceiverContext.getInstance();
const playbackConfig = new cast.framework.PlaybackConfig();

playbackConfig.licenseRequestHandler =
    licenseRequestHandler;
context.getPlayerManager().setMediaPlaybackInfoHandler(
    mediaPlaybackInfoHandler);
context.getPlayerManager().setMessageInterceptor(
    cast.framework.messages.MessageType.LOAD,
    loadInterceptor);

// starts the Cast application
context.start({playbackConfig: playbackConfig});

Cargar interceptor de solicitud

El interceptor de solicitud de carga es una devolución de llamada que te permite ver y modificar una solicitud de carga de transmisión antes de que el CAF intente cargar un elemento multimedia. Es importante destacar que se llama antes del controlador de solicitudes de licencia y del controlador de información de reproducción de contenido multimedia.

El interceptor de solicitud de carga recibe un objeto LoadRequestData que contiene la configuración del reproductor Exo que envió tu app. Puedes guardar este objeto como una variable global para usar en tu controlador de solicitudes de licencia y de información de reproducción de contenido multimedia.

loadInterceptor(loadRequestData) {
    // not every load request will have a customData object
    if (loadRequestData.media && loadRequestData.media.customData &&
            loadRequestData.media.customData['exoPlayerConfig']) {
        // exoPlayerConfig is a global variable here
        exoPlayerConfig =
                loadRequestData.media.customData['exoPlayerConfig'];
    }

    // you must return the loadRequestData object
    return loadRequestData;
}

Controlador de solicitudes de licencia

El controlador de solicitudes de licencia te permite personalizar la solicitud HTTPS que Web Receiver realiza a tu servidor de licencias. Al controlador se le pasa un objeto NetworkRequestInfo, que puedes usar para agregar encabezados HTTP, incluir cookies o incluso modificar la URL. El controlador debe mostrar este objeto.

Si, por ejemplo, necesitas agregar encabezados personalizados a la solicitud de licencia, podrías crear un controlador de solicitud de licencia similar al siguiente:

licenseRequestHandler(networkRequestInfo) {
    if (!exoPlayerConfig) {
        return networkRequestInfo;
    }

    networkRequestInfo.headers =
            exoPlayerConfig.headers ? exoPlayerConfig.headers : undefined;

    return networkRequestInfo;
}

Controlador de información de reproducción de contenido multimedia

El controlador de información de reproducción multimedia te permite realizar cambios en la configuración de reproducción por elemento multimedia. Al controlador se le pasa un LoadRequestData y un PlaybackConfig, debes mostrar una configuración de reproducción. Se llamará al controlador de información de reproducción de contenido multimedia antes de que se cargue cada elemento que transmitas. Si tenías URLs de licencia por contenido, puedes cambiarlas junto con el sistema de protección antes de la carga.

mediaPlaybackInfoHandler(loadRequest, playbackConfig) {
    if (!exoPlayerConfig) {
        return;
    }

    playbackConfig.licenseUrl = exoPlayerConfig.licenseUrl ?
            exoPlayerConfig.licenseUrl :
            undefined;
    playbackConfig.protectionSystem = exoPlayerConfig.protectionSystem ?
            exoPlayerConfig.protectionSystem :
            undefined;

    return playbackConfig;
}

Más recursos

Cada implementación de DRM es personalizada y este código se proporciona solo a modo de demostración. Consulta a tu proveedor de DRM para asegurarte de haber implementado correctamente la DRM en tus aplicaciones de ExoPlayer y Cast.

El sitio web de ExoPlayer incluye documentación y anuncios actualizados. Los problemas con ExoPlayer y su integración con Cast se pueden informar en el repositorio de GitHub de ExoPlayer.