Захват изображений из AVCaptureSession - PullRequest
2 голосов
/ 25 ноября 2011

Я узнаю о AVCaptureSession и о том, как захватить несколько изображений с помощью метода делегата

- (void)captureOutput:(AVCaptureOutput *)captureOutput 
     didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer 
     fromConnection:(AVCaptureConnection *)connection

Моя цель - сделать 1 или несколько снимков с предварительно определенной скоростью в секунду. Например, 1 или 2 изображения в 1 секунду. Поэтому я установил

 AVCaptureVideoDataOutput *captureOutput = [[AVCaptureVideoDataOutput alloc] init];
 captureOutput.alwaysDiscardsLateVideoFrames = YES; 
 captureOutput.minFrameDuration = CMTimeMake(1, 1);

Когда запускается [self.captureSession startRunning];, мой файл журнала показывает, что делегат вызывается 20 раз в секунду. Откуда оно и как захватывать изображения с заданными интервалами?

Ответы [ 2 ]

10 голосов
/ 25 ноября 2011

Вы можете использовать функцию, указанную ниже, и если вы хотите снимать через определенные промежутки времени, тогда установите таймер и снова вызовите эту функцию.

-(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];

    }];
}

Для получения дополнительной информации вы можете посмотреть iOS4: делать фотографии с предварительным просмотром живого видео с помощью AVFoundation .

0 голосов
/ 09 января 2013

Что-то, с чем я некоторое время боролся, это огромная задержка (~ 5 секунд) при съемке изображения и попытке установить UIImage с захваченным изображением.в методе

 - (void)captureOutput:(AVCaptureOutput *)captureOutput 
 didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer 
 fromConnection:(AVCaptureConnection *)connection

вы не можете использовать обычные функции, такие как [self.image setImage:img] для вещей, которые связаны с пользовательским интерфейсом, вы должны запускать их в основном потоке следующим образом:

 [self.image performSelectorOnMainThread:@selector(setImage:) withObject:img waitUntilDone:TRUE];

Надеюсь, это кому-нибудь поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...