У меня есть видео приложение, которое выполняет как предварительный просмотр в реальном времени, так и захват неподвижных изображений во время предварительного просмотра.Я использую 4 текстуры, которые предварительно генерируются при загрузке приложения.Я обращаюсь к текстурам в трех потоках.
Чтобы заставить работать предварительный просмотр в реальном времени, мне пришлось создать Sharegroup (см. Ниже), чтобы метод captureOutput
мог сохранять результат в кадровом буфере с именем FBO_OUT
.Затем для отображения на экране мне нужно было набрать FBO_OUT
для звонка на presentRenderbuffer
.Если я не использовал Sharegroup, я только что получил кучу бреда.
CAEAGLLayer* eaglLayer = (CAEAGLLayer *)self.layer;
eaglLayer.opaque = YES;
eaglLayer.drawableProperties = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:NO], kEAGLDrawablePropertyRetainedBacking,
kEAGLColorFormatRGBA8, kEAGLDrawablePropertyColorFormat,
nil];
oglContext = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
offscreenContext = [[EAGLContext alloc] initWithAPI:[oglContext API] sharegroup:oglContext.sharegroup];
if (!oglContext || ![EAGLContext setCurrentContext:oglContext]) {
NSLog(@"Problem with OpenGL context.");
[self release];
return nil;
}
Периодически, внутри captureOutput
мне нужно вызвать этот код:
#define SHAREGROUP_CONTEXT [[[appDelegate mainViewController] oglView] offscreenContext]
if ([EAGLContext currentContext] != SHAREGROUP_CONTEXT) {
NSLog(@"setting context");
glFlush();
[EAGLContext setCurrentContext:SHAREGROUP_CONTEXT];
}
@synchronized(SHAREGROUP_CONTEXT)
{
/* process pixels */
}
glFlush(); // at end of method
Thisработает нормально, проблема в том, что я сейчас пытаюсь сделать то же самое после получения неподвижного изображения (пока предварительный просмотр все еще выполняется) через блок captureStillImageAsynchronouslyFromConnection
, однако я снова получаю тарабарщину, хотя я пытался сделатьthis:
AVCaptureConnection *sic = [AVCamUtilities connectionWithMediaType:AVMediaTypeVideo fromConnections:[[self stillImageOutput] connections]];
[[self stillImageOutput] captureStillImageAsynchronouslyFromConnection:sic
completionHandler:^(CMSampleBufferRef imageDataSampleBuffer, NSError *error)
{
@synchronized(SHAREGROUP_CONTEXT)
{
/* generate new textures to process the imageDataSampleBuffer and cry */
}
Кажется, это проблема с контекстами и многопоточностью.