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, también conocida como estereopsis.

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 Jetpack SceneCore

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 SurfaceEntity. Para crear un SurfaceEntity, llama a SurfaceEntity.create, como se muestra en el siguiente ejemplo.

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()

Reproducir videos MV-HEVC con Jetpack SceneCore

El estándar de códec MV-HEVC está optimizado y diseñado para videos estereoscópicos, lo que permite que tu app reproduzca videos envolventes de alta calidad de manera eficiente. Los archivos MV-HEVC tienen una transmisión principal, por lo general, el ojo izquierdo, y una transmisión estéreo con el otro ojo.

Al igual que con los videos en paralelo, puedes cargarlo con Media3 Exoplayer y renderizarlo con SurfaceEntity. Te recomendamos que especifiques si tu archivo MV-HEVC es primario izquierdo o derecho en el parámetro stereoMode cuando llames a 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()

Cómo reproducir videos panorámicos de 180° y 360° con Jetpack SceneCore

SurfaceEntity admite la reproducción de videos de 180° en superficies hemisféricas y de 360° en superficies esféricas. El parámetro radius hace referencia al tamaño radial de las respectivas superficies en metros de forma predeterminada.

En el siguiente código, se muestra cómo configurar SurfaceEntity 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.
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.

Cómo reproducir videos espaciales con Jetpack Compose para XR

Si te interesa aprender a reproducir videos con Jetpack Compose para XR, obtén información para agregar una superficie para contenido de imagen o video.