是否应该使用 ML Kit 以纵向模式扫描条形码?
Should one can scan a barcode in portrait mode using ML Kit?
我已经尝试并能够在 iPhone 的横向模式和 iPad 的横向以及纵向模式下使用 ML Kit 扫描条形码,但是 iPhone 存在一些问题纵向模式条码扫描我无法扫描纵向模式下的代码有没有人尝试过面对这个问题请帮我解决这个问题。
提前致谢。
导入基金会
导入 UIKit
导入 AVFoundation
导入 Firebase
class CameraView: UIView
{
覆盖 class var layerClass: AnyClass
{
得到
{
return AVCaptureVideoPreviewLayer.self
}
}
覆盖 var 层:AVCaptureVideoPreviewLayer
{
得到
{
returnsuper.layer为! AVCaptureVideoPreviewLayer
}
}
}
class ViewController : UIViewController, AVCaptureVideoDataOutputSampleBufferDelegate
{
let session = AVCaptureSession()
lazy var vision = Vision.vision()
var barcodeDetector :VisionBarcodeDetector?
// Camera view
var cameraView: CameraView!
override func loadView()
{
cameraView = CameraView()
view = cameraView
}
override func viewDidLoad()
{
super.viewDidLoad()
startLiveVideo()
self.barcodeDetector = vision.barcodeDetector()
}
func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection)
{
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
}
for barcode in barcodes!
{
print(barcode.displayValue!)
let alertController = UIAlertController(title: "Barcode Scanned", message: barcode.displayValue, preferredStyle: .alert)
alertController.addAction(UIAlertAction(title: "OK", style: .default, handler:nil))
self.present(alertController, animated: true, completion: nil)
}
}
}
}
private func startLiveVideo()
{
session.sessionPreset = AVCaptureSession.Preset.high
let captureDevice = AVCaptureDevice.default(for: AVMediaType.video)
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)
session.commitConfiguration()
cameraView.layer.session = session
cameraView.layer.videoGravity = AVLayerVideoGravity.resizeAspectFill
cameraView.layer.addSublayer(imageLayer)
session.startRunning()
}
}
我已经尝试并能够在 iPhone 的横向模式和 iPad 的横向以及纵向模式下使用 ML Kit 扫描条形码,但是 iPhone 存在一些问题纵向模式条码扫描我无法扫描纵向模式下的代码有没有人尝试过面对这个问题请帮我解决这个问题。
提前致谢。
导入基金会 导入 UIKit 导入 AVFoundation 导入 Firebase
class CameraView: UIView { 覆盖 class var layerClass: AnyClass { 得到 { return AVCaptureVideoPreviewLayer.self } } 覆盖 var 层:AVCaptureVideoPreviewLayer { 得到 { returnsuper.layer为! AVCaptureVideoPreviewLayer } } }
class ViewController : UIViewController, AVCaptureVideoDataOutputSampleBufferDelegate {
let session = AVCaptureSession()
lazy var vision = Vision.vision()
var barcodeDetector :VisionBarcodeDetector?
// Camera view
var cameraView: CameraView!
override func loadView()
{
cameraView = CameraView()
view = cameraView
}
override func viewDidLoad()
{
super.viewDidLoad()
startLiveVideo()
self.barcodeDetector = vision.barcodeDetector()
}
func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection)
{
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
}
for barcode in barcodes!
{
print(barcode.displayValue!)
let alertController = UIAlertController(title: "Barcode Scanned", message: barcode.displayValue, preferredStyle: .alert)
alertController.addAction(UIAlertAction(title: "OK", style: .default, handler:nil))
self.present(alertController, animated: true, completion: nil)
}
}
}
}
private func startLiveVideo()
{
session.sessionPreset = AVCaptureSession.Preset.high
let captureDevice = AVCaptureDevice.default(for: AVMediaType.video)
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)
session.commitConfiguration()
cameraView.layer.session = session
cameraView.layer.videoGravity = AVLayerVideoGravity.resizeAspectFill
cameraView.layer.addSublayer(imageLayer)
session.startRunning()
}
}