15

我设法设置了一个基础AVCaptureSession,它可以录制视频并将其保存在设备上AVCaptureFileOutputRecordingDelegate。我一直在搜索文档以了解我们如何在正在录制的视频之上添加统计信息覆盖。

IE

在此处输入图像描述

如上图所示。我在视频预览层顶部有多个叠加层。现在,当我保存视频输出时,我也想将这些视图合成到视频中。

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

  • 老实说,我只是在互联网上四处寻找一个有信誉的博客来解释如何做到这一点。但没能找到一个。
  • 我已经阅读了一些可以通过创建并将其添加为子层来呈现文本层叠加层的地方,如下面的帖子中所述。CALayer
  • 但是,如果我想MapView在正在录制的视频之上渲染呢?另外,我不是在寻找屏幕截图。屏幕上的某些内容不会成为最终录制的一部分,因此我希望能够挑选将要组合的视图。

我在找什么?

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

到目前为止的进展:

我已经设法理解我需要从中获取CVImageBufferCMSampleBuffer在其上绘制文本。我仍然不清楚是否有可能以某种方式将 MapView 覆盖在正在录制的视频上。

4

1 回答 1

2

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

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

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

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

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

另外,我想发布代码摘录(在 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

于 2018-05-27T23:23:38.533 回答