AVFoundation & Vision
Camera capture e processamento de imagem em tempo real
O pipeline de camera do IdentityKit usa AVFoundation para captura de frames em tempo real e Vision framework para deteccao de documentos e analise facial. Todo processamento ocorre em serial queues dedicadas para evitar data races.
Pipeline de Camera
O pipeline segue o modelo producer-consumer: a camera produz frames a 30fps, e o processador consome e analisa cada frame. A chave e nunca bloquear a main thread e usar uma serial queue para configuracao da session.
| Componente | Responsabilidade | Thread |
|---|---|---|
| AVCaptureSession | Coordena inputs e outputs | Serial queue dedicada |
| AVCaptureDeviceInput | Conecta a camera fisica | Configurado na session queue |
| AVCaptureVideoDataOutput | Entrega frames via delegate | Callback na queue do delegate |
| AVCapturePhotoOutput | Captura foto de alta resolucao | Callback na queue do delegate |
| AVCaptureVideoPreviewLayer | Exibe preview na tela | Main thread (CALayer) |
Serial Queue para Session
Regra fundamental: todas as operacoes na AVCaptureSession devem ocorrer em uma serial queue dedicada. Isso inclui beginConfiguration(), adicionar inputs/outputs e startRunning().
// Serial queue dedicada β regra fundamental do AVFoundation
private let sessionQueue = DispatchQueue(
label: "com.identitykit.session",
qos: .userInitiated
)
private let videoOutputQueue = DispatchQueue(
label: "com.identitykit.videoOutput",
qos: .userInitiated
)
// NUNCA configure a session na main thread
func configure() {
sessionQueue.async { [self] in
session.beginConfiguration()
defer { session.commitConfiguration() }
// Adicionar input e output aqui
}
}
// NUNCA chame startRunning() na main thread
func start() {
sessionQueue.async { [self] in
if !session.isRunning {
session.startRunning()
}
}
}
Fluxo de Dados
- Camera captura frame (CMSampleBuffer) a 30fps
- AVCaptureVideoDataOutput entrega buffer via delegate
- Frame Processor converte para CVPixelBuffer
- Vision analisa (deteccao de bordas, face quality)
- Resultado e enviado para UI via MainActor
- Se qualidade OK, captura foto via AVCapturePhotoOutput
Importante: O delegate de
AVCaptureVideoDataOutput recebe frames na queue que voce especificar. Se o processamento demorar mais que 1/30s, frames sao descartados automaticamente (alwaysDiscardsLateVideoFrames = true).