可可:我如何在屏幕上绘制相机框架

时间:2014-06-22 11:16:45

标签: cocoa camera avfoundation

我要做的是使用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上? 另外,我想知道我的方法是否正确。这样做的标准方法是什么?

非常感谢您的帮助。谢谢:)

0 个答案:

没有答案