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.