gpt4 book ai didi

ios - 如何将 View 叠加在 CVImageBuffer 中的每个捕获帧上,实时而不是后期处理

转载 作者:IT王子 更新时间:2023-10-29 05:21:57 25 4
gpt4 key购买 nike

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

enter image description here

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

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

  • 老实说,我只是在互联网上四处寻找一个解释如何做到这一点的知名博客。但是没有找到。
  • 我读过一些可以呈现文本层覆盖的地方,如 following post 中所述。通过创建 CALayer 并将其添加为子层。
  • 但是,如果我想在正在录制的视频之上呈现 MapView 怎么办?另外,我不是在寻找屏幕截图。屏幕上的某些内容不会成为最终录制的一部分,因此我希望能够挑选将要组成的 View 。

我在找什么?

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

到目前为止的进展:

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

最佳答案

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

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

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

因此,您可以在四部分 Metal Camera 中找到所有必要的信息系列

这是一个指向博客的链接:About Compositing in Metal .

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

And here you can find a final project on a GitHub: MetalRenderCamera

关于ios - 如何将 View 叠加在 CVImageBuffer 中的每个捕获帧上,实时而不是后期处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50497671/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com