正式开始以前先介绍一下GPUImage,这是一款基于OpenGL ES 2.0的开源图像处理库。在iOS上将OpenGL ES的使用封装成Objective-C接口,能够用来给图像、相机视频、视频等添加滤镜等渲染操做。GPUImage一代已经再也不维护,OC只能给iOS和Mac使用;同时有GPUImage2使用Swift(基于Swift 3)开发,能够给Mac, iOS和Linux使用;最新的GPUImage3仍在开发完善中,基于Swift4,而且将OpenGL ES替换成苹果的Metal,因为是苹果官方封装GPU方法,能够预见会比使用OpenGL ES的性能效率更高。本文使用的还是第一代GPUImage。微信
接入GPUImage使用cocoapods直接接入就行,就再也不赘述。下面是一个简单的滤镜使用:网络
GPUImage使用有三个关键点,input, output, filter(filter也是output但主要实现了滤镜,因此分开说)。output通常是用来承载图像内容输出,能够是GPUImageUIElement(经过UIView来建立并承载整个UIView的内容), GPUImagePicture(使用UIImage或者CGImage之类的图像来建立);filter就是所使用的滤镜,可使用GPUImage自带的好比GPUImageGaussianBlurFilter, GPUImageColorInvertFilter等等,固然也能够自建Filter来实现一些本身所须要的滤镜,固然也须要一些OpenGL的功底;input则是内容输入须要GPUImage进行一些处理的,下面用一个MovieWriter进行视频和一个动态画面进行合成来举例:工具
使用中初版没有提到声音问题因此没有发现,第二版须要使用视频原声音并录制进去,查了一下能够这样使用:性能
录制开始会有随机闪退问题,网上查了一下,大体是由于音频处理比视频处理快,当音频处理完直接callback去作渲染处理了,但这时视频这帧尚未加载完成,致使处理失败崩溃,网上有一个替换GPUImageMovieWriter.m源文件的方法来规避这个问题,但我尝试了一下仍然会发生,就不贴出来了。暂时也没有更好的办法来修复这个问题,因为时间紧迫,我采起只传递声音而取消写入视频中,使用ffmpeg进行音视频合成(或其余视频处理工具,由于自己项目有视频剪切使用了ffmpeg)。若是之后对这方面有更深刻的了解和研究会继续更新如何解决这个问题。编码
PS: 说个题外关于视频编码问题,腾讯家的qq和微信SDK分享视频只能分享网络源没法分享本地源,但若是经过苹果系统自带的分享则能够分享视频。最新版部分视频会发生视频压缩失败的问题,没法上传。起先认为是视频编码问题,经过ffmpeg从新使用h264或者libx264都没法解决;后来发现那些没法经过腾讯系压缩的是音频从新合成过的,因此我对音频从新编码,使用的是网络上流媒体目前比较通用的aac,结果让我大失所望,仍是不行!网上也找不到腾讯有关这两款分享视频所须要的编码问题,而若是我不经过ffmpeg进行编辑,原视频的H.264+aac就是好的,没有办法只能采起控制变量法来一个一个试编码。最后测出来是视频H.264没有问题,音频则须要使用ac3来进行编码才能经过。3d