概念:

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();
        }
    }