转载自:http://stackoverflow.com/questions/8264749/capturing-images-from-avcapturesession
I am learning about AVCaptureSession and how to capture multiple images with its delegate method
- ( void ) captureOutput :( AVCaptureOutput *) captureOutput
didOutputSampleBuffer :( CMSampleBufferRef ) sampleBuffer
fromConnection :( AVCaptureConnection *) connection
My goal is to capture 1 or many images with a predefined rate per second. For example, 1 or 2 images per 1 second. So I set
AVCaptureVideoDataOutput * captureOutput = [[ AVCaptureVideoDataOutput alloc ] init ];
captureOutput . alwaysDiscardsLateVideoFrames = YES ;
captureOutput . minFrameDuration = CMTimeMake ( 1 , 1 );
When [self.captureSession startRunning];
is started my log file shows delegate is being called 20 times a second. Where is it coming from and how to capture images with my intended intervals?
You can use the function given below and if you want to capture at specific intervals, then set a timer and call that function again.
-( IBAction ) captureNow
{
AVCaptureConnection * videoConnection = nil ;
for ( AVCaptureConnection * connection in stillImageOutput . connections )
{
for ( AVCaptureInputPort * port in [ connection inputPorts ])
{
if ([[ port mediaType ] isEqual : AVMediaTypeVideo ] )
{
videoConnection = connection ;
break ;
}
}
if ( videoConnection ) { break ; }
}
NSLog (@ "about to request a capture from: %@" , stillImageOutput );
[ stillImageOutput captureStillImageAsynchronouslyFromConnection : videoConnection
completionHandler : ^( CMSampleBufferRef imageSampleBuffer , NSError * error )
{
CFDictionaryRef exifAttachments = CMGetAttachment ( imageSampleBuffer , kCGImagePropertyExifDictionary , NULL );
if ( exifAttachments )
{
// Do something with the attachments.
NSLog (@ "attachements: %@" , exifAttachments );
}
else
NSLog (@ "no attachments" );
NSData * imageData = [ AVCaptureStillImageOutput jpegStillImageNSDataRepresentation : imageSampleBuffer ];
UIImage * image = [[ UIImage alloc ] initWithData : imageData ];
self . vImage . image = image ;
}];
}
For more reference you can see iOS4: Take photos with live video preview using AVFoundation .
answered
Nov 25 '11 at 5:28
Something that I struggled with for a while was a massive delay (~5 sec) when taking a picture, and trying to set a UIImage with the captured image. in the
- ( void ) captureOutput :( AVCaptureOutput *) captureOutput
didOutputSampleBuffer :( CMSampleBufferRef ) sampleBuffer
fromConnection :( AVCaptureConnection *) connection
method, you cant use normal functions such as [self.image setImage:img]
for things that are linked to the UI, you have to run them on the main thread like so:
[ self . image performSelectorOnMainThread : @selector ( setImage :) withObject : img waitUntilDone : TRUE ];
Hope this helps someone