2015-08-24 6 views
5

Моего метода didOutputSampleBuffer называются успешно, пока я не переключить камеры с помощью этой функции:кадров камеры упали после изменения камеры IOS

func switchCameras() { 

    captureSession.beginConfiguration() 
    captureSession.sessionPreset = AVCaptureSessionPresetMedium 
    var error : NSError? = nil 
    for input in captureSession.inputs { 
     captureSession.removeInput(input as! AVCaptureInput) 
    } 
    if currentCamera == "back" { 
     currentCamera = "front" 

     if captureSession.canAddInput(AVCaptureDeviceInput(device: frontCamera, error: &error)) { 
      captureSession.addInput(AVCaptureDeviceInput(device: frontCamera, error: &error)) 
     } else { 
      print(error) 
     } 
    } else { 
     currentCamera = "back" 
     if captureSession.canAddInput(AVCaptureDeviceInput(device: backCamera, error: &error)) { 
      captureSession.addInput(AVCaptureDeviceInput(device: backCamera, error: &error)) 
     } else { 
     } 
    } 
    print("chagned") 
    captureSession.commitConfiguration() 
} 

После переключения, кадры иногда заглядывали этот метод, поэтому я не могу сфотографировать , Примерно через 5 секунд кадры возвращаются.

func captureOutput(captureOutput: AVCaptureOutput!, didOutputSampleBuffer sampleBuffer: CMSampleBuffer!, fromConnection connection: AVCaptureConnection!) { 
    connection.videoOrientation = AVCaptureVideoOrientation.Portrait 

    if capture == true { 
     self.capture = false 
     var newBuffer = sampleBuffer 
      self.capturePicture(newBuffer) 


    } 
} 

ЕСЛИ вам нужно больше кода, дайте мне знать.

ответ

1

Я решил это, изменив выходную очередь на DISPATCH_QUEUE_SERIAL.

let output = AVCaptureVideoDataOutput() 
output.videoSettings = [kCVPixelBufferPixelFormatTypeKey as NSString:kCVPixelFormatType_32BGRA] 
let queue = dispatch_queue_create("cameraQueue", DISPATCH_QUEUE_SERIAL) 
output.setSampleBufferDelegate(self, queue: dispatch_get_main_queue()) 
+0

Вы фактически делегируете делегат образца буфера dispatch_get_main_queue() выше. вы не используете созданную вами очередь. Как это было исправлено? – Gizmodo