← Todos os Posts

Construindo um app de câmera responsivo no iOS 27

A equipe de desempenho de câmera da Apple cortou o tempo de inicialização da câmera pela metade ao adiar tudo, exceto a saída de preview: uma inicialização que durava perto de um segundo cai para cerca de metade disso, uma melhoria de duas vezes medida em um lightboard de laboratório1. A alavanca é a API Deferred Start, disponível no iOS 26 e posteriores, e o princípio por trás dela é direto. O fator mais importante para fazer a inicialização de uma câmera parecer rápida é a velocidade com que o frame de preview aparece na tela1.

O enquadramento deste post é “o que um app AVFoundation precisa fazer para parecer instantâneo”, porque a diferença entre uma câmera que está tecnicamente rodando e uma que parece pronta para usar é exatamente a fresta por onde um dominó em queda escapa. Três sessões da WWDC26 cobrem o tema: a sessão 303 sobre inicialização responsiva e captura sustentada, a sessão 304 sobre captura em alta resolução sem perder responsividade, e a sessão 341 sobre a nova câmera frontal quadrada do Center Stage. Elas se conectam pela mesma arquitetura de sessão de captura, então adotar uma torna as outras mais baratas.

TL;DR

  • A sequência de inicialização em quatro estágios (lançamento do app, configuração/início da sessão, inicialização das saídas, streaming do preview) gasta a maior parte do tempo inicializando saídas. O Deferred Start adia todas as saídas, exceto a que renderiza o preview, reduzindo a inicialização pela metade na medição de laboratório da Apple1.
  • Apps baseados em AVCaptureVideoPreviewLayer recompilados contra o iOS 26+ ganham Deferred Start automático de graça; apps com video data output precisam adotar o modo manual para reivindicar o mesmo ganho1.
  • Adiar a saída de fotos acelera o preview, mas não a primeira captura, então combine-a com isResponsiveCaptureEnabled em AVCapturePhotoOutput para armazenar o disparo em buffer até o processamento estar pronto1.
  • O Pro Video Storage, novo no iOS 27, pré-aloca um pool de armazenamento de todo o sistema para que gravações ProRes de alta taxa de dados permaneçam determinísticas em vez de engasgar sob contenção do sistema de arquivos1.
  • A câmera frontal do Center Stage (iPhone 17, iPhone Air, iPhone 17 Pro) é um sensor quadrado exposto como a .builtInUltraWideCamera frontal; dynamicAspectRatio recorta qualquer proporção a partir do quadrado sem reconstruir a sessão, e AVCaptureSmartFramingMonitor aciona o Auto Zoom e o Auto Rotate2.

A sequência de inicialização tem quatro estágios

Watch on Apple Developer ↗

Jake, engenheiro da equipe de desempenho de câmera da Apple, percorre os quatro estágios de inicialização na sessão 303.

A inicialização de uma câmera passa por quatro estágios, e o engenheiro da Apple, Jake, os detalha em ordem1. Primeiro o app é lançado: o linker carrega o binário, os inicializadores estáticos rodam, as cenas de UI são criadas. Segundo, a sessão é configurada e iniciada: inicializar AVCaptureSession, confirmar a configuração e iniciar a sessão consomem tempo e recursos do sistema. Terceiro, cada AVCaptureOutput é inicializado, e esse tempo escala com o número de saídas e suas configurações de qualidade. Quarto, o preview começa a transmitir e os frames fluem para o app1.

O trabalho para tornar isso rápido começa na UI. Divida a inicialização em duas fases: recursos críticos para exibir o preview, e recursos que podem esperar até o preview rodar1. No AVCam, o app de câmera de exemplo clássico do AVFoundation, o preview da câmera e o botão do obturador são os únicos elementos que alguém precisa no instante em que abre o app; o image well e o seletor de modo podem aparecer em fade depois. O princípio se generaliza além da UI. Qualquer recurso criado antes de o preview renderizar adiciona tempo à inicialização1.

