为基于GPU的图像和视频处理一个开源的iOS框架

添加时间:2015-12-31 21:28:53 编辑:林海财 阅读:116


概观

该GPUImage框架是一个基于BSD授权的iOS库,让您应用GPU加速的滤镜和其他效果的图像,现场摄像头视频和电影。相较于核心映像(的iOS 5.0的一部分),GPUImage允许你写自己的自定义过滤器,支持部署到iOS 4.0,并具有简单的界面。但是,它目前缺乏一些核心形象的更先进的功能,如面部检测。

对于像处理图像或实况视频帧大规模并行运算,图形芯片拥有超过CPU的一些显著的性能优势。在iPhone 4,一个简单的图像过滤器可以更快的超过100倍的GPU比同等的基于CPU的过滤器执行。

然而,在GPU上运行自定义过滤器需要大量的代码来设置和维护的OpenGL ES 2.0的渲染目标,这些过滤器。

发现有很多的样板代码我曾在它的创作来写。因此,我把这个共同的框架,封装了大量的处理图像和视频的时候,并提出它,这样你不必关心OpenGL ES 2.0的基础,你会遇到的共同任务。

处理视频时,同时在iPhone 4只有2.5毫秒,从相机上传一个框架,应用伽马过滤器和显示,相对于106毫秒,使用核心图像相同的操作这个框架媲美核心映像。基于CPU的处理需要460毫秒,使GPUImage 40X比核心图像更快在此硬件这一操作,而且184X的速度比CPU密集型的处理。在一个iPhone 4S,GPUImage仅比4倍的图像核心更快这种情况下,和102X比CPU绑定的处理速度更快。但是,对于像高斯更复杂的操作在模糊半径越大,图像核心目前赶不上GPUImage。

技术要求

  • OpenGL ES 2.0的:应用程序中使用这不会对原来的iPhone,iPhone 3G的运行,第一和第二代iPod触摸
  • iOS 4.1的作为部署目标(4.0没有需要阅读的电影一些扩展)。如果你想拍摄静止图像时,显示实时视频预览的iOS 4.3是需要作为部署目标。
  • 的iOS 5.0 SDK构建
  • 设备必须有一个摄像头使用相机有关的功能(显然)
  • 该框架使用自动引用计数(ARC),而应该支持同时使用ARC,如果加入一个子项目说明如下手动引用计数的项目。对于面向iOS的4.x的手动引用计数的应用程序,你需要-fobjc弧添加到其它链接器标记为您的应用程序项目。

一般建筑

GPUImage使用OpenGL ES 2.0着色器进行图像和视频的处理速度远远超过能够在CPU密集型的程序来完成。然而,它隐藏在一个简单的Objective-C接口的OpenGL ES API交互的复杂性。此界面,可以定义图像和视频输入源,在链连接器,并将得到的处理后的图像或视频发送到屏幕上,以一个UIImage,或者一部电影在磁盘上。

图像或视频的帧从源对象,这是GPUImageOutput的子类上传。这些措施包括GPUImageVideoCamera(适用于从iOS摄像头的实况视频),GPUImageStillCamera(与相机拍照),GPUImagePicture(适用于静止图像),并GPUImageMovie(电影)。源对象上传的静止图像帧的OpenGL ES的纹理,然后用手那些纹理关在处理链的下一个对象。

过滤器和其他后续元素链符合GPUImageInput协议,这让他们采取从链中的一个链接提供的或加工的质感和用它做什么。对象一步环比下滑被认为是目标,处理可以通过添加多个目标到单个输出或过滤器分支。

例如,一个应用程序,在视频直播需要从相机,其转换视频深褐色调,然后显示在屏幕上的视频将成立一个链看起来像如下:

GPUImageVideoCamera -> GPUImageSepiaFilter -> GPUImageView

添加静态库到iOS项目

注意:如果你想在一个项目雨燕使用这个,你需要使用的,而不是下面的“添加此作为一个框架”一节中的步骤。斯威夫特需要第三方代码模块。

一旦你有框架的最新源代码,这是相当简单的将其添加到您的应用程序。通过拖动GPUImage.xcodeproj文件到您的应用程序的Xcode项目嵌入到你的项目的框架开始。接下来,转到您的应用程序的目标,并添加GPUImage为目标依赖。最后,你会想从GPUImage框架的产品文件夹链接二进制拖动libGPUImage.a图书馆与图书馆在构建应用程序的目标阶段。

GPUImage需要一些其他的框架被链接到应用程序,所以你需要添加以下内容作为您的应用程序的目标链接库:

  • CoreMedia
  • corevideo的
  • OpenGLES
  • AVFoundation
  • QuartzCore

您还需要找到框架头,所以在项目的构建设置从应用程序到GPUImage源目录中的框架/子目录设置标题搜索路径的相对路径。让这个头搜索路径递归。

在应用程序中使用GPUImage类,只需使用下面包括核心框架标题:

#import "GPUImage.h"

作为一个注意:如果你想建立与界面生成器的界面时遇到错误“未知的类GPUImageView在Interface Builder”或类似的,你可能需要在-ObjC项目的构建设置添加到您的其它链接器标记。

另外,如果你需要将此部署到iOS 4.x的,看来Xcode中的当前版本(4.3)要求您薄弱环节在最终应用程序的核心视频框架或看到与消息崩溃“找不到符号:_CVOpenGLESTextureCacheCreate“当你创建上传到App Store或临时分发归档。要做到这一点,去你的项目的构建阶段选项卡,展开链接二进制库群,并在列表中找到CoreVideo.framework。更改它的设置在最右边的列表,从需要可选。

此外,这是一个支持ARC的框架,所以如果你想手动引用计数的应用中定位iOS 4.x版中使用这一点,你需要-fobjc弧添加到您的其它链接器标记为好。

在命令行中建立一个静态库

如果你不希望包括项目作为应用程序的Xcode项目的依赖,可以打造为iPhone模拟器或设备的通用静态库。要做到这一点,运行build.sh在命令行。由此产生的库和头文件将位于build/Release-iphone您也可以通过改变改变了iOS SDK版本IOSSDK_VER变量build.sh(所有可用版本可以使用找到xcodebuild -showsdks)。

添加此作为一个框架(模块)到你的Mac或iOS项目

Xcode的6和iOS 8支持采用全框架一样,在Mac上,从而简化了添加以下内容到应用程序的过程。这种添加到您的应用程序,我建议拖着.xcodeproj项目文件到您的应用程序的项目(就像在静态库的目标)。

对于您的应用程序,去它的目标构建设置,选择生成阶段选项卡。根据该目标相关分组,在iOS(不GPUImage,它建立静态库)或GPUImage在Mac上添加GPUImageFramework。下的链接二进制与图书馆部分,添加GPUImage.framework。

这应当引起GPUImage建立一个框架。在Xcode中6,这也将建立一个模块,这将让你在斯威夫特项目中使用此。当设置为上面,你应该只需要使用

import GPUImage

拉进去。

然后,您需要添加一个新的复制文件构建阶段,设置目的地框架和GPUImage.framework建立产品补充。这将允许框架与应用程序捆绑在一起(否则,你会看到神秘的“dyld的:库未加载:@ rpath的/ GPUImage.framework / GPUImage”关于执行错误)。

文档

文档是从头部注释使用appledoc产生。要构建文档,切换到Xcode中的“文档”方案。您应该确保“APPLEDOC_PATH”(用户定义的版本设定)指向一个appledoc二进制文件,可用Github上它也将建立和安装一个.docset文件,你可以用你喜欢的文档工具查看。

项目源码