cocoa: как мне нарисовать кадры с камеры на экране

#cocoa #camera #avfoundation

#какао #камера #avfoundation

Вопрос:

То, что я пытаюсь сделать, это отобразить каналы камеры в NSView с помощью AVFoundation. Я знаю, что этого можно легко достичь, используя «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?
Кроме того, я хотел бы знать, верен ли мой подход. Каков стандартный способ сделать это?

Ваша помощь будет высоко оценена. Спасибо 🙂