-
Más información sobre Apple Projected Media Profile
Observa cómo el Apple Projected Media Profile (APMP) permite proyecciones de 180º/360º y de campo de visión amplio en archivos QuickTime y MP4 con la señalización de uso extendido de video. Analizaremos el uso de herramientas y estructuras proporcionadas por el SO para convertir, leer/escribir, editar y codificar medios con APMP. Revisaremos las capacidades de Apple Positional Audio Codec (APAC) para crear y entregar contenido de audio espacial para las experiencias más envolventes.
Capítulos
- 0:00 - Introducción
- 1:12 - Fundamentos del video no rectilíneo
- 3:42 - Especificación del perfil de medios proyectados de Apple
- 5:59 - Captura de contenido y flujos de APMP
- 8:33 - Capacidades de conversión de activos
- 10:45 - Lectura de video de APMP
- 11:47 - Edición de video de APMP
- 13:42 - Publicación de videos de APMP
- 16:14 - Apple Positional Audio Codec
Recursos
- 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
Videos relacionados
WWDC25
- Admite reproducción de video envolvente en apps de visionOS
- Conoce las tecnologías de Apple Immersive Video
- Explora experiencias de video para visionOS
- Novedades de la web espacial
WWDC22
WWDC21
-
Buscar este video…
-
-
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 - Introducción
Obtén información sobre cómo se representa la proyección de video no rectilínea en archivos QuickTime. Descubre nuevas API para crear, editar y publicar videos APMP con Audio Espacial. Este video está destinado a proveedores de cámaras, desarrolladores de software de edición de videos y desarrolladores de apps que tienen interés en el contenido multimedia inmersivo, particularmente para visionOS.
- 1:12 - Fundamentos del video no rectilíneo
visionOS 26 presenta el Apple Projected Media Profile, que admite varios formatos de video no rectilíneos además de los videos tradicionales 2D, 3D y espaciales. Este perfil incluye proyecciones mitad equirrectangulares para videos de 180 grados, proyecciones equirrectangulares para videos de 360 grados y proyecciones paramétricas para videos de campo de visión amplio capturados con lentes gran angular u ojo de pez. Las proyecciones equirrectangulares asignan coordenadas esféricas a un marco rectangular con ángulos de latitud y longitud. Las proyecciones inmersivas paramétricas tienen en cuenta los parámetros de distorsión de la lente, como la distancia focal, el centro óptico, la inclinación y la distorsión radial, que corrige la distorsión de barril que se observa comúnmente en lentes gran angular. Esto permite una representación más precisa e inmersiva del contenido de video de campo de visión amplio.
- 3:42 - Especificación del perfil de medios proyectados de Apple
Apple Projected Media Profile (APMP) permite la señalización de proyecciones de 180°, 360° y campo de visión amplio. Con las API de Apple puedes trabajar con contenido APMP en archivos QuickTime y MP4. Los nuevos cuadros dentro de Video Extended Usage (vexu) en visionOS 26 especifican los tipos de proyección, los parámetros de lente y la forma en que se organizan las vistas. Estos cuadros permiten la representación de diversos formatos de contenido multimedia inmersivo, como videos monoscópicos equirrectangulares y estereoscópicos de 180 grados.
- 5:59 - Captura de contenido y flujos de APMP
Varias cámaras y software de edición admiten APMP para capturar y editar videos de 180 y 360 grados. La señalización con APMP se usa en todo el flujo de trabajo (captura, edición y entrega) para una reproducción eficiente en dispositivos visionOS. Para el software que no es compatible con APMP, puedes usar metadatos esféricos y la utilidad avconvert para la conversión antes de transferir archivos al Apple Vision Pro.
- 8:33 - Capacidades de conversión de activos
macOS y visionOS 26 presentan nuevas capacidades para trabajar con archivos APMP. AVFoundation ahora reconoce activos esféricos compatibles y sintetiza la señalización con APMP. visionOS 26 cuenta con soporte integrado para los parámetros de proyección de lentes y los modos de campo de visión de los proveedores de cámaras más populares, lo que permite la conversión automática al abrirlos. Usa las nuevas estructuras y objetos para convertir el contenido de campo de visión amplio al formato APMP para que las API del sistema lo puedan reconocer.
- 10:45 - Lectura de video de APMP
Las estructuras CoreMedia y AVFoundation actualizadas en visionOS te permiten leer e identificar videos APMP mediante las API de contenido multimedia del sistema. AVAssetPlaybackAssistant se puede usar para verificar configuraciones de proyección no rectilíneas, y la extensión de descripción de formato viewPackingKind admite la organización de cuadros uno al lado del otro y por encima y por debajo para experiencias de reproducción de video inmersivas.
- 11:47 - Edición de video de APMP
El objeto AVVideoComposition de AVFoundation y CMTaggedDynamicBuffer se usan para la edición estereoscópica de videos. CMTaggedDynamicBuffer, que contiene etiquetas CM con categorías y valores, agrupa búferes relacionados como CVPixelBuffer para el ojo izquierdo y derecho. Para habilitar la edición estereoscópica, define outputBufferDescription y pasa búferes etiquetados a las solicitudes de composición después de construir el par estereoscópico.
- 13:42 - Publicación de videos de APMP
La publicación de contenido APMP en visionOS debe usar la codificación HEVC Main o Main 10 con resoluciones y colores primarios específicos. El modo estéreo puede ser monoscópico o estereoscópico, y las velocidades de cuadro y de bits recomendadas varían según la resolución. La herramienta de calidad de video avanzada (AVQT) de Apple se actualizó para admitir formatos inmersivos y evaluar la calidad de los videos. HLS se mejoró para admitir la transmisión APMP, y hay herramientas y pautas actualizadas disponibles en el sitio web de Apple Developer.
- 16:14 - Apple Positional Audio Codec
Apple Positional Audio Codec (APAC) es una tecnología diseñada para codificar audio ambisónico a fin de permitir experiencias de Audio Espacial inmersivas. El audio ambisónico es una técnica para la grabación y la reproducción de campos sonoros de esfera completa. Usa funciones matemáticas y un conjunto de micrófonos que permiten que el sonido provenga de cualquier dirección. APAC admite ambisónicos de primer, segundo y tercer orden. Las órdenes superiores proporcionan una mayor resolución espacial. El códec es altamente eficiente y se recomienda para codificar audio espacial con videos APMP. APAC decodifica en todas las principales plataformas de Apple, excepto watchOS, y permite la segmentación y transmisión de audio a través de HLS.