Testy OEM

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 dotychczasowych urządzeniach. Na tej stronie opisaliśmy testy zgodności, które zalecamy przeprowadzić przed wysłaniem urządzenia lub platformy OTA, oraz niektóre typowe błędy występujące podczas ich wykonywania.

Uruchamianie testów

Aby przeprowadzić testy odtwarzania w odtwarzaczu ExoPlayer, najpierw zapoznaj się z najnowszą wersją ExoPlayer z GitHub. Następnie możesz uruchomić testy z poziomu wiersza poleceń lub Android 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 wyjściu standardowym.

Android Studio,

Otwórz projekt ExoPlayer, przejdź do modułu playbacktests i kliknij prawym przyciskiem myszy w folderze gts i uruchom testy. Wyniki testu pojawią się w oknie Uruchom w Android Studio.

Typowe tryby awarii

Poniżej opisaliśmy niektóre typowe rodzaje błędów występujące podczas testów odtwarzania ExoPlayera wraz z ich prawdopodobnymi przyczynami. Będziemy dodawać do niej kolejne przypadki w miarę odkrywania kolejnych sposobów awarii.

Nieoczekiwana sygnatura czasowa prezentacji bufora filmu

Logcat 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).

Najczęstszą przyczyną tej awarii jest nieprawidłowy test dekodera wideo. nie dodawać buforów, wstawiać je lub zmieniać ich kolejność. W przykładzie powyżej test oczekiwał, że z bufora MediaCodec.dequeueOutputBuffer zostanie usunięty bufor z sygnaturą czasową prezentacji 134766000, ale okazało się, że z bufora został usunięty bufor z sygnaturą czasową prezentacji 134733000. W przypadku wystąpienia tego błędu zalecamy sprawdzenie implementacji dekodera, szczególnie pod kątem prawidłowego obsługiwania przełączania rozdzielczości bez odrzucania żadnych buforów.

Zbyt wiele utraconych 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 związanym z wydajnością, ponieważ testowany dekoder wideo opóźnia dekodowanie dużej liczby buforów. W przykładzie powyżej ExoPlayer uprościło 200 buforów, ponieważ były opóźnione przed usunięciem z kolejki, na potrzeby testu nakładającego limit 25. Najbardziej oczywistą przyczyną jest to, że dekoder wideo zbyt wolne bufory dekodowania. Błędy występują tylko w przypadku części testów które odtwarzają treści chronione przez Widevine, prawdopodobnie platforma działająca odszyfrowywania bufora zbyt wolno. Zalecamy sprawdzenie skuteczności tych elementów oraz czy można wprowadzić jakieś optymalizacje, aby przyspieszyć ich zwiększyć.

Nie udało się uwierzytelnić okna natywnego

Logcat 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 ustawiła prawidłowo flagi secure_bit.

Upłynął limit czasu testu

Logcat zawiera błąd podobny do tego:

AssertionFailedError: Test timed out after 300000 ms.

Ten błąd jest najczęściej spowodowany słabą jakością połączenia z internetem podczas testu. Jeśli urządzenie ma dobrą łączność z siecią, test może się zacinać podczas wywoływania komponentu platformy (takich jak MediaCodec, MediaDrm lub AudioTrack). Aby to sprawdzić, sprawdź stosy wywołań wątków w procesie testu.