Оптимизируйте свои подборки
Сохраняйте и классифицируйте контент в соответствии со своими настройками.
На этой странице описаны различные типы поверхностей, которые можно использовать для воспроизведения видео с помощью Media3, а также способы выбора подходящего типа для вашего случая. Чтобы узнать больше об объектах Surface в Android, ознакомьтесь с этой графической документацией .
Выберите тип поверхности для PlayerView
Атрибут surface_type объекта PlayerView позволяет задать тип поверхности, используемой для воспроизведения видео. Допустимые значения:
spherical_gl_surface_view ( SphericalGLSurfaceView ) — для сферического воспроизведения видео
video_decoder_gl_surface_view ( VideoDecoderGLSurfaceView ) — рендеринг видео с использованием расширений-рендереров
none — предназначено только для воспроизведения звука и должно использоваться, чтобы избежать необходимости создания поверхности, поскольку это может быть дорого.
Если представление предназначено для обычного воспроизведения видео, следует использовать surface_view или texture_view . SurfaceView имеет ряд преимуществ перед TextureView при воспроизведении видео:
Более точная синхронизация кадров, что обеспечивает более плавное воспроизведение видео.
Поддержка вывода HDR-видео более высокого качества на совместимых устройствах.
Поддержка безопасного вывода при воспроизведении контента, защищенного DRM.
Возможность отображения видеоконтента с полным разрешением дисплея на устройствах Android TV, которые масштабируют слой пользовательского интерфейса.
Поэтому по возможности следует отдавать предпочтение SurfaceView , а не TextureView . TextureView следует использовать только в том случае, если SurfaceView не отвечает вашим потребностям. Например, в случае, когда требуется плавная анимация или прокрутка видеоповерхности в версиях до Android 7.0 (уровень API 24), как описано в следующих примечаниях. В этом случае предпочтительно использовать TextureView только в том случае, если SDK_INT меньше 24 (Android 7.0), а в противном случае SurfaceView .
Модуль Media3 ui-compose предоставляет компонуемый объект PlayerSurface , который связывает Player с Surface с учётом жизненного цикла. В данном случае используются следующие типы поверхностей:
Тип none отсутствует, поскольку это соответствовало бы отсутствию PlayerSurface в дереве Compose UI.
Контент и образцы кода на этой странице предоставлены по лицензиям. Java и OpenJDK – это зарегистрированные товарные знаки корпорации Oracle и ее аффилированных лиц.
Последнее обновление: 2025-08-27 UTC.
[[["Прост для понимания","easyToUnderstand","thumb-up"],["Помог мне решить мою проблему","solvedMyProblem","thumb-up"],["Другое","otherUp","thumb-up"]],[["Отсутствует нужная мне информация","missingTheInformationINeed","thumb-down"],["Слишком сложен/слишком много шагов","tooComplicatedTooManySteps","thumb-down"],["Устарел","outOfDate","thumb-down"],["Проблема с переводом текста","translationIssue","thumb-down"],["Проблемы образцов/кода","samplesCodeIssue","thumb-down"],["Другое","otherDown","thumb-down"]],["Последнее обновление: 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."]]