Ihrer App ein räumliches Video hinzufügen

Das Jetpack XR SDK unterstützt die Wiedergabe von stereoskopischen Side-by-Side-Videos auf ebenen Oberflächen. Bei einem stereoskopischen Video besteht jeder Frame aus einem Bild für das linke und ein Bild für das rechte Auge, um den Zuschauern ein Gefühl für die Tiefe zu vermitteln – auch Stereopsis genannt.

Sie können nicht-stereoskopische 2D-Videos in Android XR-Apps mit den Standardmedien-APIs rendern, die für die Android-Entwicklung auf anderen Formfaktoren verwendet werden.

Videos nebeneinander mit Jetpack SceneCore abspielen

Bei einem Side-by-Side-Video wird jeder stereoskopische Frame als zwei Bilder dargestellt, die horizontal nebeneinander angeordnet sind. Die Videoframes oben und unten sind vertikal nebeneinander angeordnet.

Side-by-Side-Video ist kein Codec, sondern eine Möglichkeit, stereoskopische Frames zu organisieren. Es kann also in einem beliebigen der von Android unterstützten Codecs codiert werden.

Du kannst ein Splitscreen-Video mit dem Media3 Exoplayer laden und dann mit dem neuen SurfaceEntity rendern. Rufen Sie SurfaceEntity.create auf, um eine SurfaceEntity zu erstellen, wie im folgenden Beispiel gezeigt.

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()

MV-HEVC-Videos mit Jetpack SceneCore abspielen

Der MV-HEVC-Codec-Standard ist für stereoskopische Videos optimiert und konzipiert. So können Sie in Ihrer App immersive Videos in hoher Qualität effizient wiedergeben. MV-HEVC-Dateien haben einen primären Stream, in der Regel das linke Auge, und einen Stereostream mit dem anderen Auge.

Ähnlich wie bei einem Splitscreen-Video kannst du es mit dem Media3 Exoplayer laden und mit der SurfaceEntity rendern. Du musst beim Aufrufen von SurfaceEntity.create im Parameter stereoMode angeben, ob deine MV-HEVC-Datei links oder rechts primär ist.

// 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()

180-Grad- und 360-Grad-Videos mit Jetpack SceneCore abspielen

SurfaceEntity unterstützt die Wiedergabe von 180°-Videos auf halbkugelförmigen Oberflächen und 360°-Videos auf sphärischen Oberflächen. Der Parameter radius bezieht sich standardmäßig auf die radiale Größe der jeweiligen Flächen in Metern.

Im folgenden Code wird gezeigt, wie SurfaceEntity für die Wiedergabe auf einer 180°-Halbkugel und einer 360°-Kugel eingerichtet wird. Wenn Sie diese Canvas-Formen verwenden, positionieren Sie die Oberfläche anhand der Kopfhaltung des Nutzers, um ein immersives Erlebnis zu ermöglichen.

// 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.

Räumliche Videos mit Jetpack Compose for XR abspielen

Wenn Sie wissen möchten, wie Sie mit Jetpack Compose für XR Videos abspielen, erfahren Sie hier, wie Sie eine Oberfläche für Bild- oder Videoinhalte hinzufügen.