【问题标题】:How to initiate iPhone camera properly如何正确启动 iPhone 摄像头
【发布时间】:2019-10-11 08:36:49
【问题描述】:

我正在尝试构建一个简单的应用程序,它可以扫描条形码并拥有这段代码

var captureSession: AVCaptureSession?
var videoPreviewLayer: AVCaptureVideoPreviewLayer?
var codeView: UIView?

override func viewDidLoad() {
    super.viewDidLoad()

    let discoverySession = AVCaptureDevice.DiscoverySession(deviceTypes: [.builtInDualCamera], mediaType: AVMediaType.video, position: .back)
    guard let captureDevice = discoverySession.devices.first else {
        print("Camre initialization faild.")
        return
    }
    do {
        let input = try AVCaptureDeviceInput(device: captureDevice)
        captureSession?.addInput(input)

        let captureMetadataOutput = AVCaptureMetadataOutput()
        captureSession?.addOutput(captureMetadataOutput)
        captureMetadataOutput.setMetadataObjectsDelegate(self, queue: DispatchQueue.main)
        captureMetadataOutput.metadataObjectTypes = [AVMetadataObject.ObjectType.qr]

        videoPreviewLayer = AVCaptureVideoPreviewLayer(session: captureSession!)
        videoPreviewLayer?.videoGravity = AVLayerVideoGravity.resizeAspectFill
        videoPreviewLayer?.frame = view.layer.bounds
        view.layer.addSublayer(videoPreviewLayer!)
        captureSession?.startRunning()

    } catch let error as NSError {
        print("Error \(error.localizedDescription)")
    }

}

我在装有 iOS 12.3.1 的物理设备 Xs Max 上运行应用程序,结果意外崩溃了

 captureMetadataOutput.metadataObjectTypes = [AVMetadataObject.ObjectType.qr]

出现错误“libc++abi.dylib:以 NSException 类型的未捕获异常终止”

【问题讨论】:

    标签: ios swift camera


    【解决方案1】:
    import AVFoundation   
    
    
    var captureSession: AVCaptureSession!
    var videoPreviewLayer: AVCaptureVideoPreviewLayer!
    
    override func viewDidLoad() {
        super.viewDidLoad()
    
        captureSession = AVCaptureSession()
        guard let captureDevice = AVCaptureDevice.default(for: .video) else {return}
    
        let videoInput: AVCaptureDeviceInput
    
        do {
            videoInput = try AVCaptureDeviceInput(device: captureDevice)
        } catch {
            // handle error
            return
        }
    
        if (captureSession.canAddInput(videoInput)) {
            captureSession.addInput(videoInput)
        } else {
            // handle error
            return
        }
    
        let metadataOutput = AVCaptureMetadataOutput()
    
        if (captureSession.canAddOutput(metadataOutput)) {
            captureSession.addOutput(metadataOutput)
    
            metadataOutput.setMetadataObjectsDelegate(self, queue: DispatchQueue.main)
            metadataOutput.metadataObjectTypes = [.qr]
        } else {
            // handle error
            return
        }
    
        videoPreviewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
        videoPreviewLayer.frame = view.layer.bounds
        videoPreviewLayer.videoGravity = .resizeAspectFill
        view.layer.addSublayer(videoPreviewLayer)
    
        captureSession.startRunning()
    }
    

    这段代码应该对你有帮助,还记得添加 AVCaptureMetadataOutputObjectsDelegate

    【讨论】:

    • 请不要发布仅代码的答案。正确的答案解释了问题所在,并解释了答案如何解决问题。请edit您的回答并提供一些有用的细节。
    猜你喜欢
    • 1970-01-01
    • 2011-04-25
    • 1970-01-01
    • 2019-07-19
    • 2012-06-19
    • 1970-01-01
    • 1970-01-01
    • 2022-11-20
    • 2012-03-29
    相关资源
    最近更新 更多