Android相机API2,基于GLSurfaceView+SurfaceTexture实现相机预览,集成的相机算法采用GPU方案,简要流程如下(不叠加相机算法的预览显示流程也大体如此,只是去掉了算法部分):
进入相机:
1,新建实现了GLSurfaceView.Renderer接口的自定义类CameraRenderer,初始化GLSurfaceView,将两者绑定在一起,GLSurfaceView作为View组件来显示相机预览;
相机启动:
1,在起预览配流时,创建SurfaceTexture,用它来接收相机预览数据;
OpenGL初始化:
1,在Surface创建时会触发回调CameraRenderer.onSurfaceCreated,在里面获取当前的GLSurfaceView的EGLContext,并将其传递给相机算法,使得允许相机算法和GLSurfaceView共享GPU资源;
循环渲染:
1,当有预览帧来时,触发回调SurfaceTexture.OnFrameAvailable,在里面调用glSurfaceView.requestRender进行重绘;
2,glSurfaceView.requestRender中释放锁唤醒GLThread的线程执行,里面循环检查是否需要进行绘制,需要的话就调CameraRenderer.onDrawFrame;
3,onDrawFrame中调surfaceTexture.updateTexImage,将最新的相机预览帧数据更新到SurfaceTexture内部的纹理中;
4,调算法处理接口,输入纹理ID,输出也是纹理ID;
5,将这个纹理ID作为数据源,绘制到GLSurfaceView上,至此预览完成这一帧显示;后续重复“循环渲染”的步骤;
总结:
1,创建GLSurfaceView,这个作为View组件显示相机预览;
2,在相机起预览配流时,创建SurfaceTexture,用来接收相机预览数据;
3,OpenGL要初始化;
4,最后就是循环绘制的流程,当有预览帧来时,触发回调SurfaceTexture.OnFrameAvailable,在里面触发重绘,更新最新预览数据到SurfaceTexture内部纹理中,将纹理ID输入算法进行处理,算法处理后输出更新后的纹理ID,最后将这个纹理ID作为数据源绘制到GLSurfaceView上;
UML类图如下。