You should try adding a new stream when adding input and output to the session before starting it. Apple documentation states
Important. The startRunning method is a blocking call that can take some time, so you must configure the session in a sequential queue so that the main queue does not block (which distracts the user interface). See AVCam for iOS for an example of a canonical implementation.
Try using send in the session creation method like below
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), { // 1 self.captureSession.addOutput(self.stillImageOutput) self.captureSession.addInput(AVCaptureDeviceInput(device: self.captureDevice, error: &err)) self.captureSession.sessionPreset = AVCaptureSessionPresetPhoto if err != nil { println("error: \(err?.localizedDescription)") } var previewLayer = AVCaptureVideoPreviewLayer(session: self.captureSession) previewLayer?.frame = self.cameraView.layer.bounds previewLayer?.videoGravity = AVLayerVideoGravityResizeAspectFill dispatch_async(dispatch_get_main_queue(), { // 2 // 3 self.cameraView.layer.addSublayer(previewLayer) self.captureSession.startRunning() }); });
source share