Testes de OEM

O ExoPlayer é usado por um grande número de apps Android. Para OEMs, importante para garantir que o ExoPlayer funcione corretamente em novos dispositivos e em novos builds de plataforma para dispositivos existentes. Esta página descreve a compatibilidade testes que recomendamos executar antes do envio de um dispositivo ou plataforma OTA e alguns dos modos de falha comuns encontrados ao executá-los.

Como executar os testes

Para executar os testes de reprodução do ExoPlayer, primeiro confira a versão mais recente do ExoPlayer do GitHub (link em inglês). Em seguida, execute os testes na linha de comando ou Android Studio

Linha de comando

No diretório raiz, crie e instale os testes de reprodução:

./gradlew :test-exoplayer-playback:installDebug

Em seguida, execute os testes de reprodução no pacote 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

Os resultados do teste aparecem em STDOUT.

Android Studio

Abra o projeto do ExoPlayer, navegue até o módulo playbacktests e clique com o botão direito do mouse. na pasta gts e execute os testes. Os resultados do teste aparecem no Janela "Run".

Modos de falha comuns

Alguns dos modos de falha comuns encontrados ao executar a reprodução do ExoPlayer são descritos abaixo e a causa raiz provável em cada caso. Qa serão adicionados à lista à medida que mais modos de falha forem descobertos.

Carimbo de data/hora inesperado da apresentação em buffer de vídeo

O Logcat vai conter um erro semelhante a este:

Caused by: java.lang.IllegalStateException: Expected to dequeue video buffer
with presentation timestamp: 134766000. Instead got: 134733000 (Processed
buffers since last flush: 2242).

Essa falha geralmente é causada quando o decodificador de vídeo em teste está incorreto. o descarte, inserção ou reordenação dos buffers. No exemplo acima, o teste esperado para desenfileirar um buffer com o carimbo de data/hora da apresentação 134766000 de MediaCodec.dequeueOutputBuffer, mas descobriu que removeu um buffer da fila com o carimbo de data/hora da apresentação 134733000. Recomendamos que você verifique implementação do decodificador ao encontrar essa falha, em especial que ela lida corretamente com chaves de resolução adaptável sem descartar nenhum buffer.

Excesso de buffers perdidos

O Logcat vai conter um erro semelhante a este:

junit.framework.AssertionFailedError: Codec(DashTest:Video) was late decoding:
200 buffers. Limit: 25.

Essa falha é um problema de desempenho, em que o decodificador de vídeo em teste na decodificação tardia de um grande número de buffers. No exemplo acima, o ExoPlayer deixou 200 buffers porque estavam atrasados no momento em que foram retirados da fila, para um teste que impõe um limite de 25. A causa mais óbvia é que o decodificador de vídeo é decodificando buffers muito lentos. Se as falhas ocorrerem apenas no subconjunto de testes que reproduzem conteúdo protegido pela Widevine, é provável que as operações da plataforma para descriptografia de buffer forem muito lentas. Recomendamos verificar o desempenho esses componentes e verificar se é possível fazer otimizações para acelerar para cima.

Não foi possível autenticar a janela nativa

O Logcat vai conter um erro semelhante a este:

SurfaceUtils: native window could not be authenticated
ExoPlayerImplInternal: Internal runtime error.
ExoPlayerImplInternal: android.media.MediaCodec$CodecException: Error 0xffffffff

Essa falha indica que a plataforma não definiu corretamente o sistema bit.

O teste expirou

O Logcat vai conter um erro semelhante a este:

AssertionFailedError: Test timed out after 300000 ms.

Essa falha geralmente é causada por uma conectividade de rede ruim durante o teste correr. Se o dispositivo parece ter uma boa conectividade de rede, é possível que o teste está travando ao chamar um componente da plataforma (como MediaCodec, MediaDrm ou AudioTrack). Inspecione as pilhas de chamadas da no processo de teste para estabelecer se esse é o caso.