Cómo agregar video espacial a tu app

El SDK de Jetpack XR admite la reproducción de video en paralelo estereoscópico en superficies planas. Con el video estereoscópico, cada fotograma consta de una imagen para el ojo izquierdo y una para el ojo derecho para darles a los usuarios una sensación de profundidad.

Puedes renderizar videos 2D no estereoscópicos en apps para Android XR con las APIs de contenido multimedia estándar que se usan para el desarrollo de Android en otros factores de forma.

Cómo reproducir videos en paralelo con el SDK de Jetpack XR

Con el video en paralelo, cada fotograma estereoscópico se presenta como dos imágenes dispuestas horizontalmente una al lado de la otra. Los fotogramas de video de la parte superior y la inferior se organizan verticalmente uno al lado del otro.

El video en paralelo no es un códec, sino una forma de organizar fotogramas estereoscópicos, lo que significa que se puede codificar en cualquiera de los códecs compatibles con Android.

Puedes cargar videos en paralelo con Media3 Exoplayer y, luego, renderizarlos con el nuevo StereoSurfaceEntity. Para crear un StereoSurfaceEntity, llama a StereoSurfaceEntity.create, como se muestra en el siguiente ejemplo.

stereoSurfaceEntity = StereoSurfaceEntity.create(
            xrSession,
            StereoSurfaceEntity.StereoMode.SIDE_BY_SIDE,
            // Position 1.5 meters in front of user
            Pose(Vector3(0.0f, 0.0f, -1.5f), Quaternion(0.0f, 0.0f, 0.0f, 1.0f)),
            StereoSurfaceEntity.CanvasShape.Quad(1.0f, 1.0f)
        )
        val videoUri = Uri.Builder()
            .scheme(ContentResolver.SCHEME_ANDROID_RESOURCE)
            .path(R.raw.sbs_test_video.toString())
            .build()
        val mediaItem = MediaItem.fromUri(videoUri)

exoPlayer = ExoPlayer.Builder(this).build()
exoPlayer.setVideoSurface(stereoSurfaceEntity.getSurface())
exoPlayer.setMediaItem(mediaItem)
exoPlayer.prepare()
exoPlayer.play()

Cómo reproducir videos de 180° y 360° con el SDK de Jetpack XR

Alpha02 y versiones posteriores

A partir de la versión 1.0.0-alpha02, StereoSurfaceEntity admite la reproducción de videos de 180° en superficies hemisféricas y de 360° en superficies esféricas. Si los videos son estereoscópicos, los archivos deben estar en formato lado a lado.

En el siguiente código, se muestra cómo configurar StereoSurfaceEntity para la reproducción en un hemisferio de 180° y una esfera de 360°. Cuando uses estas formas de lienzo, posiciona la superficie aprovechando la postura de la cabeza del usuario para proporcionar una experiencia envolvente.

// Set up the surface for playing a 180° video on a hemisphere.
hemisphereStereoSurfaceEntity =
    StereoSurfaceEntity.create(
        xrCoreSession,
        StereoSurfaceEntity.StereoMode.SIDE_BY_SIDE,
        xrCoreSession.spatialUser.head?.transformPoseTo(
            Pose.Identity,
            xrCoreSession.activitySpace
        )!!,
        StereoSurfaceEntity.CanvasShape.Vr180Hemisphere(1.0f),
    )
// ... and use the surface for playing the media.
// Set up the surface for playing a 360° video on a sphere.
sphereStereoSurfaceEntity =
    StereoSurfaceEntity.create(
        xrCoreSession,
        StereoSurfaceEntity.StereoMode.TOP_BOTTOM,
        xrCoreSession.spatialUser.head?.transformPoseTo(
            Pose.Identity,
            xrCoreSession.activitySpace
        )!!,
        StereoSurfaceEntity.CanvasShape.Vr360Sphere(1.0f),
    )
// ... and use the surface for playing the media.