Integrazione con ExoPlayer

Questo documento fornisce una panoramica del supporto per le code e l'integrazione di DRM.

Miglioramenti a DRM

La demo di trasmissione di ExoPlayer è stata aggiornata in modo da utilizzare un modo strutturato per passare la configurazione DRM utilizzando MediaInfo di ExoPlayer a un'applicazione ricevitore. L'esempio di trasmissione utilizza anche un ricevitore demo che include lo stesso codice di questa panoramica, consentendoti di testare il supporto DRM. Tuttavia, se desideri trasmettere contenuti protetti da DRM, devi creare e ospitare il tuo web ricevitore.

Prima di iniziare, sarebbe utile consultare la documentazione sul supporto DRM in Google Cast ed ExoPlayer. In questa panoramica ti verrà mostrato come collegare la configurazione DRM di ExoPlayer a un ricevitore web. Per informazioni su come utilizzare DRM in ExoPlayer, visita il sito web ufficiale di ExoPlayer.

Specifica della configurazione DRM

L'app demo ExoPlayer contiene codice campione che mostra come fornire la configurazione DRM come parte di un MediaItem. Le quattro opzioni che puoi configurare sono:

  • Intestazioni: un dizionario di intestazioni applicate alla richiesta HTTPS per recuperare la licenza DRM.
  • URL licenza: l'URL utilizzato per acquisire la licenza.
  • Sistema di protezione: lo schema di protezione DRM utilizzato per proteggere i contenuti, ad esempio Widevine.

La configurazione DRM fornita a ExoPlayer viene inviata all'applicazione ricevitore come proprietà in customData nell'oggetto MediaInformation come parte di una richiesta di caricamento. Per impostazione predefinita, questa proprietà è denominata exoPlayerConfig, che corrisponde alla definizione riportata di seguito.

/**
 * 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;
  }
}

Configurazione iniziale

A seconda della soluzione DRM utilizzata, potrebbe essere necessario configurare un licenseRequestHandler e un mediaPlaybackInfoHandler. Il licenseRequestHandler consente di personalizzare il modo in cui CAF richiede una licenza al server delle chiavi di licenza. mediaPlaybackInfoHandler ti consente di modificare l'elemento PlaybackConfig in base all'elemento multimediale se, ad esempio, ogni contenuto deve utilizzare un URL del server licenze diverso.

Per acquisire una copia dell'elemento ExoPlayerConfig da ciascun oggetto della richiesta di caricamento, crea un intercettatore della richiesta di caricamento nell'applicazione SDK Web Receiver.

Il primo passaggio consiste nel registrare i tuoi gestori prima di avviare l'applicazione 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});

Intercettore richieste di carico

L'intercettatore delle richieste di caricamento è un callback che consente di visualizzare e modificare una richiesta di caricamento di trasmissione prima che CAF tenti di caricare un elemento multimediale. È importante sottolineare che la richiesta viene chiamata prima che la richiesta di licenza vada oltre il gestore delle informazioni sulla riproduzione dei contenuti multimediali.

All'intercettatore della richiesta di caricamento viene passato un oggetto LoadRequestData che contiene la configurazione di Exo Player inviata dalla tua app. Puoi salvare questo oggetto come variabile globale da utilizzare nel gestore delle richieste di licenza e nel gestore delle informazioni sulla riproduzione di contenuti multimediali.

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;
}

Gestore richieste di licenza

Il gestore delle richieste di licenza consente di personalizzare le richieste HTTPS inviate dal ricevitore web al tuo server delle licenze. Al gestore viene trasmesso un oggetto NetworkRequestInfo, che potrai utilizzare per aggiungere intestazioni HTTP, includere cookie o persino modificare l'URL. Il gestore deve restituire questo oggetto.

Se, ad esempio, avessi bisogno di aggiungere intestazioni personalizzate alla tua richiesta di licenza, potresti creare un gestore di richieste di licenza simile a questo:

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

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

    return networkRequestInfo;
}

Gestore delle informazioni sulla riproduzione di contenuti multimediali

Il gestore delle informazioni sulla riproduzione di contenuti multimediali ti consente di apportare modifiche alla tua configurazione di riproduzione in base all'elemento multimediale. Al gestore vengono passati un LoadRequestData e un PlaybackConfig, devi restituire una configurazione di riproduzione. Il gestore delle informazioni sulla riproduzione di contenuti multimediali viene chiamato prima del caricamento di ogni elemento che trasmetti. Se avevi URL di licenza per contenuto, modificali e modifica il sistema di protezione prima del caricamento.

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

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

    return playbackConfig;
}

Ulteriori risorse

Ogni implementazione DRM è personalizzata e questo codice viene fornito solo a scopo dimostrativo. Consulta il tuo fornitore DRM per assicurarti di aver implementato correttamente DRM nelle applicazioni ExoPlayer e Cast.

Il sito web di ExoPlayer contiene documentazione e annunci aggiornati. I problemi relativi a ExoPlayer e alla relativa integrazione con Cast possono essere segnalati nel repository GitHub di ExoPlayer.