เพิ่มวิดีโอเสียงรอบทิศทางลงในแอป

Jetpack XR SDK รองรับการเล่นวิดีโอสเตอริโอแบบแสดงคู่บนพื้นผิวเรียบ วิดีโอสเตอริโอสโคปแต่ละเฟรมประกอบด้วยภาพจากตาซ้ายและตาขวาเพื่อให้ผู้ชมเห็นภาพมีความลึก หรือที่เรียกว่าภาพสเตอริโอ

คุณสามารถเรนเดอร์วิดีโอ 2 มิติแบบไม่สตรีโอสโคปในแอป Android XR ได้ด้วย Media API มาตรฐานที่ใช้สำหรับการพัฒนา Android ในอุปกรณ์รูปแบบอื่นๆ

เล่นวิดีโอแบบแสดงคู่กันโดยใช้ Jetpack SceneCore

เมื่อใช้วิดีโอแบบแสดงคู่ เฟรมภาพสเตอริโอแต่ละเฟรมจะแสดงเป็น 2 รูปภาพที่จัดเรียงในแนวนอนต่อกัน เฟรมวิดีโอด้านบนและด้านล่างจะจัดเรียงในแนวตั้งโดยอยู่ติดกัน

วิดีโอแบบแสดงคู่ไม่ใช่ตัวแปลงรหัส แต่เป็นวิธีจัดระเบียบเฟรมสเตอริโอโสโคปิก ซึ่งหมายความว่าสามารถเข้ารหัสในตัวแปลงรหัสที่ 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()

เล่นวิดีโอ MV-HEVC โดยใช้ Jetpack SceneCore

มาตรฐานตัวแปลงรหัส MV-HEVC ได้รับการเพิ่มประสิทธิภาพและออกแบบมาสำหรับวิดีโอสเตอริโอโสโคป ซึ่งช่วยให้แอปเล่นวิดีโอสมจริงที่มีคุณภาพยอดเยี่ยมได้อย่างมีประสิทธิภาพ ไฟล์ MV-HEVC ประกอบด้วยสตรีมหลัก ซึ่งมักจะเป็นดวงตาซ้าย และสตรีมสเตอริโอที่มีดวงตาอีกข้าง

คุณสามารถโหลดวิดีโอแบบแสดงคู่โดยใช้ Media3 Exoplayer และแสดงผลโดยใช้ SurfaceEntity ได้เช่นเดียวกับวิดีโอแบบแสดงคู่ คุณจะต้องระบุว่าไฟล์ MV-HEVC เป็นหลักซ้ายหรือขวาในพารามิเตอร์ stereoMode เมื่อเรียกใช้ 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()

เล่นวิดีโอ 180 องศาและ 360 องศาโดยใช้ Jetpack SceneCore

SurfaceEntity รองรับการเล่นวิดีโอ 180 องศาบนพื้นผิวทรงครึ่งทรงกลมและวิดีโอ 360 องศาบนพื้นผิวทรงกลม พารามิเตอร์ radius หมายถึงขนาดรัศมีของพื้นผิวที่เกี่ยวข้องเป็นเมตรโดยค่าเริ่มต้น

โค้ดต่อไปนี้แสดงวิธีตั้งค่า SurfaceEntity สำหรับการเล่นบนซีกโลก 180° และทรงกลม 360° เมื่อใช้รูปร่างภาพพิมพ์แคนวาสเหล่านี้ ให้จัดตำแหน่งพื้นผิวโดยใช้ประโยชน์จากท่าทางของศีรษะผู้ใช้เพื่อให้ได้ประสบการณ์ที่สมจริง

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

เล่นวิดีโอเชิงมิติพื้นที่โดยใช้ Jetpack Compose สำหรับ XR

หากสนใจที่จะดูวิธีเล่นวิดีโอโดยใช้ Jetpack Compose สำหรับ XR ให้ดูวิธีเพิ่มแพลตฟอร์มสำหรับเนื้อหารูปภาพหรือวิดีโอ