AVCaptureSession сделалReceiveMemoryWarning

Во время захвата изображений, поскольку сеанс AVCaptureSession выполняется в локальном массиве NSMutableArray, я получаю вызов didReceiveMemoryWarning. после небольшого тестирования я обнаружил, что это происходит, когда МАССИВ достигает определенного количества.

Я предполагаю, что это потому, что я использую UIImage как тип объекта, который я добавляю в массив. В каком формате лучше сохранять эти изображения?

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

CVPixelBufferRef pixel_buffer = CMSampleBufferGetImageBuffer(sampleBuffer);
CIImage *ciImage = [CIImage imageWithCVPixelBuffer:pixel_buffer];
CGImageRef ref = [self.context createCGImage:ciImage fromRect:ciImage.extent]; 

UIImage *image = [UIImage imageWithCGImage:ref scale:1.0 orientation:UIImageOrientationRight];

CGImageRelease(ref);

[self.capturingImageView performSelectorOnMainThread:@selector(setImage:) withObject:image waitUntilDone:YES];
if (saveImages == YES) { //this a BOOL value that becomes YES when the user clicks the RECORDING button.
    [dImagesArray addObject:image];
}
}

person Ohad Regev    schedule 26.12.2012    source источник


Ответы (2)


Вы можете сохранить изображения в любом формате, наиболее подходящем для ваших нужд: это, вероятно, будет либо JPG, либо PNG. Первый меньше, но с потерями, второй без потерь. Поэтому, если для вас крайне важно качество изображения, используйте PNG. Если нет, я бы использовал JPG (у которого будет дополнительное преимущество, заключающееся в использовании меньшего места на диске).

В настоящее время вы не сохраняете изображения на диск, а просто храните их в памяти в массиве, и это вызывает у вас проблемы. Вы можете справиться с этим несколькими способами, в зависимости от того, что вы хотите, чтобы ваше приложение делало. Вам нужно сохранять изображения на диск? Если это так, возможно, установите ограничение на количество изображений, разрешенных в памяти в любой момент времени, и при необходимости сбрасывайте их на диск. Или, возможно, вы просто проводите некоторый анализ изображений, и в этом случае вы можете просто выпустить их, когда они вам больше не нужны.

person lxt    schedule 26.12.2012
comment
Спасибо лкст. Итак, вы имеете в виду, что я должен изменить тип, в котором я храню изображения в массиве, на NSData, используя NSData *UIImageJPEGRepresentation(UIImage *image, CGFloat CompressionQuality);? - person Ohad Regev; 26.12.2012

почему бы не использовать AVCaptureVideoPreviewLayer, если вы не выполняете какую-либо фильтрацию? Из соображений производительности я бы рекомендовал использовать OpenGL для рендеринга изображения для метода делегата captureOutput:didOutputSampleBuffer:fromConnection: Вот пример... https://developer.apple.com/library/ios/qa/qa1702/_index.html

person zero7    schedule 10.09.2014