Сфотографируйте отсканированный штрих-код Swift

Я использовал AVCaptureStillImageOutput для съемки отсканированного штрих-кода.

Проблема в том, что иногда он работает нормально, получая изображение и в основном получая ошибку

Домен ошибки =AVFoundationErrorDomain Code=-11800 "Операция не может быть завершена" UserInfo={NSLocalizedFailureReason= Произошла неизвестная ошибка (-16800), NSLocalizedDescription= Операция не может быть завершена, NSUnderlyingError=0x281b8bba0 {Ошибка домена =NSOSStatusEror 16800 "(null)"}}

Вот мой код

Чтобы начать чтение кода

func startReading() -> Bool {
        let captureDevice = AVCaptureDevice.defaultDevice(withMediaType: AVMediaTypeVideo)
        do {
            let input = try AVCaptureDeviceInput(device: captureDevice)
            captureSession = AVCaptureSession()
            captureSession?.addInput(input)
            // Do the rest of your work...
        } catch let error as NSError {
            // Handle any errors
            print(error)
            return false
        }

        videoPreviewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
        videoPreviewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill
        videoPreviewLayer.frame = viewPreview.layer.bounds

        self.stillImageOutput.outputSettings = [AVVideoCodecKey:AVVideoCodecJPEG]

        if (captureSession?.canAddOutput(self.stillImageOutput))! {
            captureSession?.addOutput(self.stillImageOutput)
        }

        viewPreview.layer.addSublayer(videoPreviewLayer)

        /* Check for metadata */
        let captureMetadataOutput = AVCaptureMetadataOutput()
        captureSession?.addOutput(captureMetadataOutput)
        captureMetadataOutput.metadataObjectTypes = captureMetadataOutput.availableMetadataObjectTypes
        print(captureMetadataOutput.availableMetadataObjectTypes)
        captureMetadataOutput.setMetadataObjectsDelegate(self, queue: DispatchQueue.main)
        captureSession?.startRunning()

        return true
    }

Чтобы остановить чтение кода

func stopReading() {
    captureSession?.stopRunning()
    captureSession = nil
    videoPreviewLayer.removeFromSuperlayer()
}

Метод захвата делегата

func captureOutput(_ captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [Any]!, from connection: AVCaptureConnection!) {

        for data in metadataObjects {
            let metaData = data as! AVMetadataObject
            print(metaData.description)
            let transformed = videoPreviewLayer?.transformedMetadataObject(for: metaData) as? AVMetadataMachineReadableCodeObject
            if let unwraped = transformed {
                print(unwraped.stringValue)
                lblString.text = unwraped.stringValue
                btnStartStop.setTitle("Start", for: .normal)

                if let videoConnection = stillImageOutput.connection(withMediaType: AVMediaTypeVideo) {
                    stillImageOutput.captureStillImageAsynchronously(from: videoConnection) {
                        (imageDataSampleBuffer, error) -> Void in

                        if imageDataSampleBuffer != nil{
                            let imageData = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(imageDataSampleBuffer!)

                            if let image = UIImage(data: imageData!){

                                print(image) // Image is Here
                            }
                        }else{
                            print(imageDataSampleBuffer)
                            print(error)
                        }
                    }
                }
                self.performSelector(onMainThread: #selector(stopReading), with: nil, waitUntilDone: false)
                isReading = false;
            }
        }
    }

0 ответов

Другие вопросы по тегам