A própria sessão é o próximo ponto de pressão. Como AVCaptureSession coordena todo objeto de captura, Jake a cria primeiro, assim que a main thread termina a configuração da UI. Mas criar a sessão bloqueia a main thread, então despache sua criação fora da main thread para rodar em paralelo com a configuração das cenas de UI e evitar um travamento1. A mesma cautela se aplica a startRunning() e stopRunning(): ambas são chamadas bloqueantes, e chamá-las na main thread vai travar o app1. Confirme uma única configuração de uma vez em vez de confirmar várias, já que cada reconfiguração estende a inicialização1.

Deferred Start: o ganho de duas vezes

Inicializar saídas é a parte mais cara da inicialização, e a maioria das saídas é peso morto nesse momento. Para renderizar o preview, o app precisa apenas de uma camada de preview ou de uma única saída; a movie file output e a photo output não contribuem em nada para o primeiro frame1. O Deferred Start explora isso. Ele adia a inicialização das saídas até que a inicialização tenha terminado, de modo que apenas a saída de preview seja inicializada antes do primeiro frame ser exibido1.

Cada AVCaptureOutput e a AVCaptureVideoPreviewLayer carregam uma propriedade isDeferredStartEnabled; defina-a como true para adiar aquela saída, e adie tudo, exceto a que renderiza o preview1. Há dois modos para decidir quando o trabalho adiado roda. No modo automático, o sistema escolhe o melhor momento, logo após o preview aparecer, e dispara dois callbacks de delegate para que o app possa acompanhar: sessionWillRunDeferredStart antes de a inicialização começar, e sessionDidRunDeferredStart após ela concluir1. Apps recompilados contra o SDK do iOS 26 ou posterior ganham o modo automático por padrão, com automaticallyRunsDeferredStart já definido como true1.

// Modo automático — adia tudo, menos a camada de preview
session.beginConfiguration()
session.automaticallyRunsDeferredStart = true      // true por padrão no SDK do iOS 26+

photoOutput.isDeferredStartEnabled = true           // adia a saída de fotos
// videoPreviewLayer renderiza o preview, então NÃO é adiada

session.commitConfiguration()
session.startRunning()                              // chame fora da main thread

O modo manual devolve o controle ao app. Defina automaticallyRunsDeferredStart como false, faça qualquer trabalho de inicialização que precise vir primeiro (ler preferências, montar UI não crítica) e então chame runDeferredStartWhenNeeded() para dizer ao sistema que ele pode prosseguir1. O modo manual importa para uma arquitetura em particular: apps que renderizam o preview com AVCaptureVideoDataOutput. O Deferred Start não se aplica automaticamente a uma data output, então esses apps adotam o Deferred Start manual para reivindicar o mesmo ganho de inicialização, normalmente acionando-o assim que o primeiro frame é apresentado (Jake acompanha a apresentação por meio de uma CAMetalLayer)1.

A Apple verificou o resultado em um lightboard de laboratório, comparando dois telefones capturando um padrão de LED em expansão. O telefone com o Deferred Start ativado capturou o padrão enquanto os LEDs vermelho e verde estavam acesos; o telefone sem ele terminou de inicializar somente depois que os LEDs verdes já tinham quase apagado1. Cronometrada, a inicialização sem o Deferred Start durou perto de um segundo; com ele, a inicialização foi cortada pela metade, uma melhoria de duas vezes, com sessões de captura complexas vendo ganhos ainda maiores1.

Agrupe mudanças disruptivas para que o grafo seja reconstruído uma vez

