Сфотографируйте отсканированный штрих-код 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;
}
}
}