本页面介绍了可用于 Media3 视频播放的不同类型的 Surface,以及如何为您的用例选择合适的类型。如需了解有关 Android 中 Surface 对象的更多信息,请阅读此图形文档。
为 PlayerView 选择 Surface 类型
PlayerView
的 surface_type
属性允许您设置用于视频播放的 Surface 类型。允许的值有:
surface_view
(SurfaceView
)texture_view
(TextureView
)spherical_gl_surface_view
(SphericalGLSurfaceView
) - 用于球形视频播放video_decoder_gl_surface_view
(VideoDecoderGLSurfaceView
) - 使用扩展渲染器进行视频渲染none
- 仅用于音频播放,应避免创建 Surface,因为创建 Surface 的开销可能很大。
如果视图用于常规视频播放,则应使用 surface_view
或 texture_view
。SurfaceView
在视频播放方面比 TextureView
具有多项优势:
- 在许多设备上功耗显著降低。
- 更精确的帧计时,从而实现更流畅的视频播放。
- 在支持的设备上支持更高质量的 HDR 视频输出。
- 播放受 DRM 保护的内容时支持安全输出。
- 在对 UI 层进行升采样的 Android TV 设备上,能够以显示器的全分辨率渲染视频内容。
因此,在可能的情况下,SurfaceView
应优于 TextureView
。TextureView
仅应在 SurfaceView
无法满足您的需求时使用。一个例子是,在 Android 7.0 (API level 24) 之前需要视频 Surface 的平滑动画或滚动时,如以下说明所述。在这种情况下,最好仅在 SDK_INT
小于 24 (Android 7.0) 时使用 TextureView
,否则使用 SurfaceView
。
在 Compose 中选择 Surface 类型
在 Compose 中,互操作解决方案使用 AndroidView
Composable 来包装 SurfaceView
和 TextureView
。对应于此的两个 Composable 是 AndroidExternalSurface
和 AndroidEmbeddedExternalSurface
。
Media3 ui-compose
模块提供了一个 PlayerSurface
Composable,它以生命周期感知的方式将 Player
链接到 Surface
。在这种情况下,Surface 类型是:
SURFACE_TYPE_SURFACE_VIEW
(实际上是AndroidExternalSurface
)SURFACE_TYPE_TEXTURE_VIEW
(实际上是AndroidEmbeddedExternalSurface
)
没有 none
类型,因为这相当于不在您的 Compose UI 树中包含 PlayerSurface
。