-
Saiba mais sobre o Apple Projected Media Profile (APMP)
Confira detalhes do Apple Projected Media Profile (APMP) e veja como ele permite projeções em 180º, 360º e com campo de visão amplo em arquivos QuickTime e MP4 usando a sinalização Video Extended Usage. Daremos orientações sobre o uso de frameworks e ferramentas fornecidos pelo sistema operacional para converter, ler/gravar, editar e codificar mídias que contêm APMP. Além disso, analisaremos os recursos do Apple Positional Audio Codec (APAC) para criar e reproduzir conteúdo com áudio espacial, proporcionando experiências mais imersivas.
Capítulos
- 0:00 - Introdução
- 1:12 - Fundamentos de vídeo não retilíneo
- 3:42 - Especificações do Apple Projected Media Profile
- 5:59 - Captura de conteúdo e fluxos de trabalho do APMP
- 8:33 - Recursos de conversão de assets
- 10:45 - Leitura de vídeos APMP
- 11:47 - Edição de vídeos APMP
- 13:42 - Publicação de vídeos 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
Vídeos relacionados
WWDC25
- Explore experiências de vídeo para o visionOS
- Integre a reprodução de vídeo imersivo em apps para visionOS
- Novidades dos recursos espaciais para a web
- Saiba mais sobre as tecnologias Apple Immersive Video
WWDC22
WWDC21
-
Buscar neste vídeo...
-
-
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 - Introdução
Saiba como a projeção de vídeo não retilínea é representada em arquivos QuickTime. Descubra novas APIs para criar, editar e publicar vídeos APMP com Áudio Espacial. Esse vídeo é feito sob medida para fornecedores de câmeras, desenvolvedores de software de edição de vídeo e de apps interessados em mídia imersiva, especialmente para visionOS.
- 1:12 - Fundamentos de vídeo não retilíneo
O visionOS 26 apresenta o Apple Projected Media Profile, que aceita vários formatos de vídeo não retilíneos além dos tradicionais vídeos 2D, 3D e espaciais. Esse perfil inclui projeções semiequirretangulares para vídeos de 180¬graus, projeções equirretangulares para vídeos de 360¬graus e projeções paramétricas para vídeos Wide FOV capturados com lentes grande-angulares ou olho de peixe. Projeções equirretangulares mapeiam coordenadas esféricas para um quadro retangular usando ângulos de latitude e longitude. As projeções imersivas paramétricas são responsáveis por parâmetros de distorção da lente, como distância focal, centro óptico, inclinação e distorção radial, que corrige a distorção em barril comumente vista em lentes grande-angulares. Isso permite uma representação mais precisa e imersiva do conteúdo de vídeo Wide FOV.
- 3:42 - Especificações do Apple Projected Media Profile
O Apple Projected Media Profile (APMP) permite sinalização de projeções 180, 360 e Wide FOV. As APIs da Apple permitem trabalhar com conteúdo APMP em arquivos QuickTime e MP4. As novas caixas dentro da caixa de Video Extended Usage (vexu) no visionOS 26 especificam tipos de projeção, parâmetros de lente e disposição do pacote de visualização. Essas caixas permitem a representação de vários formatos de mídia imersiva, como vídeos monoscópicos equirretangulares e estereoscópicos de 180¬graus.
- 5:59 - Captura de conteúdo e fluxos de trabalho do APMP
Várias câmeras e softwares de edição aceitam APMP para capturar e editar vídeos de 180 e 360¬graus. A sinalização do APMP é usada em todo o fluxo de trabalho de captura, edição e distribuição para reprodução eficiente em dispositivos com visionOS. Para softwares não habilitados para APMP, você pode usar metadados esféricos e o utilitário avconvert para conversão antes de transferir arquivos para o Apple Vision Pro.
- 8:33 - Recursos de conversão de assets
O macOS e o visionOS 26 introduzem novos recursos para trabalhar com arquivos APMP. O AVFoundation agora reconhece assets esféricos compatíveis e sintetiza a sinalização do APMP. O visionOS 26 tem suporte integrado para parâmetros de projeção de lente e modos de campo de visão de fornecedores de câmeras populares, permitindo a conversão automática na abertura. Use novos frameworks e objetos para converter conteúdo em Wide FOV para o formato APMP, tornando-o reconhecível pelas APIs do sistema.
- 10:45 - Leitura de vídeos APMP
Os frameworks CoreMedia e AVFoundation atualizados no visionOS permitem ler e identificar vídeos APMP usando APIs de mídia do sistema. AVAssetPlaybackAssistant pode ser usado para verificar configurações de projeção não retilíneas, e a extensão da descrição do formato viewPackingKind aceita pacotes de quadros lado a lado e superior-inferior para experiências imersivas de reprodução de vídeo.
- 11:47 - Edição de vídeos APMP
O objeto AVVideoComposition do AVFoundation e o CMTaggedDynamicBuffer são usados para edição de vídeo estereoscópico. CMTaggedDynamicBuffer, que contêm tags CM com categorias e valores, agrupam buffers relacionados como CVPixelBuffer para o olho esquerdo e direito. Para ativar a edição estereoscópica, defina o outputBufferDescription e insira buffers marcados para solicitações de composição depois de construir o par estereoscópico.
- 13:42 - Publicação de vídeos APMP
A publicação de conteúdo APMP no visionOS precisa usar a codificação HEVC Main ou Main 10 com cores primárias e resoluções específicas. O modo estéreo pode ser monoscópico ou estereoscópico, com taxas de quadros recomendadas e taxas de bits que variam conforme a resolução. A Apple Advanced Video Quality Tool (AVQT) foi atualizada para oferecer suporte a formatos imersivos e avaliar a qualidade do vídeo. O HLS foi aprimorado para oferecer suporte a streaming APMP, e ferramentas e diretrizes atualizadas estão disponíveis no site Apple Developer.
- 16:14 - Apple Positional Audio Codec
O Apple Positional Audio Codec (APAC) é uma tecnologia projetada para codificar áudio ambissônico e permitir experiências imersivas de Áudio Espacial. Áudio ambissônico é uma técnica para gravação e reprodução de campo sonoro em esfera total. Ele usa funções matemáticas e uma série de microfones, permitindo que o som venha de qualquer direção. O APAC aceita áudios ambissônicos de primeira, segunda e terceira ordem, com ordens mais altas fornecendo maior resolução espacial. O codec é altamente eficiente e recomendado para codificação de áudio espacial com vídeo APMP. O APAC faz decodificações em todas as principais plataformas da Apple (exceto watchOS) e permite áudio segmentado e transmitido via HLS.