加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

swift – 无法将Nil分配给AVCaptureDeviceInput类型

发布时间:2020-12-14 04:49:11 所属栏目:百科 来源:网络整理
导读:我试过注释掉deviceInput = nil这个行只是为了测试但是有其他错误.此代码存在于其他在线示例中,因此我不确定这里发生了什么. private func captureSetup (position : AVCaptureDevicePosition) { var captureError : NSError? var captureDevice : AVCapture
我试过注释掉deviceInput = nil这个行只是为了测试但是有其他错误.此代码存在于其他在线示例中,因此我不确定这里发生了什么.

private func captureSetup (position : AVCaptureDevicePosition) {
    var captureError : NSError?
    var captureDevice : AVCaptureDevice!

    for testedDevice in AVCaptureDevice.devicesWithMediaType(AVMediaTypeVideo){
        if (testedDevice.position == position) {
            captureDevice = testedDevice as! AVCaptureDevice
        }
    }

    if (captureDevice == nil) {
        captureDevice = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo)
    }

    var deviceInput : AVCaptureDeviceInput
    do {
        deviceInput = try AVCaptureDeviceInput(device: captureDevice)
    } catch let error as NSError {
        captureError = error
        deviceInput = nil  // Nil cannot be assigned to type AVCaptureDeviceInput
        if captureError != nil { // new if
            print("error: (captureError?.localizedDescription)")
        }
    }
    captureSession.sessionPreset = AVCaptureSessionPresetHigh

    if (captureError == nil) {
        if (captureSession.canAddInput(deviceInput)) {
            captureSession.addInput(deviceInput)
        }

        self.videoDataOutput = AVCaptureVideoDataOutput()
        self.videoDataOutput!.videoSettings = [kCVPixelBufferPixelFormatTypeKey: Int(kCVPixelFormatType_32BGRA)]
        self.videoDataOutput!.alwaysDiscardsLateVideoFrames = true
        self.videoDataOutputQueue = dispatch_queue_create("VideoDataOutputQueue",DISPATCH_QUEUE_SERIAL)
        self.videoDataOutput!.setSampleBufferDelegate(self,queue: self.videoDataOutputQueue!)

        if (captureSession.canAddOutput(self.videoDataOutput)) {
            captureSession.addOutput(self.videoDataOutput)
        }
    }

    visageCameraView.frame = UIScreen.mainScreen().bounds

    let previewLayer: AVCaptureVideoPreviewLayer = AVCaptureVideoPreviewLayer(session: captureSession) as AVCaptureVideoPreviewLayer // changed to let
    previewLayer.frame = UIScreen.mainScreen().bounds
    previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill
    visageCameraView.layer.addSublayer(previewLayer)
}

解决方法

这对我来说很有意义.如果你想把它设置为零.使用选项.这样你就可以把它设置为零.这是一个很好的机制来避免崩溃和大量的if语句进行空检查.我推荐的(即使是测试)是使用选项.这就是你的样子:

var deviceInput : AVCaptureDeviceInput?

现在,deviceInput不必保存任何有效值.所以你可以写下面的内容(虽然默认为nil)

deviceInput = nil

现在,假设您想在其他地方使用它.你可以使用如果像这样:

if let myNonNilValue = deviceInput {
    // myNonNilValue is for sure not nil
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读