【问题标题】:CMSampleBuffer convert BGRA to YUV 420fCMSampleBuffer 将 BGRA 转换为 YUV 420f
【发布时间】:2018-09-04 10:37:11
【问题描述】:

我正在做一个项目,我使用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

}

有没有办法做到这一点?或者,有一个函数可以在给定输入的情况下返回指定格式的样本缓冲区?

【问题讨论】:

标签: ios objective-c opencv avfoundation avcapturesession


【解决方案1】:

为什么不使用AVSampleBufferDisplayLayer 来显示您的 BGRA 样本缓冲区并放弃 webRTC(至少出于显示目的)?

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

【讨论】:

  • 我需要 webRTC 才能像在 viper 中一样进行在线视频通话,而且我无法修改他们的代码,所以据我所知,我无法使用 AVSampleBufferDisplayLayer。我只需要将 CMSampleBuffer 对象传递给 webRTC,以便它处理其余部分。这就是为什么我寻找一种将 BGRA 转换为 YUV 的方法
  • 你确定 webRTC支持kCVPixelFormatType_32BGRA吗?它的类RTCCVPixelBuffer 支持BGRA 并且有一个toI420 (yuv) 方法。您可以直接或间接使用它。
  • 嗯,谢谢提及。我查了一下,找不到类。我猜我正在使用的示例项目:github.com/ISBX/apprtc-ios 不包括整个框架。我尝试手动构建 webRTC,但 Xcode 构建似乎确实存在问题。但我觉得应该有一个更简单的解决方案。
  • 您在apprtc-ios 中使用哪些类/方法来显示yuv 样本缓冲区?
  • ARDAppClient 类中有一个名为createLocalVideoTrack 的方法来处理视频捕获,默认使用RTCVideoSource,但我将其更改为RTCAVFoundationVideoSource,其中有AVCaptureSession属性,然后我只是修改会话。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
相关资源
最近更新 更多