Я понимаю, что это старый вопрос сейчас, но ...
[dataOutput setSampleBufferDelegate:self queue:dispatch_get_main_queue()];
эта строка вызывает ваш видео-обратный вызов для вызова в основном потоке (UI).
Если вы измените его на что-то вроде:
[dataOutput setSampleBufferDelegate:self
queue:dispatch_queue_create("cQ", DISPATCH_QUEUE_SERIAL)];
Тогда в вашем обратном вызове, если вам нужно обновить ваш интерфейс, вы должны сделать:
dispatch_async(dispatch_get_main_queue(), ^{
[coreImageContext drawImage:image atPoint:CGPointZero fromRect:[image extent] ];
[self.context presentRenderbuffer:GL_RENDERBUFFER];
});
Это очень поможет, поскольку в фоновом потоке будут выполняться дорогостоящие вычисления, и рисование изображения не повлияет на захват.
Примечание стороны:
Слепое использование примера кода, который вы найдете в Интернете, не читая о том, как работает технология, не является хорошим способом разработки приложений (многие люди виновны в этом)