Test OEM

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.