En esta página, se describen los diferentes tipos de plataformas que se pueden usar para la reproducción de video con Media3 y cómo elegir el tipo adecuado para tu caso de uso. Para obtener más información sobre los objetos Surface en Android, consulta esta documentación de gráficos.
Cómo establecer la plataforma
Hay cuatro puntos de entrada para que el Player conecte su salida de video a algún Surface:
void setVideoSurface(@Nullable Surface surface)void setVideoSurfaceHolder(@Nullable SurfaceHolder surfaceHolder)void setVideoSurfaceView(@Nullable SurfaceView surfaceView)void setVideoTextureView(@Nullable TextureView textureView)
También hay diferentes formas de borrarlo:
void clearVideoSurface()void clearVideoSurface(@Nullable Surface surface)void clearVideoSurfaceHolder(@Nullable SurfaceHolder surfaceHolder)void clearVideoSurfaceView(@Nullable SurfaceView surfaceView)void clearVideoTextureView(@Nullable TextureView textureView)
Elige un tipo de plataforma para PlayerView
El atributo surface_type de PlayerView te permite establecer el tipo de plataforma que se usa para la reproducción de video. Los valores permitidos son los siguientes:
surface_view(SurfaceView)texture_view(TextureView)spherical_gl_surface_view(SphericalGLSurfaceView): Para la reproducción de videos esféricosvideo_decoder_gl_surface_view(VideoDecoderGLSurfaceView): Renderización de video con renderizadores de extensionesnone, que es solo para la reproducción de audio y se debe usar para evitar tener que crear una plataforma, ya que esto puede ser costoso.
Si la vista es para la reproducción de video normal, se debe usar surface_view o texture_view. SurfaceView tiene varios beneficios en comparación con TextureView para la reproducción de video:
- Un consumo de energía significativamente menor en muchos dispositivos
- Una sincronización de fotogramas más precisa, lo que permite una reproducción de video más fluida
- Compatibilidad con salida de video HDR de mayor calidad en dispositivos aptos
- Compatibilidad con la salida segura cuando se reproduce contenido protegido por DRM
- Capacidad de renderizar contenido de video en la resolución completa de la pantalla en dispositivos Android TV que reescalan la capa de IU
Por lo tanto, se debe preferir SurfaceView por sobre TextureView siempre que sea posible.
TextureView solo debe usarse si SurfaceView no satisface tus necesidades. Un ejemplo es cuando se requieren animaciones o desplazamientos fluidos de la plataforma de video en dispositivos que ejecutan versiones anteriores a Android 7.0 (nivel de API 24), como se describe en las siguientes notas. En este caso, es preferible usar TextureView solo cuando SDK_INT es inferior a 24 (Android 7.0) y SurfaceView en los demás casos.
Elige un tipo de plataforma en Compose
En Compose, la solución de interoperabilidad usa el elemento AndroidView componible para unir SurfaceView y TextureView. Los dos elementos componibles que corresponden a eso son AndroidExternalSurface y AndroidEmbeddedExternalSurface de androidx.compose.foundation. Sin embargo, estas clases de proxy proporcionan una plataforma de API que limita el acceso a las vistas subyacentes. Player necesita esas vistas para controlar el ciclo de vida completo de la plataforma (creación y actualizaciones de tamaño).
En el módulo media3-ui-compose, puedes encontrar los elementos componibles ContentFrame y PlayerSurface que vinculan el Player a un Surface de una manera que tiene en cuenta el ciclo de vida. En este caso, los tipos de plataforma son los siguientes:
androidx.media3.ui.compose.SURFACE_TYPE_SURFACE_VIEWandroidx.media3.ui.compose.SURFACE_TYPE_TEXTURE_VIEW
No hay un tipo none, ya que eso correspondería a no incluir el elemento componible en tu árbol de IU de Compose.