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