我正在尝试使用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;
}
谁能告诉我我要去哪里错了?
答案 0 :(得分:0)
sampleBuffer为420f格式,具有2个平面。
对于锁定内存,请使用CVPixelBufferLockBaseAddress(imageBuffer,0 then 1)。
为了获取Y平面数据,请使用CVPixelBufferGetBaseAddressOfPlane(imageBuffer,0)。
对于UV平面数据,请使用CVPixelBufferGetBaseAddressOfPlane(imageBuffer,1)。
不要忘记解锁内存。我不确定如何将YUV转换为RGB。
在您的代码上,您不会从imageBuffer中读取图像数据。 您只能处理没有图像数据的pxbuffer和pxdata。