• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

ios - 如何将 Vignette CIFilter 应用于 iOS 中的实时摄像机源?

[复制链接]
菜鸟教程小白 发表于 2022-12-13 16:05:12 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

在尝试将简单的晕影滤镜应用于 iPhone6 的原始摄像头馈送时,在 Metal 和 Core Image 的帮助下,我发现在 MTKViewMTKView 中处理和渲染的帧之间存在很多延迟

我遵循的方法是(MetalViewController.swift):

  1. 使用 AVCaptureVideoDataOutputSampleBufferDelegate
  2. 获取原始相机输出
  3. 转换CMSampleBuffer > CVPixelBuffer > CGImage
  4. 用这个 CGImage 创建一个 MTLTexture

点数2 和 3 在名为 fillMTLTextureToStoreTheImageData

的方法内
  1. CIFilter 应用到从 MTKViewDelegate 中的 MTLTexture 获取的 CIImage


性能完全不是苹果在这个文档中提到的:https://developer.apple.com/library/archive/documentation/GraphicsImaging/Conceptual/CoreImaging/ci_tasks/ci_tasks.html#//apple_ref/doc/uid/TP30001185-CH3-TPXREF101

我错过了什么吗?



Best Answer-推荐答案


您的第 2 步太慢了,无法支持实时渲染...而且您似乎遗漏了几个步骤。出于您的目的,您通常会:

设置:

  1. 创建一个 CVPixelBuffer 池 - 使用 CVPixelBufferPoolCreate
  2. 使用 CVMetalTextureCacheCreate
  3. 创建金属纹理池

对于每一帧:

  1. 转换 CMSampleBuffer > CVPixelBuffer > CIImage
  2. 通过过滤器管道传递 CIImage
  3. 将输出图像渲染到步骤 1 中创建的池中的 CVPixelBuffer
  4. 使用 CVMetalTextureCacheCreateTextureFromImage 使用过滤后的 CVPixelBuffer 创建金属纹理

如果设置正确,所有这些步骤将确保您的图像数据保留在 GPU 上,而不是从 GPU 传输到 CPU 再返回 GPU 进行显示。

好消息是所有这些都在 Apple https://developer.apple.com/library/archive/samplecode/AVCamPhotoFilter/Introduction/Intro.html#//apple_ref/doc/uid/TP40017556 的 AVCamPhotoFilter 示例代码中进行了演示.尤其参见 RosyCIRenderer 类及其父类(super class) FilterRenderer

关于ios - 如何将 Vignette CIFilter 应用于 iOS 中的实时摄像机源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53898780/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap