概念:
ImageReader 通过这个类进行读取码流。具体流程如下:
步骤一:新建ImageReader类,设置回调摄像机分辨率,以及回调图像格式
mPreviewImageReader = ImageReader.newInstance(1280,720,ImageFormat.YUV_420_888,2);
步骤二:设置数据回调
mPreviewImageReader.setOnImageAvailableListener(videoCallback,null);
ImageReader.OnImageAvailableListener videoCallback = new ImageReader.OnImageAvailableListener() {
@Override
public void onImageAvailable(ImageReader reader) {
Image image = reader.acquireNextImage();
Log.i(tag,"image format: " +image.getHeight()+" "+image.getWidth());
Image.Plane[] planes = image.getPlanes();
int n_image_size = image.getWidth()*image.getHeight()*3/2;
image.close();
}
};
步骤三:添加到预览里面
private void takePreview() {
try {
// 创建CameraCaptureSession,该对象负责管理处理预览请求和拍照请求
mCameraDevice.createCaptureSession(Arrays.asList(mSurfaceHolder.getSurface(),mPreviewImageReader.getSurface()), new CameraCaptureSession.StateCallback() // ③
{
@Override
public void onConfigured(CameraCaptureSession cameraCaptureSession) {
if (null == mCameraDevice) return;
// 当摄像头已经准备好时,开始显示预览
mCameraCaptureSession = cameraCaptureSession;
try {
// 创建预览需要的CaptureRequest.Builder
final CaptureRequest.Builder previewRequestBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
// 将SurfaceView的surface作为CaptureRequest.Builder的目标
previewRequestBuilder.addTarget(mSurfaceHolder.getSurface());
previewRequestBuilder.addTarget(mPreviewImageReader.getSurface());
// 自动对焦
previewRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
// 打开闪光灯
previewRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH);
// 显示预览
CaptureRequest previewRequest = previewRequestBuilder.build();
mCameraCaptureSession.setRepeatingRequest(previewRequest, null, null);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
@Override
public void onConfigureFailed(CameraCaptureSession cameraCaptureSession) {
Toast.makeText(FaceActivity.this, "配置失败", Toast.LENGTH_SHORT).show();
}
}, null);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}