O SDK do Jetpack XR oferece suporte à reprodução de vídeo lado a lado estereoscópico em superfícies planas. Com vídeos estereoscópicos, cada frame consiste em uma imagem do olho esquerdo e uma do olho direito para dar aos espectadores uma sensação de profundidade, também conhecida como stereopsia.
É possível renderizar vídeos 2D não estereoscópicos em apps Android XR com as APIs de mídia padrão usadas para desenvolvimento do Android em outros formatos.
Reproduzir vídeos lado a lado usando o Jetpack SceneCore
No vídeo lado a lado, cada frame estereoscópico é apresentado como duas imagens organizadas horizontalmente uma ao lado da outra. Os frames de vídeo de cima e de baixo são organizados verticalmente, um ao lado do outro.
O vídeo lado a lado não é um codec, mas uma maneira de organizar frames estereoscópicos, o que significa que ele pode ser codificado em qualquer um dos codecs compatíveis com o Android.
É possível carregar vídeos lado a lado usando o Exoplayer da Media3 e renderizá-los
usando o novo SurfaceEntity
. Para criar um
SurfaceEntity
, chame SurfaceEntity.create
, conforme mostrado no
exemplo abaixo.
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()
Reproduzir um vídeo MV-HEVC usando o Jetpack SceneCore
O padrão de codec MV-HEVC é otimizado e projetado para vídeos estereoscópicos, permitindo que o app reproduza vídeos imersivos com eficiência e alta qualidade. Os arquivos MV-HEVC têm um stream principal, geralmente o olho esquerdo, e um stream estéreo com o outro olho.
Assim como no vídeo lado a lado, você pode fazer o carregamento usando o Exoplayer da Media3 e
renderizar usando o SurfaceEntity
. É necessário especificar
se o arquivo MV-HEVC é primário à esquerda ou à direita no parâmetro stereoMode
ao chamar 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()
Reproduzir vídeos em 180 e 360 graus usando o Jetpack SceneCore
O SurfaceEntity
oferece suporte à reprodução de vídeos em 180° em
superfícies hemisféricas e em 360° em superfícies esféricas. O parâmetro radius
se refere ao tamanho radial das respectivas superfícies em metros por
padrão.
O código a seguir mostra como configurar SurfaceEntity
para reprodução em um
hemisfério de 180° e uma esfera de 360°. Ao usar essas formas de tela, posicione a
superfície usando a pose da cabeça do usuário para oferecer uma experiência imersiva.
// 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.
Reproduzir vídeo espacial usando o Jetpack Compose para XR
Se você quiser saber como reproduzir vídeos usando o Jetpack Compose para XR, aprenda a Adicionar uma superfície para conteúdo de imagem ou vídeo.