2011-08-05 6 views
2

이제 아래와 같이 avfoundation을 사용하여 이미지를 캡처 할 수 있습니다. 그러나 이미지 (예 : 20 개 또는 30 개의 이미지)를 연속적으로 캡처하려면 어떻게해야합니까? 당신이 설명하는 시나리오가 가장 쉽게 타이머의 일종을 사용하여 해결 될 것iPhone에서 AVFoudation을 사용한 연속 캡처 이미지

:

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

    // use the image 

}]; 
+0

(D) SLR의 "버스트 (burst)"모드와 같은 것을 의미합니까? – danyowdee

+0

아니요, danyowdee. 나는 단지 하나의 이미지를 찍고, 나중에 또 다른 1 초를 찍고 싶다. –

답변

2

으악, 나는 당신의 의견에 후속 조치를 잊어 버렸습니다.
는 당신이 필요로하는 정확도의 수준을에 따라 찾기 위해 다른 후보가있다 :

  1. 반복되는 NSTimer은 매우 간단하고 사용하기 직선적이다. 이 클래스는 runloops와 함께 작동하므로주의해야 할 몇 가지 함정이 있습니다. 하나는 정밀도가 제한된다는 것입니다 (그러나 겉으로는 성취하고자하는 것이지만 전혀 문제가되지 않아야 함).
  2. 장기적으로 정확성이 더 필요하면 NSTimer를 계속 사용할 수 있습니다. initWithFireDate:…repeats:NO과 함께 사용하고 이전 타이머의 예상 fireDate에 상대적인 날짜를 사용하여 새 타이머를 만듭니다. 하나는 발화.
  3. 의 경우 실제로에 높은 정확도가 필요한 경우 파견 타이머를 조사해야합니다. 그것들은 GCD의 일부이며 꽤 낮은 수준의 기술입니다. 정확성을 위해이 경로를 따르기로 결정한 경우 dispatch_source_create에 대한 호출에서 사용자 고유의 디스패치 대기열을 사용해야합니다.

어떤 경우에도 그림을 스냅하는 코드가 해당 처리기로 전달됩니다.

+0

고마워! 나는 NSTimer를 사용하여 이미지를 캡처합니다. 그러나 너무 빨리 캡처 할 수는 없습니다.이 "imageSampleBuffer in NULL"과 같은 오류가 발생했습니다 ... –

+0

이상하게 들립니다. 더 자세한 정보를 제공 할 수 있습니까? 'imageSampleBuffer'가'NULL' 일 때 완성 처리기로 전달 된 정확한 오류는 무엇입니까? 그리고 : 당신이 프로그램에 부착 된 디버거없이 장치에서 실행될 때 여전히 발생합니까? – danyowdee

+0

나는 비슷한 문제가있다. 서로 5 초 이내에도 여러 개의 captureStillImageAsynchronouslyFromConnection 호출을 시작하면 모든 이미지가 캡처 될 때까지 이전 호출이 완료되지 않지만 후속 호출은 실패합니다 (첫 번째 버퍼가 덮어 쓰기 될 수 있음). 이 문제를 해결하기위한 몇 가지 작업 코드를 확인하는 데 매우 흥미가 있습니다. – Meekohi