【发布时间】:2015-12-02 03:07:34
【问题描述】:
我正在使用该代码拍照我无法尽快拍照。 快速拍摄多张照片应用会崩溃。
我使用的是 Swift 1.1。
错误:
由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“+[AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:] - NULL 样本缓冲区。'
class ViewController: UIViewController {
let captureSession = AVCaptureSession()
var previewLayer : AVCaptureVideoPreviewLayer?
var captureDevice : AVCaptureDevice?
var captureConnection: AVCaptureConnection?
var stillImageOutput = AVCaptureStillImageOutput()
let targetRegion = CALayer()
var currentImage: UIImage?
@IBOutlet weak var cameraView: UIImageView!
@IBOutlet weak var imageDisplayed: UIImageView!
override func viewDidLoad() {
super.viewDidLoad()
navigationController?.setNavigationBarHidden(true, animated: true)
captureSession.sessionPreset = AVCaptureSessionPreset1920x1080
let devices = AVCaptureDevice.devices()
for device in devices {
if device.hasMediaType(AVMediaTypeVideo) {
if device.position == AVCaptureDevicePosition.Back {
captureDevice = device as? AVCaptureDevice
}
}
}
if captureDevice != nil {
println("Device trovato")
beginSession()
}
}
func beginSession() {
var err: NSError? = nil
captureSession.addInput(AVCaptureDeviceInput(device: captureDevice, error: &err))
if err != nil {
println("err \(err?.localizedDescription)")
return
}
previewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
self.view.layer.addSublayer(previewLayer)
previewLayer?.frame = CGRect(x: cameraView.frame.origin.x, y: cameraView.frame.origin.y, width: cameraView.frame.size.width, height: cameraView.frame.size.height)
captureSetup()
captureSession.startRunning()
}
func captureSetup() {
let outputSetting = NSDictionary(dictionary: [AVVideoCodecKey: AVVideoCodecJPEG])
self.stillImageOutput.outputSettings = outputSetting
self.captureSession.addOutput(stillImageOutput)
for connection:AVCaptureConnection in self.stillImageOutput.connections as [AVCaptureConnection] {
for port:AVCaptureInputPort in connection.inputPorts! as [AVCaptureInputPort] {
if port.mediaType == AVMediaTypeVideo {
captureConnection = connection as AVCaptureConnection
break
}
}
if captureConnection != nil {
break
}
}
}
var i = 0;
func captureScene() {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), {
if self.captureConnection != nil {
self.stillImageOutput.captureStillImageAsynchronouslyFromConnection(self.captureConnection, completionHandler:{ (imageSampleBuffer:CMSampleBuffer!, _) -> Void in
let imageDataJpeg = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(imageSampleBuffer)
var pickedImage: UIImage = UIImage(data:imageDataJpeg)!
if let data = UIImagePNGRepresentation(pickedImage) {
let filename = self.getDocumentsDirectory().stringByAppendingPathComponent("\(self.i).png")
data.writeToFile(filename, atomically: true)
self.i++
}
})
}
})
}
func getDocumentsDirectory() -> NSString {
let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)
let documentsDirectory: AnyObject = paths[0]
return documentsDirectory as NSString
}
override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
captureScene()
}
}
【问题讨论】:
-
你能解释一下同一个问题的答案吗?谢谢
-
非常简单:检查
imageSampleBuffer是否不为零,因为有时如果你快速拍几张照片就会出现这种情况。 // 我看到您对captureStillImageAsynchronouslyFromConnection的签名有一个非可选imageSampleBuffer。我相信这是一个 Swift 1 的问题,在 Swift 2 中它是一个可选的,你可以检查它是否为零。使用 Swift 1,你应该寻找这个函数是否有可用的错误参数并使用它。 -
请重新写成答案,以便我投票