Изображение из CMSampleBufferRef всегда белое - PullRequest
0 голосов
/ 24 сентября 2018

Я пытаюсь получить каждый кадр из replaykit, используя startCaptureWithHandler.

startCaptureWithHandler возвращает CMSampleBufferRef, который мне нужно преобразовать в изображение.

Я использую этот метод для преобразования в UIImage, ноон всегда белый.

- (UIImage *) imageFromSampleBuffer3:(CMSampleBufferRef) sampleBuffer
{
    CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
    size_t width = CVPixelBufferGetWidth(imageBuffer);
    size_t height = CVPixelBufferGetHeight(imageBuffer);

    NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithBool:YES], kCVPixelBufferCGImageCompatibilityKey, [NSNumber numberWithBool:YES], kCVPixelBufferCGBitmapContextCompatibilityKey, nil];
    CVPixelBufferRef pxbuffer = NULL;
    CVPixelBufferCreate(kCFAllocatorDefault, width, height, kCVPixelFormatType_32ARGB, (__bridge CFDictionaryRef) options, &pxbuffer);

    CVPixelBufferLockFlags flags = (CVPixelBufferLockFlags)0;
    CVPixelBufferLockBaseAddress(pxbuffer, flags);
    void *pxdata = CVPixelBufferGetBaseAddress(pxbuffer);

    CGColorSpaceRef rgbColorSpace = CGColorSpaceCreateDeviceRGB();
//    CGContextRef context = CGBitmapContextCreate(pxdata, width, height, 8, CVPixelBufferGetBytesPerRow(pxbuffer), rgbColorSpace, kCGImageAlphaPremultipliedFirst);
    CGContextRef context = CGBitmapContextCreate(pxdata, width, height, 8, CVPixelBufferGetBytesPerRow(pxbuffer), rgbColorSpace, kCGImageAlphaPremultipliedFirst);

    CGImageRef quartzImage = CGBitmapContextCreateImage(context);

    CGColorSpaceRelease(rgbColorSpace);
    CGContextRelease(context);
    CVPixelBufferUnlockBaseAddress(pxbuffer, flags);

    UIImage *image = [UIImage imageWithCGImage:quartzImage scale:1.0f orientation:UIImageOrientationRight];

    CGImageRelease(quartzImage);
    return image;
}

Может кто-нибудь сказать мне, где я иду не так?

1 Ответ

0 голосов
/ 25 сентября 2018

sampleBuffer имеет формат 420f и имеет 2 плоскости.
Для блокировки памяти, CVPixelBufferLockBaseAddress (imageBuffer, 0, тогда 1). * 1 002 * Для получения Y данных плоскости, CVPixelBufferGetBaseAddressOfPlane (imageBuffer, 0).
Для плоских данных UV, CVPixelBufferGetBaseAddressOfPlane (imageBuffer, 1).
Не забудьте разблокировать память.Я не уверен, как конвертировать YUV в RGB.

В вашем коде вы не читаете данные изображения из imageBuffer.Вы работаете только с pxbuffer и pxdata, у которых нет данных изображения.

...