AVFoundation、DataMatrix、Swift 4
AVFoundation, DataMatrix, Swift 4
呃。我与 Swift 4 AVFoundation 的变化斗争仍在继续。
我有一个数据矩阵 "QR" 代码,我正在尝试阅读。
它在 Swift 3 编译时读起来很好,但在 Swift 4 代码更改后它没有被拾取。
另请注意,Apple 提供的本应与 Swift 4 一起使用的示例也不会读取 DataMatrix 代码
当我打印出可用类型时,Data Matrix 可用。
print("types available:\n \(metadataOutput.availableMetadataObjectTypes)")
产量:
types available:
[__ObjC.AVMetadataObject.ObjectType(_rawValue: face), ...
__ObjC.AVMetadataObject.ObjectType(_rawValue: org.iso.DataMatrix), ...
但是,当我 运行 代码时,didOutput metadataObjects: 从未被调用。但是,它确实会被其他类型调用。
另外明确添加类型:
metadataOutput.metadataObjectTypes = [AVMetadataObject.ObjectType.dataMatrix]
没什么不同。
有人在 Swift 4 中扫描过 DataMatrix 吗?
代码:
import UIKit
import AVFoundation
class ViewController: UIViewController,AVCaptureMetadataOutputObjectsDelegate {
var videoCaptureDevice: AVCaptureDevice = AVCaptureDevice.default(for: AVMediaType.video)!
var device = AVCaptureDevice.default(for: AVMediaType.video)
var output = AVCaptureMetadataOutput()
var previewLayer: AVCaptureVideoPreviewLayer?
var captureSession = AVCaptureSession()
var code: String?
var scannedCode = UILabel()
override func viewDidLoad() {
super.viewDidLoad()
self.setupCamera()
self.addLabelForDisplayingCode()
}
private func setupCamera() {
let input = try? AVCaptureDeviceInput(device: videoCaptureDevice)
if self.captureSession.canAddInput(input!) {
self.captureSession.addInput(input!)
}
self.previewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
if let videoPreviewLayer = self.previewLayer {
videoPreviewLayer.videoGravity = AVLayerVideoGravity.resizeAspectFill
videoPreviewLayer.frame = self.view.bounds
view.layer.addSublayer(videoPreviewLayer)
}
let metadataOutput = AVCaptureMetadataOutput()
if self.captureSession.canAddOutput(metadataOutput) {
self.captureSession.addOutput(metadataOutput)
metadataOutput.setMetadataObjectsDelegate(self, queue: DispatchQueue.main)
print("types available:\n \(metadataOutput.availableMetadataObjectTypes)")
metadataOutput.metadataObjectTypes = metadataOutput.availableMetadataObjectTypes
// metadataOutput.metadataObjectTypes = [AVMetadataObject.ObjectType.dataMatrix]
} else {
print("Could not add metadata output")
}
}
private func addLabelForDisplayingCode() {
view.addSubview(scannedCode)
scannedCode.translatesAutoresizingMaskIntoConstraints = false
scannedCode.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: -20.0).isActive = true
scannedCode.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 20.0).isActive = true
scannedCode.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -20.0).isActive = true
scannedCode.heightAnchor.constraint(equalToConstant: 50).isActive = true
scannedCode.font = UIFont.preferredFont(forTextStyle: .title2)
scannedCode.backgroundColor = UIColor.black.withAlphaComponent(0.5)
scannedCode.textAlignment = .center
scannedCode.textColor = UIColor.white
scannedCode.text = "Scanning...."
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
if (captureSession.isRunning == false) {
captureSession.startRunning();
}
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
if (captureSession.isRunning == true) {
captureSession.stopRunning();
}
}
func metadataOutput(_ output: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject], from connection: AVCaptureConnection) {
print(metadataObjects)
for metadata in metadataObjects {
let readableObject = metadata as! AVMetadataMachineReadableCodeObject
let code = readableObject.stringValue
scannedCode.text = code
}
}
}
非常感谢。
您必须确保连接未被镜像。
需要以原始格式读取数据矩阵。
https://developer.apple.com/documentation/avfoundation/avcaptureconnection/1389172-isvideomirrored
呃。我与 Swift 4 AVFoundation 的变化斗争仍在继续。
我有一个数据矩阵 "QR" 代码,我正在尝试阅读。
它在 Swift 3 编译时读起来很好,但在 Swift 4 代码更改后它没有被拾取。
另请注意,Apple 提供的本应与 Swift 4 一起使用的示例也不会读取 DataMatrix 代码
当我打印出可用类型时,Data Matrix 可用。
print("types available:\n \(metadataOutput.availableMetadataObjectTypes)")
产量:
types available:
[__ObjC.AVMetadataObject.ObjectType(_rawValue: face), ...
__ObjC.AVMetadataObject.ObjectType(_rawValue: org.iso.DataMatrix), ...
但是,当我 运行 代码时,didOutput metadataObjects: 从未被调用。但是,它确实会被其他类型调用。
另外明确添加类型:
metadataOutput.metadataObjectTypes = [AVMetadataObject.ObjectType.dataMatrix]
没什么不同。
有人在 Swift 4 中扫描过 DataMatrix 吗?
代码:
import UIKit
import AVFoundation
class ViewController: UIViewController,AVCaptureMetadataOutputObjectsDelegate {
var videoCaptureDevice: AVCaptureDevice = AVCaptureDevice.default(for: AVMediaType.video)!
var device = AVCaptureDevice.default(for: AVMediaType.video)
var output = AVCaptureMetadataOutput()
var previewLayer: AVCaptureVideoPreviewLayer?
var captureSession = AVCaptureSession()
var code: String?
var scannedCode = UILabel()
override func viewDidLoad() {
super.viewDidLoad()
self.setupCamera()
self.addLabelForDisplayingCode()
}
private func setupCamera() {
let input = try? AVCaptureDeviceInput(device: videoCaptureDevice)
if self.captureSession.canAddInput(input!) {
self.captureSession.addInput(input!)
}
self.previewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
if let videoPreviewLayer = self.previewLayer {
videoPreviewLayer.videoGravity = AVLayerVideoGravity.resizeAspectFill
videoPreviewLayer.frame = self.view.bounds
view.layer.addSublayer(videoPreviewLayer)
}
let metadataOutput = AVCaptureMetadataOutput()
if self.captureSession.canAddOutput(metadataOutput) {
self.captureSession.addOutput(metadataOutput)
metadataOutput.setMetadataObjectsDelegate(self, queue: DispatchQueue.main)
print("types available:\n \(metadataOutput.availableMetadataObjectTypes)")
metadataOutput.metadataObjectTypes = metadataOutput.availableMetadataObjectTypes
// metadataOutput.metadataObjectTypes = [AVMetadataObject.ObjectType.dataMatrix]
} else {
print("Could not add metadata output")
}
}
private func addLabelForDisplayingCode() {
view.addSubview(scannedCode)
scannedCode.translatesAutoresizingMaskIntoConstraints = false
scannedCode.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: -20.0).isActive = true
scannedCode.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 20.0).isActive = true
scannedCode.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -20.0).isActive = true
scannedCode.heightAnchor.constraint(equalToConstant: 50).isActive = true
scannedCode.font = UIFont.preferredFont(forTextStyle: .title2)
scannedCode.backgroundColor = UIColor.black.withAlphaComponent(0.5)
scannedCode.textAlignment = .center
scannedCode.textColor = UIColor.white
scannedCode.text = "Scanning...."
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
if (captureSession.isRunning == false) {
captureSession.startRunning();
}
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
if (captureSession.isRunning == true) {
captureSession.stopRunning();
}
}
func metadataOutput(_ output: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject], from connection: AVCaptureConnection) {
print(metadataObjects)
for metadata in metadataObjects {
let readableObject = metadata as! AVMetadataMachineReadableCodeObject
let code = readableObject.stringValue
scannedCode.text = code
}
}
}
非常感谢。
您必须确保连接未被镜像。 需要以原始格式读取数据矩阵。
https://developer.apple.com/documentation/avfoundation/avcaptureconnection/1389172-isvideomirrored