曾经试图在GPUImage这个工程基础之上来开发一个项目,由于这个开源工程很知名,start非常多,就毫不犹豫地将这个工程拿来用了。谁知功能完成进入测试阶段之后,才暴露出各种问题和坑点。
第一个坑点是当一个渲染管道叠加了两个以上的滤镜的时候,稍微低端一点的手机已经在相机预览的时候已经卡得不行了。
第二个坑点是,录制的过程中会概率性的包EGL_BAG_SURFACE错误,然后预览界面就定住了。由于这个问题是OpenGL ES 报错,修复起来还是比较麻烦的。
下面就解决第一个坑点作一些总结:
要在界面上显示相机的预览画面,先要拿到camera 输出的预览图像数据。
而拿到相机的预览数据有两种方法:
第一种是利用 camera.setPreviewCallback()方法,在回调的方法中可以拿到相机的yuv数据,然后将yuv转为RGB数据,得到一张bitmap。然后将bitmap绘制到UI的预览区域。
GpuImage就是利用这种方案。这种方案的弊端在呀,要获得callback的yuv数据,必须在camera.setPreviewCallback()调用camera.setPreviewTexture方法,将预览数据先输入到一个surfaceTexture中,即使这个surfaceTexture不用显示在界面上。这就产生了一个冗余的数据处理过程。
其实如果善于利用camera.setPreviewTexture()方法,camera.setPreviewCallback()是用不着的,而且SurfaceTexture 默认是GPU运算,它的直接可以接受yuv格式的纹理,少了一个转RGB的过程。另外,SurfaceTexture可以更方便地与openGL es API 配合。
只是,在编写shader时,注意,SurfaceTexture的纹理类型和 openGL 绘图时的 fragment shader 中接收预览数据的sample2D 类型都应该是 external_OES的,具体可以参考我写的这个Demo。
欢迎关注我的CSDN和github帐号!