ExoPlayer viene utilizzato da un numero elevato di app per Android. In qualità di OEM, è importante assicurarsi che ExoPlayer funzioni correttamente sia sui nuovi dispositivi sia sulle nuove build della piattaforma per i dispositivi esistenti. Questa pagina descrive i test di compatibilità che consigliamo di eseguire prima di spedire un dispositivo o un aggiornamento OTA della piattaforma e alcune delle modalità di errore comuni riscontrate durante l'esecuzione.
Esecuzione dei test
Per eseguire i test di riproduzione di ExoPlayer, scarica innanzitutto l'ultima release di ExoPlayer da GitHub. Puoi quindi eseguire i test dalla riga di comando o da Android Studio.
Riga di comando
Dalla directory principale, crea e installa i test di riproduzione:
./gradlew :test-exoplayer-playback:installDebug
Successivamente, esegui i test di riproduzione nel pacchetto 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
I risultati del test vengono visualizzati in STDOUT.
Android Studio
Apri il progetto ExoPlayer, vai al modulo playbacktests, fai clic con il tasto destro del mouse
sulla cartella gts ed esegui i test. I risultati del test vengono visualizzati nella finestra
Esegui di Android Studio.
Modalità di errore comuni
Di seguito sono descritti alcuni dei modi di errore più comuni riscontrati durante l'esecuzione dei test di riproduzione di ExoPlayer, insieme alla probabile causa principale in ogni caso. Aggiorneremo questo elenco man mano che verranno scoperti ulteriori modi di guasto.
Timestamp di presentazione del buffer video imprevisto
Logcat conterrà un errore simile a:
Caused by: java.lang.IllegalStateException: Expected to dequeue video buffer
with presentation timestamp: 134766000. Instead got: 134733000 (Processed
buffers since last flush: 2242).
Questo errore è causato più spesso dal decoder video in fase di test che scarta, inserisce o riordina in modo errato i buffer. Nell'esempio precedente, il test
prevedeva l'estrazione dalla coda di un buffer con timestamp di presentazione 134766000 da
MediaCodec.dequeueOutputBuffer, ma ha rilevato che è stato estratto dalla coda un buffer con
timestamp di presentazione 134733000. Ti consigliamo di controllare l'implementazione del decoder quando si verifica questo errore, in particolare che gestisca correttamente i cambi di risoluzione adattiva senza eliminare i buffer.
Troppi buffer eliminati
Logcat conterrà un errore simile a:
junit.framework.AssertionFailedError: Codec(DashTest:Video) was late decoding:
200 buffers. Limit: 25.
Questo errore è un problema di prestazioni, in cui il decoder video in fase di test ha ritardato la decodifica di un numero elevato di buffer. Nell'esempio precedente, ExoPlayer ha eliminato 200 buffer perché erano in ritardo al momento dell'estrazione dalla coda, per un test che impone un limite di 25. La causa più ovvia è che il decodificatore video è troppo lento a decodificare i buffer. Se gli errori si verificano solo per il sottoinsieme di test che riproducono contenuti protetti da Widevine, è probabile che le operazioni della piattaforma per la decriptografia del buffer siano troppo lente. Ti consigliamo di controllare il rendimento di questi componenti e di verificare se è possibile apportare ottimizzazioni per velocizzarli.
Impossibile autenticare la finestra nativa
Logcat conterrà un errore simile a:
SurfaceUtils: native window could not be authenticated
ExoPlayerImplInternal: Internal runtime error.
ExoPlayerImplInternal: android.media.MediaCodec$CodecException: Error 0xffffffff
Questo errore indica che la piattaforma non è riuscita a impostare correttamente il flag bit sicuro.
Timeout test
Logcat conterrà un errore simile a:
AssertionFailedError: Test timed out after 300000 ms.
Questo errore è spesso causato da una scarsa connettività di rete durante l'esecuzione del test. Se il dispositivo sembra avere una buona connettività di rete, è possibile
che il test si blocchi durante la chiamata a un componente della piattaforma (ad esempio
MediaCodec, MediaDrm o AudioTrack). Esamina gli stack di chiamate dei
thread nel processo di test per verificare se è questo il caso.