2010-11-20 17 views
1

İşleme için ön kameradan görüntüler almak için AVCaptureSession'ı kullanmaya çalışıyorum. Şimdiye kadar yeni bir çerçevenin mevcut olduğu her seferde bir değişkene atadım ve yeni bir çerçeve varsa, saniyenin her birinin onda birini kontrol eden bir NSTimer çalıştırdı ve eğer işleniyorsa.AVCaptureSession'ı kullanarak yalnızca nasıl kamera çerçeveleri yakalarsınız?

Çerçeveyi almak, kamerayı dondurmak ve istediğim zaman bir sonraki kareyi almak istiyorum. [CaptureSession getNextFrame] gibi bir şey biliyor musunuz? Bu yakalama sürecidir böyle yürümüyor çünkü Aktif olarak geri çerçeveleri almak için kamerayı anket yok

- (void)startFeed { 

loopTimerIndex = 0; 

    NSArray *captureDevices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo]; 

    AVCaptureDeviceInput *captureInput = [AVCaptureDeviceInput 
              deviceInputWithDevice:[captureDevices objectAtIndex:1] 
              error:nil]; 

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

    dispatch_queue_t queue; 
    queue = dispatch_queue_create("cameraQueue", nil); 

    [captureOutput setSampleBufferDelegate:self queue:queue]; 
    dispatch_release(queue); 

    NSString *key = (NSString *)kCVPixelBufferPixelFormatTypeKey; 
    NSNumber *value = [NSNumber numberWithUnsignedInt:kCVPixelFormatType_32BGRA]; 
    NSDictionary *videoSettings = [NSDictionary dictionaryWithObject:value forKey:key]; 
    [captureOutput setVideoSettings:videoSettings]; 

    captureSession = [[AVCaptureSession alloc] init]; 
    captureSession.sessionPreset = AVCaptureSessionPresetLow; 
    [captureSession addInput:captureInput]; 
    [captureSession addOutput:captureOutput]; 

    imageView = [[UIImage alloc] init]; 

    [captureSession startRunning]; 

} 

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

loopTimerIndex++; 

    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

    CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer); 
    CVPixelBufferLockBaseAddress(imageBuffer, 0); 

    uint8_t *baseAddress = (uint8_t *)CVPixelBufferGetBaseAddress(imageBuffer); 
    size_t bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer); 
    size_t width = CVPixelBufferGetWidth(imageBuffer); 
    size_t height = CVPixelBufferGetHeight(imageBuffer); 

    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
    CGContextRef newContext = CGBitmapContextCreate(baseAddress, width, height, 8, bytesPerRow, colorSpace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst); 
    CGImageRef newImage = CGBitmapContextCreateImage(newContext); 

    CGContextRelease(newContext); 
    CGColorSpaceRelease(colorSpace); 

    imageView = [UIImage imageWithCGImage:newImage scale:1.0 orientation:UIImageOrientationLeftMirrored]; 
    [delegate updatePresentor:imageView]; 
    if(loopTimerIndex == 1) { 
     [delegate feedStarted]; 
    } 

    CGImageRelease(newImage); 
    CVPixelBufferUnlockBaseAddress(imageBuffer, 0); 

    [pool drain]; 

} 

cevap

3

: Burada

ben olabilir ne kadar yararlı emin değilim ancak benim kod parçası tasarlandı. Bunun yerine, her 1/30 veya daha hızlı yerine, saniyenin her birinden bir kare görüntülemek isterseniz, aradaki kareleri göz ardı etmelisiniz. Örneğin, -captureOutput:didOutputSampleBuffer:fromConnection:'un her seferinde karşılaştırılacağı bir zaman damgasını tutabilirsiniz. Zaman damgası şu andan itibaren 0.1 saniyeden daha büyük veya eşitse, kamera çerçevesini işleyin ve görüntüleyin ve zaman damgasını geçerli saate sıfırlayın. Aksi halde, çerçeveyi göz ardı edin.

İlgili konular