2011-05-19 16 views
6

Tengo dos conceptos exitosos que quiero fusionar ahora. Tengo éxito en acodar un CATextLayer en un marco de cámara CVImageBufferRef y luego guardarlo a través de un AVAssetWriter usando un AVAssetWriterInputPixelBufferAdaptor. Lo hago así:Capa de contenido OpenGL sobre AVCaptureSession CVImageBufferRef desde la cámara

- (void) processNewBuffer:(CVImageBufferRef)cameraFrame { 
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 

    //  
    // //update CALayer on main queue 
    // //UIKit is not thread safe 
    dispatch_sync(dispatch_get_main_queue(), ^{ 
     [self updateCALayer]; 
    }); 

    if(recorder.recording) { 

     CVPixelBufferLockBaseAddress(cameraFrame,0); 

     // do stuff with buffer here 
     uint8_t *baseAddress = (uint8_t *)CVPixelBufferGetBaseAddress(cameraFrame); 
     size_t bytesPerRow = CVPixelBufferGetBytesPerRow(cameraFrame); 
     width = CVPixelBufferGetWidth(cameraFrame); 
     height = CVPixelBufferGetHeight(cameraFrame); 

     /*Create a CGImageRef from the CVImageBufferRef*/ 
     CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
     CGContextRef newContext = CGBitmapContextCreate(baseAddress, width, height, 8, bytesPerRow, colorSpace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst); 

     [textLayer renderInContext:newContext]; 

     [recorder appendPixelBuffer:cameraFrame withPresentationTime:camera.lastSampleTime]; 

     CVPixelBufferUnlockBaseAddress(cameraFrame,0); 

     /*We release some components*/ 
     CGContextRelease(newContext); 
     CGColorSpaceRelease(colorSpace); 
    } 

    [pool drain]; 
} 

Esto funciona como un encanto. Ahora para mi segundo truco. Gracias a la respuesta a esta pregunta: ¿

CMSampleBuffer from OpenGL for video output with AVAssestWritter

que puede modificar el ejemplo OpenGL Tetera del código de ejemplo WWDC 2010 y guardar el contenido representado a un archivo de película en el iPhone.

AHORA, lo que quiero es la capacidad de colocar la tetera en una esquina del marco de la cámara y guardar el paquete en una película. El problema que estoy teniendo es C básico. ¿Cómo copio de un buffer al siguiente, cuando un buffer es 1280x720 (el marco de la cámara) y la tetera está en un buffer de 320x320? La otra consideración es la velocidad. Para procesar 30 fps, no puedo moverme dentro y fuera de las clases CGImageRef o UIImage. Esto tiene que suceder lo más rápido posible. Cuál es la mejor manera de lograr esto?

Respuesta

Cuestiones relacionadas