Esta página descreve os diferentes tipos de superfícies que podem ser usadas para reprodução de vídeo com a Media3 e como escolher o tipo certo para seu caso de uso. Para saber mais sobre objetos de superfície no Android, leia esta documentação de gráficos.
Definir a plataforma
Há quatro pontos de entrada para o Player conectar a saída de vídeo a algum
Surface:
void setVideoSurface(@Nullable Surface surface)void setVideoSurfaceHolder(@Nullable SurfaceHolder surfaceHolder)void setVideoSurfaceView(@Nullable SurfaceView surfaceView)void setVideoTextureView(@Nullable TextureView textureView)
Há também diferentes maneiras de limpar:
void clearVideoSurface()void clearVideoSurface(@Nullable Surface surface)void clearVideoSurfaceHolder(@Nullable SurfaceHolder surfaceHolder)void clearVideoSurfaceView(@Nullable SurfaceView surfaceView)void clearVideoTextureView(@Nullable TextureView textureView)
Escolher um tipo de superfície para PlayerView
O atributo surface_type de PlayerView permite definir o tipo de superfície
usada para reprodução de vídeo. Os valores permitidos são:
surface_view(SurfaceView)texture_view(TextureView)spherical_gl_surface_view(SphericalGLSurfaceView): para reprodução de vídeo esféricovideo_decoder_gl_surface_view(VideoDecoderGLSurfaceView): renderização de vídeo usando renderizadores de extensãonone, que é apenas para reprodução de áudio e deve ser usado para evitar a criação de uma superfície, já que isso pode ser caro.
Se a visualização for para reprodução de vídeo normal, use surface_view ou texture_view. O SurfaceView tem vários benefícios em relação ao TextureView
para reprodução de vídeo:
- Reduz significativamente o consumo de energia em muitos dispositivos.
- Melhor precisão de tempo de frame, resultando em uma reprodução de vídeo mais suave.
- Suporte para saída de vídeo HDR de alta qualidade em dispositivos compatíveis.
- Suporte para saída segura ao reproduzir conteúdo protegido por DRM.
- A capacidade de renderizar conteúdo de vídeo na resolução total da tela em dispositivos Android TV que aumentam a camada da interface.
Portanto, SurfaceView deve ser preferido em vez de TextureView sempre que possível.
TextureView só deve ser usado se SurfaceView não atender às suas necessidades. Um exemplo é quando animações suaves ou rolagem da superfície de vídeo são necessárias antes do Android 7.0 (nível 24 da API), conforme descrito nas notas a seguir. Nesse caso, é preferível usar TextureView somente quando SDK_INT for menor que 24 (Android 7.0) e SurfaceView caso contrário.
Escolher um tipo de superfície no Compose
No Compose, a solução de interoperabilidade usa o elemento combinável AndroidView para encapsular
SurfaceView e TextureView. Os dois elementos combináveis que correspondem a isso são AndroidExternalSurface e AndroidEmbeddedExternalSurface de androidx.compose.foundation. No entanto, essas classes de proxy fornecem uma superfície de API
que limita o acesso às visualizações subjacentes. Essas visualizações são necessárias para que o
Player processe um ciclo de vida completo da superfície (criação e atualizações de
tamanho).
No módulo media3-ui-compose, você encontra os elementos combináveis ContentFrame e PlayerSurface, que vinculam o Player a um Surface de maneira compatível com o ciclo de vida. Neste caso, os tipos de superfície são:
androidx.media3.ui.compose.SURFACE_TYPE_SURFACE_VIEWandroidx.media3.ui.compose.SURFACE_TYPE_TEXTURE_VIEW
Não há um tipo none, já que isso corresponderia a não incluir o
elemento combinável na árvore da interface do Compose.