iOS 5.0 中的 Core Image 过滤器对于实时视频处理是不是足够快?
Posted
技术标签:
【中文标题】iOS 5.0 中的 Core Image 过滤器对于实时视频处理是不是足够快?【英文标题】:Are the Core Image filters in iOS 5.0 fast enough for realtime video processing?iOS 5.0 中的 Core Image 过滤器对于实时视频处理是否足够快? 【发布时间】:2011-10-01 08:07:17 【问题描述】:现在 Apple 已将 Core Image 框架移植到 ios 5.0,我想知道:Core Image 是否足够快以将实时滤镜和效果应用于相机视频?
另外,学习 iOS 5.0 的 Core Image 框架的一个好的起点是什么?
【问题讨论】:
【参考方案1】:它将在 iPhone 4 及更高版本中几乎是实时的。 iPhone 3GS 会有点波涛汹涌。不推荐使用 iPhone 3 及更早版本。
【讨论】:
【参考方案2】:现在 Core Image 已经在 iOS 上推出了一段时间,我们可以谈谈一些硬性能数据。我创建了一个基准应用程序作为我的GPUImage 框架测试的一部分,并分析了基于 CPU 的原始过滤器、Core Image 过滤器和 GPUImage 过滤器与实时视频源的性能。以下是对来自 iPhone 摄像头的 640x480 视频帧应用单个伽马滤镜所需的时间(以毫秒为单位)(对于运行两种不同操作系统版本的两种不同硬件型号):
iPhone 4 (iOS 5) | iPhone 4S (iOS 6)
------------------------------------------------
CPU 458 ms (2.2 FPS) 183 ms (5.5 FPS)
Core Image 106 ms (6.7 FPS) 8.2 ms (122 FPS)
GPUImage 2.5 ms (400 FPS) 1.8 ms (555 FPS)
对于 Core Image,这意味着 iPhone 4 上的简单伽马滤镜最高可达到 9.4 FPS,但在 iPhone 4S 上则超过 60 FPS。这是您可以设置的最简单的 Core Image 过滤器案例,因此性能肯定会随着更复杂的操作而变化。这似乎表明 Core Image 无法在运行 iOS 5 的 iPhone 4 上以足够快的速度进行实时处理以匹配 iPhone 的摄像头速率,但从 iOS 6 开始,它处理视频的速度足以在 iPhone 4S 及更高版本上进行实时过滤.
这些基准的来源可以在my GitHub repository) 中找到,如果你想看看我从哪里得到这些数字的话。
我已经从我原来的答案中更新了这个答案,这对 Core Image 的性能太挑剔了。我用作比较基础的棕褐色调滤镜执行的操作与我自己的不同,因此它是一个糟糕的基准。 Core Image 滤镜的性能在 iOS 6 中也得到了显着提升,这使得它们的速度足以在 iPhone 4S 及更高版本上处理实时视频。此外,我还发现了几个案例,like large-radius blurs,Core Image 的性能明显优于我的 GPUImage 框架。
上一个答案,供后人参考:
与任何与性能相关的问题一样,答案将取决于您的过滤器的复杂性、被过滤的图像大小以及您运行的设备的性能特征。
因为 Core Image 在 Mac 上已经有一段时间了,我可以向您指出 Core Image Programming Guide 作为学习框架的资源。鉴于 NDA,我无法评论 iOS 特定的元素,但我强烈建议观看 WWDC 2011 Session 422 - Using Core Image on iOS 和 Mac OS X 的视频。
Core Image(大部分)使用 GPU 进行图像处理,因此您可以查看 OpenGL ES 2.0 着色器在现有设备上处理图像处理的速度有多快。我did some work in this area recently,发现 iPhone 4 可以使用简单的着色器对 480 x 320 的实时视频进行 60 FPS 处理。您可以在那里下载我的示例应用程序并尝试自定义着色器和/或视频输入大小来确定您的特定设备是否可以以适当的帧速率处理此处理。 Core Image 可能会增加一点开销,但它也对过滤器链的组织方式进行了一些巧妙的优化。
目前最慢的兼容设备是 iPhone 3G S 和第 3 代 iPod touch,但它们并不比 iPhone 4 慢多少。iPad 2 以其强大的片段处理能力将它们全部击败。
【讨论】:
上面的对比表你用的是什么CIContext?基于 CPU 还是基于 GPU?顺便说一句:我刚刚看了你的 GPUImage 框架,它看起来很棒! GJ! @Błażej - 据我所知,基于 GPU。我必须验证这些数字,但在 iPhone 4 上处理时,Core Image 确实使 GPU 过载。很明显,Core Image 是针对基于 A5 的较新设备,而不是 iPhone 3GS、iPhone 4、或原装 iPad。 嘿,布拉德,既然 Core Image 和 GPUImage(基于名称)都是基于 GPU 的计算,那么 GPUImage 是否更快? @tom - Core Image 和 GPUImage 在图像和视频源上应用过滤器的方法完全不同。我选择手动调整单个片段着色器到硬件,这可以显着提高性能。但是,我确实需要根据 Core Image 团队的一些 cmets 更新上述基准。我仍然比 Core Image 快,但它在 5.0 上并不像我最初的基准测试显示的那样慢。 iOS 6.0 也带来了一些改进。 嗨 @BradLarson 非常感谢您创建了如此出色的库,我正在使用 CropFilter 裁剪已经创建的视频,但是裁剪视频需要太多时间。你也是有什么办法可以提高种植速度。对于一分钟的视频,它需要 1.3 分钟才能裁剪,这太大了。所以可以建议我一些优化技术。【参考方案3】:恕我直言,自 iOS6.0 以来,Core Image 始终是您的首选。 您会喜欢一些不错的功能,例如:
-
Core Image 输入参数支持 glTexture2d;
Core Image 输出参数支持 glTexture2d;
您可以选择在 GPU 上独占使用 CI;初始化一个 CIContext 例如。
_CIglContext = [CIContext contextWithEAGLContext:_glContext options:opts]
;
现在iOS平台有很多过滤器,93个过滤器左右?
当您的应用程序临时在后台运行时,您可以选择使用 CPU 独占处理缓冲区,但不建议这样做。
这些都在 WWDC2012 session video, Core Image 部分提到。看看,也许你会在那里找到你的解决方案。
【讨论】:
以上是关于iOS 5.0 中的 Core Image 过滤器对于实时视频处理是不是足够快?的主要内容,如果未能解决你的问题,请参考以下文章
如何关联 UIKit、Core Image、Quartz 2D 以及 iOS 中的各种框架?
Quartz Composer - 如何为Core Image过滤器指定目标大小?