ExoPlayer è utilizzato da un gran numero di app Android. In qualità di OEM, è importante garantire che ExoPlayer funzioni correttamente sia sui nuovi dispositivi che nuove piattaforme per dispositivi esistenti. In questa pagina viene descritta la compatibilità test che consigliamo di eseguire prima di spedire un OTA per dispositivo o piattaforma; e alcune delle modalità di errore più comuni che si verificano durante l'esecuzione.
Esecuzione dei test
Per eseguire i test di riproduzione di ExoPlayer, dai un'occhiata all'ultima release di ExoPlayer di GitHub. Puoi quindi eseguire i test dalla riga di comando Android Studio.
Riga di comando
Dalla directory root, crea e installa i test di riproduzione:
./gradlew :test-exoplayer-playback:installDebug
Esegui quindi 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
e fai clic con il tasto destro del mouse
sulla cartella gts
ed esegui i test. I risultati del test vengono visualizzati nella console di Android Studio
Finestra Esegui.
Modalità di errore comuni
Alcune delle modalità di errore comuni che si verificano durante l'esecuzione della riproduzione di ExoPlayer vengono descritti di seguito, insieme alla probabile causa principale in ciascun caso. Me verranno aggiunte a questo elenco man mano che vengono rilevate altre modalità di errore.
Timestamp della 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 molto spesso dall'erroneo test del decodificatore video
scartare, inserire o riordinare i buffer. Nell'esempio precedente, il test
deve rimuovere la coda di un buffer con timestamp di presentazione 134766000
da
MediaCodec.dequeueOutputBuffer
, ma è stato rilevato che ha rimosso la coda di un buffer con
con il timestamp della presentazione 134733000
. Ti consigliamo di controllare
decoder quando si verifica questo errore, in particolare il fatto
gestisce correttamente i sensori di risoluzione adattiva senza scartare 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 rappresenta un problema di prestazioni, in cui il decodificatore video oggetto del test la decodifica tardiva di un grande numero di buffer. Nell'esempio precedente, ExoPlayer ha eliminato 200 buffer perché erano in ritardo quando sono stati rimossi dalla coda, per un test che impone un limite di 25. La causa più ovvia è che il decoder video è troppo lento per i buffer. Se gli errori si verificano solo per il sottoinsieme dei test che riproducono contenuti protetti da Widevine, è probabile che la piattaforma per la decrittografia del buffer sono troppo lente. Ti consigliamo di controllare il rendimento questi componenti e valutando se sia possibile ottimizzare la velocità e seleziono.
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 imposta correttamente il token sicuro flag bit.
Timeout del test
Logcat conterrà un errore simile a:
AssertionFailedError: Test timed out after 300000 ms.
Questo errore è causato molto spesso da una scarsa connettività di rete durante il test
vengono eseguiti tutti i test delle unità. Se il dispositivo ha una buona connettività di rete, è possibile
che la chiamata sia bloccata su un componente della piattaforma (come
MediaCodec
, MediaDrm
o AudioTrack
). Controlla gli stack di chiamate
thread durante il processo di test per stabilire se questo è il caso.