Androoid 视频、图像采集时相机预览时的效率改善问题

曾经试图在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

       近期计划对Android 版的 GPUImage作持续的改进,欢迎关注我的CSDN和github帐号!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章