
-
Melhore a experiência com a câmera usando os controles de captura
Saiba como personalizar os controles de captura em suas experiências com a câmera. Vamos mostrar como tirar fotos com todos os controles físicos de captura, incluindo a nova compatibilidade com os AirPods, e como alterar os ajustes com o Controle da Câmera.
Capítulos
- 0:00 - Introdução
- 2:51 - Captura física
- 3:01 - Tratamento de eventos
- 6:39 - Captura remota com os AirPods
- 10:00 - Controle da Câmera
Recursos
- Accessing the camera while multitasking
- AVFoundation
- AVMultiCamPiP: Capturing from Multiple Cameras
- Capture setup
- Capturing Photos with Depth
- Creating a camera experience for the Lock Screen
- Creating a camera extension with Core Media I/O
- DockKit
- Forum: Photos & Camera
- Scanning data with the camera
- Supporting Continuity Camera in your macOS app
- Supporting Continuity Camera in your tvOS app
Vídeos relacionados
WWDC24
WWDC23
-
Buscar neste vídeo...
Oi, meu nome é Vitaliy. Sou engineer da equipe AVKit. Esta é a sessão “Melhorar a experiência com a câmera usando os controles de captura”. Vamos explorar modos novos e eficientes de melhorar as interações do usuário com seu app. Capture Controls permite mapear ações de botões físicos em ações da câmera, proporcionando a mesma sensação do app Câmera do iOS. Também mostraremos um novo recurso incrível lançado no iOS 26 que você vai adorar.
Para ilustrar o poder da API Capture Controls, vamos usar o app Câmera no iOS. Em vez de tirar uma foto com o botão da interface na tela, vamos usar os botões físicos do telefone.
Com apenas um clique no botão de aumentar volume, podemos iniciar a captura.
Mas essa API não se resume a cliques simples. Ela também permite pressionamento longo. Por exemplo, no modo de câmera, ao manter pressionado o botão de diminuir volume, ele começa a gravar um vídeo.
Assim, com a Capture Controls, demos aos nossos usuários mais flexibilidade no uso da câmera para capturar momentos inesquecíveis com o iPhone.
Nesta sessão, abordaremos primeiro o que é a captura física e quais botões físicos são compatíveis. Mostraremos como usar a API no app para processar as interações do usuário e criar uma interface de câmera robusta e responsiva, como vimos na demonstração. E apresentaremos um novo recurso do iOS 26: o controle remoto da câmera com os AirPods.
Finalmente, meu colega, Nick, apresentará uma visão geral do Controle da Câmera no iPhone 16.
Antes de ver as funcionalidades da API, vamos analisar os principais frameworks para criar uma ótima experiência com a câmera no iOS. No centro da arquitetura do app Câmera está o AV Foundation, que permite a captura de baixo nível por meio de APIs como AVCapturePhotoOutput para fotos e AVCaptureMovieFileOutput para vídeos.
Para combinar a camada da interface com o AV Foundation, temos o AVKit, que dá conta desses frameworks.
Uma API específica de captura que o AVKit inclui é a AVCaptureEventInteraction.
Vamos conferir os principais recursos e funcionalidades da AVCaptureEventInteraction. Essa API permite substituir o comportamento padrão de botões físicos, como os de aumentar e diminuir volume ou o Controle da Câmera no iPhone 16.
Outro botão que a AVCaptureEventInteraction aceita é o botão de Ação. Confira a sessão do ano passado sobre como configurar o botão de Ação para captura.
Quando um botão físico é pressionado, uma notificação de evento de captura é acionada. Essa notificação inclui uma fase de evento, dando controle preciso sobre o ciclo de vida do pressionamento. Há três fases possíveis: began: O momento em que o botão é pressionado. Perfeita para preparar o objeto da câmera do app.
cancelled: Para os momentos em que o app fica em segundo plano ou a captura não está disponível.
ended: O momento em que o botão é solto. Essa é a fase em que o objeto da câmera deve iniciar a captura.
AVCaptureEventInteraction possibilita distinguir ações primárias e secundárias de pressionamentos de botão. Um pressionamento aciona uma notificação de captura enviada só para o gerenciador designado.
As ações principais são acionadas pelo botão de diminuir volume, botão de Ação e Controle da Câmera. A ação secundária é acionada pelo botão de aumentar volume. O mesmo botão não pode acionar ambos os gerenciadores, pois eles representam ações distintas. O gerenciador secundário é opcional. Se não for especificado, o botão de aumentar volume acionará a ação principal. Esse design inclui modularidade no seu app e oferece mais flexibilidade para criar uma ótima experiência com a câmera para os usuários. Essa API destina-se a casos de uso de captura. O sistema envia eventos de captura apenas a apps que usam ativamente a câmera. Adotar essa API substitui o comportamento padrão do botão físico. Os apps devem sempre responder corretamente aos eventos recebidos. Deixar de processar eventos resulta em um botão que não funciona e prejudica a experiência do usuário.
Os apps de captura em segundo plano, ou aqueles que não têm uma AVCaptureSession ativa em execução, não recebem eventos. O pressionamento de um botão aciona a ação padrão do sistema, como ajustar o volume ou abrir a câmera.
Embora a AVCaptureEventInteraction seja uma API criada para o UIKit, os desenvolvedores da SwiftUI podem acessar suas funcionalidades pelo modificador de views onCameraCaptureEvent. Adotar qualquer um deles resulta no mesmo comportamento.
Agora que entendemos a AVCaptureEventInteraction, vamos criar um app de câmera simples que usa o modificador de views onCameraCaptureEvent da SwiftUI para tirar fotos com botões físicos. Vamos começar criando a interface do nosso app de câmera. Vamos incluir o CameraView, que é responsável por exibir a saída da câmera na tela.
Depois, vamos adicionar um botão à view para que usuário possa capturar fotos. Conectaremos esse botão ao CameraModel, para que tocar nele acione a captura de fotos.
Temos uma view funcional que tira fotos quando o usuário pressiona o botão na tela. No entanto, os botões físicos acionam ações do sistema. Vamos torná-los específicos para a câmera com a API que mencionamos nesta sessão. Primeiro, importamos o framework AVKit. Depois, anexamos o modificador de views onCameraCaptureEvent ao CameraView e, se event phase for ended, uma foto é capturada.
É simples assim! Com seis linhas de código a mais, ativamos as mesmas interações intuitivas com botões físicos para captura de fotos, igual ao app Câmera nativo. Esse é o poder da API Capture Controls. Este ano, estamos felizes em anunciar que a AVCaptureEventInteraction será compatível com ações primárias acionadas por cliques nos AirPods com o chip H2. Isso permitirá que o usuário capture momentos inesquecíveis remotamente, sem precisar interagir com o telefone.
Para quem já usa a API, esse recurso será gratuito no iOS 26.
Agora, vamos conferir esse novo recurso em ação. Vou colocar meu AirPod direito, depois o esquerdo.
Fiquei no estilo!
Agora, para configurar os AirPods para captura, vamos entrar em Ajustes
e rolar até Remote Camera Capture.
Lá, podemos escolher que tipo de clique acionará a captura. Vou escolher a opção de pressionar uma vez.
Vamos voltar ao app Câmera.
Vou me afastar e tirar uma foto clicando em um dos AirPods.
Ótimo! Agora posso controlar a câmera sem tocar no dispositivo.
Como os AirPods são usados para controle remoto da câmera, o feedback de áudio é essencial, pois os usuários talvez não vejam a tela durante a captura, mas precisam confirmar que o comando foi reconhecido.
Por isso, agora temos uma nova API para controlar o som do clique na haste de um AirPod. Se um evento de captura for acionado por algo além de um clique em um AirPod, o objeto AVCaptureEventInteraction não permitirá o controle do feedback sonoro.
Para disponibilizar o novo recurso a usuários da API AVCaptureEventInteraction sem exigir trabalho extra, incluímos um tom padrão para cliques nos AirPods.
No entanto, esse som pode não ser ideal para seu caso de uso. Ele poderá ser personalizado se você incluir seu próprio som no pacote do app.
Vamos voltar ao modificador de views .onCameraCaptureEvent no app de câmera. No iOS 26, se não alterarmos o código, quando o usuário clicar no AirPod, ouvirá o som padrão. Como estamos criando um app especificamente para tirar fotos, o som padrão pode não ser apropriado para o app.
Para ajustar o som de captura para nosso cenário, primeiro desativamos o som padrão com o parâmetro defaultSoundDisabled.
Se o feedback de áudio for necessário, reproduziremos o som cameraShutter com o método playSound no objeto de evento. A propriedade shouldPlaySound só será verdadeira se a ação de captura tiver sido acionada por um clique em um AirPod.
Em resumo, a API AVCaptureEventInteraction simplifica o processo de criação de experiências de alta qualidade com a câmera para seus apps. Analisamos os principais recursos e melhores práticas de implementação da API, incluindo a atualização deste ano: uma forma de controlar a captura da câmera com cliques em um AirPod. Agora, vamos falar sobre o AVCaptureControls. Olá! Meu nome é Nick Lupinetti. Sou software engineer da equipe Camera Experience. Vou apresentar o AVCaptureControl, um modo eficiente de transformar o Controle da Câmera no iPhone 16 em um hardware físico para a interface da sua câmera. O Controle da Câmera é uma ferramenta de captura versátil que abre um app de câmera com um clique, atua como botão do obturador e faz ajustes rápidos sem você mover o dedo do lugar.
Vamos falar dessas três funções, começando com a abertura. Para abrir o app, o Controle da Câmera precisa acessá-lo mesmo com o dispositivo bloqueado. Isso significa criar uma extensão de captura da Tela Bloqueada. Para saber mais, confira a sessão do ano passado sobre como criar uma experiência de câmera na Tela Bloqueada.
É fácil usar o Controle da Câmera como botão do obturador para seu app. Basta configurar uma das APIs de eventos de captura que o Vitaliy mostrou anteriormente. O Controle da Câmera executará o mesmo callback de evento principal que você já atribuiu aos botões de volume. Agora, minha parte favorita: alterar os ajustes da câmera. Pressione o Controle da Câmera de leve, como um obturador de câmera tradicional, para mostrar uma prévia e se concentrar na composição e abrir ajustes com controle deslizante. Veja outros ajustes para seleção pressionando de leve duas vezes, deslizando o dedo no Controle da Câmera e pressionando de leve para confirmar.
No nível mais alto, existem dois tipos de controles: os deslizantes para valores numéricos e os seletores para itens de lista.
Os controles deslizantes têm dois modos: contínuo e discreto.
Os contínuos podem selecionar um valor numérico em um intervalo definido. Por exemplo, o iOS vem com um controle deslizante contínuo de zoom. Ele oferece todo o espectro de zoom entre os valores mínimo e máximo recomendados para o dispositivo Os controles discretos também selecionam valores numéricos: em um conjunto explícito fornecido ou por meio de etapas fixas entre dois valores. O iOS tem um controle deslizante discreto integrado para ajustar a polarização de exposição, com incrementos de 1/3 entre ±2, que são unidades gerenciáveis da fotografia tradicional.
Os seletores, como os controles discretos, permitem seleções finitas, mas são indexados. Cada índice é associado a um estado nomeado do controle, como Ativado e Desativado para flash, ou nomes de Estilos Fotográficos no app Câmera. Agora que entendemos os vários tipos de controle, vamos dar uma olhada nas classes que os implementam. Os controles são definidos no framework AV Foundation. AVCaptureControl é a classe básica abstrata da qual os outros herdam.
Há duas subclasses definidas pelo sistema para que um app adote o mesmo comportamento do app Câmera integrado para polarização de exposição ou zoom. Finalmente, existem duas subclasses genéricas, para controles deslizantes, contínuos e discretos, e seletores, cujos comportamentos você pode definir. Para adotar controles no seu app, adicione-os a uma AVCaptureSession. Normalmente, a primeira etapa na configuração de uma sessão é criar um dispositivo de captura e adicioná-lo à sessão como entrada. Em seguida, os controles definidos pelo sistema são criados com referência ao mesmo dispositivo para controlar as propriedades por você. Todos os controles com comportamentos definidos pelo app também são criados neste momento, e cada controle é adicionado à sessão.
Para que o app responda quando alguém interagir com o Controle da Câmera, há alguns fluxos a serem considerados. Os controles fornecidos pelo sistema aplicam valores do Controle da Câmera diretamente ao dispositivo configurado. Você não precisa definir videoZoomFactor ou exposureTargetBias.
Mas você pode ter modelos ou itens de interface a serem atualizados. Se você já usa o Key-Value Observing, ou KVO, para detectar alterações na propriedade relevante, pode continuar usando esse mecanismo para atualizar sua interface.
Se você não usa o KVO, crie o controle do sistema com um gerenciador de ação, que será chamado no thread principal quando o valor for alterado, para você atualizar a interface diretamente.
Os controles definidos pelo app são sempre criados com um callback de ação, executado em uma fila especificada. Se o controle precisar definir ajustes de captura, você poderá fazer isso de forma síncrona especificando a fila onde gerencia esse estado. Depois, atualize sua interface na fila principal.
Agora estamos prontos para adotar o Controle da Câmera no app que estou criando com Vitaliy. Como ele adicionou uma interação de captura, o controle já funciona como um botão obturador para tirar fotos sem mexer no código.
Também quero ajustar o zoom no Controle da Câmera, então vamos adicionar esse recurso.
É aqui que estamos configurando nossa sessão de captura para usar um dispositivo. Verificamos se os controles são compatíveis, já que só estão disponíveis em dispositivos com Controle da Câmera, como o iPhone 16.
Os controles fornecidos pelo sistema são criados com apenas uma linha de código.
Antes de adicionar seu controle, verifique se a sessão o aceitará. Por exemplo, não dá para adicionar um controle de zoom pelo sistema em um dispositivo já associado a um controle de zoom. Por último, adicionamos o controle à sessão.
Só precisei fazer isso para o zoom funcionar perfeitamente no app usando o Controle da Câmera! Mas há um problema. Também uso gesto de pinça para aumentar o zoom. Depois que ampliei com o Controle da Câmera, a interface não estava atualizada e o gesto de pinça fez a imagem voltar ao zoom anterior. É fácil corrigir isso. Vamos criar o controle deslizante com um encerramento de ação, que recebe o fator de zoom como argumento. O novo valor é aplicado à interface com um callback delegado ou uma propriedade de modelo observável.
Quando o modelo por trás do gesto de pinça está sincronizado, posso dar zoom com o Controle da Câmera e a pinça começa pelo fator de zoom certo.
Agora quero adicionar um controle que não está disponível por padrão. Antes de criarmos o nosso, vamos refletir sobre o que compõe um bom controle. O Controle da Câmera, como diz o nome, foi feito para ser usado com a câmera do iPhone. Então, deve afetar a aparência ou a experiência de captura. Por isso, se os controles afetam áreas não relacionadas do seu app, fica confuso. Nunca introduza uma sessão de captura só para adotar o Controle da Câmera, pois a execução da câmera tem requisitos de energia e privacidade mais adequados à experiência de captura. Um ótimo exemplo de controle personalizado é um seletor que percorre os efeitos ou filtros do app.
Ele normalmente precisa operar mais perto da captura do que da interface. Vamos conferir como fica. Usando o código que acabamos de escrever, vamos incluir outros controles além do zoom. Veja que há um limite para o número de controles, informado pela propriedade maxControlsCount da sessão. canAddControl retornará false quando você atingir o limite. Agora podemos definir nossos efeitos. Eles podem ser renderizados em uma fila dedicada usando buffers de amostra de vídeo. Para nosso app, usarei os efeitos de reação apresentados no iOS 17. Aqui, criamos uma lista ordenada de efeitos e seus nomes a partir do conjunto não ordenado disponível. O seletor é inicializado com os nomes de efeito a serem exibidos à medida que ele percorre as opções. O seletor também precisa de um nome e de uma imagem do SF Symbol para distingui-lo do controle de zoom. É recomendável desativar o controle quando ele não for compatível em vez de omiti-lo. Assim ele ainda fica visível, mas não interativo. Caso contrário, outro controle é selecionado como fallback, o que pode confundir as pessoas.
Quando o usuário alterar o índice selecionado do seletor, executaremos a reação correspondente. Vamos direcionar a ação para a fila da sessão, já que esse é nosso contexto de isolamento para gerenciar o dispositivo. E agora só falta adicionar o seletor ao conjunto de controles. Vamos ver como nos saímos.
Quando interajo com o Controle da Câmera, observe que o zoom está desativado na nova configuração. Vamos mudar o controle. Vou deslizar na sobreposição, e agora posso ver meu seletor na lista. Vou rolar até ele e pressionar de leve para exibir as opções. Agora posso selecionar cada efeito e ver o que acontece na visualização.
É isso aí!
Com tudo que o Vitaliy e eu mostramos nesta sessão, você tem um monte de ferramentas incríveis para criar um app de câmera de primeira.
Vimos como capturar mídias com botões físicos em dispositivos iOS, incluindo a facilidade de fazer isso usando interações com os AirPods no iOS 26. Aprendemos a usar o Controle da Câmera como uma ferramenta útil para aprimorar as interações de captura do seu app. Você encontra ainda mais recursos em developer.apple.com, como Human Interface Guidelines para o Controle da Câmera, orientações para configurar AirPods para testar novos recursos e artigos e amostras de código sobre como adotar o Controle da Câmera. Agora é com você! Crie uma câmera que vai capturar a atenção das pessoas. Agradecemos sua participação.
-
-
5:35 - Initial PhotoCapture view setup
import SwiftUI struct PhotoCapture: View { var body: some View { VStack { CameraView() } } }
-
5:37 - Connecting a button to the camera model
import SwiftUI struct PhotoCapture: View { let camera = CameraModel() var body: some View { VStack { CameraView() Button(action: camera.capturePhoto) { Text("Take a photo") } } } }
-
6:10 - Importing AVKit
import AVKit import SwiftUI struct PhotoCapture: View { let camera = CameraModel() var body: some View { VStack { CameraView() Button(action: camera.capturePhoto) { Text("Take a photo") } } } }
-
6:14 - Setting up onCameraCaptureEvent view modifier
import AVKit import SwiftUI struct PhotoCapture: View { let camera = CameraModel() var body: some View { VStack { CameraView() .onCameraCaptureEvent { event in if event.phase == .ended { camera.capturePhoto() } } Button(action: camera.capturePhoto) { Text("Take a photo") } } } }
-
8:53 - Default sound for onCameraCaptureEvent view modifier
.onCameraCaptureEvent { event if event.phase == .ended { camera.capturePhoto() } }
-
9:13 - Play photo shutter sound on AirPod stem click
.onCameraCaptureEvent(defaultSoundDisabled: true) { event in if event.phase == .ended {a if event.shouldPlaySound {d event.play(.cameraShutter) } } camera.capturePhoto() }
-
14:46 - Add a build-in zoom slider to Camera Control
captureSession.beginConfiguration() // configure device inputs and outputs if captureSession.supportsControls { let zoomControl = AVCaptureSystemZoomSlider(device: device) if captureSession.canAddControl(zoomControl) { captureSession.addControl(zoomControl) } } captureSession.commitConfiguration()
-
15:40 - Modifying the built-in zoom slider to receive updates when zoom changes
let zoomControl = AVCaptureSystemZoomSlider(device: device) { [weak self] zoomFactor in self?.updateUI(zoomFactor: zoomFactor) }
-
16:46 - Adding a custom reaction-effects picker alongside zoom slider
let reactions = device.availableReactionTypes.sorted { $0.rawValue < $1.rawValue } let titles = reactions.map { localizedTitle(reaction: $0) } let picker = AVCaptureIndexPicker(“Reactions", symbolName: “face.smiling.inverted”, localizedIndexTitles: titles) picker.isEnabled = device.canPerformReactionEffects picker.setActionQueue(sessionQueue) { index in device.performEffect(for: reactions[index]) } let controls: [AVCaptureControl] = [zoomControl, picker] for control in controls { if captureSession.canAddControl(control) { captureSession.addControl(control) } }
-
-
- 0:00 - Introdução
Aprenda a usar o AVKit e o AV Foundation para aprimorar as interações em apps de câmera. Mapeie gestos dos botões físicos, como volume "para cima" e "para baixo", para ações da câmera, permitindo que as pessoas tirem fotos e iniciem gravações de vídeo usando os botões do telefone. Um novo recurso no iOS 26 é o Controle Remoto da Câmera com AirPods. Aprenda sobre os botões físicos compatíveis, como usar a API AVCaptureEventInteraction e uma visão geral do Controle da Câmera no iPhone 16.
- 2:51 - Captura física
O AVCaptureEventInteraction aceita o botão de Ação; encontre os detalhes de configuração na sessão do ano passado: Expanda os controles do seu app por todo o sistema.
- 3:01 - Tratamento de eventos
AVCaptureEventInteraction é uma API que permite controlar o ciclo de vida dos pressionamentos dos botões físicos em apps de câmera. Ela oferece três fases de evento: 'began', 'cancelled' e 'ended'. A fase 'ended' é quando o objeto da câmera deve iniciar a captura. A API diferencia ações primárias e secundárias, acionadas por botões específicos: volume para baixo, Ação e Controle da Câmera para ações primárias; volume para cima para ações secundárias. Esse design permite modularidade e flexibilidade para o app. Desenvolvedores SwiftUI podem acessar essa funcionalidade pelo 'onCameraCaptureEvent'. Ao importar o framework AVKit e aplicar esse modificador na CameraView, ative a captura de fotos com os botões físicos em poucas linhas de código, replicando o comportamento do app Câmera integrado.
- 6:39 - Captura remota com os AirPods
A partir do iOS 26, os AirPods com chip H2 permitirão o controle remoto da câmera por meio de cliques na haste. Configure esse recurso no app Ajustes e escolha qual ação de clique na haste acionará a captura de fotos. Uma nova API foi apresentada para fornecer feedback sonoro aos cliques na haste, com um tom padrão incluído, embora você possa personalizar o som para apps específicos. Essa melhoria permite capturar momentos sem usar as mãos e ter a confirmação dos comandos por meio de sinais sonoros.
- 10:00 - Controle da Câmera
AVCaptureControl é um novo recurso do iPhone 16 que permite criar controles físicos de hardware para as interfaces de câmera. Ele permite iniciar apps de câmera e ajustar configurações, além de funcionar como um botão do obturador. O controle oferece suporte a dois tipos principais de ajustes: controles (contínuos e separados) para valores numéricos e seletores para itens em uma lista. Esses controles são definidos no framework AV Foundation. Adicione controles definidos pelo sistema ou crie controles com comportamentos definidos pelo app. Esses controles são adicionados a uma AVCaptureSession, e o app responde às interações por meio de manipuladores de ação ou Key-Value Observing (KVO), atualizando a interface. Para aprimorar a funcionalidade do app de câmera, utilize o Controle da Câmera para adicionar controles fornecidos pelo sistema que exige uma linha de código. Garanta que a sessão aceite o controle e sincronize a interface com o estado do controle para evitar problemas como fatores de zoom obsoletos. Ao criar controles personalizados, o Controle da Câmera é projetado especificamente para experiências de captura. Um exemplo de controle personalizado é um Seletor que permite selecionar efeitos ou filtros. Ele precisa operar mais próximo da sessão de captura do que da interface. Defina efeitos, inicialize o Seletor com os nomes dos efeitos e desative o controle quando não tiver suporte. Ao direcionar a ação para a fila da sessão, garanta o isolamento adequado e o gerenciamento correto do dispositivo. Com os Controles de Captura, crie apps de câmera que capturam a atenção das pessoas.