Создание 64-битного родного приложения OSX (не iOS) для версии 10.7+. Несколько новичок в работе с видеофайлами во вселенной Cocoa.
Я хотел бы иметь возможность открывать видеофайл и отображать вывод внутри рендеринга openGL (IE, я хотел бы иметь эффективный доступ к фреймбуферу видео и превращать каждый кадр в текстуру opengl).
Концептуально это кажется простым, но мне трудно пробираться через различные (старые и устаревшие) примеры и варианты, все из которых, похоже, недавно устарели в пользу AVFoundation. Возможно, я что-то упустил, но примеры использования AVFoundation с OpenGL кажутся незначительными.
Чтобы немного уточнить, этот пример приложения (QTCoreVideo101 от Apple) делает более или менее то, что я хочу, за исключением того, что он построен вокруг поэтому устаревший QTKit даже не будет компилироваться в 64-битной версии.
Я читаю документы AVFoundation прямо сейчас, но я все еще не уверен, что имеет смысл пытаться получить glTexture из AVFoundation или мне следует искать в другом месте.
ОБНОВЛЕНИЕ
Это решение, с которым я в итоге пошел. «thisLayer.layerSource.videoPlayerOutput» — это объект AVPlayerItemVideoOutput.
if ([thisLayer.layerSource.videoPlayerOutput hasNewPixelBufferForItemTime:playerTime]){
frameBuffer= [thisLayer.layerSource.videoPlayerOutput copyPixelBufferForItemTime:playerTime itemTimeForDisplay:NULL];
CVReturn result= CVOpenGLTextureCacheCreateTextureFromImage(NULL,
textureCache,
frameBuffer,
NULL,
&textureRef);
if(result == kCVReturnSuccess){
// These appear to be GL_TEXTURE_RECTANGLE_ARB
thisLayer.layerSource.vid_glTextureTarget=CVOpenGLTextureGetTarget(textureRef);
thisLayer.layerSource.vid_glTexture=CVOpenGLTextureGetName(textureRef);
thisLayer.layerSource.vid_glTextureSize=NSMakeSize(CVPixelBufferGetWidth(frameBuffer), CVPixelBufferGetHeight(frameBuffer));
thisLayer.layerSource.vid_ciimage=[CIImage imageWithCVImageBuffer:frameBuffer];
CFRelease(textureRef);
CVOpenGLTextureCacheFlush(textureCache, 0);
}else{
NSLog(@"INTERNAL ERROR FAILED WITH CODE: %i",result);
}
CVBufferRelease(frameBuffer);
}