У меня есть две успешные концепции, которые я хочу объединить.Я успешно наложил CATextLayer
на CVImageBufferRef
рамку камеры и затем сохранил его с помощью AVAssetWriter
, используя AVAssetWriterInputPixelBufferAdaptor
.Я делаю это так:
- (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];
}
Это работает как шарм.Теперь для моего второго трюка.Благодаря ответу на этот вопрос:
CMSampleBuffer из OpenGL для вывода видео с помощью AVAssestWritter
Я могу изменить пример OpenGL Teapot из примера кода WWDC 2010 и сохранитьрендерил контент в файл фильма на iPhone.
СЕЙЧАС, мне нужна возможность наложить чайник в один угол кадра камеры и сохранить его в виде фильма.Проблема, с которой я сталкиваюсь - это базовые вещи на Си.Как скопировать из одного буфера в другой, когда один буфер имеет размер 1280x720 (кадр камеры) и чайник находится в буфере с размером 320x320.Другое соображение - это скорость.Чтобы обработать 30 кадров в секунду, я не могу входить и выходить из классов CGImageRef или UIImage.Это должно произойти как можно быстрее.Каков наилучший способ сделать это?