View in English

  • Global Nav Open Menu Global Nav Close Menu
  • Apple Developer
Search
Cancel
  • Apple Developer
  • News
  • Discover
  • Design
  • Develop
  • Distribute
  • Support
  • Account
Only search within “”

Quick Links

5 Quick Links

Vidéos

Ouvrir le menu Fermer le menu
  • Collections
  • Sujets
  • Toutes les vidéos
  • À propos

Plus de vidéos

  • À propos
  • Résumé
  • Transcription
  • Code
  • Prise en charge de la lecture vidéo immersive dans les apps visionOS

    Découvrez comment lire des vidéos immersives dans les apps visionOS. Nous aborderons les différents modes de rendu immersif ainsi que les frameworks qui les prennent en charge, et nous vous expliquerons comment effectuer le rendu de vidéos immersives dans votre app. Pour tirer le meilleur parti de cette vidéo, nous vous recommandons de commencer par regarder « Explorer les expériences vidéo pour visionOS » de la WWDC25.

    Chapitres

    • 0:00 - Introduction
    • 1:24 - Profils vidéo pris en charge dans visionOS 26
    • 3:09 - Lecture vidéo immersive dans Aperçu rapide
    • 4:25 - Lecture vidéo immersive avec AVKit
    • 9:11 - Détection de l’atténuation du confort
    • 9:51 - Lecture personnalisée dans RealityKit
    • 11:48 - Mode d’immersion progressive dans RealityKit
    • 16:32 - Rendu de vidéos spatiales avec RealityKit
    • 21:16 - Détection de l’atténuation du confort dans RealityKit
    • 22:57 - Intégration de contenu RealityKit avec SwiftUI

    Ressources

    • AVFoundation
    • AVKit
    • HTTP Live Streaming Examples
    • Playing immersive media with AVKit
    • Playing immersive media with RealityKit
    • RealityKit
      • Vidéo HD
      • Vidéo SD

    Vidéos connexes

    WWDC25

    • Découvrir des expériences vidéo pour visionOS
    • En savoir plus sur Apple Projected Media Profile
    • En savoir plus sur les technologies Apple Immersive Video
    • Nouveautés pour le web spatial

    WWDC24

    • Dive deep into volumes and immersive spaces

    WWDC23

    • Enhance your spatial computing app with RealityKit
  • Rechercher dans cette vidéo…

    Bonjour. Je m’appelle Jamal, je suis ingénieur en applications de contenu multimédia dans l’équipe AVKit. Je m’appelle Michael, je suis ingénieur logiciel au sein de l’équipe visionOS Spatial Media. L’une de mes activités préférées sur visionOS c’est de regarder des vidéos d’une manière propre à la plate-forme. Dans visionOS 2, cela inclut des expériences incroyables comme la lecture depuis la station d’accueil et les vidéos spatiales. Sous visionOS 26, nous avons étendu vos frameworks multimédias préférés, tels que Quick Look, AVKit et RealityKit, pour prendre en charge des profils multimédias plus immersifs et vous aider à créer une grande expérience de lecture vidéo immersive dans visionOS. Jamal et moi allons partager comment prendre en charge cette lecture vidéo immersive dans votre application. À toi de jouer, Jamal. Merci, Michael. Je vais passer brièvement en revue les différents types de profils vidéo. Je présenterai la façon dont Quick Look et les nouvelles API d’AVKit prennent en charge la lecture multimédia immersive. Enfin, Michael expliquera comment les applications peuvent personnaliser les expériences de lecture immersives avec RealityKit. À la fin de cette vidéo, vous apprendrez tout ce que vous devez savoir, pour créer une expérience de lecture vidéo immersive, dans votre application visionOS. Je vais commencer par passer en revue les différents types de profils vidéo pris en charge dans visionOS 26.

    Dans visionOS 1, les vidéos 2D et 3D étaient le principal moyen d’offrir la lecture vidéo dans les applications. Les médias spatiaux ont permis aux gens de filmer du contenu stéréo convaincant et d’apprécier leur création de manière immersive. visionOS 26 inclut désormais Apple Projected Media Profile (APMP) pour les vidéos à 180°, 360° et à large champ de vision. Et pour des expériences des plus immersives, il y a Apple Immersive Video. Chacun de ces profils est unique à sa manière. Si vous n’êtes pas familier avec les termes, la séance « Explore video experiences for visionOS » vous sera utile. Il existe de nombreuses façons de prendre en charge tous les profils vidéo que je viens d’énumérer. Choisir la bonne technologie pour votre application est important pour offrir une expérience immersive exceptionnelle.

    Quick Look est idéal pour présenter rapidement tout type de contenu multimédia, même immersif. AVKit offre une expérience vidéo cohérente et familière sur toutes les plates-formes, tout en offrant des commandes améliorées pour l’expérience de lecture. RealityKit est conçu pour les applications qui exigent une expérience de lecture immersive unique, comme celles que l’on trouve dans les environnements de jeux vidéo. Enfin, si vous recherchez une prise en charge de la lecture immersive dans un navigateur, Consultez « What’s new for spatial web », pour une explication plus détaillée de la lecture immersive du contenu web.

    Ensuite, je passerai en revue les outils disponibles pour Quick Look et AVKit dans visionOS 26, afin que vous puissiez vous lancer dans la création de votre application de lecture vidéo immersive. Quick Look propose deux API pour afficher et prévisualiser rapidement le contenu multimédia dans les apps. Il y a PreviewApplication, une API qui active une fenêtre hors processus pour la présentation multimédia. Et QLPreviewController, une API permettant de prévisualiser du contenu multimédia dans la fenêtre d’une app ou dans un style de présentation modale. Dans visionOS 26, QLPreviewController a été amélioré pour prendre en charge les photos et les vidéos spatiales. PreviewApplication prend désormais en charge Apple Immersive Video et Apple Projected Media Profile, y compris les vidéos à 180°, 360° et à large champ de vision.

    QLPreviewController et PreviewApplication peuvent gérer la présentation et les transitions des nouveaux profils vidéo. Ils adaptent également leur aperçu avec le style vidéo approprié. Dans visionOS 26, toutes les applications qui implémentent déjà des API Quick Look prendront automatiquement en charge les profils multimédias immersifs. Pour en savoir plus sur l’implémentation des API PreviewApplication ou QLPreviewController, reportez-vous à nos vidéos « Discover Quick Look for spatial computing » de la WWDC23 et « What’s new in Quick Look for visionOS » de la WWDC24. Ensuite, je vais aborder les nouvelles API AVKit introduites pour prendre pleinement en charge la lecture vidéo immersive. Dans visionOS 26, l’API AVExperienceController est exploitée pour réaliser des transitions vers une nouvelle expérience immersive. Il existe différentes options pour réaliser la transition vers une expérience immersive avec AVExperienceController. La première étant Expanded. L’expérience Expanded permet à AVPlayerViewController d’utiliser toute la scène de la fenêtre de l’interface utilisateur, et maintenant, dans visionOS 26, Expanded est configurable pour obtenir une lecture vidéo immersive. Nouveauté de la configuration Expanded, la propriété AutomaticTransitionToImmersive permet de déterminer si des transitions automatiques vers une expérience immersive doivent être lancées. La propriété AutomaticTransitionToImmersive peut être définie sur default pour accepter le comportement par défaut du système, ou sur none si aucune transition automatique n’est souhaitée.

    La valeur .none définie pour la propriété AutomaticTransitionToImmersive donne à AVPlayerViewController un traitement de portail pour le contenu immersif lorsqu’il est détecté. Tout en conservant AVExperienceController dans l’expérience Expanded. Voici un exemple de désactivation des transitions automatiques vers une expérience immersive, lorsque le traitement de portail pour le contenu immersif est souhaité. Je vais d’abord créer un AVPlayerViewController et le configurer avec le contenu multimédia immersif. J’ajoute à experienceController l’ensemble recommandé, qui comprend les expériences appropriées pour la plate-forme, tout en m’assurant que .expanded et .immersive en font partie. Puisque AutomaticTransitionToImmersive est une propriété initiale par défaut, je dois définir la valeur .none de la propriété. En supposant qu’AVPlayerViewController soit déjà dans la hiérarchie de vue des applications, je suis prêt pour la transition de AVExperienceController vers l’expérience .expanded. Avec la nouvelle API immersive, dans le cadre des expériences AVExperienceController, il est possible de passer explicitement à cette expérience au lieu de compter sur un déclencheur automatique. Tout comme cela a été fait pour Expanded.

    L’API Expérience immersive s’accompagne d’une nouvelle API de configuration qui permet aux apps de définir l’emplacement pour expérimenter la lecture vidéo immersive. Cet extrait de code montre comment utiliser l’expérience immersive avec l’API de configuration. En supposant que AVPlayerViewController n’ait pas été ajouté à la hiérarchie de vue, vous devrez le spécifier via l’API de configuration. Pour ce faire, accédez à la configuration ExperienceController et fournissez la valeur de placement avec la fonction .over pour votre scène d’interface utilisateur de fenêtre préférée. Une fois défini, AVExperienceController est prêt à passer à une expérience immersive. Si AVPlayerViewController est déjà contenu dans la hiérarchie de vue, AVExperienceController considère que la scène de fenêtre où il se trouve est la scène de placement souhaitée. Et c’est ainsi que les applications peuvent passer à une expérience immersive avec AVKit. Lors de la transition vers et hors de l’expérience immersive, AVExperienceController gère les animations et les transitions entre les expériences. Ces transitions sont initiées à tout moment, soit par l’utilisateur, soit par la logique de l’application, soit par le système.

    Par conséquent, lorsque vous utilisez AVExperienceController, il est important de comprendre tout changement d’état de transition ou de présentation, cela vous donnera la flexibilité nécessaire pour gérer correctement l’état actif de votre application. Pour cela, le protocole AVExperienceController.Delegate est la solution. Le protocole compte trois méthodes de délégué : didChangeAvailableExperiences, qui avertit lorsque les expériences disponibles possibles ont changé. prepareForTransitionUsing, qui avertit lorsque AVExperienceController est sur le point d’effectuer une transition, permettant à votre app de se préparer une dernière fois au nouvel état. et didChangeTransitionContext, qui avertit lorsque la transition vers la nouvelle expérience est finalisée.

    L’expérience immersive est étroitement liée au type de contenu fourni. Utilisez la méthode didChangeAvailableExperiences pour déterminer si une expérience immersive est disponible pour le type de contenu actuel. Par exemple, si du contenu multimédia 2D est fourni à AVPlayerViewController, l’expérience immersive ne sera pas disponible. Pour en savoir plus sur l’utilisation d’AVExperienceController et de ses méthodes déléguées, consultez l’exemple de code « Playing immersive media with AVKit ». Outre les nouvelles API pour la lecture vidéo immersive, Quick Look et AVKit prennent désormais en charge la détection de l’atténuation du confort sous visionOS 26. Les vidéos immersives présentent parfois des mouvements de caméra impressionnants, ce qui peut gêner le spectateur. Comme solution, la détection de mouvement est désormais prise en charge pour le contenu Apple Projected Media Profile. Quick Look et AVKit détectent les mouvements rapides pendant la lecture et réduisent automatiquement le niveau d’immersion. Le spectateur peut régler les options dans l’app Réglages pour personnaliser le comportement de Quick Look et AVKit. Pour les expériences de lecture vidéo les plus immersives, Quick Look et AVKit sont parfaits ! Pour une expérience immersive plus personnalisée, RealityKit est idéal, et je vais laisser Michael vous dire pourquoi. Merci, Jamal. RealityKit est excellent pour la lecture vidéo personnalisée, comme l’inclusion de vidéos dans un jeu immersif ou le rendu vidéo avec une interface utilisateur personnalisée. Dans visionOS 26, RealityKit prend en charge la lecture native de vidéos immersives. Nous allons voir un nouveau mode immersif progressif pour les vidéos à 180°, 360° et à large champ de vision, ainsi que Apple Immersive Video, mais aussi le rendu de vidéos spatiales avec un style spatial complet, exactement comme dans l’app Photos. Je vous montrerai également comment détecter l’application des mesures d’atténuation du confort vidéo. Enfin, je vous donnerai quelques conseils sur l’utilisation de RealityKit pour la lecture vidéo dans une scène SwiftUI. VideoPlayerComponent est une API puissante pour le rendu de vidéos dans RealityKit. Reliée à une entité RealityKit, elle crée ses propres maillage et matériau en fonction de la vidéo en cours dans AVPlayer et des propriétés du composant. VideoPlayerComponent est idéal pour le rendu de vidéos avec des modes d’affichage immersifs, car les mises à jour et les animations de maillage sont gérées automatiquement, comme dans cet exemple d’ancrage vidéo du projet Destination Video sur developer.apple.com. Consultez « Enhance your spatial computing app with RealityKit » pour une présentation de VideoPlayerComponent.

    Dans visionOS 26, VideoPlayerComponent prend en charge tous les profils vidéo immersifs désormais pris en charge par Quick Look et AVKit. Je vais commencer par les vidéos Apple Projected Media Profile et Apple Immersive Video. VideoPlayerComponent prend en charge trois modes immersifs pour ces profils vidéo. Le rendu vidéo du mode Portal s’effectue dans un portail, pour une présentation en fenêtre. Le mode progressif est une nouvelle API qui permet aux utilisateurs de régler leur propre niveau d’immersion à l’aide de la Digital Crown, ce qui leur permet de rester connectés au monde qui les entoure tout en profitant de la vidéo. Et à 100 % d’immersion, le mode progressif équivaut au mode de vision immersif complet.

    À partir de visionOS 26, le mode d’affichage immersif progressif est préféré au mode d’affichage immersif complet pour les vidéos Apple Projected Media Profile et Apple Immersive Video, en raison de la plus grande flexibilité qu’il offre, et pour sa prise en charge de la détection de l’atténuation du confort, que j’aborderai plus tard. Ici, je vais créer une vue pour rendre une vidéo à 180 degrés en mode portail, et je vais la placer dans un WindowGroup de l’espace partagé. Pour configurer la lecture du portail, commencez par créer un AVPlayerItem et un AVPlayer, avec une URL locale ou HTTP Live Streaming. Ensuite, initialisez un VideoPlayerComponent avec le lecteur. Définissez desiredImmersiveViewingMode du composant sur portal et attachez le composant à une entité. Le maillage de VideoPlayerComponent a une hauteur de 1 mètre par défaut. Je fais une mise à l’échelle de 0,4 mètre, pour tenir dans la scène de la fenêtre SwiftUI. Enfin, ajoutez l’entité à la scène. Pour un rendu de cette vidéo en mode progressif, remplacez .portal par .progressive dans le mode desiredImmersiveViewingMode du composant. Comme le composant contrôle la mise à l’échelle en mode progressif, les opérations de mise à l’échelle n’ont aucun effet. Je vais le supprimer pour que ce soit plus clair. Passer le composant à .progressive ne suffit pas pour le rendu dans une scène SwiftUI. Pour éviter de tronquer le développement du maillage dans les limites de la scène de fenêtre, je dois placer le nouveau ProgressiveVideoView dans un ImmersiveSpace. Et lors du rendu avec le mode progressif, cet ImmersiveSpace doit avoir un style d’immersion .progressive. Ici, le niveau d’immersion initial est de 1 : soit une immersion totale. J’ai choisi une plage large de 10 à 100 %, afin que les gens puissent composer leur propre niveau d’immersion. Si j’avais inclus 0 %, l’immersion aurait pu être réduite jusqu’à faire disparaitre le contenu, mais je ne veux pas de cela pour mon app. La valeur ImmersionStyle de SwiftUI et le mode d’affichage immersif du composant sont tous deux importants pour configurer la lecture. Faites toujours correspondre desiredImmersiveViewingMode avec ImmersionStyle lors du rendu dans un RealityView. Pour plus d’informations sur les styles d’immersion, consultez la vidéo de 2024 « Dive deep into volumes and immersive spaces ». Pour passer du mode portail au mode progressif, attendez l’événement ImmersiveViewingModeDidChange lors du changement de scène SwiftUI. Les événements ImmersiveViewingModeWillTransition et DidTransition signalent quand changer la visibilité de la UI pendant les transitions animées, pour réduire les conflits de mouvement et stéréo. Pour obtenir des exemples de ces événements, consultez « Playing immersive media with RealityKit » sur developer.apple.com. Révision : Pour un rendu portail des vidéos Apple Projected Media Profile et Apple Immersive Video, définissez desiredImmersiveViewingMode sur .portal. Les portails sont généralement dans un WindowGroup SwiftUI de l’espace partagé, mais peuvent être exclusifs dans un espace immersif avec une immersion .mixed. Pour un rendu immersif, définissez desiredImmersiveViewingMode sur .progressive, dans un ImmersiveSpace avec un ImmersionStyle .progressive comme précédemment. Pour obtenir un comportement système préféré, ne définissez pas desiredViewingMode. Le viewingMode sera automatiquement .mono pour les vidéos monoscopiques et .stereo pour les vidéos stéréo telles que stéréo 180 et Apple Immersive video. Les vidéos spatiales sont des vidéos stéréo que des personnes comme vous ont peut-être déjà capturées dans l’écosystème Apple. Elles contiennent des métadonnées spatiales qui permettent un rendu plus confortable et immersif. Tout comme les vidéos Apple Projected Media Profile et Apple Immersive Video, les vidéos spatiales sont désormais prises en charge en mode natif dans RealityKit avec un rendu en style spatial complet et des modes immersifs.

    Le style spatial des vidéos spatiales est configuré avec la propriété desiredSpatialVideoMode sur VideoPlayerComponent. Définissez cette propriété pour spécifier le rendu d’une vidéo spatiale. Lisez la propriété spatialVideoMode get-only pour déterminer le rendu d’une vidéo spatiale. Pour choisir le style spatial pour les vidéos spatiales, définissez desiredSpatialVideoMode sur .spatial.

    Le rendu spatial prend en charge les modes ImmersiveViewingModes .portal et .full. Contrairement à d’autres types de vidéos immersives, le rendu immersif de SpatialVideo est toujours configuré avec ImmersiveViewingMode .full. Les vidéos spatiales immersives s’affichent dans une taille fixe en fonction du champ de vision du contenu.

    Définissez desiredSpatialVideoMode sur .screen, la valeur par défaut, pour afficher les vidéos spatiales en stéréo traditionnelle sur un maillage d’écran. SpatialVideoMode ne sera pas mis à jour, sauf si la vidéo en cours est une vidéo spatiale valide. Comme son nom l’indique, ce mode ne s’applique qu’aux vidéos spatiales. Abonnez-vous au nouveau VideoPlayerEvent : SpatialVideoModeDidChange, ou observez la propriété 'spatialVideoMode' et déterminez si la propriété spatialVideoMode a été mise à jour et à quel moment. Pour effectuer un rendu vidéo en tant que vidéo spatiale en mode portail, créez d’abord un VideoPlayerComponent avec un AVPlayer qui contient une vidéo spatiale. Définissez le desiredViewingMode sur stéréo. C’est la valeur par défaut des vidéos spatiales, mais j’aime être précis. Définissez ensuite desiredSpatialVideoMode sur .spatial et choisissez .portal pour desiredImmersiveViewingMode. Comme vu précédemment, redimensionnez la vidéo pour qu’elle tienne dans la fenêtre. En mode spatial, la vidéo peut être agrandie en réglant le mode d’affichage immersif sur .full. Je supprime également l’opération de mise à l’échelle puisque le composant contrôle la taille pendant la présentation immersive. Comme dans mon exemple précédent, la vue devra être dans un espace immersif pour éviter d’être tronquée. Mais le rendu vidéo spatial immersif n’est pas verrouillé comme d’autres types de vidéo immersive, je dois donc définir la position de l’entité. Je vais choisir un mètre et demi au-dessus du sol et un mètre en avant. Mais pour une solution plus solide, utilisez un ancrage pour initialiser l’entité avec une position devant le spectateur. Enfin, je vais envelopper cette ImmersiveSpatialVideoView dans un ImmersiveSpace. Pour les vidéos spatiales, utilisez un ImmersionStyle .mixed pour un rendu en mode immersif sur passthrough. Pour permettre un rendu des vidéos spatiales également dans les environnements système, comportement que je valide toujours, utilisez le nouveau modificateur de scène immersiveEnvironmentBehavior avec l’option .coexist.

    Révision : les portails de vidéos spatiales sont configurés avec un mode desiredSpatialVideoMode .spatial et un desiredImmersiveViewingMode .portal dans l’espace partagé, ou un ImmersiveSpace avec ImmersionStyle .mixed. Par défaut, le ViewingMode des vidéos spatiales est .stereo. Le mode immersif de vidéo spatiale est défini avec desiredImmersiveViewingMode .full et ImmersiveSpace avec ImmersionStyle .mixed pour un rendu sur passthrough.

    Pour un rendu traditionnel .stereo, sans style spatial, définissez desiredSpatialVideoMode sur .screen. Les modes d’affichage immersif n’ont aucun effet dans ce mode. Le rendu des vidéos spatiales peut également être monoscopique avec un desiredViewingMode .mono. Dans ce mode, ni SpatialVideoMode ni ImmersiveViewingMode n’ont d’effet. Ces modes non immersifs se trouvent généralement dans un WindowGroup, dans l’espace partagé. Regarder des vidéos immersives est une expérience incroyablement immersive. Cela signifie que la lecture peut être très sensible aux mouvements rapides dans la vidéo. Ainsi, pour les vidéos Apple Projected Media Profile, RealityKit prend automatiquement des mesures de limitation du confort pendant la lecture, comme Jamal l’a décrit précédemment pour AVKit et Quick Look.

    Le nouvel événement VideoComfortMitigationDidOccur signale lorsqu’une atténuation du confort est appliquée par le système, en réponse à un mouvement important dans la vidéo. Aucune action n’est alors nécessaire, c’est le signal qu’un certain niveau d’atténuation a été appliqué. La réduction de l’immersion n’est disponible que pendant le rendu progressif, c’est pourquoi il est important d’utiliser ImmersiveViewingMode et un style d’immersion en mode .progressive plutôt que .full, pour les vidéos Apple Projected Media Profile. Pendant le rendu .portal, aucune atténuation ne se produit, car la lecture du portail est déjà confortable pour la plupart des contenus. Les comportements et les styles de rendu pris en charge d’un VideoPlayerComponent dépendent du profil vidéo spécifique présenté. Utilisez l’événement ContentTypeDidChange pour détecter le type de vidéo dans un VideoPlayerComponent, y compris de nouveaux types comme les vidéos Apple Projected Media Profile. Réagissez au moindre changement de type de vidéo pour comprendre les modes d’affichage disponibles, si une atténuation du confort sera appliquée ou pour mettre à jour des éléments de la UI. Lorsque VideoPlayerComponent est combiné avec la UI, ou simplement présenté dans une scène SwiftUI, j’ai quelques conseils pour assurer une intégration fluide entre le contenu RealityKit et SwiftUI. Par exemple, la gestion de l’échelle d’un maillage est importante pour placer du contenu multimédia avec l’interface utilisateur. En mode portail, la taille du maillage est reflétée par la propriété playerScreenSize, dans l’espace de coordonnées local de l’entité. Le maillage du portail est toujours créé avec une hauteur de 1 mètre. Lors de la mise à l’échelle d’une entité vidéo, mettez toujours à l’échelle X et Y uniformément pour conserver les proportions. Si la scène de fenêtre a une hauteur inférieure à 1 mètre, le maillage est tronqué par les limites de la scène, sauf si l’entité est réduite. Pour mettre à l’échelle une vidéo et l’adapter à l’intérieur de la scène, définissez l’échelle en fonction de la taille de la fenêtre disponible à l’aide de GeometryReader3D. Reportez-vous à l’exemple de projet « Playing immersive media with RealityKit » sur developer.apple.com pour un exemple de mise à l’échelle d’un portail vidéo pour l’adapter à une scène.

    J’ai aussi, une remarque sur le tri : La UI personnalisée sur le même plan que le maillage vidéo aura un comportement de tri non défini. Ajoutez un ModelSortGroupComponent à la même entité que le VideoPlayerComponent, et utilisez un ModelSortGroup qui spécifie une catégorie planarUIPlacement, pour trier explicitement l’entité par rapport à l’interface utilisateur coplanaire. Qu’il s’agisse de Quick Look, AVKit ou RealityKit, c’est à vous de choisir le framework à utiliser pour une lecture vidéo immersive, et vous disposez des outils nécessaires pour intégrer ces expériences incroyables dans votre app !

    Créez de nouvelles expériences immersives dans votre app en ajoutant des vidéos APMP à 360° à un jeu immersif, ou en diffusant des vidéos Apple Immersive Video ou spatiales, par exemple. Pour en savoir plus sur les nouveaux types de vidéos APMP, regardez la vidéo « Learn about the Apple Projected Media Profile ». Et pour en savoir plus sur Apple Immersive Video, regardez la vidéo « Learn about Apple Immersive Video technologies ». Il ne vous reste plus qu’à créer des expériences vidéo immersives étonnantes !

    • 5:03 - AVExperienceController - AutomaticTransitionToImmersive

      struct ExpandedConfiguration {
          enum AutomaticTransitionToImmersive {
        		case `default`
        		case  none
          }
      }
    • 5:50 - Disable Automatic Transitions to immersive

      import AVKit
      
      let controller = AVPlayerViewController()
      
      let experienceController = controller.experienceController
      experienceController.allowedExperiences = .recommended(including: [.expanded, .immersive])
      
      experienceController.configuration.expanded.automaticTransitionToImmersive = .none
      
      await experienceController.transition(to: .expanded)
    • 6:26 - AVExperienceController - Immersive

      enum Experience {
          case immersive
      }
      
      struct Configuration {
      		struct Placement {
      			static var unspecified: Placement
      			static func over(scene: UIScene) -> Placement
      		}
      }
    • 6:53 - Transition to immersive

      import AVKit
      
      let controller = AVPlayerViewController()
      
      let experienceController = controller.experienceController
      experienceController.allowedExperiences = .recommended(including: [.immersive])
      
      let myScene = getMyPreferredWindowUIScene()
      experienceController.configuration.placement = .over(scene: myScene)
      
      await experienceController.transition(to: .immersive)
    • 8:13 - AVExperienceController.Delegate

      func experienceController(_ controller: AVExperienceController, didChangeAvailableExperiences availableExperiences: AVExperienceController.Experiences)
      
      func experienceController(_ controller: AVExperienceController, prepareForTransitionUsing context: AVExperienceController.TransitionContext) async
      
      func experienceController(_ controller: AVExperienceController, didChangeTransitionContext context: AVExperienceController.TransitionContext)
    • 12:52 - PortalVideoView

      @main
      struct ImmersiveVideoApp: App {
          var body: some Scene {
              WindowGroup {
                  PortalVideoView()
              }
          }
      }
    • 13:03 - Portal Rendering

      import AVFoundation
      import RealityKit
      import SwiftUI
      
      struct PortalVideoView: View {
          var body: some View {
              RealityView { content in
                  guard let url = URL(string: "https://cdn.example.com/My180.m3u8") else { return }
                  let player = AVPlayer(playerItem: AVPlayerItem(url: url))
                  let videoEntity = Entity()
                  var videoPlayerComponent = VideoPlayerComponent(avPlayer: player)
                  videoPlayerComponent.desiredImmersiveViewingMode = .portal
                  videoEntity.components.set(videoPlayerComponent)
                  videoEntity.scale *= 0.4
                  content.add(videoEntity)
              }
          }
      }
    • 13:57 - Progressive Immersion Rendering

      import AVFoundation
      import RealityKit
      import SwiftUI
      
      struct ProgressiveVideoView: View {
          var body: some View {
              RealityView { content in
                  guard let url = URL(string: "https://cdn.example.com/My180.m3u8") else { return }
                  let player = AVPlayer(playerItem: AVPlayerItem(url: url))
                  let videoEntity = Entity()
                  var videoPlayerComponent = VideoPlayerComponent(avPlayer: player)
                  videoPlayerComponent.desiredImmersiveViewingMode = .progressive
                  videoEntity.components.set(videoPlayerComponent)
                  content.add(videoEntity)
              }
          }
      }
    • 14:20 - ProgressiveVideoView

      import AVFoundation
      import RealityKit
      import SwiftUI
      
      @main
      struct ImmersiveVideoApp: App {
          var body: some Scene {
              ImmersiveSpace {
                  ProgressiveVideoView()
              }
      				.immersionStyle(selection: .constant(.progressive(0.1...1, initialAmount: 1.0)), in: .progressive)    
          }
      }
    • 17:22 - SpatialVideoMode

      if let vpc = components.get[VideoPlayerComponent.self] {
      	vpc.desiredSpatialVideoMode = .spatial
      }
    • 18:32 - Spatial Video Portal Rendering

      import AVFoundation
      import RealityKit
      import SwiftUI
      
      struct PortalSpatialVideoView: View {
          var body: some View {
              RealityView { content in
                  let url = Bundle.main.url(forResource: "MySpatialVideo", withExtension: "mov")!
                  let player = AVPlayer(url: url)
                  let videoEntity = Entity()
                  var videoPlayerComponent = VideoPlayerComponent(avPlayer: player)
                  videoPlayerComponent.desiredViewingMode = .stereo
                  videoPlayerComponent.desiredSpatialVideoMode = .spatial
                  videoPlayerComponent.desiredImmersiveViewingMode = .portal
                  videoEntity.components.set(videoPlayerComponent)
                  videoEntity.scale *= 0.4
                  content.add(videoEntity)
              }
          }
      }
    • 19:02 - Spatial Video Immersive Rendering

      import AVFoundation
      import RealityKit
      import SwiftUI
      
      struct PortalSpatialVideoView: View {
          var body: some View {
              RealityView { content in
                  let url = Bundle.main.url(forResource: "MySpatialVideo", withExtension: "mov")!
                  let player = AVPlayer(url: url)
                  let videoEntity = Entity()
                  var videoPlayerComponent = VideoPlayerComponent(avPlayer: player)
                  videoPlayerComponent.desiredViewingMode = .stereo
                  videoPlayerComponent.desiredSpatialVideoMode = .spatial
                  videoPlayerComponent.desiredImmersiveViewingMode = .full
                  videoEntity.position = [0, 1.5, -1]
                  videoEntity.components.set(videoPlayerComponent)
                  content.add(videoEntity)
              }
          }
      }
    • 19:46 - ImmersiveSpatialVideoView

      import AVFoundation
      import RealityKit
      import SwiftUI
      
      @main
      struct SpatialVideoApp: App {
          var body: some Scene {
              ImmersiveSpace {
                  ContentSimpleView()
              }
              .immersionStyle(selection: .constant(.mixed), in: .mixed)
              .immersiveEnvironmentBehavior(.coexist)
          }
      }
    • 21:40 - Comfort Mitigation Event

      switch event.comfortMitigation {
      case .reduceImmersion:
          // Default behavior
          break
      case .play:
          // No action
          break
      case .pause:
          // Show custom pause dialog
          break
      }
    • 0:00 - Introduction
    • Cette vidéo présente les nouvelles API d’AVKit et Quick Look pour la lecture immersive de vidéos, et explique en détail comment personnaliser les expériences de lecture immersive avec RealityKit.

    • 1:24 - Profils vidéo pris en charge dans visionOS 26
    • visionOS 26 propose de nouveaux formats vidéo, notamment l’APMP pour les contenus à 180°, 360° et grand angle, ainsi qu’Apple Immersive Video pour une expérience immersive optimale. Vous pouvez utiliser Quick Look, AVKit ou RealityKit pour la lecture dans l’app.

    • 3:09 - Lecture vidéo immersive dans Aperçu rapide
    • Quick Look dans visionOS 26 propose deux API : PreviewApplication pour la présentation multimédia hors processus et QLPreviewController pour les aperçus multimédias dans les apps. Les deux API ont été mises à jour pour prendre en charge les photos et vidéos spatiales, Apple Immersive Video et Apple Projected Media Profile. Les apps qui utilisent déjà les API Quick Look prendront automatiquement en charge ces nouveaux profils multimédias immersifs.

    • 4:25 - Lecture vidéo immersive avec AVKit
    • AVKit présente « AVExperienceController », qui offre deux expériences principales : Expanded et Immersive. Vous pouvez désormais configurer l’expérience Expanded pour une lecture immersive, avec une option permettant de désactiver les transitions automatiques. Cela permet un « traitement portail » du contenu immersif lorsqu’il est détecté. Vous pouvez explicitement passer à l’expérience immersive à l’aide de la nouvelle API Immersive Experience, qui fournit une API de configuration permettant de définir l’emplacement de la lecture vidéo immersive. « AVExperienceController » gère les animations et les transitions entre les expériences. Le protocole délégué du contrôleur est essentiel pour surveiller les changements d’état de transition et de présentation, ce qui garantit que vos apps s’adaptent correctement aux différents types de contenu et aux interactions des utilisateurs.

    • 9:11 - Détection de l’atténuation du confort
    • visionOS 26 intègre une fonctionnalité de détection de l’inconfort pour les vidéos immersives dans Quick Look et AVKit. Le système réduit automatiquement le niveau d’immersion lors de la lecture de contenus Apple Projected Media Profile comportant beaucoup de mouvements afin d’éviter toute gêne pour le spectateur. Cette fonctionnalité peut être personnalisée dans l’app Réglages.

    • 9:51 - Lecture personnalisée dans RealityKit
    • RealityKit est l’outil essentiel pour créer des expériences vidéo immersives personnalisées sous visionOS, particulièrement pour les jeux et les apps ayant des interfaces innovantes. visionOS 26 intègre le VideoPlayerComponent de RealityKit qui permet la lecture native de vidéos immersives, y compris les formats 180°, 360° et grand-angle, ainsi que la vidéo spatiale et le format Apple Immersive Video, tout comme l’app Photos. Ce composant s’occupe automatiquement de la gestion des mises à jour et des animations des maillages, ce qui en fait la solution parfaite pour développer des expériences vidéo immersives dynamiques.

    • 11:48 - Mode d’immersion progressive dans RealityKit
    • Dans visionOS 26, « VideoPlayerComponent » prend en charge trois modes immersifs pour Apple Projected Media Profile et Apple Immersive Video : portail, progressif et complet. Le mode Portal présente la vidéo dans un portail. Le mode Progressive, nouveau dans visionOS 26, permet aux utilisateurs d’ajuster l’immersion à l’aide de la Digital Crown et est préférable pour plus de confort et de flexibilité. Il équivaut à une immersion totale à 100 %. Pour configurer la lecture, définissez le paramètre « desiredImmersiveViewingMode ». Pour le mode Progressive, utilisez un « ImmersiveSpace » avec un « ImmersionStyle » progressif et faites correspondre le mode au style. Les évènements du mode de visualisation immersive indiquent quand basculer la visibilité de l’interface utilisateur pendant les transitions.

    • 16:32 - Rendu de vidéos spatiales avec RealityKit
    • RealityKit prend désormais en charge les vidéos spatiales en mode natif, ce qui permet un rendu immersif avec un style spatial complet. Vous pouvez configurer le style spatial à l’aide de la propriété « desiredSpatialVideoMode » dans « VideoPlayerComponent ». Définir cette propriété sur « .spatial » active le style spatial, ce qui permet le rendu dans les modes d’affichage immersif « .portal » ou « .full ». Le mode « .full » est toujours utilisé pour les vidéos spatiales immersives, qui s’affichent dans une taille fixe en fonction du champ de vision du contenu. Le mode par défaut, « .screen », rend les vidéos spatiales en stéréo traditionnelle sur un maillage d’écran. Vous pouvez vous abonner à l’évènement « SpatialVideoModeDidChange » pour surveiller les mises à jour de la propriété « spatialVideoMode ». Pour créer un portail vidéo spatial, définissez « desiredSpatialVideoMode » sur « .spatial » et « desiredImmersiveViewingMode » sur « .portal ». Pour un rendu vidéo spatial immersif, utilisez le mode « .full » avec un style d’immersion mixte et l’option « coexist » pour « immersiveEnvironmentBehavior ».

    • 21:16 - Détection de l’atténuation du confort dans RealityKit
    • RealityKit détecte automatiquement les mouvements rapides dans les vidéos Apple Projected Media Profile et applique des mesures d’atténuation pour améliorer le confort. Votre app est informée de ces ajustements via l’évènement « VideoComfortMitigationDidOccur ». Le rendu progressif est nécessaire pour la mesure d’atténuation « reducedImmersion », mais pas pour le rendu de portail, car celui-ci est déjà confortable pour la plupart des contenus. L’évènement « ContentTypeDidChange » vous permet de vous adapter aux différents types de vidéos, à leur mode d’affichage spécifique et aux exigences en matière d’atténuation.

    • 22:57 - Intégration de contenu RealityKit avec SwiftUI
    • Lors de l’intégration du composant VideoPlayerComponent de RealityKit à SwiftUI, assurez-vous que les axes X et Y de l’entité vidéo sont mis à l’échelle de manière uniforme afin de conserver le rapport d’aspect, en particulier en mode portail. Utilisez « GeometryReader3D » pour mettre à l’échelle la vidéo en fonction de la taille de la fenêtre disponible afin d’éviter tout rognage. L’interface utilisateur personnalisée sur le même plan que le maillage vidéo présente un comportement de tri non défini. Pour résoudre les problèmes de tri avec l’interface utilisateur personnalisée sur le même plan, ajoutez un « ModelSortGroupComponent » avec une catégorie « planarUIPlacement ».

