Содержимое OpenGL слоя поверх AVCaptureSession CVImageBufferRef с камеры - PullRequest
6 голосов
/ 19 мая 2011

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

1 Ответ

0 голосов
/ 11 апреля 2014

Вы можете попробовать использовать SpriteKit Framework (от iOS7), который работает на OpenGL и должен сохранять высокую частоту кадров, работая с изображениями / текстурой.

Начните смотреть на введение Apple: https://developer.apple.com/library/ios/documentation/GraphicsAnimation/Conceptual/SpriteKit_PG/Introduction/Introduction.html#//apple_ref/doc/uid/TP40013043-CH1-SW1

Надеюсь, это поможет

...