Testy OEM

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.