Developer Footer

  • Vidéos
  • WWDC25
  • Prise en charge de la lecture vidéo immersive dans les apps visionOS
  • Open Menu Close Menu
    • iOS
    • iPadOS
    • macOS
    • tvOS
    • visionOS
    • watchOS
    Open Menu Close Menu
    • Swift
    • SwiftUI
    • Swift Playground
    • TestFlight
    • Xcode
    • Xcode Cloud
    • Icon Composer
    • SF Symbols
    Open Menu Close Menu
    • Accessibility
    • Accessories
    • App Store
    • Audio & Video
    • Augmented Reality
    • Business
    • Design
    • Distribution
    • Education
    • Fonts
    • Games
    • Health & Fitness
    • In-App Purchase
    • Localization
    • Maps & Location
    • Machine Learning & AI
    • Open Source
    • Security
    • Safari & Web
    Open Menu Close Menu
    • Documentation
    • Sample Code
    • Tutorials
    • Downloads
    • Forums
    • Videos
    Open Menu Close Menu
    • Support Articles
    • Contact Us
    • Bug Reporting
    • System Status
    Open Menu Close Menu
    • Apple Developer
    • App Store Connect
    • Certificates, IDs, & Profiles
    • Feedback Assistant
    Open Menu Close Menu
    • Apple Developer Program
    • Apple Developer Enterprise Program
    • App Store Small Business Program
    • MFi Program
    • News Partner Program
    • Video Partner Program
    • Security Bounty Program
    • Security Research Device Program
    Open Menu Close Menu
    • Meet with Apple
    • Apple Developer Centers
    • App Store Awards
    • Apple Design Awards
    • Apple Developer Academies
    • WWDC
    Get the Apple Developer app.
    Copyright © 2025 Apple Inc. All rights reserved.
    Terms of Use Privacy Policy Agreements and Guidelines