Intégration d'ExoPlayer

Ce document présente la mise en file d'attente et l'intégration DRM.

Améliorations DRM

La démonstration de Cast d'ExoPlayer a été mise à jour afin d'utiliser un moyen structuré de transmettre une configuration DRM à une application réceptrice à l'aide de l'MediaInfo d'ExoPlayer. L'exemple Cast utilise également un récepteur de démonstration qui inclut le même code dans cette présentation, ce qui vous permet de tester la compatibilité avec la DRM. Toutefois, si vous souhaitez caster du contenu protégé par DRM, vous devez créer et héberger votre propre récepteur Web.

Avant de commencer, il peut être utile de vous familiariser avec la documentation sur la prise en charge de la DRM dans Google Cast et ExoPlayer. Cette présentation vous explique comment connecter la configuration DRM d'ExoPlayer à un récepteur Web. Pour en savoir plus sur l'utilisation de la DRM dans ExoPlayer, consultez le site officiel d'ExoPlayer.

Fournir la configuration DRM

L'application de démonstration ExoPlayer contient un exemple de code qui montre comment fournir une configuration DRM dans un MediaItem. Les quatre options que vous pouvez configurer sont les suivantes:

  • Headers : dictionnaire d'en-têtes appliqués à la requête HTTPS pour récupérer la licence DRM.
  • URL de licence : URL utilisée pour acquérir la licence.
  • Protection System : schéma de protection DRM utilisé pour protéger le contenu, par exemple Widevine.

La configuration DRM que vous fournissez à ExoPlayer est envoyée à votre application réceptrice en tant que propriété dans customData sur l'objet MediaInformation dans le cadre d'une requête de chargement. Par défaut, cette propriété est appelée exoPlayerConfig, ce qui correspond à la définition suivante.

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

Configuration initiale

Selon la solution de DRM que vous utilisez, vous devrez peut-être configurer une licenseRequestHandler et une mediaPlaybackInfoHandler. Le fichier licenseRequestHandler vous permet de personnaliser la façon dont CAF demande une licence à votre serveur de clés de licence. mediaPlaybackInfoHandler vous permet de modifier PlaybackConfig en fonction de l'élément multimédia si, par exemple, chaque contenu doit utiliser une URL de serveur de licences différente.

Pour capturer une copie du ExoPlayerConfig à partir de chaque objet de requête de chargement, créez un intercepteur de requêtes de chargement dans votre application SDK Web Receiver.

La première étape consiste à enregistrer vos gestionnaires avant de démarrer votre application 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});

Interceveur de requêtes de chargement

L'intercepteur de requêtes de chargement est un rappel qui vous permet d'afficher et de modifier une requête de chargement Cast avant que CAF ne tente de charger un élément multimédia. Il est important de noter qu'il est appelé avant le gestionnaire de demandes de licence et le gestionnaire d'informations de lecture multimédia.

L'intercepteur de requêtes de chargement reçoit un objet LoadRequestData contenant la configuration d'Exo Player envoyée par votre application. Vous pouvez enregistrer cet objet en tant que variable globale à utiliser dans votre gestionnaire de requêtes de licence et dans votre gestionnaire d'informations sur la lecture de contenus multimédias.

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

Gestionnaire de requêtes de licence

Le gestionnaire de demandes de licence vous permet de personnaliser la requête HTTPS envoyée par Web Receiver à votre serveur de licences. Le gestionnaire reçoit un objet NetworkRequestInfo, que vous pouvez ensuite utiliser pour ajouter des en-têtes HTTP, inclure des cookies ou même modifier l'URL. Le gestionnaire doit renvoyer cet objet.

Par exemple, si vous devez ajouter des en-têtes personnalisés à votre demande de licence, vous pouvez créer un gestionnaire de requêtes de licence semblable à celui-ci:

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

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

    return networkRequestInfo;
}

Gestionnaire d'informations sur la lecture de contenus multimédias

Le gestionnaire d'informations sur la lecture de contenus multimédias vous permet de modifier la configuration de lecture par élément multimédia. Le gestionnaire reçoit les éléments LoadRequestData et PlaybackConfig. Vous devez renvoyer une configuration de lecture. Le gestionnaire d'informations sur la lecture de contenus multimédias est appelé avant le chargement de chaque élément Cast. Si vous aviez des URL de licence par contenu, vous pouvez les modifier ainsi que le système de protection avant le chargement.

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

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

    return playbackConfig;
}

Autres ressources

Chaque implémentation de DRM est personnalisée et ce code n'est fourni qu'à titre de démonstration. Vous devez consulter votre fournisseur de DRM pour vous assurer que vous l'avez correctement implémentée dans vos applications ExoPlayer et Cast.

Le site Web d'ExoPlayer propose une documentation à jour et des annonces à jour. Les problèmes liés à ExoPlayer et à son intégration Cast peuvent être signalés dans le dépôt GitHub d'ExoPlayer.