注:本文档参考https://blog.youkuaiyun.com/lb377463323/article/details/77071054大家可以看看他的讲解,我用的代码是在他的基础上更改的,并在代码里合适的地方加入了注解,由于我还不会gitHub所以直接在这里贴代码了。(现已改为百度链接)
注意!注意!注意!
一定要去看他的讲解,我能力有限说的没他好,不过我还是决定把他全搬过来了,望谅解!!!
首先讲一下,本文不使用Camera的PreviewCallback预览回调接口,因为onPreviewFrame()获取的数据格式只能是NV21或NV12,除非修改HAL层代码,一般情况下NV21或NV12需要转成RGB格式然后进行处理,这样太耗时了,所以本文使用SurfaceTexture来获取预览图像。
1. 添加GLSurfaceView作为布局界面
伪代码如下,这个不细讲了,可以参考我之前的博客 Android初始化OpenGL ES,并且分析Renderer子线程原理
//实例化一个GLSurfaceView
mGLSurfaceView = new GLSurfaceView(this);
//配置OpenGL ES,主要是版本设置和设置Renderer,Renderer用于执行OpenGL的绘制
mGLSurfaceView.setEGLContextClientVersion(2);
mGLSurfaceView.setRenderer(new GLSurfaceView.Renderer());
//在屏幕上显示GLSurfaceView
setContentView(mGLSurfaceView);
2. 在onCreate方法中开启相机并设置参数(本文只使用后置摄像头)
mCameraId = Camera.CameraInfo.CAMERA_FACING_BACK;
mCamera = Camera.open(mCameraId)
Camera.Parameters parameters = mCamera.getParameters();
parameters.set("orientation", "portrait");
parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);
parameters.setPreviewSize(1280, 720);
mCamera.setDisplayOrientation(90)
setCameraDisplayOrientation(mActivity, mCameraId, mCamera);
mCamera.setParameters(parameters);
3. GLSurfaceView创建好OpenGL ES的环境后,在Renderer的onSurfaceCreated()中,创建一个外部纹理用于接收预览数据
public static int createOESTextureObject() {
int[] tex = new int[1];
//生成一个纹理
GLES20.glGenTextures(1, tex, 0);
//将此纹理绑定到外部纹理上
GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, tex[0]);
//设置纹理过滤参数
GLES20.glTexParameterf(GLES11Ext.GL_TEXTURE_EXTERNAL_OES,
GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST);
GLES20.glTexParameterf(GLES11Ext.GL_TEXTURE_EXTERNAL_OES,
GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR);
GLES20.glTexParameterf(GLES11Ext.GL_TEXTURE_EXTERNAL_OES,
GL10.GL_TEXTURE_WRAP_S, GL10.GL_CLAMP_TO_EDGE);
GLES20.glTexParameterf(GLES11Ext.GL_TEXTURE_EXTERNAL_OES,
GL10.GL_TEXTURE_WRAP_T, GL10.GL_CLAMP_TO_EDGE);
//解除纹理绑定
GLES20.