Search code examples
iphoneobjective-cuiimageviewcalayeravcapturesession

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?


Solution

  • 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(@"Attachments: %@", exifAttachments);
            }
            else
            { 
                NSLog(@"No attachments found.");
            }
    
            NSData *imageData = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageSampleBuffer];
            UIImage *image = [[UIImage alloc] initWithData:imageData];
            [[self vImage] setImage:image];
    
        }];
    }
    

    For more reference you can see iOS4: Take photos with live video preview using AVFoundation.