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