O ExoPlayer é usado por um grande número de apps Android. Como OEM, é importante garantir que o ExoPlayer funcione corretamente em novos dispositivos e em novos builds de plataforma para dispositivos já existentes. Esta página descreve os testes de compatibilidade que recomendamos executar antes de enviar um dispositivo ou plataforma OTA, e alguns dos modos de falha comuns encontrados nessa etapa.
Como executar os testes
Para executar os testes de reprodução do ExoPlayer, primeiro confira a versão mais recente do ExoPlayer no GitHub (link em inglês). Em seguida, execute os testes na linha de comando ou no 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 são exibidos em STDOUT.
Android Studio
Abra o projeto do ExoPlayer, navegue até o módulo playbacktests
, clique com o botão direito
do mouse na pasta gts
e execute os testes. Os resultados do teste aparecem na janela
Run do Android Studio.
Modos de falha comuns
Alguns dos modos de falha comuns encontrados ao executar os testes de reprodução do ExoPlayer estão descritos abaixo, junto com a causa raiz provável em cada caso. Adicionaremos a essa lista à medida que mais modos de falha forem descobertos.
Carimbo de data/hora inesperado da apresentação do 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 pelo decodificador de vídeo em teste descartando, inserindo ou reordenando buffers incorretamente. No exemplo acima, o teste
esperava cancelar a fila de um buffer com o carimbo de data/hora da apresentação 134766000
de
MediaCodec.dequeueOutputBuffer
, mas descobriu que ele removeu a fila um
com carimbo de data/hora da apresentação 134733000
. Recomendamos verificar a
implementação do decodificador ao encontrar essa falha, principalmente se ela
processa corretamente as chaves de resolução adaptáveis sem descartar nenhum buffer.
Muitos buffers descartados
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 estava atrasando a decodificação de um grande número de buffers. No exemplo acima, o ExoPlayer descartou 200 buffers porque eles estavam atrasados no momento em que foram removidos da fila, para um teste que impõe um limite de 25. A causa mais óbvia é que o decodificador de vídeo tem buffers de decodificação muito lentos. Se as falhas ocorrerem apenas no subconjunto de testes que reproduzem conteúdo protegido pelo Widevine, é provável que as operações da plataforma para descriptografia de buffer sejam muito lentas. Recomendamos verificar o desempenho desses componentes e analisar se é possível fazer otimizações para acelerá-los.
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 a flag de bit seguro.
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 a execução do
teste. Se o dispositivo parecer ter uma boa conectividade de rede, é possível
que o teste esteja travado ao chamar um componente da plataforma (como
MediaCodec
, MediaDrm
ou AudioTrack
). Inspecione as pilhas de chamadas das
linhas de execução no processo de teste para estabelecer se esse é o caso.