A disciplina de configuração única da sequência de inicialização tem um mecanismo por trás que um engenheiro de câmera no painel do laboratório da WWDC26 explicou. AVCaptureSession coordena um grafo de objetos de captura, e toda vez que você define uma propriedade que força uma mudança disruptiva, a sessão reresolve esse grafo5. Reconfigurar geralmente significa mudar mais de uma coisa ao mesmo tempo, alternando do modo foto para o modo vídeo ou reduzindo um formato ativo para uma resolução mais baixa, então definir cada propriedade isoladamente faz o grafo ser reconstruído a cada passo5. Envolva todo o lote em beginConfiguration() e commitConfiguration() e o grafo se reresolve exatamente uma vez, no commit, quer o lote contenha uma mudança ou vinte5. O painelista comparou o par a uma transação bancária: beginConfiguration() a abre, o saque e o depósito ficam pendentes, e commitConfiguration() os liquida juntos5.

O Deferred Start se compõe de forma limpa com mais uma alavanca de pré-inicialização. O painel confirmou que o Deferred Start e o array de prepared photo settings (setPreparedPhotoSettingsArray(_:completionHandler:) em AVCapturePhotoOutput) são ortogonais e complementares, um adiando a prontidão da saída para que o preview apareça primeiro enquanto o outro pré-aloca os recursos de pior caso do pipeline de still, combináveis sem conflito5.

Preview rápido não é captura rápida

Adiar a saída de fotos tem uma pegadinha que vale dizer com clareza: o preview começa bem mais cedo, mas o tempo até a primeira captura permanece o mesmo, porque o sistema ainda precisa terminar de inicializar a saída de fotos adiada antes que uma captura possa começar1. O preview está no ar, o usuário toca no obturador, e o disparo continua perdido.

A correção é isResponsiveCaptureEnabled em AVCapturePhotoOutput. A propriedade adiciona buffering entre iniciar uma captura e o momento em que o processamento começa, para que alguém possa capturar o momento mesmo que a saída de fotos não esteja totalmente pronta1. Na demo do dominó da Apple, o telefone rodando captura responsiva junto com o Deferred Start conseguiu um disparo limpo dos dominós em queda enquanto o telefone de controle perdeu completamente1. A combinação é o padrão recomendado: adote o Deferred Start com a saída de fotos de qualidade, mantenha a inicialização rápida, e deixe a captura responsiva cobrir a janela antes de a saída de fotos terminar de inicializar1.

Captura de alta resolução em sequência rápida

Watch on Apple Developer ↗

Mohit, engenheiro da equipe de Software de Câmera da Apple, demonstra fast capture prioritization em uma quadra de basquete na sessão 304.

A sessão 304 estende a história da responsividade para rajadas de alta resolução. O mecanismo é isFastCapturePrioritizationEnabled em AVCapturePhotoOutput, uma propriedade existente em vez de uma nova: quando ativado, o sistema detecta múltiplas capturas em sucessão rápida e adapta a qualidade da foto da configuração de qualidade mais alta para a balanceada, que precisa de menos tempo tanto para captura quanto para processamento4. A parte nova chega com o sistema operacional. A partir do iOS 27 no iPhone 16 e iPhone 17, o sistema também processa essas capturas rápidas balanceadas depois, usando deferred photo processing, o pipeline em segundo plano da WWDC23 que termina uma foto sem bloquear a próxima captura (distinto da API de inicialização Deferred Start acima)4. Na demo de basquete da Apple, a diferença foi uma captura bloqueada contra cinco disparos responsivos da mesma jogada, uma vez que o deferred processing, a captura responsiva e a fast capture prioritization estavam todos ativados4.

A mesma sessão atualiza a tabela de cobertura de alta resolução. O suporte a captura de 24MP e 48MP se estende à câmera telefoto no iPhone 16 Pro e à câmera ultra-angular no iPhone 17, e uma opção de 18MP existe apenas na câmera frontal do Center Stage no iPhone 174. A configuração de priorização limita o que você pode requisitar: 12MP funciona nos três níveis de priorização, 48MP de frame único precisa de balanceada ou qualidade, e os formatos fundidos de múltiplos frames de 18MP e 24MP exigem priorização de qualidade por causa de seu processamento mais longo4. O deferred processing é o que torna essas fusões de múltiplos frames práticas em um app responsivo, já que o trabalho pesado acontece em segundo plano sem compartilhar memória com a sessão de captura4.

