Android基于共享texture(surfaceTexture)实现glSurfaceView高效camera预览

    处理和渲染视频需要较高的性能,而移动端的cpu性能有限,所以在处理和渲染视频的时候尽量要用gpu的能力,在移动设备里主要是opengles api的使用,今天主要想介绍一下通过共享texture(surfacetexture)来实现Android camera的高效预览。

    在本文中主要介绍Android camera预览,用opengl shader对camera数据进行简单的对比度处理,然后在glSurfaceView预览,其中避免直接操作yuv裸数据,通过共享texture完成数据传递,大致原理图见下:

    


    本方案的思路就是camera预览不采用直接到View和数据回调的方式,而是采用setPreviewTexture方式,将camera数据预览到surfaceTexture,surfaceTexture由于opengl 中texture关联,数据准备好后surfaceTexture中onFrameAvailable回调通知Render开始处理,通过updateImage将surfaceTexture数据更新到texture,然后进行处理,最后显示到glSurfaceView上。

    Demo资源下载:https://download.csdn.net/download/cmshao/10371209 

    Demo中实现了一个类MyGLSurfaceView,继承自GLSurfaceView,实现GLSurfaceView.Render和SurfaceTexture.OnFrameAvailableListener接口,GLSurfaceView rendermode位RENDERMODE_WHEN_DITY,靠onFrameAvailable中调用requestRender驱动,texture绑定需要GLES11Ext.GL_TEXTURE_EXTERNAL_OES类型,Fragement中需要声明extension GL_OES_EGL_image_external : require。

    引用参考链接:

    https://developer.android.com/training/graphics/opengl/index.html

    https://github.com/muojie/PlayCamera_V3.0.0