iOS 视频处理的最佳实践

Best Practice for iOS video processing

我一直在研究使用最新技术在 iOS 上进行视频处理的最佳方式,并得到了一些不同的结果。似乎有一些方法可以使用 Core Image、OpenGL 和一些开源框架来做到这一点。我想避开开源选项,这样我就可以了解幕后发生的事情,所以问题是:

我在 iOS 上处理(滤镜、亮度、对比度等)预录视频的最佳选择是什么?

我知道 Core Image 有很多很棒的内置滤镜并且有一个相对简单的 API,但是我还没有找到任何关于如何将视频实际分解为图像然后重新制作的资源编码它们。任何有关此主题的帮助都将非常有用,谢谢。

如您所说,对此您有多种选择。您认为哪个 "best" 将取决于您的具体需求。

最简单的非开源途径可能是使用 Core Image。从 Core Image 视频过滤中获得最佳性能仍然需要一些工作,因为您需要确保为此进行 GPU 端处理。

a benchmark application 我的 GPUImage 框架中,我有以优化方式使用 Core Image 的代码。为此,我设置了 AV Foundation 视频捕获并从像素缓冲区创建了一个 CIImage。 Core Image 上下文设置为渲染到 OpenGL ES 上下文,并且其属性(颜色空间等)设置为快速渲染。我使用的设置是 Core Image 团队在我与他们讨论此事时建议的设置。

走原始的 OpenGL ES 路线是我谈论的事情 here(那里有一个链接示例应用程序),但它确实需要一些设置。它可以为您提供比 Core Image 更多的灵活性,因为您可以编写完全自定义的着色器来以您在 Core Image 中可能无法实现的方式来操作图像。过去它比 Core Image 快,但现在实际上没有性能差距。

然而,构建自己的 OpenGL ES 视频处理管道并不简单,它涉及到一堆样板代码。这就是我在该框架内编写 this, and I and others have put a lot of time into tuning it for performance and ease of use. If you're concerned about not understanding how this all works, read through the GPUImageVideo class 代码的原因。这就是从相机中提取帧并开始视频处理操作的原因。它比我的基准应用程序稍微复杂一些,因为它在大多数情况下从相机接收 YUV 平面帧并在着色器中将其转换为 RGBA,而不是获取原始 RGBA 帧。后者稍微简单一些,但是前者有性能和内存优化。

以上都是在谈论实时视频,但预录视频大同小异,只是 AV Foundation 输入类型不同。我的 GPUImageMovie class 中有代码可以接收预先录制的电影并处理其中的单个帧。它们最终与您从相机捕获的帧位于同一位置。