-
En savoir plus sur Apple Projected Media Profile
Plongez dans Apple Projected Media Profile (APMP) et voyez comment APMP permet des projections à champ de vision large de 180º/360º dans les fichiers QuickTime et MP4 grâce à la signalisation d'utilisation étendue de la vidéo. Nous fournirons des conseils sur l'utilisation des frameworks et des outils fournis par le système d'exploitation pour convertir, lire/écrire, éditer et encoder des médias contenant APMP. Et nous passerons en revue les capacités du Apple Positional Audio Codec (APAC) pour créer et diffuser du contenu en audio spatial afin de créer des expériences des plus immersives.
Chapitres
- 0:00 - Introduction
- 1:12 - Principes de base de la vidéo non rectiligne
- 3:42 - Spécifications d’Apple Projected Media Profile
- 5:59 - Capture de contenu et flux de travail d’APMP
- 8:33 - Capacités de conversion des ressources
- 10:45 - Lecture vidéo d’APMP
- 11:47 - Montage vidéo d’APMP
- 13:42 - Publication vidéo d’APMP
- 16:14 - Apple Positional Audio Codec
Ressources
- QuickTime and ISO Base Media File Formats and Spatial and Immersive Media
- Converting projected video to Apple Projected Media Profile
- Apple HEVC Stereo Video Interoperability Profile
- Using Apple’s HTTP Live Streaming (HLS) Tools
- Core Media
- HTTP Live Streaming
- HTTP Live Streaming (HLS) authoring specification for Apple devices
- AVFoundation
Vidéos connexes
WWDC25
- Découvrir des expériences vidéo pour visionOS
- En savoir plus sur les technologies Apple Immersive Video
- Nouveautés pour le web spatial
- Prise en charge de la lecture vidéo immersive dans les apps visionOS
WWDC22
WWDC21
-
Rechercher dans cette vidéo…
-
-
8:58 - Recognize spherical v1/v2 equirectangular content
// Convert spherical v1/v2 RFC 180/360 equirectangular content import AVFoundation func wasConvertedFromSpherical(url: URL) -> Bool { let assetOptions = [AVURLAssetShouldParseExternalSphericalTagsKey: true] let urlAsset = AVURLAsset(url: url, options: assetOptions) // simplified for sample, assume first video track let track = try await urlAsset.loadTracks(withMediaType: .video).first! // Retrieve formatDescription from video track, simplified for sample assume first format description let formatDescription = try await videoTrack.load(.formatDescriptions).first // Detect if formatDescription includes extensions synthesized from spherical let wasConvertedFromSpherical = formatDescription.extensions[.convertedFromExternalSphericalTags] return wasConvertedFromSpherical } -
9:54 - Convert wide FOV content from supported cameras
// Convert wide-FOV content from recognized camera models import ImmersiveMediaSupport func upliftIntoParametricImmersiveIfPossible(url: URL) -> AVMutableMovie { let movie = AVMutableMovie(url: url) let assetInfo = try await ParametricImmersiveAssetInfo(asset: movie) if (assetInfo.isConvertible) { guard let newDescription = assetInfo.requiredFormatDescription else { fatalError("no format description for convertible asset") } let videoTracks = try await movie.loadTracks(withMediaType: .video) guard let videoTrack = videoTracks.first, let currentDescription = try await videoTrack.load(.formatDescriptions).first else { fatalError("missing format description for video track") } // presumes that format already compatible for intended use case (delivery or production) // for delivery then if not already HEVC should transcode for example videoTrack.replaceFormatDescription(currentDescription, with: newDescription) } return movie } -
10:58 - Recognize Projected & Immersive Video
// Determine if an asset contains any tracks with nonRectilinearVideo and if so, whether any are AIV import AVFoundation func classifyProjectedMedia( movieURL: URL ) async -> (containsNonRectilinearVideo: Bool, containsAppleImmersiveVideo: Bool) { let asset = AVMovie(url: movieURL) let assistant = AVAssetPlaybackAssistant(asset: asset) let options = await assistant.playbackConfigurationOptions // Note contains(.nonRectilinearProjection) is true for both APMP & AIV, while contains(.appleImmersiveVideo) is true only for AIV return (options.contains(.nonRectilinearProjection), options.contains(.appleImmersiveVideo)) } -
11:22 - Perform projection or viewPacking processing
import AVFoundation import CoreMedia // Perform projection or viewPacking specific processing func handleProjectionAndViewPackingKind(_ movieURL: URL) async throws { let movie = AVMovie(url: movieURL) let track = try await movie.loadTracks(withMediaType: .video).first! let mediaCharacteristics = try await track.load(.mediaCharacteristics) // Check for presence of non-rectilinear projection if mediaCharacteristics.contains(.indicatesNonRectilinearProjection) { let formatDescriptions = try await track.load(.formatDescriptions) for formatDesc in formatDescriptions { if let projectionKind = formatDesc.extensions[.projectionKind] { if projectionKind == .projectionKind(.equirectangular) { // handle equirectangular (360) video } else if projectionKind == .projectionKind(.halfEquirectangular) { // handle 180 video } else if projectionKind == .projectionKind(.parametricImmersive) { // handle parametric wfov video } else if projectionKind == .projectionKind(.appleImmersiveVideo) { // handle AIV } } if let viewPackingKind = formatDesc.extensions[.viewPackingKind] { if viewPackingKind == .viewPackingKind(.sideBySide) { // handle side by side } else if viewPackingKind == .viewPackingKind(.overUnder) { // handle over under } } } } } -
12:51 - Specify outputBufferDescription for a stereoscopic pair
var config = try await AVVideoComposition.Configuration(for: asset) config.outputBufferDescription = [[.stereoView(.leftEye)], [.stereoView(.rightEye)]] let videoComposition = AVVideoComposition(configuration: config) -
13:01 - Finish an asyncVideoCompositionRequest with tagged buffers
func startRequest(_ asyncVideoCompositionRequest: AVAsynchronousVideoCompositionRequest) { var taggedBuffers: [CMTaggedDynamicBuffer] = [] let MVHEVCLayerIDs = [0, 1] let eyes: [CMStereoViewComponents] = [.leftEye, .rightEye] for (layerID, eye) in zip(MVHEVCLayerIDs, eyes) { // take a monoscopic image and convert it to a z=0 stereo image with identical content for each eye let pixelBuffer = asyncVideoCompositionRequest.sourceReadOnlyPixelBuffer(byTrackID: 0) let tags: [CMTag] = [.videoLayerID(Int64(layerID)), .stereoView(eye)] let buffer = CMTaggedDynamicBuffer(tags: tags, content: .pixelBuffer(pixelBuffer!)) taggedBuffers.append(buffer) } asyncVideoCompositionRequest.finish(withComposedTaggedBuffers: taggedBuffers) }
-
-
- 0:00 - Introduction
Découvrez comment la projection vidéo non rectiligne est représentée dans les fichiers QuickTime. Découvrez de nouvelles API pour créer, éditer et publier des vidéos APMP avec l’Audio spatial. Cette vidéo s’adresse aux fabricants de caméras, aux développeurs de logiciels de montage vidéo et aux créateurs d’apps intéressés par les médias immersifs, en particulier pour visionOS.
- 1:12 - Principes de base de la vidéo non rectiligne
visionOS 26 introduit le profil Apple Projected Media (APMP), qui prend en charge divers formats vidéo non rectilignes, au-delà des vidéos 2D, 3D et spatiales traditionnelles. Ce profil inclut des projections semi-équirectangulaires pour les vidéos à 180 degrés, des projections équirectangulaires pour les vidéos à 360 degrés, ainsi que des projections paramétriques pour les vidéos à grand champ de vision capturées avec des objectifs grand-angle ou fisheye. Les projections équirectangulaires mappent des coordonnées sphériques sur une image rectangulaire à l’aide d’angles de latitude et de longitude. Les projections immersives paramétriques prennent en compte les paramètres de distorsion de l’objectif, tels que la distance focale, le centre optique, l’inclinaison et la distorsion radiale, ce qui corrige la distorsion en barillet couramment observée dans les objectifs grand angle. Cela permet une représentation plus fidèle et immersive du contenu vidéo à grand champ de vision.
- 3:42 - Spécifications d’Apple Projected Media Profile
Apple Projected Media Profile (APMP) permet de signaler les projections à 180°, 360° et à grand champ de vision. Les API d’Apple permettent de travailler avec du contenu APMP dans les fichiers QuickTime et MP4. De nouvelles boîtes au sein de la boîte Video Extended Usage (vexu) dans visionOS 26 spécifient les types de projection, les paramètres de l’objectif et les configurations de disposition des vues. Ces boîtes permettent de représenter divers formats de médias immersifs, comme les vidéos équirectangulaires monoscopiques et les vidéos stéréoscopiques à 180 degrés.
- 5:59 - Capture de contenu et flux de travail d’APMP
Diverses caméras et divers logiciels de montage prennent en charge le format APMP pour la capture et l’édition de vidéos à 180 et 360 degrés. La signalisation APMP est utilisée tout au long du flux de production (capture, montage et diffusion) afin d’assurer une lecture efficace sur les appareils visionOS. Pour les logiciels ne prenant pas en charge APMP, vous pouvez utiliser les métadonnées sphériques et l’utilitaire avconvert pour effectuer la conversion avant de transférer les fichiers vers l’Apple Vision Pro.
- 8:33 - Capacités de conversion des ressources
macOS et visionOS 26 offrent de nouvelles possibilités de traitement des fichiers APMP. AVFoundation reconnaît désormais les ressources sphériques compatibles et génère automatiquement le signalement APMP. visionOS 26 intègre la prise en charge native des paramètres de projection d’objectif et des modes de champ de vision des principaux fabricants de caméras, permettant une conversion automatique à l’ouverture du fichier. Utilisez les nouveaux frameworks et objets pour convertir du contenu à grand champ de vision au format APMP, afin qu’il soit reconnu par les API système.
- 10:45 - Lecture vidéo d’APMP
Les frameworks CoreMedia et AVFoundation mis à jour dans visionOS vous permettent de lire et d’identifier les vidéos APMP à l’aide des API multimédias du système. AVAssetPlaybackAssistant peut être utilisé pour vérifier les configurations de projection non rectilignes, et l’extension de description de format viewPackingKind prend en charge les agencements d’images côte à côte (side-by-side) et superposés (over-under) pour une lecture immersive des vidéos.
- 11:47 - Montage vidéo d’APMP
L’objet AVVideoComposition d’AVFoundation ainsi que CMTaggedDynamicBuffer sont utilisés pour le montage de vidéos stéréoscopiques. CMTaggedDynamicBuffer, qui contient des balises CM associées à des catégories et des valeurs, permet de regrouper des tampons liés, comme des CVPixelBuffer pour l’œil gauche et l’œil droit. Pour activer le montage stéréoscopique, définissez la propriété outputBufferDescription et transmettez les tampons étiquetés dans les requêtes de composition après avoir construit la paire stéréoscopique.
- 13:42 - Publication vidéo d’APMP
La publication de contenu APMP sur visionOS nécessite l’utilisation de l’encodage HEVC Main ou Main 10, avec des primaires de couleur et des résolutions spécifiques. Le mode stéréo peut être monoscopique ou stéréoscopique, avec des fréquences d’image et des débits binaires recommandés qui varient selon la résolution. L’outil Apple Advanced Video Quality Tool (AVQT) a été mis à jour pour prendre en charge les formats immersifs et évaluer la qualité vidéo. HLS a été amélioré pour prendre en charge le streaming APMP, et des outils ainsi que des recommandations mis à jour sont disponibles sur le site web Apple Developer.
- 16:14 - Apple Positional Audio Codec
Le codec Apple Positional Audio Codec (APAC) est une technologie conçue pour encoder des sons ambisoniques afin de créer des expériences immersives en Audio spatial. L’audio ambisonique est une technique d’enregistrement et de restitution sonore couvrant l’ensemble d’un champ acoustique sphérique. Elle utilise des fonctions mathématiques et une série de microphones qui permettent au son de provenir de n’importe quelle direction. APAC prend en charge l’audio ambisonique d’ordre 1, 2 et 3, les ordres supérieurs offrant une résolution spatiale plus élevée. Ce codec est très efficace et recommandé pour l’encodage de l’audio spatial avec la vidéo APMP. APAC est décodé sur toutes les principales plateformes Apple, à l’exception de watchOS, et permet la diffusion segmentée et en streaming de l’audio via HLS.