Accès aux pixels d'un film quicktime

baleinebaleine Membre
23:34 modifié dans API AppKit #1
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 ?

Réponses

  • ChachaChacha Membre
    janvier 2007 modifié #2
    dans 1168687256:

    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 ?

    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
  • baleinebaleine Membre
    23:34 modifié #3
    Autre possibilité : dans une NSOpenGLView
    // 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, &currentFrame);
    // 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);


Connectez-vous ou Inscrivez-vous pour répondre.