Praca z MediaPlayer i zarządzaniem prawami cyfrowymi (DRM)

Począwszy od Androida 8.0 (poziom interfejsu API 26) MediaPlayer zawiera interfejsy API, które umożliwiają odtwarzanie materiałów chronionych przez DRM. Interfejsy MediaPlayer DRM są podobne do interfejsu API niskiego poziomu udostępnianego przez MediaDrm, ale działają na wyższym poziomie i nie udostępniają obiektów extractor, DRM i kryptograficznych obiektów.

Interfejs MediaPlayer DRM API nie zapewnia pełnej funkcjonalności interfejsu MediaDrm, ale obsługuje najczęstsze przypadki użycia. Obecna implementacja obsługuje te typy treści:

  • Pliki multimedialne zabezpieczone technologią Widevine
  • Pliki multimedialne chronione przez Widevine, przesyłane strumieniowo lub zdalnie

Ten fragment kodu pokazuje, jak używać nowych metod DRM MediaPlayer w implementacji synchronicznej.

Aby zarządzać multimediami kontrolowanymi przez DRM, musisz uwzględnić nowe metody obok zwykłego przepływu wywołań MediaPlayer, jak w tym przykładzie:

Kotlin

mediaPlayer?.apply {
    setDataSource()
    setOnDrmConfigHelper() // optional, for custom configuration
    prepare()
    drmInfo?.also {
        prepareDrm()
        getKeyRequest()
        provideKeyResponse()
    }

    // MediaPlayer is now ready to use
    start()
    // ...play/pause/resume...
    stop()
    releaseDrm()
}

Java

setDataSource();
setOnDrmConfigHelper(); // optional, for custom configuration
prepare();
if (getDrmInfo() != null) {
  prepareDrm();
  getKeyRequest();
  provideKeyResponse();
}

// MediaPlayer is now ready to use
start();
// ...play/pause/resume...
stop();
releaseDrm();

Zacznij od zainicjowania obiektu MediaPlayer i ustawienia jego źródła za pomocą funkcji setDataSource(). Aby korzystać z DRM, wykonaj te czynności:

  1. Jeśli chcesz, aby aplikacja wykonywała konfigurację niestandardową, zdefiniuj interfejs OnDrmConfigHelper i dołącz go do odtwarzacza za pomocą setOnDrmConfigHelper().
  2. Zadzwoń pod numer prepare().
  3. Zadzwoń pod numer getDrmInfo(). Jeśli źródło zawiera treści chronione przez DRM, metoda zwraca wartość niezerową MediaPlayer.DrmInfo.

Jeśli istnieje grupa MediaPlayer.DrmInfo:

  1. Zapoznaj się z mapą dostępnych identyfikatorów UUID i wybierz jeden z nich.
  2. Przygotuj konfigurację DRM dla bieżącego źródła, wywołując funkcję prepareDrm().
    • Jeśli wywołanie zwrotne OnDrmConfigHelper zostało utworzone i zarejestrowane, jest ono wywoływane podczas wykonywania funkcji prepareDrm(). Dzięki temu możesz skonfigurować właściwości DRM przed otwarciem sesji DRM. Wywołanie jest wykonywane synchronicznie w wątku, który wywołał funkcję prepareDrm(). Aby uzyskać dostęp do właściwości DRM, wywołaj funkcje getDrmPropertyString() i setDrmPropertyString(). Unikaj wykonywania długich operacji.
    • Jeśli urządzenie nie zostało jeszcze skonfigurowane, prepareDrm() uzyskuje dostęp do serwera obsługi administracyjnej, aby skonfigurować urządzenie. Może to potrwać dowolną ilość czasu w zależności od połączenia z siecią.
  3. Aby uzyskać tablicę bajtów żądania klucza nieprzezroczystego, którą można wysłać do serwera licencji, wywołaj funkcję getKeyRequest().
  4. Aby poinformować mechanizm DRM o otrzymanej od serwera licencji odpowiedzi dotyczącej klucza, wywołaj funkcję provideKeyResponse(). Wynik zależy od typu żądania klucza:
    • Jeśli odpowiedź dotyczy żądania klucza offline, wynikiem jest identyfikator zestawu kluczy. Możesz użyć tego identyfikatora zestawu kluczy z restoreKeys(), aby przywrócić klucze w nowej sesji.
    • Jeśli odpowiedź dotyczy żądania przesyłania strumieniowego lub wydania, wynik jest pusty.

