Mit Sammlungen den Überblick behalten
Sie können Inhalte basierend auf Ihren Einstellungen speichern und kategorisieren.
Auf dieser Seite werden die verschiedenen Arten von Oberflächen beschrieben, die für die Videowiedergabe mit Media3 verwendet werden können, und es wird erläutert, wie Sie den richtigen Typ für Ihren Anwendungsfall auswählen. Weitere Informationen zu Surface-Objekten in Android
Oberflächentyp für PlayerView auswählen
Mit dem Attribut surface_type von PlayerView können Sie den Typ der Oberfläche für die Videowiedergabe festlegen. Zulässige Werte:
none – diese Option ist nur für die Audiowiedergabe vorgesehen und sollte verwendet werden, um die Erstellung einer Oberfläche zu vermeiden, da dies kostspielig sein kann.
Wenn die Ansicht für die normale Videowiedergabe vorgesehen ist, sollte surface_view oder texture_view verwendet werden. SurfaceView bietet bei der Videowiedergabe eine Reihe von Vorteilen gegenüber TextureView:
Das Frame-Timing ist genauer, was zu einer flüssigeren Videowiedergabe führt.
Unterstützung für die HDR-Videoausgabe in höherer Qualität auf kompatiblen Geräten.
Unterstützung für die sichere Ausgabe bei der Wiedergabe von DRM-geschützten Inhalten.
Die Möglichkeit, Videoinhalte in der vollen Auflösung des Displays auf Android TV-Geräten wiederzugeben, die die UI-Ebene hochskalieren.
SurfaceView sollte daher nach Möglichkeit gegenüber TextureView bevorzugt werden.
TextureView sollte nur verwendet werden, wenn SurfaceView nicht Ihren Anforderungen entspricht. Ein Beispiel ist, wenn vor Android 7.0 (API-Level 24) flüssige Animationen oder das Scrollen der Videooberfläche erforderlich sind, wie in den folgenden Hinweisen beschrieben. In diesem Fall ist es besser, TextureView nur zu verwenden, wenn SDK_INT kleiner als 24 (Android 7.0) ist, und andernfalls SurfaceView.
Das Media3-Modul ui-compose bietet ein PlayerSurface-Composable, das die Player auf lebenszyklusbewusste Weise mit einem Surface verknüpft. Die Oberflächen sind in diesem Fall:
Es gibt keinen Typ none, da dies bedeuten würde, dass PlayerSurface nicht in Ihren Compose-UI-Baum aufgenommen wird.
Alle Inhalte und Codebeispiele auf dieser Seite unterliegen den Lizenzen wie im Abschnitt Inhaltslizenz beschrieben. Java und OpenJDK sind Marken oder eingetragene Marken von Oracle und/oder seinen Tochtergesellschaften.
Zuletzt aktualisiert: 2025-08-27 (UTC).
[[["Leicht verständlich","easyToUnderstand","thumb-up"],["Mein Problem wurde gelöst","solvedMyProblem","thumb-up"],["Sonstiges","otherUp","thumb-up"]],[["Benötigte Informationen nicht gefunden","missingTheInformationINeed","thumb-down"],["Zu umständlich/zu viele Schritte","tooComplicatedTooManySteps","thumb-down"],["Nicht mehr aktuell","outOfDate","thumb-down"],["Problem mit der Übersetzung","translationIssue","thumb-down"],["Problem mit Beispielen/Code","samplesCodeIssue","thumb-down"],["Sonstiges","otherDown","thumb-down"]],["Zuletzt aktualisiert: 2025-08-27 (UTC)."],[],[],null,["This page describes the different types of surfaces that can be used for video\nplayback with Media3, and how to choose the right type for your use case. To\nfind out more about Surface objects in Android, read this [graphics\ndocumentation](https://source.android.com/docs/core/graphics/arch-sh).\n\nChoose a surface type for PlayerView\n\nThe `surface_type` attribute of [`PlayerView`](/reference/androidx/media3/ui/PlayerView) lets you set the type of\nsurface used for video playback. The allowed values are:\n\n- `surface_view` ([`SurfaceView`](/reference/android/view/SurfaceView))\n- `texture_view` ([`TextureView`](/reference/android/view/TextureView))\n- `spherical_gl_surface_view` ([`SphericalGLSurfaceView`](/reference/androidx/media3/exoplayer/video/spherical/SphericalGLSurfaceView)) - for spherical video playback\n- `video_decoder_gl_surface_view` ([`VideoDecoderGLSurfaceView`](/reference/androidx/media3/exoplayer/video/VideoDecoderGLSurfaceView)) - video rendering using extension renderers\n- `none` - which is for audio playback only and should be used to avoid having to create a surface because doing so can be expensive.\n\nIf the view is for regular video playback then `surface_view` or `texture_view`\nshould be used. [`SurfaceView`](/reference/android/view/SurfaceView) has a number of benefits over\n[`TextureView`](/reference/android/view/TextureView) for video playback:\n\n- Significantly [lower power consumption](/media/media3/exoplayer/battery-consumption) on many devices.\n- More accurate frame timing, resulting in smoother video playback.\n- Support for higher quality HDR video output on capable devices.\n- Support for secure output when playing DRM-protected content.\n- The ability to render video content at the full resolution of the display on Android TV devices that upscale the UI layer.\n\n`SurfaceView` should therefore be preferred over `TextureView` where possible.\n`TextureView` should be used only if `SurfaceView` does not meet your needs. One\nexample is where smooth animations or scrolling of the video surface is required\nprior to Android 7.0 (API level 24), as described in the following notes. For\nthis case, it's preferable to use `TextureView` only when [`SDK_INT`](/reference/android/os/Build.VERSION#SDK_INT) is less\nthan 24 (Android 7.0) and `SurfaceView` otherwise.\n| **Note:** `SurfaceView` rendering wasn't properly synchronized with view animations until Android 7.0 (API level 24). On earlier releases, improper synchronization could result in unwanted effects when a `SurfaceView` was placed into a scrolling container, or when it was animated. Unwanted effects included the view's contents appearing to lag slightly behind where it should be displayed, and the view turning black when animated. To achieve smooth animation or scrolling of video prior to Android 7.0, use `TextureView` rather than `SurfaceView`.\n| **Note:** The lifecycle of a `SurfaceView`'s surface is tied to view visibility, whereas a `TextureView`'s surface lifecycle is tied to window attachment and detachment. Therefore, in scrolling UIs that use `SurfaceView`, starting playback can take longer because the output surface becomes available slightly later. From Android 14 onwards, `PlayerView` uses [`SurfaceView.setSurfaceLifecycle(SURFACE_LIFECYCLE_FOLLOWS_ATTACHMENT)`](/reference/android/view/SurfaceView#setSurfaceLifecycle(int)) to avoid this behavior. If your app uses `SurfaceView` directly (without `PlayerView`) then you may want to enable this mode. Before Android 14, it's possible to work around the surface being destroyed by translating views off-screen when recycling them.\n| **Note:** Some Android TV devices run their UI layer at a resolution that's lower than the full resolution of the display, upscaling it for presentation to the user. For example, the UI layer may be run at 1080p on an Android TV that has a 4K display. On such devices, `SurfaceView` must be used to render content at the full resolution of the display. The full resolution of the display (in its current display mode) can be queried using [`Util.getCurrentDisplayModeSize`](/reference/androidx/media3/common/util/Util#getCurrentDisplayModeSize(android.content.Context)). The UI layer resolution can be queried using Android's [`Display.getSize`](/reference/android/view/Display#getSize(android.graphics.Point)) API.\n| **Note:** If you are using `PlayerView` inside of `AndroidView`, we cannot guarantee compatibility because `PlayerView` was not made with Compose in mind. One of the common problems for `SDK_INT == 34` is a stretched/cropped/leaked Surface that does not match the parent container (`AspectRatioFrameLayout`) correctly. You can opt into a Compose workaround by calling `PlayerView.setEnableComposeSurfaceSyncWorkaround`, but note that it causes issues with XML-based shared transitions.\n\nChoose a surface type in Compose\n\nIn Compose, the interop solution uses the `AndroidView` Composable to wrap\n[`SurfaceView`](/reference/android/view/SurfaceView) and [`TextureView`](/reference/android/view/TextureView). The two Composables that correspond to\nthat are [`AndroidExternalSurface`](/reference/kotlin/androidx/compose/foundation/package-summary#AndroidExternalSurface(androidx.compose.ui.Modifier,kotlin.Boolean,androidx.compose.ui.unit.IntSize,androidx.compose.foundation.AndroidExternalSurfaceZOrder,kotlin.Boolean,kotlin.Function1)) and [`AndroidEmbeddedExternalSurface`](/reference/kotlin/androidx/compose/foundation/package-summary#AndroidEmbeddedExternalSurface(androidx.compose.ui.Modifier,kotlin.Boolean,androidx.compose.ui.unit.IntSize,androidx.compose.ui.graphics.Matrix,kotlin.Function1)).\n\nMedia3 `ui-compose` module provides a [`PlayerSurface`](https://developer.android.com/reference/kotlin/androidx/media3/ui/compose/package-summary#PlayerSurface(androidx.media3.common.Player,androidx.compose.ui.Modifier,kotlin.Int)) Composable that links\nthe [`Player`](/reference/androidx/media3/common/Player) to a `Surface` in a lifecycle-aware manner. The surface types\nin this case are:\n\n- `SURFACE_TYPE_SURFACE_VIEW` (effectively [`AndroidExternalSurface`](/reference/kotlin/androidx/compose/foundation/package-summary#AndroidExternalSurface(androidx.compose.ui.Modifier,kotlin.Boolean,androidx.compose.ui.unit.IntSize,androidx.compose.foundation.AndroidExternalSurfaceZOrder,kotlin.Boolean,kotlin.Function1)))\n- `SURFACE_TYPE_TEXTURE_VIEW` (effectively [`AndroidEmbeddedExternalSurface`](/reference/kotlin/androidx/compose/foundation/package-summary#AndroidEmbeddedExternalSurface(androidx.compose.ui.Modifier,kotlin.Boolean,androidx.compose.ui.unit.IntSize,androidx.compose.ui.graphics.Matrix,kotlin.Function1)))\n\nThere is no type `none`, since that would correspond to not including the\n`PlayerSurface` in your Compose UI tree."]]