Это похоже на проблему с многопоточностью. Вы не можете обновить свои представления в любой другой теме, кроме основной. В вашей настройке, что хорошо, функция делегата captureOutput: didOutputSampleBuffer: вызывается во вторичном потоке. Таким образом, вы не можете установить вид изображения оттуда. Ответ Арта Гиллеспи - один из способов решения этой проблемы, если вы можете избавиться от ошибки неверного доступа.
Другим способом является изменение буфера семплов в captureOutput: didOutputSampleBuffer: , который отображается путем добавления экземпляра AVCaptureVideoPreviewLayer в сеанс захвата. Это, безусловно, предпочтительный способ, если вы изменяете только небольшую часть изображения, например выделяете что-то.
Кстати: ошибка неверного доступа может возникнуть из-за того, что вы не сохраняете созданное изображение во вторичном потоке, и поэтому оно будет освобождено до вызова cameraCaptureGotFrame в основном потоке.
Обновление :
Чтобы правильно сохранить изображение, увеличьте счетчик ссылок в captureOutput: didOutputSampleBuffer: (во вторичном потоке) и уменьшите его в cameraCaptureGotFrame: (в главном потоке).
// Delegate routine that is called when a sample buffer was written
- (void)captureOutput:(AVCaptureOutput *)captureOutput
didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer
fromConnection:(AVCaptureConnection *)connection
{
// Create a UIImage from the sample buffer data
UIImage *image = [self imageFromSampleBuffer:sampleBuffer];
// increment ref count
[image retain];
[self.delegate performSelectorOnMainThread:@selector(cameraCaptureGotFrame:)
withObject:image waitUntilDone:NO];
}
- (void) cameraCaptureGotFrame:(UIImage*)image
{
// whatever this function does, e.g.:
imageView.image = image;
// decrement ref count
[image release];
}
Если вы не увеличиваете счетчик ссылок, изображение освобождается пулом автоматического освобождения второго потока перед вызовом cameraCaptureGotFrame: в основном потоке. Если вы не уменьшите его в главном потоке, изображения никогда не будут освобождены, и вам не хватит памяти в течение нескольких секунд.