我要做的是使用AVfoundation在NSview中显示相机源。我知道这可以通过使用" AVCaptureVideoPreviewLayer"轻松实现。但是,长期计划是进行一些跟踪手势的帧处理,因此我更喜欢手动绘制帧。我的方式是使用" AVCaptureVideoDataOutput"并实现"(void)captureOutput:didOutputSampleBuffer:fromConnection:"委托功能。
以下是我对委托函数的实现。在委托函数中,我从样本缓冲区创建一个CGImage并将其渲染到CALayer上。但是这不起作用,因为我没有在屏幕上看到任何视频帧。 CALayer(mDrawlayer)是在函数" awakeFromNib"中创建的。并附加到故事板中的自定义视图。我通过将背景颜色设置为橙色来验证CALayer的创建,并且它可以正常工作。
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer: (CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection
{
CVImageBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
CVPixelBufferLockBaseAddress(pixelBuffer, 0);
uint8_t *baseAddress = (uint8_t *)CVPixelBufferGetBaseAddress(pixelBuffer);
size_t bytesPerRow = CVPixelBufferGetBytesPerRow(pixelBuffer);
size_t width = CVPixelBufferGetWidth(pixelBuffer);
size_t height = CVPixelBufferGetHeight(pixelBuffer);
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef newContext =
CGBitmapContextCreate(baseAddress,width,height, 8, bytesPerRow,
colorSpace, kCGBitmapByteOrder32Little |
kCGImageAlphaPremultipliedFirst);
CGImageRef imgRef = CGBitmapContextCreateImage(newContext);
mDrawLayer.contents = (id) CFBridgingRelease(imgRef);
[mDrawLayer display];
CVPixelBufferUnlockBaseAddress(pixelBuffer, 0);
}
显然我没有正确地做某事,所以我应该如何将相机框架逐一渲染到CALayer上? 另外,我想知道我的方法是否正确。这样做的标准方法是什么?
非常感谢您的帮助。谢谢:)