首页 > 解决方案 > 在展开可选值时意外发现 nil。avcapturedevice输入

问题描述

class ViewController: UIViewController {

    @IBOutlet weak var cameraView: UIView!

    var captureSession: AVCaptureSession?
    var videoPreviewLayer: AVCaptureVideoPreviewLayer?
    var frontCamera = AVCaptureDevice.default(.builtInWideAngleCamera, for :.video, position: .front)
    var backCamera = AVCaptureDevice.default(.builtInWideAngleCamera, for: .video, position: .back)


    override func viewDidLoad() {
        super.viewDidLoad()

        if #available(iOS 10.2, *){

            let captureDevice = AVCaptureDevice.default(.builtInWideAngleCamera, for: .video, position: .back)
            do{
                let input = try AVCaptureDeviceInput(device: captureDevice!)
                captureSession = AVCaptureSession()
                captureSession?.addInput(input)
                videoPreviewLayer = AVCaptureVideoPreviewLayer(session: captureSession!)
                videoPreviewLayer?.frame = view.layer.bounds
                cameraView.layer.addSublayer(videoPreviewLayer!)
                captureSession?.startRunning()
            }
            catch {
                print("error")
            }
        }
        // Do any additional setup after loading the view.
    }

    @IBAction func ImageCapture(_ sender: Any) {

    }

我正在用 swift 代码编写一个简单的相机应用程序。我尝试了 2 种不同的方式,但都遇到了相同的错误。

线程 1:致命错误:在展开可选值时意外发现 nil。

这里

let input = try AVCaptureDeviceInput(device: captureDevice!)

我该如何解决?

标签: iosswiftxcode11

解决方案


你是在模拟器上运行的吗?因为它不会工作。它将在真实设备中工作。还可以使用 if let 语句安全地打开您的 captureDevice。这不会使应用程序崩溃。

if #available(iOS 10.2, *){

    if let captureDevice = AVCaptureDevice.default(.builtInWideAngleCamera, for: .video, position: .back) {
        do{
            let input = try AVCaptureDeviceInput(device: captureDevice)
            captureSession = AVCaptureSession()
            captureSession?.addInput(input)
            videoPreviewLayer = AVCaptureVideoPreviewLayer(session: captureSession!)
            videoPreviewLayer?.frame = view.layer.bounds
            cameraView.layer.addSublayer(videoPreviewLayer!)
            captureSession?.startRunning()
        }
        catch {
            print("error")
        }
    } else {
        print("camera not available")
    }
}

推荐阅读