#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?
Кроме того, я хотел бы знать, верен ли мой подход. Каков стандартный способ сделать это?
Ваша помощь будет высоко оценена. Спасибо 🙂