Renderizando o preview: layer versus data output

Duas saídas podem acionar o preview, e a escolha determina quanto mais você tem de fazer. AVCaptureVideoPreviewLayer mostra exatamente o que a câmera vê sem trabalho por frame no app: ela faz o tone mapping HDR automaticamente, mantém o overhead de CPU e GPU baixo, e otimiza para exibição de baixa latência1. A contrapartida é que ela não oferece acesso por frame1. (Para o lado HDR desse tone mapping automático, o post sobre AVFoundation HDR e Apple Log cobre o pipeline de captura e exibição em profundidade.)

AVCaptureVideoDataOutput é a alternativa quando o processamento por frame é a prioridade. Ela toma o lugar da camada de preview como saída de exibição principal e dá ao app controle sobre o fluxo de frames: overlays de UI personalizados por frame, integração com Metal, análise de frames1. O custo é a adoção do Deferred Start manual mencionada acima, mais uma regra de disciplina: mantenha o trabalho por frame curto para evitar quedas de frames e manter a experiência fluida1. Use a camada de preview quando você só precisa mostrar o feed; recorra à data output quando você genuinamente processa frames.

Sustentando o desempenho sob pressão

A maior parte do desenvolvimento de câmera acontece em uma mesa em um ambiente controlado, mas as pessoas usam o app em um dia quente e ensolarado, e o sistema reduz a velocidade conforme o dispositivo aquece1. Duas APIs de custo permitem que um app veja isso chegando. O hardware cost retorna um valor entre 0 e 1 representando a parcela do hardware da sessão em uso; acima de 1 significa que o sistema não consegue suportar a configuração1. O custo sobe com o número de câmeras, os formatos ativos (1080p versus 4K), a taxa de frames, e se o formato é binned. O hardware cost assume a taxa de frames máxima de um formato, então um app rodando a 30 fps em um formato de 60 fps deve definir o override de taxa de frames para reduzir o custo reportado1.

O system pressure cost também retorna de 0 a 1, representando o custo do estado atual, e cruzar 1 torna a configuração insustentável1. O padrão de adoção: após confirmar a configuração, verifique que o hardware cost permanece em 1 ou abaixo, depois observe o systemPressureState do AVCaptureDevice e registre um handler para mudanças1. Conforme a pressão sobe, o handler reduz a taxa de frames do dispositivo de captura, limita o trabalho da GPU ou do Apple Neural Engine, e minimiza o trabalho de UI1.

Pro Video Storage: gravações ProRes determinísticas

Watch on Apple Developer ↗

A sessão 303 apresenta o Pro Video Storage, novo no iOS 27, para captura de vídeo de alta taxa de dados.

A I/O tradicional do sistema de arquivos é não determinística: o sistema gerencia operações concorrentes, fragmentação de memória e desgaste do armazenamento, então o timing de gravação varia1. Capturas de alta taxa de dados como ProRes precisam de I/O sustentado de alta largura de banda para gravar sem perder frames, e o timing variável é exatamente a propriedade errada. O Pro Video Storage, novo no iOS 27, ataca o problema rastreando e gerenciando armazenamento pré-alocado para capturas de alta taxa de dados. É um recurso de todo o sistema que todos os apps compartilham, e se integra às APIs de gravação de vídeo existentes1.

Os apps optam por participar definindo usesProVideoStorage em AVCaptureMovieFileOutput, ou em AVAssetWriter ao gravar a partir de uma video data output1. O armazenamento então cuida da alocação e da I/O de arquivos, mantendo o desempenho de gravação consistente para codecs de alta taxa de dados. A sequência de adoção: o Pro Video Storage é um singleton, então obtenha-o pelo seu acessor compartilhado e confirme o suporte; monte a movie file output, a sessão, as conexões e o formato escolhido; verifique isProVideoStorageSupported na movie file output; confirme que o armazenamento não está ocupado redimensionando ou atendendo à criação ou exclusão de arquivos; então ative-o e comece a gravar1. Durante a captura, a gravação escreve no pool pré-alocado e move para o local final assim que a captura termina1. As configurações da câmera agora deixam as pessoas controlarem quanto armazenamento alocar, o método remainingCapacity reporta o que sobrou, e um método de abrir configurações leva o usuário até essa UI a partir do app1.

