CMSampleBuffer 将 BGRA 转换为 YUV 420f

CMSampleBuffer convert BGRA to YUV 420f

我正在做一个项目,我用 AVCaptureSession 捕获用户的视频输入。问题是我需要 BGRA 格式的输出以使用 OpenCV 渲染它,但随后我需要将其更改回默认的 420f 格式以将其显示给用户。所以,我将videoSettings中的PixelFormatType设置为kCVPixelFormatType_32BGRA

[videoOutput setVideoSettings:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:kCVPixelFormatType_32BGRA] forKey:(id)kCVPixelBufferPixelFormatTypeKey]];

并且我想在 captureOutput 中将样本缓冲区转换为 420f:

- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection {
    [self doSomeOpenCV:sampleBuffer]; // the OpenCV part

    //convert sampleBuffer to kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange

}

有办法吗?或者,也许有一个函数 returns 给定输入的指定格式的样本缓冲区?

为什么不使用 AVSampleBufferDisplayLayer 来显示 BGRA 示例缓冲区并放弃 webRTC(至少为了显示目的)?

如果你不想那样做,你当然可以将你的 BGRA 缓冲区转换为 YUV,你甚至可以在 GPU 上非常有效地完成它,但最好的转换是不转换,而且谁想输入iPad 屏幕键盘有那么多?