captureOutput: didOutputSampleBuffer: fromConnection Проблемы с производительностью - PullRequest
2 голосов
/ 08 мая 2011

Я использую AVCaptureSessionPhoto, чтобы позволить пользователю делать фотографии с высоким разрешением.После фотографирования я использую метод captureOutput:didOutputSampleBuffer:fromConnection:, чтобы получить миниатюру во время захвата.Тем не менее, хотя я пытаюсь выполнить минимальную работу в методе делегата, приложение становится вялым (я говорю вроде как, потому что оно все еще пригодно для использования).Кроме того, iPhone имеет тенденцию нагреваться.

Есть ли способ уменьшить объем работы, которую должен выполнять iPhone?

Я настроил AVCaptureVideoDataOutput, выполнив следующие действия:

self.videoDataOutput = [[AVCaptureVideoDataOutput alloc] init]; 
self.videoDataOutput.alwaysDiscardsLateVideoFrames = YES;

// Specify the pixel format
dispatch_queue_t queue = dispatch_queue_create("com.myapp.videoDataOutput", NULL);
[self.videoDataOutput setSampleBufferDelegate:self queue:queue];
dispatch_release(queue);
self.videoDataOutput.videoSettings = [NSDictionary dictionaryWithObject: [NSNumber numberWithInt:kCVPixelFormatType_32BGRA] 
                                                   forKey:(id)kCVPixelBufferPixelFormatTypeKey];

Вотмой captureOutput:didOutputSampleBuffer:fromConnection (и вспомогательный imageRefFromSampleBuffer метод):

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

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
if (videoDataOutputConnection == nil) {
    videoDataOutputConnection = connection;
}
if (getThumbnail > 0) {
    getThumbnail--;
    CGImageRef tempThumbnail = [self imageRefFromSampleBuffer:sampleBuffer];
    UIImage *image;
    if (self.prevLayer.mirrored) {
        image = [[UIImage alloc] initWithCGImage:tempThumbnail scale:1.0 orientation:UIImageOrientationLeftMirrored];
    }
    else {
        image = [[UIImage alloc] initWithCGImage:tempThumbnail scale:1.0 orientation:UIImageOrientationRight];
    }
    [self.cameraThumbnailArray insertObject:image atIndex:0];
    dispatch_async(dispatch_get_main_queue(), ^{
        self.freezeCameraView.image = image;
    });
    CFRelease(tempThumbnail);
}
sampleBuffer = nil;
[pool release];

}

-(CGImageRef)imageRefFromSampleBuffer:(CMSampleBufferRef)sampleBuffer {

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 context = CGBitmapContextCreate(baseAddress, width, height, 8, bytesPerRow, colorSpace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst); 
CGImageRef newImage = CGBitmapContextCreateImage(context); 
CVPixelBufferUnlockBaseAddress(imageBuffer,0);
CGContextRelease(context); 
CGColorSpaceRelease(colorSpace);
return newImage;

}

Ответы [ 2 ]

1 голос
/ 30 мая 2013

minFrameDuration устарела, это может работать:

AVCaptureConnection *stillImageConnection = [stillImageOutput connectionWithMediaType:AVMediaTypeVideo];
stillImageConnection.videoMinFrameDuration = CMTimeMake(1, 10);
0 голосов
/ 27 ноября 2012

Чтобы улучшить, мы должны настроить наш AVCaptureVideoDataOutput на:

output.minFrameDuration = CMTimeMake(1, 10);

Мы указываем минимальную продолжительность для каждого кадра (поиграйтесь с этими настройками, чтобы избежать слишком большого количества кадров, ожидающих в очереди, поскольку это может вызвать проблемы с памятью). Это похоже на инверсию максимальной частоты кадров. В этом примере мы устанавливаем минимальную длительность кадра 1/10 секунды, поэтому максимальная частота кадров составляет 10 кадров в секунду. Мы говорим, что не можем обрабатывать более 10 кадров в секунду.

Надеюсь, что поможет!

...