Swift AVFoundation PDF417扫描仪没有';我不总是工作
我正在使用Swift 4和Xcode 9创建一个应用程序,该程序使用AVFoundation扫描PDF417条形码。扫描仪可以处理一些代码,但无法识别您在CA彩票刮刮器彩票正面可以找到的PDF417条形码 我缺少什么东西来让它工作吗?下面是我的代码:Swift AVFoundation PDF417扫描仪没有';我不总是工作,swift,xcode,avfoundation,pdf417,Swift,Xcode,Avfoundation,Pdf417,我正在使用Swift 4和Xcode 9创建一个应用程序,该程序使用AVFoundation扫描PDF417条形码。扫描仪可以处理一些代码,但无法识别您在CA彩票刮刮器彩票正面可以找到的PDF417条形码 我缺少什么东西来让它工作吗?下面是我的代码: let deviceDiscoverySession = AVCaptureDevice.DiscoverySession(deviceTypes: [.builtInDualCamera], mediaType: AVMediaType.vide
let deviceDiscoverySession = AVCaptureDevice.DiscoverySession(deviceTypes: [.builtInDualCamera], mediaType: AVMediaType.video, position: .back)
guard let captureDevice = deviceDiscoverySession.devices.first else {
print("Failed to get the camera device")
return
}
do {
captureSession = AVCaptureSession()
let input = try AVCaptureDeviceInput(device: captureDevice)
captureSession!.addInput(input)
let captureMetadataOutput = AVCaptureMetadataOutput()
captureSession!.addOutput(captureMetadataOutput)
captureMetadataOutput.setMetadataObjectsDelegate(self, queue: DispatchQueue.main)
captureMetadataOutput.metadataObjectTypes = [AVMetadataObject.ObjectType.pdf417]
videoPreviewLayer = AVCaptureVideoPreviewLayer(session: captureSession!)
videoPreviewLayer?.videoGravity = AVLayerVideoGravity.resizeAspectFill
videoPreviewLayer?.frame = view.layer.bounds
view.layer.addSublayer(videoPreviewLayer!)
captureSession?.startRunning()
} catch {
print(error)
return
}
func metadataOutput(_ output: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject], from connection: AVCaptureConnection) {
//Get the metadata object
let metadataObj = metadataObjects[0] as! AVMetadataMachineReadableCodeObject
if scanType.contains(metadataObj.type) {
let barCodeObj = videoPreviewLayer?.transformedMetadataObject(for: metadataObj)
if(metadataObj.stringValue != nil) {
callDelegate(metadataObj.stringValue)
captureSession?.stopRunning()
AudioServicesPlayAlertSound(SystemSoundID(kSystemSoundID_Vibrate))
navigationController?.popViewController(animated: true)
}
}
}
谢谢 将扫描仪的初始化代码替换为viewDidLoad中的以下代码或您希望的某种方法中的代码
// Global vars used in init below
var captureSession: AVCaptureSession!
var previewLayer: AVCaptureVideoPreviewLayer!
func setupCaptureInputDevice() {
let cameraMediaType = AVMediaType.video
captureSession = AVCaptureSession()
// get the video capture device, which should be of type video
guard let videoCaptureDevice = AVCaptureDevice.default(for: .video) else {
// if there is an error then something is wrong, so dismiss
dismiss(animated: true, completion: nil)
return
}
let videoInput: AVCaptureDeviceInput
// create a capture input for the above device input that was created
do {
videoInput = try AVCaptureDeviceInput(device: videoCaptureDevice)
} catch {
return
}
// this is important to check for if we are able to add the input
// because adding before this could cause a crash or it could not happen
if (captureSession.canAddInput(videoInput)) {
captureSession.addInput(videoInput)
} else {
// dismiss or display error
return
}
// get ready to capture output somewhere
let metadataOutput = AVCaptureMetadataOutput()
// again check to make sure that we can do this operation before doing it
if (captureSession.canAddOutput(metadataOutput)) {
captureSession.addOutput(metadataOutput)
// setting the metadataOutput's delegate to be self and then requesting it run on the main thread
metadataOutput.setMetadataObjectsDelegate(self, queue: DispatchQueue.main)
// specify your code type
metadataOutput.metadataObjectTypes = [.pdf417]
} else {
// dismiss or display error
return
}
// the preview layer now becomes the capture session
previewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
// just add it to the screen
previewLayer.frame = view.layer.bounds
previewLayer.videoGravity = .resizeAspectFill
view.layer.addSublayer(previewLayer)
// and begin input
captureSession.startRunning()
}
很抱歉,我的问题中没有包含该委托,但我的代码中确实包含该委托。我将把它添加到问题中,也许你可以指出我可能遗漏的任何东西如果你在委托方法的中间添加一个断点,如果你试图扫描代码,断点会被击中吗?我觉得你的设置不完全正确。因为我的扫描仪不使用
DiscoverySession
。我将更新我的答案,以显示我用于设置视图的内容。我觉得这就是为什么你会有问题。我不确定isI从本教程中获得的大部分代码是什么。扫描仪适用于大多数PDF417,但它无法读取刮刮彩票中的内容,我想这可能是因为它不是标准iso格式。然而,像微链接这样的第三方应用程序却开始使用它。因此,我不确定是否有什么我错过了使AVF更好。我已经做了一个扫描仪使用上述代码,以使PDF417扫描仪。它使用的是AVFoundation,但归根结底取决于条形码的质量和条形码的大小。较小的条形码更难被扫描仪重新记录,这意味着如果条形码太小,它就无法读取。或者,如果PDF417被挤压在一起,它将无法扫描。但是,是的,这很可能就是解决办法。这个代码有效。在你的驾照上试试,背面有一个PDF417谢谢你的努力和帮助,我真的很感激。很高兴得到确认,该代码可以正常工作,我今天在工作时四处询问,我正在尝试扫描的PDF417代码是非标准的,而且非常小,正如您所提到的,很可能这就是它无法正常工作的原因。