ExoPlayer jest używany przez wiele aplikacji na Androida. Jako producent OEM ważne jest, aby zapewnić, że ExoPlayer działa poprawnie zarówno na nowych urządzeniach, jak i na nowych kompilacjach platform dla istniejących urządzeń. Na tej stronie opisujemy testy zgodności, które zalecamy przed wysłaniem OTA urządzenia lub platformy, a także niektóre typowe problemy, które mogą wystąpić podczas ich uruchamiania.
Przeprowadzanie testów
Aby uruchomić testy odtwarzania w ExoPlayer, najpierw sprawdź najnowszą wersję ExoPlayera z GitHuba. Możesz potem uruchomić testy z poziomu wiersza poleceń lub w Android Studio.
Wiersz poleceń
W katalogu głównym utwórz i zainstaluj testy odtwarzania:
./gradlew :test-exoplayer-playback:installDebug
Następnie uruchom testy odtwarzania w pakiecie GTS:
adb shell am instrument -w -r -e debug false \ -e package androidx.media3.test.exoplayer.playback.gts \ androidx.media3.test.exoplayer.playback.test/androidx.test.runner.AndroidJUnitRunner
Wyniki testu pojawiają się w kolekcji STDOUT.
Android Studio
Otwórz projekt ExoPlayer, przejdź do modułu playbacktests
, kliknij prawym przyciskiem folder gts
i uruchom testy. Wyniki testu pojawią się w oknie uruchamiania w Android Studio.
Tryby typowych awarii
Poniżej opisujemy niektóre typowe tryby błędów, które mogą wystąpić podczas testów odtwarzania w ExoPlayer, wraz z prawdopodobną główną przyczyną w każdym z nich. Będziemy tę listę uzupełniać w miarę wykrywania kolejnych trybów awarii.
Nieoczekiwana sygnatura czasowa prezentacji bufora filmu
Plik Logcat wyświetli błąd podobny do tego:
Caused by: java.lang.IllegalStateException: Expected to dequeue video buffer
with presentation timestamp: 134766000. Instead got: 134733000 (Processed
buffers since last flush: 2242).
Przyczyną tej awarii jest najczęściej to, że testowany dekoder wideo niewłaściwie odrzuca, wstawia lub zmienia kolejność buforów. W powyższym przykładzie test zakładał usuwanie kolejki bufora z sygnaturą czasową prezentacji 134766000
z tabeli MediaCodec.dequeueOutputBuffer
, ale zamiast tego usuwał bufor z sygnaturą czasową prezentacji 134733000
. W przypadku wystąpienia tego błędu zalecamy sprawdzenie implementacji dekodera, w szczególności, że prawidłowo obsługuje ona przełączniki rozdzielczości adaptacyjnej bez odrzucania żadnych buforów.
Zbyt wiele utraconych buforów
Plik Logcat wyświetli błąd podobny do tego:
junit.framework.AssertionFailedError: Codec(DashTest:Video) was late decoding:
200 buffers. Limit: 25.
Ta awaria wynika z problemu z wydajnością – testowany dekoder wideo później dekodował dużą liczbę buforów. W przykładzie powyżej ExoPlayer pominął 200 buforów, ponieważ były opóźnione przed usunięciem kolejki. W ramach testu narzucamy limit 25 buforów. Najbardziej oczywistą przyczyną jest to, że dekoder wideo ma zbyt wolne bufory dekodowania. Jeśli błędy występują tylko w przypadku podzbioru testów, które odtwarzają treści chronione przez Widevine, możliwe, że operacje na platformie dotyczące odszyfrowywania bufora są zbyt wolne. Zalecamy sprawdzenie wydajności tych komponentów i sprawdzenie, czy można wprowadzić jakieś optymalizacje, które mogłyby je przyspieszyć.
Nie udało się uwierzytelnić okna natywnego
Plik Logcat wyświetli błąd podobny do tego:
SurfaceUtils: native window could not be authenticated
ExoPlayerImplInternal: Internal runtime error.
ExoPlayerImplInternal: android.media.MediaCodec$CodecException: Error 0xffffffff
Ten błąd wskazuje, że platforma nie ustawi poprawnie flagi bezpiecznego bitu.
Przekroczono limit czasu testu
Plik Logcat wyświetli błąd podobny do tego:
AssertionFailedError: Test timed out after 300000 ms.
Ten błąd jest najczęściej spowodowany słabym połączeniem sieciowym podczas testu. Jeśli urządzenie ma dobre połączenie z siecią, możliwe, że test blokuje się na wywoływaniu elementu platformy (np. MediaCodec
, MediaDrm
lub AudioTrack
). Sprawdź stosy wywołań wątków w procesie testowym, aby ustalić, czy faktycznie tak się dzieje.