Integration von ExoPlayer

Dieses Dokument bietet einen Überblick über die Unterstützung für die Warteschlangen- und DRM-Einbindung.

DRM-Verbesserungen

Die ExoPlayer-Cast-Demo wurde aktualisiert und enthält jetzt eine strukturierte Methode zur Weitergabe der DRM-Konfiguration mithilfe des MediaInfo von ExoPlayer an eine Empfängeranwendung. Im Cast-Beispiel wird auch ein Demoempfänger verwendet, der denselben Code in dieser Übersicht enthält, sodass Sie die DRM-Unterstützung testen können. Wenn Sie jedoch DRM-geschützte Inhalte streamen möchten, sollten Sie Ihren eigenen Web Receiver erstellen und hosten.

Bevor du beginnst, solltest du dich mit der Dokumentation zur DRM-Unterstützung in Google Cast und ExoPlayer vertraut machen. In dieser Übersicht erfahren Sie, wie Sie die ExoPlayer-DRM-Konfiguration mit einem Web Receiver verbinden. Informationen zur Verwendung von DRM in ExoPlayer finden Sie auf der offiziellen ExoPlayer-Website.

DRM-Konfiguration bereitstellen

Die ExoPlayer-Demo-App enthält Beispielcode, der zeigt, wie die DRM-Konfiguration als Teil eines MediaItems bereitgestellt wird. Folgende vier Optionen können konfiguriert werden:

  • Headers: Ein Wörterbuch der Header, die auf die HTTPS-Anfrage zum Abrufen der DRM-Lizenz angewendet werden.
  • License URL (Lizenz-URL): Die URL, über die die Lizenz erworben wurde.
  • Protection System: Das DRM-Schutzschema, das zum Schutz der Inhalte verwendet wird, z. B. Widevine.

Die DRM-Konfiguration, die du ExoPlayer zur Verfügung stellst, wird als Teil einer Ladeanfrage als Attribut in customData für das Objekt MediaInformation an deine Empfängeranwendung gesendet. Standardmäßig heißt dieses Attribut exoPlayerConfig, was der folgenden Definition entspricht.

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

Ersteinrichtung

Je nach verwendeter DRM-Lösung müssen Sie möglicherweise eine licenseRequestHandler und eine mediaPlaybackInfoHandler konfigurieren. Mit licenseRequestHandler kannst du anpassen, wie CAF eine Lizenz von deinem Lizenzschlüsselserver anfordert. Mit mediaPlaybackInfoHandler können Sie PlaybackConfig für einzelne Medienelemente ändern, wenn beispielsweise für jeden Inhalt eine andere Lizenzserver-URL verwendet werden muss.

Erstellen Sie in Ihrer Web Receiver SDK-Anwendung einen Interceptor für Ladeanfragen, um eine Kopie von ExoPlayerConfig aus jedem Ladeanfrageobjekt zu erfassen.

Der erste Schritt besteht darin, die Handler zu registrieren, bevor Sie Ihre Cast-Anwendung starten.

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

Anfrage-Abfanggerät laden

Das Abfangen von Ladeanfragen ist ein Callback, mit dem Sie eine Cast-Ladeanfrage aufrufen und ändern können, bevor CAF versucht, ein Medienelement zu laden. Wichtig ist, dass sie vor dem Lizenzanforderungsaussteller und dem Info-Handler zur Medienwiedergabe aufgerufen wird.

Dem Interceptor der Ladeanfrage wird ein LoadRequestData-Objekt übergeben, das die von deiner App gesendete Exo Player-Konfiguration enthält. Du kannst dieses Objekt als globale Variable zur Verwendung in deinem Lizenzanfrage-Handler und Info-Handler für die Medienwiedergabe speichern.

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

Handler für Lizenzanfragen

Mit dem Lizenzanfrage-Handler kannst du die HTTPS-Anfrage, die WebReceiver an deinen Lizenzserver stellt, anpassen. An den Handler wird ein NetworkRequestInfo-Objekt übergeben, mit dem Sie dann HTTP-Header hinzufügen, Cookies einfügen oder sogar die URL ändern können. Der Handler sollte dieses Objekt zurückgeben.

Wenn Sie Ihrer Lizenzanfrage beispielsweise benutzerdefinierte Header hinzufügen müssen, können Sie einen Lizenzanfrage-Handler wie diesen erstellen:

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

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

    return networkRequestInfo;
}

Info-Handler für die Medienwiedergabe

Mit dem Info-Handler für die Medienwiedergabe können Sie Änderungen an Ihrer Wiedergabekonfiguration für einzelne Elemente vornehmen. Wenn dem Handler ein LoadRequestData und ein PlaybackConfig übergeben werden, sollten Sie eine Wiedergabekonfiguration zurückgeben. Der Info-Handler für die Medienwiedergabe wird aufgerufen, bevor jedes gestreamte Element geladen wird. Wenn Sie inhaltsspezifische Lizenz-URLs hatten, können Sie diese und das Schutzsystem vor dem Laden ändern.

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

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

    return playbackConfig;
}

Weitere Ressourcen

Jede DRM-Implementierung ist benutzerdefiniert und dieser Code dient nur zu Demonstrationszwecken. Wenden Sie sich an Ihren DRM-Anbieter, um sicherzustellen, dass Sie die digitale Rechteverwaltung in Ihren ExoPlayer- und Cast-Anwendungen korrekt implementiert haben.

Auf der ExoPlayer-Website finden Sie die aktuelle Dokumentation und Ankündigungen. Probleme mit ExoPlayer und dessen Cast-Integration können im GitHub-Repository von ExoPlayer gemeldet werden.