הוספת סרטון מרחבי לאפליקציה

‏Jetpack XR SDK תומך בהפעלה של סרטונים סטריאוסקופיים לצד לצד על משטחים שטוחים. בסרטון סטריאופטי, כל פריים מורכב מתמונה לעין שמאל ומתמונה לעין ימין, כדי לתת לצופים תחושה של עומק – שנקראת גם סטריאופסיה.

אפשר ליצור עיבוד (רנדור) של סרטונים 2D לא סטריאוסקופיים באפליקציות ל-Android XR באמצעות ממשקי ה-API הרגילים של המדיה שמשמשים לפיתוח Android בפלטפורמות אחרות.

הפעלת סרטון לצד סרטון באמצעות 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()

הפעלת סרטון MV-HEVC באמצעות Jetpack SceneCore

תקן הקודק MV-HEVC מותאם ועוצב לווידאו סטריאופוני, ומאפשר לאפליקציה שלכם להפעיל בצורה יעילה סרטונים מציאותיים באיכות מעולה. לקובצי MV-HEVC יש שידור ראשי, בדרך כלל העין השמאלית, ושידור סטריאו עם העין השנייה.

בדומה לסרטון לצד לצד, אפשר לטעון אותו באמצעות Media3 Exoplayer ולייצר לו רינדור באמצעות SurfaceEntity. כשקוראים לפונקציה SurfaceEntity.create, צריך לציין אם קובץ ה-MV-HEVC הוא ראשי ימין או שמאל בפרמטר stereoMode.

// 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 for XR? תוכלו לקרוא איך מוסיפים משטח לתוכן של תמונות או סרטונים.