Jetpack XR SDK 支持在平面上播放立体并排视频。在立体视频中,每个帧都由左眼和右眼图像组成,以便让观看者感受到深度(也称为立体视觉)。
您可以使用用于在其他设备规格上进行 Android 开发的标准媒体 API,在 Android XR 应用中渲染非立体 2D 视频。
使用 Jetpack SceneCore 播放并排视频
在并排视频中,每个立体图像帧都显示为两张图片,水平排列在一起。顶部和底部的视频帧垂直排列,彼此相邻。
并排视频不是编解码器,而是组织立体声帧的方式,这意味着它可以使用 Android 支持的任何编解码器进行编码。
您可以使用 Media3 Exoplayer 加载并排视频,然后使用新的 SurfaceEntity
进行渲染。如需创建 SurfaceEntity
,请调用 SurfaceEntity.create
,如以下示例所示。
val stereoSurfaceEntity = SurfaceEntity.create( xrSession, SurfaceEntity.StereoMode.SIDE_BY_SIDE, Pose(Vector3(0.0f, 0.0f, -1.5f)), SurfaceEntity.CanvasShape.Quad(1.0f, 1.0f) ) val videoUri = Uri.Builder() .scheme(ContentResolver.SCHEME_ANDROID_RESOURCE) .path("sbs_video.mp4") .build() val mediaItem = MediaItem.fromUri(videoUri) val exoPlayer = ExoPlayer.Builder(this).build() exoPlayer.setVideoSurface(stereoSurfaceEntity.getSurface()) exoPlayer.setMediaItem(mediaItem) exoPlayer.prepare() exoPlayer.play()
使用 Jetpack SceneCore 播放 MV-HEVC 视频
MV-HEVC 编解码器标准经过优化,专为立体视频而设计,可让您的应用高效地以优质画质播放沉浸式视频。MV-HEVC 文件包含一个主要串流(通常是左眼)和一个包含另一只眼睛的立体声串流。
与并排视频类似,您可以使用 Media3 Exoplayer 加载此类视频,并使用 SurfaceEntity
进行渲染。调用 SurfaceEntity.create
时,您需要在 stereoMode
参数中指定 MV-HEVC 文件是左主还是右主。
// Create the SurfaceEntity with the StereoMode corresponding to the MV-HEVC content val stereoSurfaceEntity = SurfaceEntity.create( xrSession, SurfaceEntity.StereoMode.MULTIVIEW_LEFT_PRIMARY, Pose(Vector3(0.0f, 0.0f, -1.5f)), SurfaceEntity.CanvasShape.Quad(1.0f, 1.0f) ) val videoUri = Uri.Builder() .scheme(ContentResolver.SCHEME_ANDROID_RESOURCE) .path("mvhevc_video.mp4") .build() val mediaItem = MediaItem.fromUri(videoUri) val exoPlayer = ExoPlayer.Builder(this).build() exoPlayer.setVideoSurface(stereoSurfaceEntity.getSurface()) exoPlayer.setMediaItem(mediaItem) exoPlayer.prepare() exoPlayer.play()
使用 Jetpack SceneCore 播放 180 度和 360 度视频
SurfaceEntity
支持在半球形 Surface 上播放 180 度视频,在球形 Surface 上播放 360 度视频。默认情况下,radius
参数是指相应 Surface 的半径大小(以米为单位)。
以下代码展示了如何设置 SurfaceEntity
,以便在 180° 半球和 360° 球面上播放。使用这些画布形状时,请利用用户的头部姿势来定位 Surface,以提供沉浸式体验。
// Set up the surface for playing a 180° video on a hemisphere. val hemisphereStereoSurfaceEntity = SurfaceEntity.create( xrSession, SurfaceEntity.StereoMode.SIDE_BY_SIDE, xrSession.scene.spatialUser.head?.transformPoseTo( Pose.Identity, xrSession.scene.activitySpace )!!, SurfaceEntity.CanvasShape.Vr180Hemisphere(1.0f), ) // ... and use the surface for playing the media.
// Set up the surface for playing a 360° video on a sphere. val sphereStereoSurfaceEntity = SurfaceEntity.create( xrSession, SurfaceEntity.StereoMode.TOP_BOTTOM, xrSession.scene.spatialUser.head?.transformPoseTo( Pose.Identity, xrSession.scene.activitySpace )!!, SurfaceEntity.CanvasShape.Vr360Sphere(1.0f), ) // ... and use the surface for playing the media.
使用适用于 XR 的 Jetpack Compose 播放空间视频
如果您有兴趣了解如何使用适用于 XR 的 Jetpack Compose 播放视频,请了解如何为图片或视频内容添加 Surface。