Anteriormente estaba agregando un AVCaptureMovieFileOutput a mi AVCaptureSession y habilitando el modo de estabilización de video preferredVideoStabilizationMode cinemático, obteniendo excelentes resultados esperados.
Acabo de cambiar a un AVCaptureVideoDataOutput y la estabilización cinemática está provocando un retraso extremadamente notable, aproximadamente un segundo de retraso antes de que se actualice la vista previa de la imagen.
Configuración:
// Video data output let outputSettings: [String: Any] = [kCVPixelBufferPixelFormatTypeKey as String: kCVPixelFormatType_32BGRA] videoDataOutput = AVCaptureVideoDataOutput() videoDataOutput?.videoSettings = outputSettings let videoSessionQueue = DispatchQueue(label: "video_capture_session_queue") videoDataOutput?.setSampleBufferDelegate(self, queue: videoSessionQueue) videoDataOutput?.alwaysDiscardsLateVideoFrames = true // Audio data output let audioDataOutput = AVCaptureAudioDataOutput() let audioSessionQueue = DispatchQueue(label: "audio_capture_session_queue") audioDataOutput.setSampleBufferDelegate(self, queue: audioSessionQueue) // Configure session captureSession.beginConfiguration() let videoInput = try AVCaptureDeviceInput(device: currentCameraDevice) captureSession.addInput(videoInput) captureSession.addOutput(videoDataOutput!) if let videoDataOutputConnection = videoDataOutput?.connection(with: .video), videoDataOutputConnection.isVideoStabilizationSupported { videoDataOutputConnection.preferredVideoStabilizationMode = .cinematic } if let audioInput = AVCaptureDevice.default(for: .audio) { try captureSession.addInput(AVCaptureDeviceInput(device: audioInput)) captureSession.addOutput(audioDataOutput) } captureSession.commitConfiguration() captureSession.startRunning()¿Alguien tiene alguna idea o una solución? Gracias por adelantado.
Para cualquier persona interesada, esto es lo que aprendí después de unos días más de excavación:
El retraso no se puede evitar cuando se renderiza en una capa que no es AVCaptureVideoPreviewLayer , que es esencialmente cada vez que ejecuta un AVCaptureVideoDataOutput para procesar fotogramas individuales (y es cierto para las configuraciones CI y Metal).
El modo de estabilización .cinematic conduce al retraso más notable: ~ 1 segundo. Cambiar a .standard reduce a ~1/10 de segundo y produce mejores resultados que ninguna estabilización.