如何在CVImageBuffer中叠加每个捕获帧的视图,实时而不是后期处理

我设法设置了一个基本的AVCaptureSession ,它记录video并使用AVCaptureFileOutputRecordingDelegate将其保存在设备上。 我一直在搜索文档,以了解我们如何在正在录制的video之上添加统计信息叠加层。

在此处输入图像描述

如上图所示。 我在video预览图层上有多个叠加层。 现在,当我保存video输出时,我也希望将这些视图组合到video上。

到目前为止我尝试了什么?

  • 老实说,我只是在互联网上跳来寻找一个有信誉的博客,解释如何做到这一点。 但未能找到一个。
  • 我已经阅读了一些可以渲染文本图层叠加的地方, 如下文所述,创建CALayer并将其添加为子图层。
  • 但是,如果我想在正在录制的video上渲染MapView ,那该怎么办呢? 另外,我不是在寻找屏幕截图。 屏幕上的某些内容不会成为最终录制内容的一部分,因此我希望能够选择将要编写的视图。

我在找什么?

  1. 方向。
  2. 没有直接解决方案
  3. 文档链接和类名我应该阅读更多关于创建它的内容。

进展到目前为止:

我已经设法理解我需要从CMSampleBuffer获取CVImageBuffer并在其上绘制文本。 有些事情我还不清楚是否有可能以某种方式将MapView覆盖在正在录制的video上。

帮助您实现目标的最佳方法是使用Metal框架。 使用Metal相机有助于最大限度地减少对设备有限计算资源的影响。 如果您正在尝试实现对摄像头传感器的最低开销访问,那么使用AVCaptureSession将是一个非常好的开始。

您需要从CMSampleBuffer获取每个帧数据(您是对的),然后将帧转换为MTLTextureAVCaptureSession将通过委托回调不断向我们发送来自设备摄像头的帧。

所有可用的叠加层也必须转换为MTLTextures 。 然后,您可以使用over操作合成所有MTLTextures图层。

所以,在这里你可以找到四部分 金属相机 系列的所有必要信息。

这里有一个博客链接: 关于金属中的合成 。

另外,我想发布代码的摘录(在Metal中使用AVCaptureSession):

 import Metal guard let imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) else { // Handle an error here. } // Texture cache for converting frame images to textures var textureCache: CVMetalTextureCache? // `MTLDevice` for initializing texture cache var metalDevice = MTLCreateSystemDefaultDevice() guard let metalDevice = metalDevice where CVMetalTextureCacheCreate(kCFAllocatorDefault, nil, metalDevice, nil, &textureCache) == kCVReturnSuccess else { // Handle an error (failed to create texture cache) } let width = CVPixelBufferGetWidth(imageBuffer) let height = CVPixelBufferGetHeight(imageBuffer) var imageTexture: CVMetalTexture? let result = CVMetalTextureCacheCreateTextureFromImage(kCFAllocatorDefault, textureCache.takeUnretainedValue(), imageBuffer, nil, pixelFormat, width, height, planeIndex, &imageTexture) // `MTLTexture` is in the `texture` variable now. guard let unwrappedImageTexture = imageTexture, let texture = CVMetalTextureGetTexture(unwrappedImageTexture), result == kCVReturnSuccess else { throw MetalCameraSessionError.failedToCreateTextureFromImage } 

在这里,您可以在GitHub上找到最终项目: MetalRenderCamera