Как правильно запустить камеру iPhone - PullRequest
0 голосов
/ 24 мая 2019

Я пытаюсь создать простое приложение, которое будет сканировать штрих-коды и имеющее этот кусок кода

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)")
    }

}

Я запускаю приложение на физическом устройстве Xs Max с iOS 12.3.1, и оно неожиданно падает на линии

 captureMetadataOutput.metadataObjectTypes = [AVMetadataObject.ObjectType.qr]

с ошибкой "libc ++ abi.dylib: завершается с необработанным исключением типа NSException"

1 Ответ

0 голосов
/ 24 мая 2019
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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...