2016-01-11 1 views
3

J'essaie de créer une application qui va capturer des images de la caméra et les traiter avec OpenCV avant d'enregistrer ces fichiers sur l'appareil, mais à une fréquence d'images spécifique. Ce que je suis bloqué en ce moment est le fait que AVCaptureVideoDataOutputSampleBufferDelegate ne semble pas respecter le AVCaptureDevice.activeVideoMinFrameDuration, ou AVCaptureDevice.activeVideoMaxFrameDuration paramètres.iOS Swift - AVCaptureSession - Capture d'images en respectant la fréquence d'images

captureOutput fonctionne beaucoup plus rapidement que 2 images par seconde, comme l'indiquent les paramètres ci-dessus.

Savez-vous comment y parvenir, avec ou sans le délégué?

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) 
} 

Répondre

9

J'ai compris le problème.

Dans la section des commentaires pour AVCaptureDevice.h au-dessus du activeVideoMinFrameDuration propriété, il déclare:

Sur iOS, les réinitialisations activeVideoMinFrameDuration du récepteur à sa valeur par défaut dans les conditions suivantes:

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

Le dernier point de balle a causé mon problème, faisant ce qui suit a résolu le problème pour moi:

 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

La partie KEY ici est le commentaire sur quand la valeur RESETS! Moi aussi je commençais à être un peu car je réglais la fréquence d'images AVANT d'ajouter l'appareil à une session! – ericWasTaken