AVCaptureSession avec plusieurs sorties?

Je suis actuellement en train de développer une application iOS qui applique CoreImage au stream de la camera afin de prendre des photos et des videos, et j'ai rencontré quelques problèmes.

Jusqu'à présent, j'utilisais AVCaptureVideoDataOutput pour get les tampons d'échantillons et les manipuler avec CoreImage, puis j'ai affiché un aperçu simple, ainsi que l'utiliser pour capturer des photos et les sauvegarder.

Quand j'ai essayé d'implémenter l'logging video, en écrivant les SampleBuffers dans une video comme je les ai reçus de l' AVCaptureVideoDataOutput , il avait une cadence d'images très lente (probablement à cause de l'autre image processing qui se passait).

Donc je me demandais, est-il possible d'avoir un AVCaptureVideoDataOutput et un AVCaptureMoveFileOutput en même time sur AVCaptureSession?

Je l'ai fait rapidement et j'ai constaté que lorsque j'ai ajouté la sortie supplémentaire, mon AVCaptureVideoDataOutput a cessé de recevoir des informations.

Si je peux le faire fonctionner, j'espère que cela signifie que je peux simplement utiliser la 2ème sortie pour save de la video à des fréquences d'images élevées, et faire un post-traitement sur la video après que l'user a arrêté l'logging.

Toute aide est la bienvenue.

C'est plus facile que tu ne le penses.

Voir: AVCamDemo

  1. Capturez des données en utilisant AVCaptureVideoDataOutput.
  2. Créer une nouvelle queue avant l'logging, par ex. recordingQueue: recordingQueue = dispatch_queue_create("Movie Recording Queue", DISPATCH_QUEUE_SERIAL);
  3. Dans la méthode captureOutput: didOutputSampleBuffer: fromConnection: delegate, capturez le samplebuffer, conservez-le et, dans la queue d'logging, écrivez-le dans le file:

     -(void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection { CFRetain(sampleBuffer); dispatch_async(recordingQueue, ^{ if (assetWriter) { if (connection == videoConnection) { [self writeSampleBuffer:sampleBuffer ofType:AVMediaTypeVideo]; } else if (connection == audioConnection) { [self writeSampleBuffer:sampleBuffer ofType:AVMediaTypeAudio]; } } CFRelease(sampleBuffer); }); } - (void) writeSampleBuffer:(CMSampleBufferRef)sampleBuffer ofType:(NSSsortingng *)mediaType { CMTime presentationTime = CMSampleBufferGetPresentationTimeStamp(sampleBuffer); if ( assetWriter.status == AVAssetWriterStatusUnknown ) { if ([assetWriter startWriting]) { [assetWriter startSessionAtSourceTime:presentationTime]; } else { NSLog(@"Error writing initial buffer"); } } if ( assetWriter.status == AVAssetWriterStatusWriting ) { if (mediaType == AVMediaTypeVideo) { if (assetWriterVideoIn.readyForMoreMediaData) { if (![assetWriterVideoIn appendSampleBuffer:sampleBuffer]) { NSLog(@"Error writing video buffer"); } } } else if (mediaType == AVMediaTypeAudio) { if (assetWriterAudioIn.readyForMoreMediaData) { if (![assetWriterAudioIn appendSampleBuffer:sampleBuffer]) { NSLog(@"Error writing audio buffer"); } } } } }