【发布时间】:2018-03-14 23:08:48
【问题描述】:
我正在将屏幕从我的 iPhone 设备录制到我的 Mac。作为预览层,我直接从AVCaptureVideoDataOutput 收集样本缓冲区,从中创建纹理并使用Metal 渲染它们。我遇到的问题是在10.13 之前在macOS 中工作的代码在更新到10.13 后停止工作。即,
CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(_currentSampleBuffer);
if (!imageBuffer) return;
CVPixelBufferLockBaseAddress(imageBuffer,0);
size_t width = CVPixelBufferGetWidth(imageBuffer);
size_t height = CVPixelBufferGetHeight(imageBuffer);
CVMetalTextureRef metalTexture = NULL;
CVReturn result = CVMetalTextureCacheCreateTextureFromImage(nil,
self.textureCache,
imageBuffer,
nil,
self.pixelFormat,
width,
height,
0,
&metalTexture);
if (result == kCVReturnSuccess) {
self.texture = CVMetalTextureGetTexture(metalTexture);
}
返回result = -6660,转换为通用kCVReturnError,如on the official Apple docs和metalTexture = NULL所示。
我使用的像素格式是MTLPixelFormatBGRG422,因为来自相机的样本是2vuy。
作为从sampleBuffer 创建metalTexture 的解决方法,我现在
像这样创建一个中间 NSImage:
CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(_currentSampleBuffer);
NSCIImageRep *imageRep = [NSCIImageRep imageRepWithCIImage:[CIImage imageWithCVImageBuffer:imageBuffer]];
NSImage *image = [[NSImage alloc] initWithSize:[imageRep size]];
[image addRepresentation:imageRep];
并从中创建一个MTLTexture。这显然是直接使用CVMetalTextureCacheCreateTextureFromImage 的低劣解决方案。
再一次,有问题的代码在macOS < 10.13 中运行良好,我想知道是否有人有类似的问题,如果有,你有什么想法可以解决这个问题吗?
【问题讨论】:
标签: objective-c macos metal