前言
近期想了解一下 IOS 下是如何进行音视频采集和渲染的。在学习一门新的知识时,很多人都有自己的学习方法,有的是买书学习,有的是看论坛等等不一而终。我的学习习惯是直接找一个比较好的开源项目,去分析它的代码。这样即可以了解到新的知识,又可以知道该如何编写正确的代码。自己的一点小心得哈。
言归正转,我们都知道对于视频的采集,IOS提供了 AVFoundtion 库,这个库非常强大,可以做很多事情。但如果我们要对里边的每个函数都仔细的过一遍的话还是要花不少时间的,而且还可能有很多坑在等着我们。是否有这方面比较好的开源库呢?这样我们不就轻松的跳过了这些坑了吗?于是我发现了GPUImage库。
GPUImage在github上有16304个星,哇,能有几百个星就已经很了不起了,它居然能有上万的星,可见它人气是非常旺的。下面我们来看看 GPUImage 都能干些什么吧。
GPUImage
GPUImage是一个BSD许可的IOS库,它使用GPU加速对图像,实时视频和电影做美颜,灰度等各种特效。在大规模并行运算处理图像或实时视频时,GPU相对于CPU有显著的性能优势。在iPhone4上,一个简单的图像过滤器在GPU上执行的速度比CPU的过滤器快100倍以上。然而,在GPU上运行自定义过滤器需要大量处理OpenGL ES相关的代码。而GPUImage帮我们解决了这些问题,它对 OpengGL ES做了非常好的封装,我们只要调用简单的几个接口就可以做出各种特效来。
GPUImage总体结构
GPUImage使用OpenGL ES 2着色器进行图像和视频处理速度远远超过基于CPU程序做的。而且它提供了简化的Objective-C接口,隐藏了OpenGL复杂的交互。这个接口允许您将图像和视频作为输入源,经过过滤器,最后得到处理的图像或视频的画面。
图像或视频帧可以通过GPUImageVideoCamera、GPUImageStillCamera、GPUImagePicture及GPUImageMovie类获得。
- GPUImageVideoCamera: 从Camera获取的实时视频。
- GPUImageStillCamera: 从Camera获取到的图片。
- GPUImagePicture: 静态图片。
- GPUImageMovie: 电影
图片或帧上传到OpengGL ES后做为纹理,然后将这些纹理传递给处理链中的下一个对象。
例如,一个应用程序,从Camera获取视频,转换视频到深褐色调,然后显示视频到屏幕上。将建立一个链,看起来像下面这样子:
GPUImageVideoCamera -> GPUImageSepiaFilter -> GPUImageView
效果对比图
依赖库
GPUImage依赖下面的几个库:
CoreMedia: AVFoundation常用的功能。 CoreVideo: OpenGL ES 使用的视频基础库。 OpenGLES: 用于图像渲染。 AVFoundation: 音视频基础库。 QuartzCore: 用于渲染、组合和动画视觉元素。