Menambahkan video spasial ke aplikasi

Jetpack XR SDK mendukung pemutaran video berdampingan stereoskopik ke permukaan datar. Dengan video stereoskopis, setiap frame terdiri dari gambar mata kiri dan mata kanan untuk memberi penonton kedalaman tampilan—juga dikenal sebagai stereopsis.

Anda dapat merender video 2D non-stereoskopik di aplikasi Android XR dengan API media standar yang digunakan untuk pengembangan Android pada faktor bentuk lainnya.

Memutar video berdampingan menggunakan Jetpack SceneCore

Dengan video berdampingan, setiap frame stereoskopik ditampilkan sebagai dua gambar yang disusun secara horizontal berdekatan satu sama lain. Frame video atas dan bawah diatur secara vertikal berdekatan satu sama lain.

Video berdampingan bukanlah codec, melainkan cara mengatur frame stereoskopik, yang berarti dapat dienkode dalam salah satu codec yang didukung oleh Android.

Anda dapat memuat video berdampingan menggunakan Media3 Exoplayer, lalu merendernya menggunakan SurfaceEntity baru. Untuk membuat SurfaceEntity, panggil SurfaceEntity.create, seperti yang ditunjukkan dalam contoh berikut.

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

Memutar video MV-HEVC menggunakan Jetpack SceneCore

Standar codec MV-HEVC dioptimalkan dan dirancang untuk video stereoskopik, sehingga aplikasi Anda dapat memutar video imersif dengan kualitas yang luar biasa secara efisien. File MV-HEVC memiliki streaming utama, biasanya mata kiri, dan streaming stereo dengan mata lainnya.

Serupa dengan video berdampingan, Anda dapat memuat video tersebut menggunakan Media3 Exoplayer dan merendernya menggunakan SurfaceEntity. Anda harus menentukan apakah file MV-HEVC Anda adalah utama kiri atau kanan dalam parameter stereoMode saat memanggil SurfaceEntity.create.

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

Memutar video 180 derajat dan 360 derajat menggunakan Jetpack SceneCore

SurfaceEntity mendukung pemutaran video 180° di permukaan hemisfer dan video 360° di permukaan bola. Parameter radius mengacu pada ukuran radial masing-masing permukaan dalam meter secara default.

Kode berikut menunjukkan cara menyiapkan SurfaceEntity untuk pemutaran di hemisfera 180° dan bola 360°. Saat menggunakan bentuk kanvas ini, posisikan permukaan dengan memanfaatkan pose kepala pengguna untuk memberikan pengalaman yang imersif.

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

Memutar video spasial menggunakan Jetpack Compose untuk XR

Jika Anda tertarik untuk mempelajari cara memutar video menggunakan Jetpack Compose untuk XR, pelajari cara Menambahkan platform untuk konten gambar atau video.