Począwszy od Androida 8.0 (API na poziomie 26), MediaPlayer zawiera interfejsy API, które obsługują odtwarzanie materiałów chronionych przez DRM. Interfejsy MediaPlayer DRM API są podobne do interfejsu API niskiego poziomu udostępnianego przez MediaDrm, ale działają na wyższym poziomie i nie udostępniają podstawowych obiektów wyodrębniania, DRM i kryptograficznych.
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 lokalne chronione przez Widevine
- zdalnych lub strumieniowych plików multimedialnych chronionych przez Widevine;
Poniższy fragment kodu pokazuje, jak używać nowych metod DRM MediaPlayer w implementacji synchronicznej.
Aby zarządzać multimediami chronionymi przez DRM, musisz uwzględnić nowe metody wraz ze zwykłym przepływem wywołań MediaPlayer, jak pokazano 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(), tak jak zwykle. Aby używać DRM, wykonaj te czynności:
- Jeśli chcesz, aby aplikacja przeprowadzała niestandardową konfigurację, zdefiniuj interfejs
OnDrmConfigHelperi dołącz go do odtwarzacza za pomocąsetOnDrmConfigHelper(). - Zadzwoń pod numer
prepare(). - Zadzwoń pod numer
getDrmInfo(). Jeśli źródło zawiera treści chronione DRM, metoda zwraca niepustą wartośćMediaPlayer.DrmInfo.
Jeśli grupa MediaPlayer.DrmInfo istnieje:
- Sprawdź mapę dostępnych identyfikatorów UUID i wybierz jeden z nich.
- Przygotuj konfigurację DRM dla bieżącego źródła, wywołując funkcję
prepareDrm().- Jeśli utworzysz i zarejestrujesz wywołanie zwrotne
OnDrmConfigHelper, zostanie ono wywołane podczas wykonywania funkcjiprepareDrm(). Umożliwia to przeprowadzenie niestandardowej konfiguracji właściwości DRM przed otwarciem sesji DRM. Wywołanie zwrotne jest wywoływane synchronicznie w wątku, który wywołał funkcjęprepareDrm(). Aby uzyskać dostęp do właściwości DRM, wywołaj funkcjegetDrmPropertyString()isetDrmPropertyString(). Unikaj wykonywania długotrwałych operacji. - Jeśli urządzenie nie zostało jeszcze skonfigurowane,
prepareDrm()uzyskuje też dostęp do serwera obsługi administracyjnej, aby skonfigurować urządzenie. Może to potrwać różną ilość czasu w zależności od połączenia sieciowego.
- Jeśli utworzysz i zarejestrujesz wywołanie zwrotne
- Aby uzyskać tablicę bajtów żądania nieprzezroczystego klucza do wysłania na serwer licencji, wywołaj funkcję
getKeyRequest(). - Aby poinformować silnik DRM o odpowiedzi dotyczącej klucza otrzymanej z serwera licencji, wywołaj
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 udostępnienia, wynikiem jest wartość null.
- Jeśli odpowiedź dotyczy żądania klucza offline, wynikiem jest identyfikator zestawu kluczy. Możesz użyć tego identyfikatora zestawu kluczy z
Przygotowywanie DRM asynchronicznie
Domyślnie funkcja prepareDrm() działa synchronicznie, blokując działanie do momentu zakończenia przygotowania. Jednak pierwsze przygotowanie DRM na nowym urządzeniu może również wymagać udostępnienia, co prepareDrm() obsługuje wewnętrznie. Ze względu na operacje sieciowe może to zająć trochę czasu. Możesz uniknąć blokowania w prepareDrm(), definiując i ustawiając MediaPlayer.OnDrmPreparedListener.
Ustaw OnDrmPreparedListener. prepareDrm() przeprowadza w tle aprowizację (w razie potrzeby) i przygotowanie. Po zakończeniu udostępniania i przygotowania system wywołuje odbiorcę. Nie zakładaj niczego na temat sekwencji wywołań ani wątku, w którym działa detektor (chyba że zarejestrujesz detektor w wątku obsługi). System może wywołać detektor przed lub po zwróceniu wartości przez funkcję prepareDrm().
Asynchroniczna konfiguracja DRM
DRM możesz zainicjować asynchronicznie, tworząc i rejestrując MediaPlayer.OnDrmInfoListener na potrzeby przygotowania DRM oraz MediaPlayer.OnDrmPreparedListener do uruchomienia odtwarzacza. Działają one 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
Od Androida 8.0 (poziom interfejsu API 26) MediaPlayer może też odszyfrowywać media zaszyfrowane na poziomie próbki w ramach wspólnego schematu szyfrowania (CENC) i HLS (METHOD=SAMPLE-AES) w przypadku typów strumieni podstawowych H.264 i AAC. Wcześniej obsługiwane były zasoby multimedialne szyfrowane w całości (METHOD=AES-128).
Więcej informacji
Jetpack Media3 to zalecane rozwiązanie do odtwarzania multimediów w aplikacji. Więcej informacji
Na tych stronach znajdziesz informacje o nagrywaniu, przechowywaniu i odtwarzaniu dźwięku i obrazu: