AVCaptureDeviceInput初始化异常

时间:2017-08-16 06:40:04

标签: ios swift avfoundation

当我尝试创建AVCaptureDeviceInput类型的实例时,我收到以下错误 到目前为止我做了什么:
1)我获得了相机使用和麦克风的权限 2)我在iPhone 7和iPhone 5s上测试了代码 3)当它显示我打印的session.isRunning值的错误时,它返回true值 4)所有属性都保持强大。

Error Domain=AVFoundationErrorDomain Code=-11814 "Cannot Record" UserInfo={NSLocalizedDescription=Cannot Record, NSLocalizedRecoverySuggestion=Try recording again.

这是代码:

let session = AVCaptureSession()
self.session = session
session.sessionPreset = AVCaptureSessionPresetPhoto

do {
     let input = try AVCaptureDeviceInput(device: device)
     session.addInput(input)
     if session.canAddInput(input) {
         let stillImageOutput = AVCapturePhotoOutput()
         self.stillImageOutput = stillImageOutput
         let settings = AVCapturePhotoSettings()
         stillImageOutput.capturePhoto(with: settings, delegate: self)
         if session.canAddOutput(stillImageOutput) {
              session.addOutput(stillImageOutput)
              if let previewLayer = AVCaptureVideoPreviewLayer(session: session) {
                   self.previewLayer = previewLayer
                   previewLayer.videoGravity = AVLayerVideoGravityResizeAspect
                   previewLayer.connection!.videoOrientation = AVCaptureVideoOrientation.portrait
                   viewController.centerView.layer.insertSublayer(previewLayer, at: 0)
                   session.startRunning()
              }
          }
      }
} catch {
     print(error.localizedDescription)
}

1 个答案:

答案 0 :(得分:0)

我在您的代码中发现了几个问题,因此带有注释的更新版本如下所示:

let session = AVCaptureSession()
self.session = session
// `This method is used to start the flow of data from the inputs to the outputs connected to the AVCaptureSession instance that is the receiver.`
//session.startRunning() // Don't startRunning until everything is configured
session.sessionPreset = AVCaptureSessionPresetPhoto

do {
    let input = try AVCaptureDeviceInput(device: device)
//    session.addInput(input) // This one has to be after you check if you `canAddInput`
    if session.canAddInput(input) {
        session.addInput(input)
        let stillImageOutput = AVCapturePhotoOutput()
        self.stillImageOutput = stillImageOutput
        let settings = AVCapturePhotoSettings()
//        stillImageOutput.capturePhoto(with: settings, delegate: self) // This one might want to be called after you add it as an output to the `session`
        if session.canAddOutput(stillImageOutput) {
            session.addOutput(stillImageOutput)
            if let previewLayer = AVCaptureVideoPreviewLayer(session: session) {
                self.previewLayer = previewLayer
                previewLayer.videoGravity = AVLayerVideoGravityResizeAspect
                previewLayer.connection!.videoOrientation = AVCaptureVideoOrientation.portrait
                viewController.centerView.layer.insertSublayer(previewLayer, at: 0)
                session.startRunning()
            }
            stillImageOutput.capturePhoto(with: settings, delegate: self)
        }
    }
} catch {
    print(error.localizedDescription)
}