AVFoundation добавить поддержку штрих-кодов Code39Mod10 и Codabar

Я реализовал сканер QR-/ штрих-кодов в Swift с использованием фреймворка AVFoundation.

Для поддерживаемых типов я добавил почти все доступные типы:

let supportedCodeTypes = [AVMetadataObjectTypeUPCECode,
                          AVMetadataObjectTypeCode39Code,
                          AVMetadataObjectTypeCode39Mod43Code,
                          AVMetadataObjectTypeCode93Code,
                          AVMetadataObjectTypeCode128Code,
                          AVMetadataObjectTypeEAN8Code,
                          AVMetadataObjectTypeEAN13Code,
                          AVMetadataObjectTypeAztecCode,
                          AVMetadataObjectTypePDF417Code,
                          AVMetadataObjectTypeQRCode,
                          AVMetadataObjectTypeDataMatrixCode,
                          AVMetadataObjectTypeITF14Code]

Теперь я хочу добавить поддержку кодов Code39Mod10 и штрих-кодов Codabar, чего нет в AVMetadataObjectTypes.

Is there a possibility to add custom AVMetadataObjectTypes or do I have to use some 3rd party scanner framework. And if so, can you suggest one?

1 ответ

Пожалуйста, проверьте firebase , он позволяет сканировать его ``` добавьте AVCaptureVideoDataOutputSampleBufferDelegate на ваш контроллер просмотра,
настройте обнаружение в реальном времени:-
self.view.layoutIfNeeded()session.sessionPreset = AVCaptureSession.Preset.photo )

          if captureDevice != nil
    {
        let deviceInput = try! AVCaptureDeviceInput(device: captureDevice!)
        let deviceOutput = AVCaptureVideoDataOutput()
        deviceOutput.videoSettings = [kCVPixelBufferPixelFormatTypeKey as String: Int(kCVPixelFormatType_32BGRA)]
        deviceOutput.setSampleBufferDelegate(self, queue: DispatchQueue.global(qos: DispatchQoS.QoSClass.default))
        session.addInput(deviceInput)
        session.addOutput(deviceOutput)
        
        let imageLayer = AVCaptureVideoPreviewLayer(session: session)
        imageLayer.frame = self.viewScanner.bounds
        imageLayer.videoGravity = .resizeAspectFill
        viewScanner.layer.addSublayer(imageLayer)
        viewScanner.bringSubviewToFront(imgScanner)
        session.startRunning()
    } <br/> implement delegate:- <br/> //MARK:- AVCaptureVideoDataOutputSampleBufferDelegate
func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {
    if self.session.isRunning {
        if let barcodeDetector = self.barcodeDetector {
            
            let visionImage = VisionImage(buffer: sampleBuffer)
            
            barcodeDetector.detect(in: visionImage) { (barcodes, error) in
                if let error = error {
                    print(error.localizedDescription)
                    return
                }
                if barcodes!.count > 0 {
                    let barcode = barcodes?.first
                    if let decodeString = barcode?.rawValue {

                            print("\n======================= Barcode value =======================\n \(barcode!.rawValue!)")
                            self.session.stopRunning()
    
                    }
                }
            }
        }
    }
} 
Другие вопросы по тегам