正式开始之前先介绍一下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来进行编码才能通过。
AMD RX 7700XT显卡曝光,AMD RX 6400预计5月10发布
JDI将启用新工厂,因中国厂商订单增加
售价2999的OPPO R11,还是不是高价低配?
秒懂STEP 7-MicroWIN SMART V2.3软件的安装及使用
2018年华为研发投入击败苹果高通等公司总额排名全球第五
GPUImage简单实用及碰到的问题
金属端子电容器的啸叫降低作用
富士通:2012 MCU在新能源汽车中的创新应用
AI重构医患关系 需建立全新一代智能医疗系统
LED驱动器的拓扑结构应该如何选择
台积电将启动1.4nm制程研发,欲保持其领先地位
小米6什么时候上市:高通猪队友本色再现,小米6或再遇小米5之痛
滴滴宣布成立人工智能实验室 加大AI领域投入
模电应该如何学习
可媲美iPad的20款平板电脑
奋达科技:公司智能穿戴产品的主要客户包括华为、飞利浦等
韦乐平谈ROADM后续演进
逻辑门电路有关概念
未来车联网在实际应用中的形式
可简化电动汽车启动发电机设计的12V和48V通用型驱动器平台