使用AVFoundation从前置摄像头捕获照片时出现致命错误

5

我试图编写代码,使其能够从前置摄像头捕获图像并进行分享。然而,每次我尝试“拍照”时,我的应用程序都会崩溃,并出现以下控制台警告:

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '*** -[AVCaptureStillImageOutput captureStillImageAsynchronouslyFromConnection:completionHandler:] - inconsistent state.'
*** First throw call stack:
(0x181b1ee38 0x181183f80 0x188265074 0x10003d578 0x10003d748 0x10003c380 0x10003c3d8 0x186ca0ad0 0x186ca0a4c 0x186c88740 0x186ca033c 0x186c58b0c 0x186c994f8 0x186c98af4 0x186c68f4c 0x186c67528 0x181ad5124 0x181ad4bb8 0x181ad28b8 0x1819fcd10 0x1832e4088 0x186cd1f70 0x100036880 0x18159a8b8)
libc++abi.dylib: terminating with uncaught exception of type NSException

我在下面发布我的代码:
import UIKit
import AVFoundation

class CameraSnapViewController: UIViewController {

    let captureSession = AVCaptureSession()
    let stillImageOutput = AVCaptureStillImageOutput()

    let cameraPicker = UIImagePickerController()

    override func viewDidLoad() {
        super.viewDidLoad()

        self.addPhotoCapturingFunctionality()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

    @IBAction func cameraButtonPressed(sender: UIButton) {
        self.takePhoto()
    }

}

extension CameraSnapViewController {
    func addPhotoCapturingFunctionality() {
        guard let device = AVCaptureDevice.devices().filter({ $0.hasMediaType(AVMediaTypeVideo) && $0.position == .Front }).first as? AVCaptureDevice else { fatalError("No front facing camera found") }

        do {
            let input = try AVCaptureDeviceInput(device: device)
            captureSession.addInput(input)
            captureSession.sessionPreset = AVCaptureSessionPresetPhoto
            stillImageOutput.outputSettings = [AVVideoCodecKey:AVVideoCodecJPEG]
            if captureSession.canAddOutput(stillImageOutput) {
                captureSession.addOutput(stillImageOutput)
            }
        } catch let error as NSError {
            print(error)
        }

    }

    func takePhoto() {
        if let videoConnection = stillImageOutput.connectionWithMediaType(AVMediaTypeVideo) {

            stillImageOutput.captureStillImageAsynchronouslyFromConnection(videoConnection) { (imageDataSampleBuffer, error) -> Void in
                let imageData = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(imageDataSampleBuffer)
                // TODO: Sharing
            }

        }
    }
}

我该如何解决这个问题?
1个回答

3

在拍照之前,您必须启动会话。

captureSession.startRunning()


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接