2016-01-11 4 views
3

Я пытаюсь создать приложение, которое будет захватывать кадры из камеры и обрабатывать их с помощью OpenCV, прежде чем сохранять эти файлы на устройство, но с определенной частотой кадров.iOS Swift - AVCaptureSession - Захват кадров с учетом частоты кадров

В настоящее время я застрял в том, что AVCaptureVideoDataOutputSampleBufferDelegate, похоже, не соответствует настройкам AVCaptureDevice.activeVideoMinFrameDuration, или AVCaptureDevice.activeVideoMaxFrameDuration.

captureOutput работает намного быстрее, чем 2 кадра в секунду, как указано выше.

Вы случайно не знаете, как можно достичь этого, с делегатом или без него?

ViewController:

override func viewDidLoad() { 
    super.viewDidLoad() 

} 

override func viewDidAppear(animated: Bool) { 
    setupCaptureSession() 
} 

func setupCaptureSession() { 

    let session : AVCaptureSession = AVCaptureSession() 
    session.sessionPreset = AVCaptureSessionPreset1280x720 

    let videoDevices : [AVCaptureDevice] = AVCaptureDevice.devices() as! [AVCaptureDevice] 

    for device in videoDevices { 
     if device.position == AVCaptureDevicePosition.Back { 
      let captureDevice : AVCaptureDevice = device 

      do { 
       try captureDevice.lockForConfiguration() 
       captureDevice.activeVideoMinFrameDuration = CMTimeMake(1, 2) 
       captureDevice.activeVideoMaxFrameDuration = CMTimeMake(1, 2) 
       captureDevice.unlockForConfiguration() 

       let input : AVCaptureDeviceInput = try AVCaptureDeviceInput(device: captureDevice) 

       if session.canAddInput(input) { 
        try session.addInput(input) 
       } 

       let output : AVCaptureVideoDataOutput = AVCaptureVideoDataOutput() 

       let dispatch_queue : dispatch_queue_t = dispatch_queue_create("streamoutput", nil) 
       output.setSampleBufferDelegate(self, queue: dispatch_queue) 

       session.addOutput(output) 

       session.startRunning() 

       let previewLayer = AVCaptureVideoPreviewLayer(session: session) 
       previewLayer.connection.videoOrientation = .LandscapeRight 

       let previewBounds : CGRect = CGRectMake(0,0,self.view.frame.width/2,self.view.frame.height+20) 
       previewLayer.backgroundColor = UIColor.blackColor().CGColor 
       previewLayer.frame = previewBounds 
       previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill 
       self.imageView.layer.addSublayer(previewLayer) 

       self.previewMat.frame = CGRectMake(previewBounds.width, 0, previewBounds.width, previewBounds.height) 

      } catch _ { 

      } 
      break 
     } 
    } 

} 

func captureOutput(captureOutput: AVCaptureOutput!, didOutputSampleBuffer sampleBuffer: CMSampleBuffer!, fromConnection connection: AVCaptureConnection!) { 
    self.wrapper.processBuffer(self.getUiImageFromBuffer(sampleBuffer), self.previewMat) 
} 

ответ

9

Так я понял, проблема.

В разделе комментариев для AVCaptureDevice.h выше activeVideoMinFrameDuration собственности говорится:

КСН, на ресивере activeVideoMinFrameDuration сброшена, его значение по умолчанию при следующих условиях:

- The receiver's activeFormat changes 
- The receiver's AVCaptureDeviceInput's session's sessionPreset changes 
- The receiver's AVCaptureDeviceInput is added to a session 

последняя проблема была причиной моей проблемы, поэтому следующее решение проблемы для меня:

 do { 

      let input : AVCaptureDeviceInput = try AVCaptureDeviceInput(device: captureDevice) 

      if session.canAddInput(input) { 
       try session.addInput(input) 
      } 

      try captureDevice.lockForConfiguration() 
      captureDevice.activeVideoMinFrameDuration = CMTimeMake(1, 2) 
      captureDevice.activeVideoMaxFrameDuration = CMTimeMake(1, 2) 
      captureDevice.unlockForConfiguration() 

      let output : AVCaptureVideoDataOutput = AVCaptureVideoDataOutput() 

      let dispatch_queue : dispatch_queue_t = dispatch_queue_create("streamoutput", nil) 
      output.setSampleBufferDelegate(self, queue: dispatch_queue) 

      session.addOutput(output) 
+1

КЛЮЧЕВАЯ часть здесь - комментарий о том, когда значение RESETS! Я тоже получал немного, потому что я устанавливал частоту кадров ПЕРЕД добавлением устройства в сеанс! – ericWasTaken

 Смежные вопросы

  • Нет связанных вопросов^_^