android camera surfacetexture使用

/ Android / 没有评论 / 2146浏览

需求:有时候我们预览camera并不想直接输出camera捕获的图像而是想二次加工图像后再预览比如美颜、滤镜等等。这是我们可以用surfacetexture方案解决。

部分代码:

surfaceView.getHolder().addCallback(new SurfaceHolder.Callback() {
    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        mCamera = Camera.open(1);

        mCamera.setPreviewCallback(new Camera.PreviewCallback() {
            @Override
            public void onPreviewFrame(byte[] data, Camera camera) {
                //这里你可以做美颜或滤镜然后渲染到surfaceview或glsurfaceview等等
                Log.e("onPreviewFrame", 
                    "onPreviewFrame() called with: data = [" + data + "], camera = [" + camera + "]");
            }
        });

        try {
	    //这里有坑,不能用匿名对象必须传入有名字的对象,不然onPreviewFrame里只能得到有限几帧数据。
            mCamera.setPreviewTexture(surfaceTexture);
           //mCamera.setPreviewTexture(new SurfaceTexture(0))千万别这样写,定位此bug花费了不少力气;
        } catch (IOException t) {
        }
        mCamera.startPreview();
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {

    }
});