A câmera frontal do Center Stage é quadrada

Watch on Apple Developer ↗

Tracy, engenheira da equipe de Software de Câmera da Apple, apresenta a câmera frontal quadrada do Center Stage na sessão 341.

Os sensores de câmera frontal tradicionais têm uma proporção de 4x3 que trava o enquadramento na orientação do telefone. A câmera frontal do Center Stage no iPhone 17, iPhone Air e iPhone 17 Pro usa um sensor de imagem quadrado emparelhado com uma lente de 95 graus, o campo de visão mais amplo em qualquer câmera frontal de iPhone2. A engenheira da Apple, Tracy, enquadra a recompensa: o formato quadrado permite que o usuário escolha qualquer proporção, fotografando uma selfie em retrato ou paisagem sem girar o telefone, o que mantém uma pegada segura com uma só mão e uma imagem centralizada com contato visual natural2.

A configuração da sessão é AVFoundation convencional3. Crie uma AVCaptureSession, encontre a câmera como um AVCaptureDevice com o tipo de dispositivo .builtInUltraWideCamera frontal, envolva-a em um AVCaptureDeviceInput, adicione uma AVCaptureVideoPreviewLayer para o preview e uma AVCapturePhotoOutput para fotos; a sessão forma os AVCaptureConnections implicitamente entre tipos de mídia compatíveis2.

O bloco de construção é dynamicAspectRatio em AVCaptureDevice, disponível a partir do iOS 26. Definir a propriedade recorta a proporção escolhida a partir do sensor quadrado sem reconstruir a sessão ou interromper o preview, então a troca é perfeita2. A propriedade suporta cinco proporções (3x4, 4x3, 9x16, 16x9 e 1x1) em formatos quadrados de 1280 até 4032, com uma restrição: o formato de foto de 4032 suporta apenas 3x4 e 4x3, porque eles preservam a resolução mais alta2.

// Toque para girar usando dynamicAspectRatio
let discovery = AVCaptureDevice.DiscoverySession(
    deviceTypes: [.builtInUltraWideCamera],
    mediaType: .video,
    position: .front
)
guard let device = discovery.devices.first else { return }

// Encontre um formato que suporte a proporção desejada
guard let format = device.formats.first(where: {
    $0.supportedDynamicAspectRatios.contains(.ratio4x3)
}) else { return }

try device.lockForConfiguration()
device.activeFormat = format
let timestamp = device.setDynamicAspectRatio(.ratio4x3)  // retorna o timestamp do primeiro buffer
device.unlockForConfiguration()

Cada formato anuncia seu supportedDynamicAspectRatios, e definir a proporção retorna o timestamp do primeiro buffer onde a mudança entra em vigor2. O timestamp retornado não é decoração: para gravação de vídeo, ele é a costura que permite encerrar um clipe e iniciar o próximo na nova proporção.

Auto Zoom, Auto Rotate e compensação do sensor

AVCaptureSmartFramingMonitor (iOS 26 e posteriores, obtido da câmera) fica em cima de dynamicAspectRatio e impulsiona o Auto Zoom e o Auto Rotate2. O monitor dá recomendações periódicas de enquadramento a partir de detecção automática de rosto e olhar, cada uma carregando uma proporção e um fator de zoom que o app pode aplicar ou ignorar; como ele tem como alvo a captura de fotos, ele só recomenda quando o formato de foto de 4032 está ativo2. Por padrão ele não recomenda nada, então defina enabledFramings (para todos os supportedFramings, ou um subconjunto escolhido), depois observe recommendedFraming via key-value observing e aplique cada recomendação. A ordem importa para uma transição suave: defina a proporção primeiro, depois o fator de zoom2. O monitor pode iniciar enquanto a sessão roda; desligar o enquadramento automático significa cancelar o registro do KVO e chamar stopMonitoring2.

