Improve QR scanner: prefer built-in camera, add rectOfInterest, fallback metadata types
This commit is contained in:
parent
8236b586c5
commit
f220800262
@ -99,8 +99,17 @@ class QRScannerWindowController: NSObject, AVCaptureMetadataOutputObjectsDelegat
|
|||||||
// 在后台线程初始化摄像头
|
// 在后台线程初始化摄像头
|
||||||
private func setupCaptureOnBackground(previewHost: NSView) {
|
private func setupCaptureOnBackground(previewHost: NSView) {
|
||||||
let session = AVCaptureSession()
|
let session = AVCaptureSession()
|
||||||
|
session.sessionPreset = .high
|
||||||
|
|
||||||
guard let device = AVCaptureDevice.default(for: .video) else {
|
// 优先选内置摄像头,避免 Continuity Camera 不支持 metadata
|
||||||
|
var device: AVCaptureDevice?
|
||||||
|
if let builtIn = AVCaptureDevice.default(.builtInWideAngleCamera, for: .video, position: .unspecified) {
|
||||||
|
device = builtIn
|
||||||
|
} else {
|
||||||
|
device = AVCaptureDevice.default(for: .video)
|
||||||
|
}
|
||||||
|
|
||||||
|
guard let device = device else {
|
||||||
DispatchQueue.main.async { [weak self] in
|
DispatchQueue.main.async { [weak self] in
|
||||||
self?.showError("No camera available")
|
self?.showError("No camera available")
|
||||||
}
|
}
|
||||||
@ -125,6 +134,12 @@ class QRScannerWindowController: NSObject, AVCaptureMetadataOutputObjectsDelegat
|
|||||||
// 检查摄像头是否支持 QR 码识别
|
// 检查摄像头是否支持 QR 码识别
|
||||||
if output.availableMetadataObjectTypes.contains(.qr) {
|
if output.availableMetadataObjectTypes.contains(.qr) {
|
||||||
output.metadataObjectTypes = [.qr]
|
output.metadataObjectTypes = [.qr]
|
||||||
|
output.rectOfInterest = CGRect(x: 0.1, y: 0.1, width: 0.8, height: 0.8)
|
||||||
|
} else {
|
||||||
|
// fallback: 支持什么就用什么
|
||||||
|
let types = output.availableMetadataObjectTypes.filter { $0 == .qr || $0 == .ean13 || $0 == .ean8 || $0 == .code128 }
|
||||||
|
if !types.isEmpty {
|
||||||
|
output.metadataObjectTypes = types
|
||||||
} else {
|
} else {
|
||||||
DispatchQueue.main.async { [weak self] in
|
DispatchQueue.main.async { [weak self] in
|
||||||
self?.showError("Camera does not support QR code scanning")
|
self?.showError("Camera does not support QR code scanning")
|
||||||
@ -132,6 +147,7 @@ class QRScannerWindowController: NSObject, AVCaptureMetadataOutputObjectsDelegat
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
let previewLayer = AVCaptureVideoPreviewLayer(session: session)
|
let previewLayer = AVCaptureVideoPreviewLayer(session: session)
|
||||||
previewLayer.videoGravity = .resizeAspectFill
|
previewLayer.videoGravity = .resizeAspectFill
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user