如何在CVImageBuffer中叠加每个捕获帧的视图,实时而不是后期处理
我设法设置了一个基本的AVCaptureSession
,它记录video并使用AVCaptureFileOutputRecordingDelegate
将其保存在设备上。 我一直在搜索文档,以了解我们如何在正在录制的video之上添加统计信息叠加层。
即
如上图所示。 我在video预览图层上有多个叠加层。 现在,当我保存video输出时,我也希望将这些视图组合到video上。
到目前为止我尝试了什么?
- 老实说,我只是在互联网上跳来寻找一个有信誉的博客,解释如何做到这一点。 但未能找到一个。
- 我已经阅读了一些可以渲染文本图层叠加的地方, 如下文所述,创建
CALayer
并将其添加为子图层。 - 但是,如果我想在正在录制的video上渲染
MapView
,那该怎么办呢? 另外,我不是在寻找屏幕截图。 屏幕上的某些内容不会成为最终录制内容的一部分,因此我希望能够选择将要编写的视图。
我在找什么?
- 方向。
- 没有直接解决方案
- 文档链接和类名我应该阅读更多关于创建它的内容。
进展到目前为止:
我已经设法理解我需要从CMSampleBuffer
获取CVImageBuffer
并在其上绘制文本。 有些事情我还不清楚是否有可能以某种方式将MapView覆盖在正在录制的video上。
帮助您实现目标的最佳方法是使用Metal
框架。 使用Metal
相机有助于最大限度地减少对设备有限计算资源的影响。 如果您正在尝试实现对摄像头传感器的最低开销访问,那么使用AVCaptureSession
将是一个非常好的开始。
您需要从CMSampleBuffer
获取每个帧数据(您是对的),然后将帧转换为MTLTexture
。 AVCaptureSession
将通过委托回调不断向我们发送来自设备摄像头的帧。
所有可用的叠加层也必须转换为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