Uma armadilha de correção vem com o novo sensor. As câmeras frontais de iPhones anteriores montavam o sensor em Landscape Left, então uma selfie em retrato chegava na orientação nativa do sensor carregando uma tag EXIF pedindo uma rotação de 270 graus na reprodução. O sensor do Center Stage é montado em Portrait, então apps que dependem dos valores de rotação antigos renderizariam fotos de lado ou de cabeça para baixo2. AVCapturePhotoOutput lida com isso por padrão por meio da compensação de orientação do sensor: ele gira fisicamente fotos processadas HEIC, JPEG e não comprimidas e atualiza os metadados EXIF para que a saída chegue em Landscape Left como antes, deixando a lógica de rotação existente continuar funcionando2. Duas ressalvas: a compensação nunca se aplica a Bayer RAW ou Apple ProRAW, e a Apple recomenda testar com a compensação desligada (via cameraSensorOrientationCompensationEnabled) para melhor desempenho, confirmando que a orientação permanece correta2.

Center Stage para vídeo e chamadas

Para gravação de vídeo, dynamicAspectRatio funciona da mesma forma, mas as trilhas de filme QuickTime exigem que todas as amostras compartilhem as dimensões, então mudar a proporção durante a captura interrompe a gravação2. Com AVCaptureMovieFileOutput, a gravação para automaticamente na mudança; com AVCaptureVideoDataOutput mais AVAssetWriter, o timestamp de conclusão de setDynamicAspectRatio é o ponto de corte para encerrar uma gravação e começar outra na nova proporção2. As gravações também ganham dois modos de estabilização cinemática com reconhecimento de rosto nesta câmera, cinematicExtended e cinematicExtendedEnhanced, que priorizam manter o sujeito estável em vez do fundo2.

As chamadas de vídeo têm o caminho mais simples. O Center Stage já está ativo para apps de conferência que usam o modo de fundo Voice over IP, alternado pelo usuário a partir do menu de Efeitos de Vídeo da Central de Controle2. Apps sem esse modo de fundo adotam a API do Center Stage diretamente: ela é ativada por processo (como Retrato, Luz de Estúdio e Gestos), então defina um modo de controle (cooperative para permitir um botão no app, ou app), depois defina isCenterStageEnabled como true, e o enquadramento mantém todo mundo centralizado2. Mais uma melhoria de chamada de vídeo vem desligada por padrão: um modo de estabilização de baixa latência em tempo real, ativado definindo preferredVideoStabilizationMode da conexão como lowLatency2.

Orientação de adoção

As três sessões recompensam uma adoção em camadas.

Para todo app de câmera AVFoundation: Adote o Deferred Start primeiro. Se você renderiza o preview com AVCaptureVideoPreviewLayer e recompila contra o SDK do iOS 26+, o modo automático está ligado de graça; verifique-o confirmando que automaticallyRunsDeferredStart é true e que toda saída que não é de preview tem isDeferredStartEnabled = true1. Combine-o com isResponsiveCaptureEnabled na saída de fotos para que um preview rápido também seja um obturador utilizável1.

Para pipelines de data output e Metal: Você abre mão do ganho de graça. Adote o Deferred Start manual, acione runDeferredStartWhenNeeded() após o primeiro frame ser apresentado, e mantenha o trabalho por frame curto1. Conecte a observação de systemPressureState para que o pipeline degrade de forma graciosa em um dispositivo quente1.

Para ProRes e vídeo de alta taxa de dados: Adote o Pro Video Storage no iOS 27 para tornar as gravações sustentadas determinísticas, condicionando a isProVideoStorageSupported e à verificação de ocupado antes de gravar1.

