1.变焦的时候是根据 rect来设定的,但是rectzoom大小要注意,超出maxZoom大小会导致预览卡死,cameraError;
public int setZoom(int curZoom) {
if(curZoom < maxZoom){
curZoom = (int) (curZoom / 2f);//矩形 缩短的是前后两端的定点,刚好是2倍,我们这里提前除以2
if (mRecordSession == null)//还未开启预览
return 0;
int minW = (int) (rectInit.width() / maxZoom);
int minH = (int) (rectInit.height() / maxZoom);
int difW = rectInit.width() - minW;
int difH = rectInit.height() - minH;
int cropW = (int) (difW * (curZoom / maxZoom));
int cropH = (int) (difH * (curZoom / maxZoom));
cropW -= cropW & 3;
cropH -= cropH & 3;
zoomRect = new Rect(cropW, cropH, rectInit.width() - cropW, rectInit.height() - cropH);
mPreviewRequestBuilder.set(CaptureRequest.SCALER_CROP_REGION, zoomRect);
CaptureRequest previewRequest = mPreviewRequestBuilder.build();
try {
mRecordSession.setRepeatingRequest(previewRequest, null, mBackgroundHandler);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
return (int) (curZoom*2f/stepZoom +1);
}
rectInit获取
//原始 预览rect大小
rectInit = mCharacteristics.get(CameraCharacteristics.SENSOR_INFO_ACTIVE_ARRAY_SIZE);
2.camera2坐标系 与camera1有别,设置对焦,测光,白平衡Rect一定要注意区别
camera1坐标系rect(-1000,-1000,1000,1000)
camera2坐标系rect(0,0,previewWidth,previewHeight)
3.camera2 yuv数据需要单独请求才会返回,yuv宽高可以跟预览宽高不一致(测试发现个别手机不支持预览、yuv分辨率不一致,所以建议使用一致的),但比例应当一致capture请求如下:
1).设定imageReader
//返回指定宽高的yuv 数据
mYuvImageReader = ImageReader.newInstance(mCameraParamters.previewWidth, mCameraParamters.previewHeight,
ImageFormat.YUV_420_888, /*maxImages*/2);
mYuvImageReader.setOnImageAvailableListener(
mOnImageAvailableListener, mBackgroundHandler);
2).加入到repeating请求中
mPreviewRequestBuilder.addTarget(mYuvImageReader.getSurface());//yuv surface
// mPreviewRequestBuilder.addTarget(mYuvImageReader.getSurface());// 设置yuv回调surface ,如果需要yuv,需要打开注释
mCameraDevice.createCaptureSession(Arrays.asList(mSurface, mImageReader.getSurface(),mYuvImageReader.getSurface()),
recordSessionStateCallback, null
);
网友评论