내 iPhone 장치에서 내 Mac으로 화면을 녹화하고 있습니다. 미리보기 레이어로서 AVCaptureVideoDataOutput
에서 직접 샘플 버퍼를 수집하고 있습니다.이 버퍼에서 텍스처를 만들고 Metal
으로 렌더링합니다. 내가 가지고있는 문제는 10.13
으로 업데이트 한 후 10.13
이전에 macOS에서 작동했던 코드가 작동을 멈춘 것입니다. 즉,CVMetalTextureCacheCreateTextureFromImage는 macOS에서 -6660을 반환합니다. 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);
}
on the official Apple docs을 알 수있는 바와 같이, 일반적인 kCVReturnError
로 변환 반환 result = -6660
, 그리고 metalTexture = NULL
.
카메라에서 가져 오는 샘플이 2vuy
이므로 사용중인 픽셀 형식은 MTLPixelFormatBGRG422
입니다. 해결 방법으로
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
에서 완벽하게 작동합니다. 비슷한 문제가있는 사람이 있는지 알고 싶습니다. 그렇다면이 문제를 해결하는 방법에 대해 알고 계십니까?
정말 멋지다! 분할 된 이미지와 이상한 색상을 얻고 있기 때문에 픽셀 버퍼의 출력 형식을 확인해야합니다. 나중에 참조 할 수 있도록 다른 해결책으로 해결 방법을 게시하겠습니다. –