ExoPlayer wird von einer großen Anzahl von Android-Apps verwendet. Als OEM ist es wichtig, dass ExoPlayer sowohl auf neuen Geräten als auch auf neuen Plattform-Builds für bestehende Geräte ordnungsgemäß funktioniert. Auf dieser Seite werden die Kompatibilitätstests beschrieben, die wir vor dem Versand eines Geräts oder einer Plattform per Over-the-air-Update ausführen empfehlen, sowie einige der häufigsten Fehlermodi, die dabei auftreten können.
Tests ausführen
Wenn du die Wiedergabetests von ExoPlayer ausführen möchtest, lade zuerst die neueste Version von ExoPlayer von GitHub herunter. Sie können die Tests dann über die Befehlszeile oder Android Studio
Befehlszeile
Erstelle und installiere die Wiedergabetests aus dem Stammverzeichnis:
./gradlew :test-exoplayer-playback:installDebug
Führen Sie als Nächstes die Wiedergabetests im GTS-Paket aus:
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
Die Testergebnisse werden in STDOUT angezeigt.
Android Studio
Öffnen Sie das ExoPlayer-Projekt, gehen Sie zum Modul playbacktests
und klicken Sie mit der rechten Maustaste
im Ordner gts
und führen Sie die Tests aus. Die Testergebnisse werden im Fenster „Ausführen“ von Android Studio angezeigt.
Häufige Fehlerszenarien
Im Folgenden werden einige der häufigsten Fehlermodi beschrieben, die beim Ausführen der Wiedergabetests von ExoPlayer auftreten, zusammen mit der wahrscheinlichen Ursache in jedem Fall. Sobald weitere Fehlerarten entdeckt werden, werden sie dieser Liste hinzugefügt.
Unerwarteter Zeitstempel für Präsentation des Videopuffers
Logcat enthält einen Fehler wie diesen:
Caused by: java.lang.IllegalStateException: Expected to dequeue video buffer
with presentation timestamp: 134766000. Instead got: 134733000 (Processed
buffers since last flush: 2242).
Dieser Fehler wird meistens dadurch verursacht, dass der getestete Videodecoder falsch ist.
das Verwerfen, Einfügen
oder Neuanordnen von Zwischenspeichern. Im Beispiel oben sollte im Test ein Puffer mit dem Präsentationszeitstempel 134766000
aus MediaCodec.dequeueOutputBuffer
entfernt werden. Stattdessen wurde jedoch ein Puffer mit dem Präsentationszeitstempel 134733000
entfernt. Wir empfehlen, die Implementierung des Decoders zu überprüfen, wenn dieser Fehler auftritt. Insbesondere sollte er adaptive Auflösungswechsel korrekt verarbeiten, ohne Puffer zu verwerfen.
Zu viele abgebrochene Zwischenspeicher
Logcat enthält einen Fehler wie diesen:
junit.framework.AssertionFailedError: Codec(DashTest:Video) was late decoding:
200 buffers. Limit: 25.
Dieser Fehler ist ein Leistungsproblem, bei dem der getestete Videodecoder eine große Anzahl von Puffern zu spät decodiert hat. Im obigen Beispiel hat ExoPlayer 200 Puffer, da sie zu spät gekommen sind, als sie aus der Warteschlange entfernt wurden, mit einem Grenzwert von 25. Die offensichtlichste Ursache ist, dass der Video-Decoder zu langsam Puffer decodiert. Wenn die Fehler nur bei einer Teilmenge der Tests auftreten, bei denen Widevine-geschützte Inhalte wiedergegeben werden, sind die Plattformvorgänge für die Pufferentschlüsselung wahrscheinlich zu langsam. Wir empfehlen, die Leistung dieser Komponenten zu prüfen und zu sehen, ob sie optimiert werden können, um sie zu beschleunigen.
Das native Fenster konnte nicht authentifiziert werden
Logcat enthält einen Fehler wie diesen:
SurfaceUtils: native window could not be authenticated
ExoPlayerImplInternal: Internal runtime error.
ExoPlayerImplInternal: android.media.MediaCodec$CodecException: Error 0xffffffff
Dieser Fehler weist darauf hin, dass das Secure Bit-Flag auf der Plattform nicht richtig festgelegt wurde.
Zeitüberschreitung beim Test
Logcat enthält einen Fehler wie diesen:
AssertionFailedError: Test timed out after 300000 ms.
Dieser Fehler wird meistens durch eine schlechte Netzwerkverbindung während des Tests verursacht.
ausführen. Wenn das Gerät offenbar eine gute Netzwerkverbindung hat, hängt der Test möglicherweise beim Aufruf einer Plattformkomponente (z. B. MediaCodec
, MediaDrm
oder AudioTrack
) fest. Prüfen Sie die Aufrufstacks der Threads im Testprozess, um dies festzustellen.