Integracja z ExoPlayer

Ten dokument zawiera omówienie funkcji kolejkowania i integracji z DRM.

Ulepszenia DRM

Zaktualizowaliśmy prezentację przesyłania ExoPlayer, by korzystała z ustrukturyzowanego sposobu przekazywania konfiguracji DRM za pomocą obiektu MediaInfo platformy ExoPlayer do aplikacji odbierającej. W przykładzie przesyłania wykorzystywany jest też demonstracyjny odbiornik, który zawiera ten sam kod widoczny w tym omówieniu, co umożliwia przetestowanie obsługi DRM. Jeśli jednak chcesz przesyłać treści chronione przez DRM, musisz utworzyć i hostować własny odbiornik.

Zanim zaczniesz, warto zapoznać się z dokumentacją dotyczącą obsługi DRM w Google Cast i ExoPlayer. To omówienie pokazuje, jak podłączyć konfigurację DRM ExoPlayer do odbiornika internetowego. Informacje o korzystaniu z DRM w ExoPlayer znajdziesz na oficjalnej stronie ExoPlayer.

Udostępniam konfigurację DRM

Aplikacja demonstracyjna ExoPlayer zawiera przykładowy kod, który pokazuje, jak udostępnić konfigurację DRM w ramach elementu MediaItem. Dostępne są 4 opcje:

  • Nagłówki – słownik nagłówków stosowanych w żądaniu HTTPS w celu pobrania licencji DRM.
  • URL licencji – adres URL użyty do uzyskania licencji.
  • System ochrony – schemat ochrony DRM używany do ochrony treści, np. Widevine.

Konfiguracja DRM, którą udostępniasz ExoPlayer jest wysyłana do aplikacji odbierającej jako właściwość w customData w obiekcie MediaInformation w ramach żądania wczytania. Domyślnie ta właściwość nazywa się exoPlayerConfig. Odpowiada ona tej definicji.

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

Konfiguracja początkowa

W zależności od używanego rozwiązania DRM może być konieczne skonfigurowanie licenseRequestHandler i mediaPlaybackInfoHandler. licenseRequestHandler pozwala dostosować sposób, w jaki CAF żąda licencji od serwera kluczy licencyjnych. mediaPlaybackInfoHandler umożliwia zmodyfikowanie PlaybackConfig dla poszczególnych elementów multimedialnych, jeśli na przykład każdy element treści musi używać innego adresu URL serwera licencji.

Aby przechwycić kopię obiektu ExoPlayerConfig z każdego obiektu żądania wczytania, utwórz w aplikacji z pakietem Web pickups tag przechwytujący żądania wczytania.

Pierwszym krokiem jest zarejestrowanie modułów obsługi przed uruchomieniem aplikacji 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});

Przechwytujący żądania wczytania

Przechwytywanie żądań obciążenia to wywołanie zwrotne, które pozwala wyświetlić i zmodyfikować żądanie wczytania Cast, zanim CAF spróbuje wczytać element multimedialny. Co ważne, funkcja ta jest wywoływana przed modułem obsługi próśb o licencję i modułem obsługi informacji o odtwarzaniu multimediów.

Przechwytujący żądanie wczytania jest przekazywany do obiektu LoadRequestData, który zawiera konfigurację Exo Playera przesłaną przez Twoją aplikację. Możesz zapisać ten obiekt jako zmienną globalną do wykorzystania w module obsługi żądań licencji i w module obsługi informacji o odtwarzaniu multimediów.

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

Moduł obsługi żądań licencji

Moduł obsługi żądań licencji umożliwia dostosowanie żądań HTTPS wysyłanych do serwera licencji przez Web odbiornik. Moduł obsługi przekazuje obiekt NetworkRequestInfo, za pomocą którego możesz dodać nagłówki HTTP, uwzględnić pliki cookie, a nawet zmodyfikować adres URL. Moduł obsługi powinien zwrócić ten obiekt.

Jeśli na przykład chcesz dodać niestandardowe nagłówki do żądania licencji, możesz utworzyć moduł obsługi żądań licencji podobny do tego:

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

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

    return networkRequestInfo;
}

Moduł obsługi informacji o odtwarzaniu multimediów

Moduł obsługi informacji o odtwarzaniu multimediów pozwala wprowadzić zmiany w konfiguracji odtwarzania poszczególnych elementów multimedialnych. Moduł obsługi jest przekazywany do instrukcji LoadRequestData i PlaybackConfig. Należy zwrócić konfigurację odtwarzania. Moduł obsługi informacji o odtwarzaniu multimediów zostanie wywołany przed wczytaniem każdego elementu, który przesyłasz. Jeśli masz adresy URL licencji dla poszczególnych treści, zmień je oraz system ochrony przed załadowaniem.

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

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

    return playbackConfig;
}

Dodatkowe zasoby

Każda implementacja DRM jest niestandardowa, a ten kod jest tylko demonstracyjny. Skontaktuj się z dostawcą zabezpieczeń DRM, aby upewnić się, że masz prawidłowo zaimplementowane zabezpieczenia w aplikacjach ExoPlayer i Cast.

Strona ExoPlayer zawiera aktualną dokumentację i ogłoszenia. Problemy z ExoPlayer i jego integracją Cast można zgłaszać w repozytorium na GitHubie ExoPlayera.