UI 레이어를 업스케일하는 Android TV 기기에서 디스플레이의 전체 해상도로 동영상 콘텐츠를 렌더링하는 기능
따라서 가능한 경우 TextureView보다 SurfaceView를 사용하는 것이 좋습니다.
SurfaceView가 요구사항을 충족하지 않는 경우에만 TextureView를 사용해야 합니다. 한 가지 예는 다음 참고사항에 설명된 대로 Android 7.0 (API 수준 24) 이전에 동영상 화면의 부드러운 애니메이션이나 스크롤이 필요한 경우입니다. 이 경우 SDK_INT이 24 (Android 7.0)보다 작은 경우에만 TextureView을 사용하고 그렇지 않은 경우 SurfaceView을 사용하는 것이 좋습니다.
Compose UI 트리에 PlayerSurface을 포함하지 않는 것에 해당하므로 none 유형은 없습니다.
이 페이지에 나와 있는 콘텐츠와 코드 샘플에는 콘텐츠 라이선스에서 설명하는 라이선스가 적용됩니다. 자바 및 OpenJDK는 Oracle 및 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."]]