ios - 来自 CMSampleBufferRef 的图像始终为白色
问题描述
我正在尝试使用 startCaptureWithHandler 从 replaykit 中获取每一帧。
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;
}
谁能告诉我我哪里出错了?
解决方案
sampleBuffer 是 420f 格式,它有 2 个平面。
对于锁定内存,CVPixelBufferLockBaseAddress(imageBuffer, 0 then 1)。
对于获取 Y 平面数据,CVPixelBufferGetBaseAddressOfPlane(imageBuffer, 0)。
对于 UV 平面数据,CVPixelBufferGetBaseAddressOfPlane(imageBuffer, 1)。
不要忘记解锁记忆。我不确定如何将 YUV 转换为 RGB。
在您的代码中,您不会从 imageBuffer 读取图像数据。您只在没有图像数据的 pxbuffer 和 pxdata 上工作。
推荐阅读
- swift - Firebase - 制作您关注的人的帖子的主页(swift)
- javascript - 在 Angular 5 中将 Javascript 对象附加到另一个对象
- oracle - 如何在oracle中构造分层数据
- java - 如何使依赖项在 JVM 语言中使用它们自己的传递依赖项
- c# - C# 将 KeyValue 设置为一行中的变量
- javascript - 折线图显示在 chartjs 组合图中的条形下方
- android - 为什么 webview 标题键在 android 中转换为小写?
- python - 如何找到非卷积模型tensorflow python的概率
- javascript - MongoDB - 即时从 ID 获取数据
- sql-server - 重新安装 SQL Server 2008 的问题