Uygulamanıza uzamsal video ekleme

Jetpack XR SDK, stereoskopik yan yana video oynatmayı düz yüzeylerde destekler. Stereoskopik videolarda her kare, izleyicilere derinlik hissi vermek için sol göz ve sağ göz görüntüsünden oluşur. Bu derinlik hissi stereopsis olarak da bilinir.

Diğer form faktörlerinde Android geliştirme için kullanılan standart medya API'leri ile Android XR uygulamalarında stereoskopik olmayan 2D videolar oluşturabilirsiniz.

Jetpack SceneCore kullanarak yan yana video oynatma

Yan yana video formatında, her stereoskopik kare, yatay olarak yan yana yerleştirilmiş iki resim şeklinde sunulur. Üst ve alt video kareleri, dikey olarak birbirine bitişik şekilde düzenlenir.

Yan yana video bir codec değil, stereoskopik kareleri düzenleme yöntemidir. Bu nedenle, Android tarafından desteklenen codec'lerin herhangi biriyle kodlanabilir.

Media3 Exoplayer'ı kullanarak yan yana video yükleyebilir ve ardından yeni SurfaceEntity ile oluşturabilirsiniz. SurfaceEntity oluşturmak için aşağıdaki örnekte gösterildiği gibi SurfaceEntity.create işlevini çağırın.

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 kullanarak MV-HEVC video oynatma

MV-HEVC codec standardı, stereoskopik video için optimize edilmiş ve tasarlanmıştır. Bu sayede uygulamanız, etkileyici videoları yüksek kalitede verimli bir şekilde oynatabilir. MV-HEVC dosyalarında genellikle sol göz olan bir birincil akış ve diğer gözü içeren bir stereo akış bulunur.

Yan yana video gibi, Media3 Exoplayer'ı kullanarak yükleyebilir ve SurfaceEntity kullanarak oluşturabilirsiniz. SurfaceEntity.create çağrılırken stereoMode parametresinde MV-HEVC dosyanızın sol mu yoksa sağ mı birincil olduğunu belirtmeniz gerekir.

// 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 kullanarak 180 derece ve 360 derece video oynatma

SurfaceEntity, yarım küre yüzeylerde 180° videoların, küre yüzeylerde ise 360° videoların oynatılmasını destekler. radius parametresi, varsayılan olarak ilgili yüzeylerin metre cinsinden radyal boyutunu ifade eder.

Aşağıdaki kodda, 180° yarım küre ve 360° küre üzerinde oynatma için SurfaceEntity nasıl ayarlanacağı gösterilmektedir. Bu kanvas şekillerini kullanırken yüzeyi, kullanıcının baş pozisyonundan yararlanarak konumlandırın. Böylece sürükleyici bir deneyim sunabilirsiniz.

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

Gelişmiş SurfaceEntity kontrolü

Video ve resim oluşturma üzerinde daha gelişmiş kontrol (ör. özel materyal efektleri uygulama) için doğrudan SceneCore kitaplığındaki SurfaceEntity ile çalışabilirsiniz.

Aşağıdaki bölümlerde, SurfaceEntity'da bulunan bazı gelişmiş özellikler açıklanmaktadır.

Kenar yumuşatma uygulama

edgeFeather özelliğini ayarlayarak yüzeyin kenarlarını yumuşatın ve çevreyle uyum sağlamasına yardımcı olun.

// Create a SurfaceEntity.
val surfaceEntity = SurfaceEntity.create(
    session = xrSession,
    pose = Pose(Vector3(0.0f, 0.0f, -1.5f))
)

// Feather the edges of the surface.
surfaceEntity.edgeFeather =
    SurfaceEntity.EdgeFeatheringParams.SmoothFeather(0.1f, 0.1f)

Alfa maskesi uygulama

Dikdörtgen olmayan yüzeyler oluşturmak veya şeffaflık efektleri eklemek için alfa maskesi uygulayın. Öncelikle bir öğeden Texture yükleyin, ardından bunu primaryAlphaMaskTexture özelliğine atayın:

// Create a SurfaceEntity.
val surfaceEntity = SurfaceEntity.create(
    session = xrSession,
    pose = Pose(Vector3(0.0f, 0.0f, -1.5f))
)

// Load the texture in a coroutine scope.
activity.lifecycleScope.launch {
    val alphaMaskTexture =
        Texture.create(
            xrSession,
            Paths.get("textures", "alpha_mask.png"),
            TextureSampler.create()
        )

    // Apply the alpha mask.
    surfaceEntity.primaryAlphaMaskTexture = alphaMaskTexture

    // To remove the mask, set the property to null.
    surfaceEntity.primaryAlphaMaskTexture = null
}

XR için Jetpack Compose kullanarak üç boyutlu video oynatma

XR için Jetpack Compose kullanarak video oynatmayı öğrenmek istiyorsanız resim veya video içeriği için yüzey ekleme başlıklı makaleyi inceleyin.