The digital camera preview freezes on a single body (a black/partially rendered picture), and the stay digital camera feed by no means begins. The UI stays responsive, however the AVCaptureSession doesn’t correctly ship frames after initialization. Primarily, the preview layer is displaying a stale or frozen body as a substitute of stay video.
func startReceivingUpdates() {
videoFrameService.delegate = self
cameraService.delegate = self
}
func stopReceivingUpdates() {
videoFrameService.delegate = nil
cameraService.delegate = nil
}
these are referred to as on the onAppear and onDisappear of the view respectively
non-public func configureCaptureSession() {
guard standing == .unconfigured else {
return
}
session.beginConfiguration()
defer {
session.commitConfiguration()
}
for enter in session.inputs {
session.removeInput(enter)
}
let system = AVCaptureDevice.default(
.builtInWideAngleCamera,
for: .video,
place: cameraPosition)
guard let digital camera = system else {
set(error: .cameraUnavailable)
standing = .failed
return
}
do {
let cameraInput = attempt AVCaptureDeviceInput(system: digital camera)
if session.canAddInput(cameraInput) {
session.addInput(cameraInput)
} else {
set(error: .cannotAddInput)
standing = .failed
return
}
if let audioCaptureDevice = audioCaptureDevice {
let audioInput = attempt AVCaptureDeviceInput(system: audioCaptureDevice)
if session.canAddInput(audioInput) {
session.addInput(audioInput)
}
}
} catch {
set(error: .createCaptureInput(error))
standing = .failed
return
}
session.outputs.forEach { output in
session.removeOutput(output)
}
if session.canAddOutput(videoOutput) {
session.addOutput(videoOutput)
videoOutput.videoSettings =
[kCVPixelBufferPixelFormatTypeKey as String: kCVPixelFormatType_32BGRA]
let videoConnection = videoOutput.connection(with: .video)
videoConnection?.videoOrientation = .portrait
videoConnection?.isVideoMirrored = cameraPosition == .entrance
} else {
set(error: .cannotAddOutput)
standing = .failed
return
}
if session.canAddOutput(audioOutput) {
session.addOutput(audioOutput)
}
if session.canAddOutput(photoOutput) {
session.addOutput(photoOutput)
let outputConnection = photoOutput.connection(with: .video)
if cameraPosition == .entrance {
outputConnection?.automaticallyAdjustsVideoMirroring = false
outputConnection?.isVideoMirrored = true
} else {
outputConnection?.automaticallyAdjustsVideoMirroring = false
outputConnection?.isVideoMirrored = false
}
}
standing = .configured
}
extension VideoFrameService: AVCaptureVideoDataOutputSampleBufferDelegate, AVCaptureAudioDataOutputSampleBufferDelegate {
func captureOutput(
_ output: AVCaptureOutput,
didOutput sampleBuffer: CMSampleBuffer,
from connection: AVCaptureConnection
) {
DispatchQueue.major.async {
self.delegate?.replace(output: output, sampleBuffer: sampleBuffer)
}
}
}
what would be the root trigger for this. and find out how to remedy this