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?