Adicionar vídeo espacial ao seu app

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.