This page describes the different types of surfaces that can be used for video playback with Media3, and how to choose the right type for your use case. To find out more about Surface objects in Android, read this graphics documentation.
Choose a surface type for PlayerView
The surface_type attribute of PlayerView lets you set the type of
surface used for video playback. The allowed values are:
surface_view(SurfaceView)texture_view(TextureView)spherical_gl_surface_view(SphericalGLSurfaceView) - for spherical video playbackvideo_decoder_gl_surface_view(VideoDecoderGLSurfaceView) - video rendering using extension renderersnone- which is for audio playback only and should be used to avoid having to create a surface because doing so can be expensive.
If the view is for regular video playback then surface_view or texture_view
should be used. SurfaceView has a number of benefits over
TextureView for video playback:
- Significantly lower power consumption on many devices.
- More accurate frame timing, resulting in smoother video playback.
- Support for higher quality HDR video output on capable devices.
- Support for secure output when playing DRM-protected content.
- The ability to render video content at the full resolution of the display on Android TV devices that upscale the UI layer.
SurfaceView should therefore be preferred over TextureView where possible.
TextureView should be used only if SurfaceView does not meet your needs. One
example is where smooth animations or scrolling of the video surface is required
prior to Android 7.0 (API level 24), as described in the following notes. For
this case, it's preferable to use TextureView only when SDK_INT is less
than 24 (Android 7.0) and SurfaceView otherwise.
Choose a surface type in Compose
In Compose, the interop solution uses the AndroidView Composable to wrap
SurfaceView and TextureView. The two Composables that correspond to
that are AndroidExternalSurface and AndroidEmbeddedExternalSurface.
Media3 ui-compose module provides a PlayerSurface Composable that links
the Player to a Surface in a lifecycle-aware manner. The surface types
in this case are:
SURFACE_TYPE_SURFACE_VIEW(effectivelyAndroidExternalSurface)SURFACE_TYPE_TEXTURE_VIEW(effectivelyAndroidEmbeddedExternalSurface)
There is no type none, since that would correspond to not including the
PlayerSurface in your Compose UI tree.