kCVPixelFormatType_420YpCbCr8BiPlanarFullRange преобразование кадра в UIImage

У меня есть приложение, которое захватывает живое видео в формате kCVPixelFormatType_420YpCbCr8BiPlanarFullRange для обработки канала Y. Согласно документации Apple:

kCVPixelFormatType_420YpCbCr8BiPlanarFullRange Бипланарный компонент Y'CbCr 8-бит 4:2:0, полный диапазон (luma=[0,255] chroma=[1,255]). baseAddr указывает на big-endian CVPlanarPixelBufferInfo_YCbCrBiPlanar struct.

Я хочу представить некоторые из этих кадров в UIViewController, есть ли API для преобразования в формат kCVPixelFormatType_32BGRA? Не могли бы вы подсказать, как настроить этот метод, предоставляемый Apple?

// Create a UIImage from sample buffer data
- (UIImage *) imageFromSampleBuffer:(CMSampleBufferRef) sampleBuffer  {
    // Get a CMSampleBuffer's Core Video image buffer for the media data
    CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
    // Lock the base address of the pixel buffer
    CVPixelBufferLockBaseAddress(imageBuffer, 0);

    // Get the number of bytes per row for the pixel buffer
    void *baseAddress = CVPixelBufferGetBaseAddress(imageBuffer);

    // Get the number of bytes per row for the pixel buffer
    size_t bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer);
    // Get the pixel buffer width and height
    size_t width = CVPixelBufferGetWidth(imageBuffer);
    size_t height = CVPixelBufferGetHeight(imageBuffer);

    // Create a device-dependent RGB color space
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();

    // Create a bitmap graphics context with the sample buffer data
    CGContextRef context = CGBitmapContextCreate(baseAddress, width, height, 8,
                                                 bytesPerRow, colorSpace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst);
    // Create a Quartz image from the pixel data in the bitmap graphics context
    CGImageRef quartzImage = CGBitmapContextCreateImage(context);
    // Unlock the pixel buffer
    CVPixelBufferUnlockBaseAddress(imageBuffer,0);

    // Free up the context and color space
    CGContextRelease(context);
    CGColorSpaceRelease(colorSpace);

    // Create an image object from the Quartz image
    UIImage *image = [UIImage imageWithCGImage:quartzImage];

    // Release the Quartz image
    CGImageRelease(quartzImage);

    return (image);
}

Спасибо!

8
задан mohacs 8 August 2014 в 20:16
поделиться