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