除了用第三方库做视频或者拍照之外,想学些一下基础的东西,但是刚开了个头就碰到了钉子,记录一下过程,万一有点用呢?
原以为使用SurfaceView+Camera绑定、然后在回调中获得画面字节,处理后再次写回Surface View即可,但是实际测试后发现,设置预览窗口后,不能再次锁定画布:
camera.setPreviewDisplay(this.surfaceView1.getHolder());
尝试在相机预览回调中锁定并重写画布:
camera.setPreviewCallback((bytes, camera) -> {
SurfaceHolder surfaceHolder = surfaceView1.getHolder();
Canvas canvas = surfaceHolder.lockCanvas();//此处会抛异常
...
});
异常如下:
SurfaceHolder: Exception locking surface
java.lang.IllegalArgumentException
at android.view.Surface.nativeLockCanvas(Native Method)
at android.view.Surface.lockCanvas(Surface.java:331)
at android.view.SurfaceView$3.internalLockCanvas(SurfaceView.java:1059)
at android.view.SurfaceView$3.lockCanvas(SurfaceView.java:1019)
就是说当前的SurfaceView画布已经被相机Lock了,无法再次人为Lock并写入。