本页面介绍了在 Media3 中可用于视频播放的不同类型的 Surface,以及如何根据您的应用场景选择合适的类型。如需详细了解 Android 中的 Surface 对象,请参阅此图形文档。
设置购买途径
Player 有四个入口点,可用于将其视频输出连接到某个 Surface:
void setVideoSurface(@Nullable Surface surface)void setVideoSurfaceHolder(@Nullable SurfaceHolder surfaceHolder)void setVideoSurfaceView(@Nullable SurfaceView surfaceView)void setVideoTextureView(@Nullable TextureView textureView)
您还可以通过其他方式清除此错误:
void clearVideoSurface()void clearVideoSurface(@Nullable Surface surface)void clearVideoSurfaceHolder(@Nullable SurfaceHolder surfaceHolder)void clearVideoSurfaceView(@Nullable SurfaceView surfaceView)void clearVideoTextureView(@Nullable TextureView textureView)
为 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。与 TextureView 相比,SurfaceView 在视频播放方面具有多项优势:
- 在许多设备上显著降低能耗。
- 帧计时更准确,从而使视频播放更流畅。
- 在支持的设备上支持更高质量的 HDR 视频输出。
- 支持在播放受 DRM 保护的内容时进行安全输出。
- 在对界面层进行放大处理的 Android TV 设备上,能够以显示屏的完整分辨率渲染视频内容。
因此,应尽可能优先使用 SurfaceView 而不是 TextureView。只有在 SurfaceView 无法满足您的需求时,才应使用 TextureView。例如,在 Android 7.0(API 级别 24)之前,需要对视频 Surface 进行平滑动画处理或滚动,请参阅以下说明。在这种情况下,最好仅当 SDK_INT 小于 24(Android 7.0)时使用 TextureView,否则使用 SurfaceView。
在 Compose 中选择 Surface 类型
在 Compose 中,互操作解决方案使用 AndroidView 可组合项来封装 SurfaceView 和 TextureView。与此对应的两个可组合项是 androidx.compose.foundation 中的 AndroidExternalSurface 和 AndroidEmbeddedExternalSurface。不过,这些代理类提供的 API 表面会限制对底层视图的访问。Player 需要这些视图来处理界面的完整生命周期(创建和大小更新)。
在 media3-ui-compose 模块中,您可以找到 ContentFrame 和 PlayerSurface 可组合项,它们以生命周期感知的方式将 Player 关联到 Surface。在这种情况下,表面类型为:
androidx.media3.ui.compose.SURFACE_TYPE_SURFACE_VIEWandroidx.media3.ui.compose.SURFACE_TYPE_TEXTURE_VIEW
没有 none 类型,因为这相当于未在 Compose 界面树中包含可组合项。