ios - captureStillImageAsynchronouslyFromConnection 返回 nil 错误

标签 ios swift avcapturesession

我的自定义摄像头无法正常工作。有时它会拍照,有时它会无声地崩溃。我的应用程序由 3 个选项卡和一个选项卡栏 Controller 组成。当我从主页选项卡访问相机时,我可以正常拍照。当我从配置文件选项卡访问相机时,它不会拍照,并且会在 didPressTakePhoto 函数中的随机位置崩溃。我没有在选项卡之间传递数据,所以它不应该发生。

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)

    //Set current bottom border to photo
    borderPhoto.backgroundColor = newColor.CGColor
    borderPhoto.frame = CGRect(x: 0, y: 0 + libraryView.frame.size.height, width: libraryView.frame.size.width, height: 4)
    photoView.layer.addSublayer(borderPhoto)

    //self.tabBarController!.tabBar.hidden = true

    chosenMode = "Photo"
    libraryView.removeFromSuperview()
    photoButton.setBackgroundImage(buttonImage, forState: .Normal)

    if self.isRunning == false{
        captureSession = AVCaptureSession()
        captureSession!.sessionPreset = AVCaptureSessionPresetPhoto

        let backCamera = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo)

        var error: NSError?

        do {
            input = try AVCaptureDeviceInput(device: backCamera)
        } catch let error1 as NSError {
            error = error1
            input = nil
        }

        if error == nil && captureSession!.canAddInput(input) {
            captureSession!.addInput(input)

            stillImageOutput = AVCaptureStillImageOutput()
            stillImageOutput!.outputSettings = [AVVideoCodecKey: AVVideoCodecJPEG]
            if captureSession!.canAddOutput(stillImageOutput) {
                captureSession!.addOutput(stillImageOutput)

                previewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
                previewLayer!.videoGravity = AVLayerVideoGravityResizeAspectFill
                previewLayer!.connection?.videoOrientation = AVCaptureVideoOrientation.Portrait
                previewView.layer.addSublayer(previewLayer!)

                captureSession!.startRunning()
                self.isRunning = true



            }
        }

    }
    print("Done ViewWillApear")

}

@IBAction func didPressTakePhoto(sender: UIButton) {
    print("Beginning Method")

    self.previewLayer?.connection.enabled = false
    if let videoConnection = stillImageOutput!.connectionWithMediaType(AVMediaTypeVideo) {
        videoConnection.videoOrientation = AVCaptureVideoOrientation.Portrait
        stillImageOutput?.captureStillImageAsynchronouslyFromConnection(videoConnection, completionHandler: {(sampleBuffer, error) in
            //print(error)
            if (sampleBuffer != nil) {
                let imageData = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(sampleBuffer)
                let dataProvider = CGDataProviderCreateWithCFData(imageData)
                let cgImageRef = CGImageCreateWithJPEGDataProvider(dataProvider, nil, true, CGColorRenderingIntent.RenderingIntentDefault)
                var image = UIImage()

                if UIDevice.currentDevice().orientation == .Portrait{
                    image = UIImage(CGImage: cgImageRef!, scale: 1.0, orientation: UIImageOrientation.Right)
                }else if UIDevice.currentDevice().orientation == .LandscapeLeft{
                    image = UIImage(CGImage: cgImageRef!, scale: 1.0, orientation: UIImageOrientation.Up)
                }else if UIDevice.currentDevice().orientation == .LandscapeRight{
                    image = UIImage(CGImage: cgImageRef!, scale: 1.0, orientation: UIImageOrientation.Down)
                }

                //Crop the image to a square
                let imageSize: CGSize = image.size
                let width: CGFloat = imageSize.width
                let height: CGFloat = imageSize.height
                if width != height {
                    let newDimension: CGFloat = min(width, height)
                    let widthOffset: CGFloat = (width - newDimension) / 2
                    let heightOffset: CGFloat = (height - newDimension) / 2
                    UIGraphicsBeginImageContextWithOptions(CGSizeMake(newDimension, newDimension), false, 0.0)
                    image.drawAtPoint(CGPointMake(-widthOffset, -heightOffset), blendMode: .Copy, alpha: 1.0)
                    image = UIGraphicsGetImageFromCurrentImageContext()
                    let imageData: NSData = UIImageJPEGRepresentation(image, 0.25)!
                    UIGraphicsEndImageContext()
                    self.captImage = UIImage(data: imageData)!
                }

            }
            self.performSegueWithIdentifier("fromCustomCamera", sender: self)
        })

    }


}

最佳答案

已修复。我不得不压缩我的图像,因为它们对于内存来说太大了。感谢那些提供帮助的人。

关于ios - captureStillImageAsynchronouslyFromConnection 返回 nil 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35788004/

相关文章:

ios - 将委托(delegate)回调转换为 SignalProducer 事件?

iphone - 'NSInvalidArgumentException',原因 : 'Unable to parse the format string "title contains[cd] @ %"' Error

swift - 无法在 Swift 3 中创建范围

ios - AVCaptureDevice 的 isLowLightBoostSupported 在 5S iOS 7.1 上始终返回 false(用于自动启用 LowLightBoost WhenAvailable)

avfoundation - 如何从具有正确方向的 AVCapturePhoto 生成 UIImage?

ios - “AppDelegate”仅适用于 iOS 10.0 或更新版本

ios - 如何检查是否启用了按钮形状?

ios - swift 错误 : Could not cast value of type 'NSTaggedPointerString' (0x1a1264378) to 'NSNumber' (0x1a126f900)

ios - 无权从照片库中挑选照片

iphone - 如何初始化 AVCaptureMetadataOutput 对象?