Le SDK Jetpack XR est compatible avec la lecture de vidéos côte à côte stéréoscopiques sur des surfaces planes. Avec la vidéo stéréoscopique, chaque frame se compose d'une image pour l'œil gauche et d'une image pour l'œil droit afin de donner aux spectateurs une sensation de profondeur, également appelée stéréopsie.
Vous pouvez afficher des vidéos 2D non stéréoscopiques dans les applications Android XR à l'aide des API multimédias standards utilisées pour le développement Android sur d'autres facteurs de forme.
Lire des vidéos côte à côte à l'aide de Jetpack SceneCore
Avec la vidéo côte à côte, chaque frame stéréoscopique est présenté sous la forme de deux images disposées horizontalement l'une à côté de l'autre. Les images vidéo du haut et du bas sont disposées verticalement l'une à côté de l'autre.
La vidéo côte à côte n'est pas un codec, mais plutôt un moyen d'organiser les images stéréoscopiques. Elle peut donc être encodée dans l'un des codecs compatibles avec Android.
Vous pouvez charger une vidéo côte à côte à l'aide de Media3 Exoplayer, puis l'afficher à l'aide de la nouvelle SurfaceEntity
. Pour créer un SurfaceEntity
, appelez SurfaceEntity.create
, comme illustré dans l'exemple suivant.
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()
Lire des vidéos MV-HEVC à l'aide de Jetpack SceneCore
La norme de codec MV-HEVC est optimisée et conçue pour la vidéo stéréoscopique, ce qui permet à votre application de lire efficacement des vidéos immersives de haute qualité. Les fichiers MV-HEVC comportent un flux principal, généralement l'œil gauche, et un flux stéréo avec l'autre œil.
Comme pour les vidéos côte à côte, vous pouvez les charger à l'aide de Media3 Exoplayer et les afficher à l'aide de SurfaceEntity
. Vous devez spécifier si votre fichier MV-HEVC est primaire à gauche ou à droite dans le paramètre stereoMode
lorsque vous appelez 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()
Lire des vidéos à 180° et à 360° à l'aide de Jetpack SceneCore
SurfaceEntity
est compatible avec la lecture de vidéos à 180° sur des surfaces hémisphériques et de vidéos à 360° sur des surfaces sphériques. Le paramètre radius
fait référence à la taille radiale des surfaces respectives en mètres par défaut.
Le code suivant montre comment configurer SurfaceEntity
pour la lecture sur un hémisphère à 180 degrés et une sphère à 360 degrés. Lorsque vous utilisez ces formes de canevas, positionnez la surface en exploitant la position de la tête de l'utilisateur pour offrir une expérience immersive.
// 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.
Lire des vidéos spatiales à l'aide de Jetpack Compose pour XR
Si vous souhaitez savoir comment lire une vidéo à l'aide de Jetpack Compose pour XR, découvrez comment ajouter une surface pour le contenu image ou vidéo.