ExoPlayer jest używany przez wiele aplikacji na Androida. Jako producent OEM musisz zadbać o to, aby ExoPlayer działał prawidłowo zarówno na nowych urządzeniach, jak i na nowych wersjach platformy na istniejących urządzeniach. Na tej stronie opisujemy testy zgodności, które zalecamy przeprowadzić przed wysłaniem urządzenia lub platformy OTA, oraz niektóre typowe tryby awarii, które mogą wystąpić podczas ich przeprowadzania.
Przeprowadzanie testów
Aby uruchomić testy odtwarzania ExoPlayera, najpierw pobierz najnowszą wersję ExoPlayera z GitHub. Testy możesz uruchamiać z wiersza poleceń lub w Androidzie Studio.
Wiersz poleceń
W katalogu głównym skompiluj 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 pojawią się w STDOUT.
Android Studio
Otwórz projekt ExoPlayer, przejdź do modułu playbacktests, kliknij prawym przyciskiem myszy folder gts i uruchom testy. Wyniki testu pojawią się w oknie działania aplikacji w Android Studio.
Typowe rodzaje błędów
Poniżej opisujemy niektóre z najczęstszych rodzajów błędów, które występują podczas testów odtwarzania w ExoPlayerze, wraz z prawdopodobnymi przyczynami w każdym przypadku. Będziemy dodawać do tej listy kolejne tryby awarii, gdy tylko je odkryjemy.
Nieoczekiwana sygnatura czasowa prezentacji bufora wideo
Logcat będzie zawierać 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).
Ten błąd jest najczęściej spowodowany nieprawidłowym odrzucaniem, wstawianiem lub zmianą kolejności buforów przez dekoder wideo poddawany testowi. W przykładzie powyżej test miał usunąć z kolejki bufor z sygnaturą czasową prezentacji 134766000 z MediaCodec.dequeueOutputBuffer, ale okazało się, że usunął bufor z sygnaturą czasową prezentacji 134733000. Jeśli wystąpi ten błąd, zalecamy sprawdzenie implementacji dekodera, a w szczególności tego, czy prawidłowo obsługuje przełączanie rozdzielczości adaptacyjnej bez odrzucania buforów.
Zbyt wiele odrzuconych buforów
Logcat będzie zawierać błąd podobny do tego:
junit.framework.AssertionFailedError: Codec(DashTest:Video) was late decoding:
200 buffers. Limit: 25.
Ten błąd jest problemem z wydajnością, ponieważ testowany dekoder wideo dekodował z opóźnieniem dużą liczbę buforów. W przykładzie powyżej ExoPlayer odrzucił 200 buforów, ponieważ były opóźnione w momencie wyjęcia z kolejki. Test nakłada limit 25 buforów. Najbardziej oczywistą przyczyną jest to, że dekoder wideo zbyt wolno dekoduje bufory. Jeśli błędy występują tylko w przypadku podzbioru testów, które odtwarzają treści chronione przez Widevine, prawdopodobnie operacje platformy związane z odszyfrowywaniem bufora są zbyt wolne. Zalecamy sprawdzenie wydajności tych komponentów i zastanowienie się, czy można je zoptymalizować, aby przyspieszyć ich działanie.
Nie udało się uwierzytelnić okna natywnego
Logcat będzie zawierać 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 ustawia prawidłowo flagi bezpiecznego bitu.
Upłynął limit czasu testu
Logcat będzie zawierać błąd podobny do tego:
AssertionFailedError: Test timed out after 300000 ms.
Najczęstszą przyczyną tego błędu jest słaba łączność sieciowa podczas testu. Jeśli urządzenie ma dobre połączenie z siecią, test może się zawieszać podczas wywoływania komponentu platformy (np. MediaCodec, MediaDrm lub AudioTrack). Sprawdź stosy wywołań wątków w procesie testowym, aby ustalić, czy tak jest.