Слой содержимого OpenGL поверх AVCaptureSession CVImageBufferRef с камеры

У меня есть две успешные концепции, которые я хочу объединить. Мне удалось наложить слой 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. Это должно произойти как можно быстрее. Как лучше всего это сделать?

6
задан Community 23 May 2017 в 12:24
поделиться