ExoPlayer est utilisé par un grand nombre d'applications Android. En tant qu'OEM, il est important de s'assurer qu'ExoPlayer fonctionne correctement à la fois sur les nouveaux appareils et sur les nouvelles versions de plate-forme pour les appareils existants. Cette page décrit les tests de compatibilité que nous vous recommandons d'exécuter avant d'envoyer une mise à jour OTA pour un appareil ou une plate-forme, ainsi que certains des modes de défaillance courants rencontrés lors de leur exécution.
Exécuter les tests
Pour exécuter les tests de lecture d'ExoPlayer, commencez par extraire la dernière version d'ExoPlayer depuis GitHub. Vous pouvez ensuite exécuter les tests à partir de la ligne de commande ou d'Android Studio.
Ligne de commande
À partir du répertoire racine, compilez et installez les tests de lecture :
./gradlew :test-exoplayer-playback:installDebug
Ensuite, exécutez les tests de lecture dans le package 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
Les résultats des tests s'affichent dans STDOUT.
Android Studio
Ouvrez le projet ExoPlayer, accédez au module playbacktests, effectuez un clic droit sur le dossier gts et exécutez les tests. Les résultats des tests s'affichent dans la fenêtre "Run" (Exécuter) d'Android Studio.
Modes de défaillance courants
Vous trouverez ci-dessous une description de certains modes de défaillance courants rencontrés lors de l'exécution des tests de lecture d'ExoPlayer, ainsi que la cause première probable dans chaque cas. Nous compléterons cette liste à mesure que d'autres modes de défaillance seront découverts.
Code temporel de présentation du tampon vidéo inattendu
Logcat affichera une erreur semblable à celle-ci :
Caused by: java.lang.IllegalStateException: Expected to dequeue video buffer
with presentation timestamp: 134766000. Instead got: 134733000 (Processed
buffers since last flush: 2242).
Cet échec est le plus souvent dû au fait que le décodeur vidéo testé supprime, insère ou réorganise incorrectement les tampons. Dans l'exemple ci-dessus, le test devait retirer de la file d'attente un tampon avec le code temporel de présentation 134766000 de MediaCodec.dequeueOutputBuffer, mais il a retiré un tampon avec le code temporel de présentation 134733000. Nous vous recommandons de vérifier l'implémentation du décodeur en cas d'échec, en particulier qu'il gère correctement les changements de résolution adaptatifs sans supprimer de tampons.
Trop de tampons supprimés
Logcat affichera une erreur semblable à celle-ci :
junit.framework.AssertionFailedError: Codec(DashTest:Video) was late decoding:
200 buffers. Limit: 25.
Il s'agit d'un problème de performances, où le décodeur vidéo testé a décodé un grand nombre de tampons en retard. Dans l'exemple ci-dessus, ExoPlayer a supprimé 200 tampons, car ils étaient en retard au moment de leur retrait de la file d'attente, pour un test qui impose une limite de 25. La cause la plus évidente est que le décodeur vidéo est trop lent pour décoder les tampons. Si les échecs ne se produisent que pour le sous-ensemble de tests qui lisent du contenu protégé par Widevine, il est probable que les opérations de plate-forme pour le déchiffrement du tampon soient trop lentes. Nous vous recommandons de vérifier les performances de ces composants et de voir si des optimisations peuvent être apportées pour les accélérer.
Impossible d'authentifier la fenêtre native
Logcat affichera une erreur semblable à celle-ci :
SurfaceUtils: native window could not be authenticated
ExoPlayerImplInternal: Internal runtime error.
ExoPlayerImplInternal: android.media.MediaCodec$CodecException: Error 0xffffffff
Cet échec indique que la plate-forme n'a pas réussi à définir correctement l'indicateur de bit sécurisé.
Le délai du test a expiré
Logcat affichera une erreur semblable à celle-ci :
AssertionFailedError: Test timed out after 300000 ms.
Cet échec est le plus souvent dû à une mauvaise connectivité réseau lors de l'exécution du test. Si l'appareil semble disposer d'une bonne connectivité réseau, il est possible que le test soit bloqué lors de l'appel d'un composant de plate-forme (tel que MediaCodec, MediaDrm ou AudioTrack). Inspectez les piles d'appels des threads du processus de test pour déterminer si c'est le cas.