Para apps de câmera frontal e selfie no iPhone 17 / Air / 17 Pro: Descubra a .builtInUltraWideCamera frontal, exponha o Toque para Girar por meio de dynamicAspectRatio, e adicione AVCaptureSmartFramingMonitor para o Auto Zoom e o Auto Rotate. Deixe a compensação de orientação do sensor ligada a menos que você tenha medido uma razão para desligá-la, e lembre-se de que ela nunca toca em RAW2.

FAQ

Quão mais rápida o Deferred Start realmente torna a inicialização?

A Apple mediu cerca de duas vezes mais rápido em um lightboard de laboratório: uma inicialização que durava perto de um segundo caiu para cerca de metade disso com o Deferred Start ativado, e sessões de captura complexas podem melhorar mais1. O ganho vem de inicializar apenas a saída de preview antes do primeiro frame, adiando toda outra saída até depois de o preview aparecer1.

Eu ganho o Deferred Start automaticamente?

Se o seu app renderiza o preview com AVCaptureVideoPreviewLayer e recompila contra o SDK do iOS 26 ou posterior, sim: o modo automático está ligado e automaticallyRunsDeferredStart assume true por padrão1. Apps que renderizam o preview com AVCaptureVideoDataOutput não o ganham automaticamente e precisam adotar o Deferred Start manual para reivindicar o mesmo ganho de inicialização1.

Por que minha primeira foto ainda está lenta mesmo com o Deferred Start?

Adiar a saída de fotos acelera o preview, mas não a primeira captura, porque o sistema ainda termina de inicializar a saída de fotos adiada antes que uma captura possa começar1. Defina isResponsiveCaptureEnabled em AVCapturePhotoOutput para armazenar a captura em buffer de modo que o momento seja registrado mesmo antes de a saída de fotos estar totalmente pronta1.

Como eu encontro a câmera frontal do Center Stage no código?

Use um AVCaptureDevice.DiscoverySession requisitando o tipo de dispositivo .builtInUltraWideCamera na posição .front; a câmera frontal do Center Stage é exposta como esse dispositivo frontal ultra-angular no iPhone 17, iPhone Air e iPhone 17 Pro2. A partir daí, defina dynamicAspectRatio para recortar qualquer proporção suportada a partir do sensor quadrado sem reconstruir a sessão2.

A lógica de rotação antiga da câmera frontal vai quebrar no novo sensor?

Pode, porque o sensor do Center Stage é montado em Portrait em vez do histórico Landscape Left, então buffers não compensados apareceriam de lado ou de cabeça para baixo2. AVCapturePhotoOutput aplica a compensação de orientação do sensor por padrão para fotos processadas HEIC, JPEG e não comprimidas (nunca RAW), então os valores de rotação existentes continuam funcionando a menos que você desabilite cameraSensorOrientationCompensationEnabled2.

O cluster do ecossistema Apple

Este post está na faixa de câmera e captura: o workflow de AVFoundation HDR e Apple Log para captura e exibição de vídeo profissional; as três superfícies de um app iOS para onde a captura se encaixa na arquitetura do app; do que o SwiftUI é feito para a camada de UI que hospeda o preview; e a matriz de plataformas Apple para quais recursos chegam onde. O hub é a Série do ecossistema Apple. Para contexto de iOS com agentes de IA, veja o guia de desenvolvimento de agentes iOS.

