有没有人能推荐一个非常快的 API,最好是使用 CPU 进行 NEON 优化,以便在 iPhone 上运行时进行 YUV 到 RGB 转换?遗憾的是,加速框架的 vImage 并没有提供合适的内容。使用 vDSP,将其转换为浮点数再转回来似乎不太优秀,而且几乎和编写 NEON 代码一样麻烦。
我知道如何通过着色器在 GPU 上完成这项任务,并且实际上已经在显示主视频平面时使用了 GPU。不幸的是,我还需要在运行时创建和保存显示区域的 RGBA 纹理。对于这个问题,大多数好的答案都涉及使用着色器,但我不想在 GPU 上执行额外的工作,因为:
(1)虽然我可以使用 RenderTextures 和我的 YUV 着色器来转换和缓存区域,但我不想给应用程序增加任何更多的同步 / 复杂性。(我已经将纹理从 CVTextureCache 传递到 Unity3D 中……在许多情况下,我已经在 Unity3D 的背后切换 OpenGL 状态,不想再做任何调试……)
(2)更实际的是,我正在编写一个游戏,没有任何 GPU 可以浪费(因为游戏通常没有 - 在过去几年中,我已经做了更多的演示,介绍如何将东西从 GPU 转移到 CPU 上,而不是反过来......)
(3)在 iPad 上,我有一个闲置的核心。
虽然有许多库可以执行 YUV 到 RGBA 转换,但我很想节省编写自己 NEON 版本的时间。现在我正在使用 OpenCV 的实现方式:
我知道如何通过着色器在 GPU 上完成这项任务,并且实际上已经在显示主视频平面时使用了 GPU。不幸的是,我还需要在运行时创建和保存显示区域的 RGBA 纹理。对于这个问题,大多数好的答案都涉及使用着色器,但我不想在 GPU 上执行额外的工作,因为:
(1)虽然我可以使用 RenderTextures 和我的 YUV 着色器来转换和缓存区域,但我不想给应用程序增加任何更多的同步 / 复杂性。(我已经将纹理从 CVTextureCache 传递到 Unity3D 中……在许多情况下,我已经在 Unity3D 的背后切换 OpenGL 状态,不想再做任何调试……)
(2)更实际的是,我正在编写一个游戏,没有任何 GPU 可以浪费(因为游戏通常没有 - 在过去几年中,我已经做了更多的演示,介绍如何将东西从 GPU 转移到 CPU 上,而不是反过来......)
(3)在 iPad 上,我有一个闲置的核心。
虽然有许多库可以执行 YUV 到 RGBA 转换,但我很想节省编写自己 NEON 版本的时间。现在我正在使用 OpenCV 的实现方式:
cv::cvtColor(avFoundationYUVCaptureMat, BGRAInputImage, CV_YUV420sp2BGRA, 4);
这是正确的,但速度非常慢。
如果有人之前看过其他实现(CoreImage?FFMpeg?),并且可以推荐一个,我将非常感激。
谢谢, Alex。