首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在CVImageBuffer内的每个捕获帧上叠加视图,实时而不是后期处理

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

Stack Overflow用户
提问于 2018-05-24 05:22:51
回答 1查看 1.1K关注 0票数 15

我已经设法通过使用AVCaptureFileOutputRecordingDelegate设置了一个基本的AVCaptureSession,它可以录制视频并保存到设备上。我一直在搜索文档,以了解我们如何在正在录制的视频上添加统计覆盖。

正如您在上图中所看到的。我有多个覆盖在顶部的视频预览层。现在,当我保存我的视频输出时,我也想将这些视图合成到视频上。

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

  • 老实说,我只是在互联网上跳来跳去,寻找一个有声誉的博客来解释如何做到这一点。我读过一些地方,可以通过创建sublayer.
  • But,并将其添加为
  • 来呈现following post中描述的文本层覆盖。如果我想在正在录制的视频上呈现MapView,该怎么办?另外,我不是在寻找屏幕截图。屏幕上的一些内容将不会是最终录制的一部分,所以我希望能够选择要合成的视图。

我要找的是什么?

  1. 方向。
  2. 没有直接的solution
  3. Documentation链接和类名我应该阅读更多关于创建这个的内容。

到目前为止的进展:

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-28 07:23:39

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

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

所有可用的覆盖也必须转换为MTLTextures。然后你可以用over操作合成所有的MTLTextures层。

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

这里有一个到博客的链接:About Compositing in Metal

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

代码语言:javascript
复制
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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50497671

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档