Referências


  1. Apple, “Build a responsive camera app that launches quickly,” WWDC26 Session 303. Apresentado por Jake, da equipe de desempenho de câmera da Apple. Cobre a sequência de inicialização em quatro estágios, a API Deferred Start (modos automático e manual, isDeferredStartEnabled, automaticallyRunsDeferredStart, runDeferredStartWhenNeeded(), e os callbacks sessionWillRunDeferredStart / sessionDidRunDeferredStart), isResponsiveCaptureEnabled, renderização do preview via AVCaptureVideoPreviewLayer versus AVCaptureVideoDataOutput, as APIs de hardware cost e system pressure, e o Pro Video Storage (usesProVideoStorage, isProVideoStorageSupported, remainingCapacity) novo no iOS 27. 

  2. Apple, “Support the Center Stage front camera in your iOS app,” WWDC26 Session 341. Apresentado por Tracy, da equipe de Software de Câmera da Apple. Cobre o sensor quadrado da câmera frontal do Center Stage no iPhone 17, iPhone Air e iPhone 17 Pro acessado como a .builtInUltraWideCamera frontal; dynamicAspectRatio e supportedDynamicAspectRatios; AVCaptureSmartFramingMonitor (enabledFramings, supportedFramings, recommendedFraming, stopMonitoring) para o Auto Zoom e o Auto Rotate; a compensação de orientação do sensor (cameraSensorOrientationCompensationEnabled); os modos de estabilização cinemática; e a API de chamada de vídeo do Center Stage (isCenterStageEnabled, modos de controle) mais a estabilização de vídeo lowLatency

  3. Documentação para Desenvolvedores da Apple: AVFoundation. A referência do framework cobrindo APIs de captura, edição e reprodução (AVCaptureSession, AVCaptureDevice, AVCaptureDeviceInput, AVCaptureVideoPreviewLayer, AVCapturePhotoOutput, AVCaptureMovieFileOutput, AVCaptureVideoDataOutput, AVAssetWriter, e AVCaptureConnection) referenciada ao longo de ambas as sessões. 

  4. Apple, “Implement high resolution photo capture,” WWDC26 Session 304. Apresentado por Mohit, da equipe de Software de Câmera da Apple. Fonte para o comportamento de fast capture prioritization (o sistema detectando capturas rápidas e adaptando a qualidade para balanceada), o deferred processing do iOS 27 de capturas rápidas balanceadas no iPhone 16 e iPhone 17, a demo de basquete (uma captura bloqueada contra cinco disparos responsivos), a extensão de 24MP/48MP para a telefoto do iPhone 16 Pro e as câmeras ultra-angulares do iPhone 17, o formato de 18MP da câmera frontal do Center Stage, e os requisitos de nível de priorização por resolução. O nome da propriedade isFastCapturePrioritizationEnabled (iOS 17.0+) verificado contra a documentação de AVCapturePhotoOutput da Apple

  5. Apple, “Camera and Photo Technologies Group Lab,” WWDC26 Lab 8018. Fonte para a regra de agrupamento de reconfiguração de sessão (a sessão de captura reresolvendo seu grafo de objetos em mudanças disruptivas de propriedade, e a analogia da transação bancária para beginConfiguration() / commitConfiguration()) e a confirmação de que o Deferred Start e o array de prepared photo settings são ortogonais e complementares. Parafraseado a partir de uma gravação transcrita localmente do Camera and Photo Technologies Group Lab da WWDC 2026; a Apple não publica legendas para os labs. Os símbolos beginConfiguration() e commitConfiguration() em AVCaptureSession, e setPreparedPhotoSettingsArray(_:completionHandler:) em AVCapturePhotoOutput, verificados contra a documentação de AVCaptureSession da Apple e a documentação de AVCapturePhotoOutput da Apple

Artigos relacionados

Entrada de imagem no Foundation Models no iOS 27

O iOS 27 dá visão ao LLM on-device do Foundation Models: coloque um UIImage, CGImage ou pixel buffer em um prompt como a…

12 min de leitura

SwiftData no iOS 27: Observation e History

O iOS 27 dá ao SwiftData observação de mudanças de primeira classe com ResultsObserver, observação de histórico persiste…

12 min de leitura

The Robots Are Taking Exams in My Search Console

First-party GSC data: 91% of 3.8M impressions fail a human-query filter. Exam questions, pasted errors, and agent sweeps…

10 min de leitura