3

我正在尝试使用 AVFoundation 库从条形码类型 PDF417 中读取信息。

func metadataOutput(_ output: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject], from connection: AVCaptureConnection) {
    if let metadataObj = metadataObjects[0] as? AVMetadataMachineReadableCodeObject {
        print(metadataObj.stringValue)//prints 0357379329
    }
}

在“AVCaptureMetadataOutputObjectsDelegate”中的didOutput方法的执行点,我可以捕获AVMetadataObject及其stringValue;然而 stringValue 没有包含在条形码中的完整信息,它会生成如下内容:

0357379329

当我使用像BlinkId这样的付费应用程序时,我可以看到更多信息。

根据这个主题,我尝试使用“_internal.basicDescriptor”方法:

func metadataOutput(_ output: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject], from connection: AVCaptureConnection) {
    if let metadataObj = metadataObjects[0] as? AVMetadataMachineReadableCodeObject {
        if let basic_descriptor = metadataObj.value(forKeyPath: "_internal.basicDescriptor") as? NSObject {
            if let barcodeRawData = basic_descriptor.value(forKeyPath: "BarcodeRawData") as? NSData {
                let barcode_raw_data_length = barcodeRawData.length
                let memory_layout = MemoryLayout<UInt8>.size
                let count = barcode_raw_data_length / memory_layout
                var array = [UInt8](repeating: 0, count: count)//Array con 1050 elementos. Cada elemento es igual a cero
                barcodeRawData.getBytes(&array, length:count * memory_layout)
                let data_character = array.reduce("", { $0 + String(format: "%c", $1)})
                print(data_character)
            }
        }
    }
}

data_character 打印一个我不知道如何解释的字符串:

ÍH ÕÛ+ÝY-<4mI ËÇ;ÚÖ ÿûJhiòþ ^HT¶î èm½C3&îðÜ,Feæ»0æ¤öc$¯#m,WÆç4Pá$Ññü0njtYÜ0U¼Çça°'£aR.)9 Êq3uúù7=,~mV ½Q ý;áu½7õÚÚAZÝcJà ëu-Õß/³©îprX×Ijßçól{¡¿ý...

我想知道其中的任何一个:

  1. 如何获取包含整个信息的 AVMetadataObject stringValue?
  2. 如何解释使用“_internal.basicDescriptor”生成的字符串?
  3. 是否有另一种方法可以从 swift 4 中的 pdf417 获取信息?

谢谢!

4

0 回答 0