Przygotowanie DRM asynchronicznie

Domyślnie prepareDrm() działa synchronicznie, blokując się do czasu zakończenia przygotowania. Jednak pierwsze przygotowanie DRM na nowym urządzeniu może wymagać też wdrożenia, które prepareDrm() obsługuje wewnętrznie. Może to zająć trochę czasu ze względu na działanie sieci. Aby uniknąć blokowania prepareDrm(), zdefiniuj i ustaw MediaPlayer.OnDrmPreparedListener.

Ustaw OnDrmPreparedListener. prepareDrm() wykonuje w tle konfigurację (jeśli jest potrzebna) i przygotowanie. Po zakończeniu obsługi i przygotowania system wywołuje słuchacza. Nie należy zakładać niczego na temat sekwencji wywołania ani wątku, w którym działa listener (chyba że listener jest zarejestrowany w wątku obsługi). System może wywołać listenera przed powrotem z wynikiem prepareDrm() lub po nim.

Konfigurowanie DRM asynchronicznie

Możesz zainicjować DRM asynchronicznie, tworząc i rejestrując MediaPlayer.OnDrmInfoListener na potrzeby przygotowania DRM oraz MediaPlayer.OnDrmPreparedListener na potrzeby uruchomienia odtwarzacza. Działa ona w połączeniu z prepareAsync(), jak w tym przykładzie:

Kotlin

setOnPreparedListener()
setOnDrmInfoListener()
setDataSource()
prepareAsync()
// ...

// If the data source content is protected you receive a call to the onDrmInfo() callback.
override fun onDrmInfo(mediaPlayer: MediaPlayer, drmInfo: MediaPlayer.DrmInfo) {
    mediaPlayer.apply {
        prepareDrm()
        getKeyRequest()
        provideKeyResponse()
    }
}

// When prepareAsync() finishes, you receive a call to the onPrepared() callback.
// If there is a DRM, onDrmInfo() sets it up before executing this callback,
// so you can start the player.
override fun onPrepared(mediaPlayer: MediaPlayer) {
    mediaPlayer.start()
}

Java

setOnPreparedListener();
setOnDrmInfoListener();
setDataSource();
prepareAsync();
// ...

// If the data source content is protected you receive a call to the onDrmInfo() callback.
onDrmInfo() {
  prepareDrm();
  getKeyRequest();
  provideKeyResponse();
}

// When prepareAsync() finishes, you receive a call to the onPrepared() callback.
// If there is a DRM, onDrmInfo() sets it up before executing this callback,
// so you can start the player.
onPrepared() {

start();
}

Obsługa zaszyfrowanych multimediów

Począwszy od Androida 8.0 (interfejs API 26) MediaPlayer może też odszyfrowywać media szyfrowane według schematu Common Encryption Scheme (CENC) i HLS na poziomie próbki (METHOD=SAMPLE-AES) w przypadku typów strumieni elementarnych H.264 i AAC. Wcześniej obsługiwane były szyfrowane media w całym segmencie (METHOD=AES-128).

Więcej informacji

Jetpack Media3 to zalecane rozwiązanie do odtwarzania multimediów w aplikacji. Dowiedz się więcej o tej usłudze.

Na tych stronach znajdziesz informacje na temat nagrywania, przechowywania i odtwarzania dźwięku i obrazu: