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