Skip to content

Latest commit

 

History

History
87 lines (69 loc) · 3.2 KB

File metadata and controls

87 lines (69 loc) · 3.2 KB

使用GLSurfaceView实现相机预览,可支持滤镜等数据处理,最简单的demo,便于理解数据传递流程。

public class CameraRecordRenderer implements GLSurfaceView.Renderer {

    private final Context mApplicationContext;
    private int mTextureId = GlUtil.NO_TEXTURE;
    private FullFrameRect mFullScreen; // 绘制的主要实现,包含滤镜、数据处理等
    private SurfaceTexture mSurfaceTexture; // 显示纹理
    private final float[] mSTMatrix = new float[16];

    private SurfaceTexture.OnFrameAvailableListener mOnFrameAvailableListener;

    public CameraRecordRenderer(Context applicationContext) {
        mApplicationContext = applicationContext;
    }

    @Override public void onSurfaceCreated(GL10 gl, EGLConfig config) {
        Matrix.setIdentityM(mSTMatrix, 0);
        mFullScreen = new FullFrameRect(FilterManager.getCameraFilter(FilterManager.FilterType.Normal, mApplicationContext));
        mTextureId = GlUtil.createTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES);
        mSurfaceTexture = new SurfaceTexture(mTextureId); // 通过mTextureId将view和数据绑定
        mSurfaceTexture.setOnFrameAvailableListener(mOnFrameAvailableListener);
    }

    @Override public void onSurfaceChanged(GL10 gl, int width, int height) {
        if (gl != null) {
            gl.glViewport(0, 0, width, height);
        }

        // 打开相机预览,有数据时就会通过mSurfaceTexture回调回来
        CameraHelperAsy.getInstance().setupCameraAsy(mApplicationContext);
        CameraHelperAsy.getInstance().startPreviewAsy(mSurfaceTexture);
    }

    @Override public void onDrawFrame(GL10 gl) {
        mSurfaceTexture.updateTexImage();
        mSurfaceTexture.getTransformMatrix(mSTMatrix);
        mFullScreen.drawFrame(mTextureId, mSTMatrix); // 绘制图像
    }

    public void setOnFrameAvailableListener(SurfaceTexture.OnFrameAvailableListener listener) {
        mOnFrameAvailableListener = listener;
    }
}
public class CameraSurfaceView extends GLSurfaceView implements SurfaceTexture.OnFrameAvailableListener {

    private CameraRecordRenderer mCameraRenderer;

    public CameraSurfaceView(Context context) {
        this(context, null);
    }

    public CameraSurfaceView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(context);
    }

    private void init(Context context) {
        setEGLContextClientVersion(2); // 设置OpenGL ES版本为2.0

        mCameraRenderer = new CameraRecordRenderer(context);
        mCameraRenderer.setOnFrameAvailableListener(this); // 为mSurfaceTexture设置回调

        setRenderer(mCameraRenderer); // 设置
        setRenderMode(RENDERMODE_WHEN_DIRTY); // 有数据更新 或者 requestRender时才更新
    }

	@Override public void onPause() {
        CameraHelperAsy.getInstance().closeCameraAsy(); // 关闭相机
        queueEvent(new Runnable() {
            @Override public void run() {
                // 跨进程 清空 Renderer数据
                mCameraRenderer.notifyPausing();
            }
        });

        super.onPause();
    }

    @Override public void onFrameAvailable(SurfaceTexture surfaceTexture) {
        requestRender(); // 有数据来时请求渲染
    }
}