本页面介绍了可用于 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。