Types de surfaces

Cette page décrit les différents types de surfaces pouvant être utilisées pour la lecture vidéo avec Media3, et explique comment choisir le type adapté à votre cas d'utilisation. Pour en savoir plus sur les objets Surface dans Android, consultez cette documentation sur les graphiques.

Définir la surface

Il existe quatre points d'entrée pour que Player connecte sa sortie vidéo à un Surface :

Vous pouvez également l'effacer de différentes manières :

Choisir un type de surface pour PlayerView

L'attribut surface_type de PlayerView vous permet de définir le type de surface utilisé pour la lecture de la vidéo. Les valeurs autorisées sont les suivantes :

  • surface_view (SurfaceView)
  • texture_view (TextureView)
  • spherical_gl_surface_view (SphericalGLSurfaceView) : pour la lecture de vidéos sphériques
  • video_decoder_gl_surface_view (VideoDecoderGLSurfaceView) : rendu vidéo à l'aide de renderers d'extension
  • none, qui est réservé à la lecture audio et doit être utilisé pour éviter d'avoir à créer une surface, car cela peut être coûteux.

Si la vue est destinée à la lecture de vidéos classiques, surface_view ou texture_view doivent être utilisés. SurfaceView présente plusieurs avantages par rapport à TextureView pour la lecture de vidéos :

  • Consommation d'énergie nettement inférieure sur de nombreux appareils.
  • Un timing des images plus précis, ce qui permet une lecture plus fluide des vidéos.
  • Prise en charge de la sortie vidéo HDR de meilleure qualité sur les appareils compatibles.
  • Prise en charge de la sortie sécurisée lors de la lecture de contenu protégé par DRM.
  • Possibilité d'afficher du contenu vidéo à la résolution maximale de l'écran sur les appareils Android TV qui mettent à l'échelle la couche UI.

Dans la mesure du possible, il est donc préférable d'utiliser SurfaceView plutôt que TextureView. TextureView ne doit être utilisé que si SurfaceView ne répond pas à vos besoins. Par exemple, des animations fluides ou le défilement de la surface vidéo sont nécessaires avant Android 7.0 (niveau d'API 24), comme décrit dans les notes suivantes. Dans ce cas, il est préférable d'utiliser TextureView uniquement lorsque SDK_INT est inférieur à 24 (Android 7.0) et SurfaceView dans le cas contraire.

Choisir un type de surface dans Compose

Dans Compose, la solution d'interopérabilité utilise le composable AndroidView pour encapsuler SurfaceView et TextureView. Les deux composables qui correspondent à cela sont AndroidExternalSurface et AndroidEmbeddedExternalSurface de androidx.compose.foundation. Toutefois, ces classes de proxy fournissent une surface d'API qui limite l'accès aux vues sous-jacentes. Ces vues sont nécessaires à Player pour gérer le cycle de vie complet de la surface (création et mises à jour de la taille).

Dans le module media3-ui-compose, vous trouverez les composables ContentFrame et PlayerSurface qui associent Player à un Surface de manière à tenir compte du cycle de vie. Les types de surface dans ce cas sont les suivants :

  • androidx.media3.ui.compose.SURFACE_TYPE_SURFACE_VIEW
  • androidx.media3.ui.compose.SURFACE_TYPE_TEXTURE_VIEW

Il n'existe pas de type none, car cela correspondrait à ne pas inclure le composable dans votre arborescence de l'UI Compose.