需求:有时候我们预览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) { } });