2010-12-13 46 views
2

J'utilise actuellement le code suivant pour tirer une série d'images:Existe-t-il un moyen d'améliorer le temps entre les prises de vue avec AVCaptureStillImageOutput?

- (void)shootSeries:(int)photos { 
    if(photos == 0) { 
     [self mergeImages]; 
    } else { 
     [output captureStillImageAsynchronouslyFromConnection:connection completionHandler: 
      ^(CMSampleBufferRef imageDataSampleBuffer, NSError *error) { 
       NSLog(@"Shot picture %d.", 7 - photos); 
       [self shootSeries:(photos - 1)]; 

       CVPixelBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(imageDataSampleBuffer); 

       CVPixelBufferLockBaseAddress(pixelBuffer, 0); 
       int dataSize = CVPixelBufferGetDataSize(pixelBuffer); 
       CFDataRef data = CFDataCreate(NULL, (const UInt8 *)CVPixelBufferGetBaseAddress(pixelBuffer), dataSize); 
       CVPixelBufferUnlockBaseAddress(pixelBuffer, 0); 

       CGDataProviderRef dataProvider = CGDataProviderCreateWithCFData(data); 
       CFRelease(data); 

       CGImageRef image = CGImageCreate(CVPixelBufferGetWidth(pixelBuffer), 
               CVPixelBufferGetHeight(pixelBuffer), 
               8, 32, 
               CVPixelBufferGetBytesPerRow(pixelBuffer), 
               colorspace, 
               kCGImageAlphaNoneSkipFirst | kCGBitmapByteOrder32Little, 
               dataProvider, NULL, true, kCGRenderingIntentDefault); 
       CFRelease(dataProvider); 

       CFArrayAppendValue(shotPictures, image); 
       CFRelease(image); 
      }]; 
    } 
} 

Bien que cela fonctionne plutôt bien, il est très lent. Comment des applications comme ClearCam peuvent-elles prendre des photos beaucoup plus rapidement en série que cela et comment puis-je le faire aussi?

+0

Avez-vous compris? Si oui, j'apprécierais que vous puissiez poster la réponse. J'ai essayé un tas de techniques telles que la création de plusieurs entrées et sorties et le cycle entre eux, ou l'ajout/suppression des entrées/sorties après chaque prise. Mon problème est que si l'utilisateur est autorisé à prendre des photos très rapidement, vous finissez avec NULL CMSampleBuffers et les erreurs "AVFoundation out of memory". Le résultat final est que certaines photos sont perdues, ce qui est évidemment pire que de les forcer à prendre des photos plus lentement. –

Répondre

0

Après avoir capturé l'image, stockez le tampon d'échantillon dans un CFArray, et une fois que vous avez terminé de prendre tous vos téléphones, puis les convertir en images (ou dans votre cas CGImageRefs).

+0

J'ai maintenant essayé de nombreuses heures pour enregistrer sur CFMutableArray et après avoir converti en UIImages, mais je ne peux tout simplement pas le faire fonctionner. Avez-vous un exemple de code pour cela? – Snilleblixten