Accès aux pixels d'un film quicktime
baleine
Membre
Je voudrais accéder aux données bitmap des frames d'un film quicktime : y a t-il un moyen simple de faire ça, et d'obtenir, par exemple des buffers directement accessibles par des routines en C ?
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Oui.
Avec la classe QTMovie, tu peux charger un film et obtenir une NSImage par un "frameImageAtTime". NSImage encapsule une représentation de l'image. Si c'est une NSBitmapImageRep, tu la récupères et a accès aux pixels. Sinon, tu peux toujours reconstruire ta propre NSBitmapImageRep avec la TIFFRepresentation de l'image.
Autre possibilité (plus complexe mais plus efficace) : crée une composition QuartzComposer capable de lire un film, que tu associes à un QCRenderer. Comme tu vas créer toi-même le NSOpenGLContext, tu peux te débrouiller pour faire un rendu hors-écran dans un pixel buffer et donc intercerpter les buffer OpenGL pour récupérer directement les tableaux RGB. J'ai déjà fait cela, il faudra que je poste le code, mais il est inspiré de celui-ci : http://developer.apple.com/samplecode/QuartzComposerOffline/
Voilà pour des infos brutes...
[edit]
Entre temps, j'ai posté le code correspondant aux histoires de QuartzComposer : http://www.objective-cocoa.org/forum/index.php?topic=2071.new#new
[/edit]
+
Chacha
// créer un "OpenGL texture context "
QTOpenGLTextureContextCreate(kCFAllocatorDefault,CGLContextObj([[self openGLContext] CGLContextObj]),CGLPixelFormatObj([[self pixelFormat] CGLPixelFormatObj]),NULL,&textureContext);
// récupérer une "frame" (image buffer) du film
OSStatus status = QTVisualContextCopyImageForTime(textureContext, NULL, timeStamp, ¤tFrame);
// créer une image Core Image image depuis le CVImageBuffer
inputImage = [CIImage imageWithCVImageBuffer:currentFrame];
// convertir inputImage (CIImage) en Quartz (CGImage)
CGImageRef qutz = [ciContext createCGImage:inputImage fromRect:imageRect];
// créer un CG Bitmap Context
size_t width = CGImageGetWidth(qutz);
size_t height = CGImageGetHeight(qutz);
CGColorSpaceRef space = CGColorSpaceCreateDeviceRGB();
CGContextRef qtzContext = CGBitmapContextCreate(data, width, height, 8*sizeof(float), 4*sizeof(float)*width, space,
kCGImageAlphaPremultipliedLast | kCGBitmapFloatComponents | kCGBitmapByteOrder32Host);
// release color space
CGColorSpaceRelease(space);
// dessiner l'image Core Graphic dans le CG Image Context
CGContextDrawImage(qtzContext,CGRectMake(0,0,width,height),qutz);
// nettoyage
CGImageRelease(qutz);
CGContextRelease(qtzContext);
CGColorSpaceRelease(space);