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

Tea*_*App 14 camera core-graphics ios avcapturemoviefileoutput swift

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

在此输入图像描述

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

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

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

我在找什么?

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

进展到目前为止:

我已成功地明白,我需要弄个CVImageBufferCMSampleBuffer和绘制文本了它.有些事情我还不清楚是否有可能以某种方式将MapView覆盖在正在录制的视频上.

ARG*_*Geo 2

帮助您实现目标的最佳方法是使用框架Metal。使用Metal相机有助于最大限度地减少对设备\xe2\x80\x99 有限计算资源的影响。如果您想以最低的开销访问相机传感器,那么使用 aAVCaptureSession将是一个非常好的开始。

\n\n

您需要从中获取每个帧数据CMSampleBuffer(您是对的),然后将帧转换为MTLTexture. AVCaptureSession将通过委托回调不断地从 device\xe2\x80\x99s 相机向我们发送帧。

\n\n

所有可用的叠加层也必须转换为MTLTextures。然后就可以MTLTextures通过操作来合成所有图层了over

\n\n

因此,您将在这里找到由四部分组成的 金属相机 系列的所有必要信息所有必要信息。

\n\n

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

\n\n

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

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

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

\n
\n