android-camera2相机开发【5】-获取、处理预览帧数据

camera2 api 中使用 ImageReader 类间接获取预览帧数据。

ImageReader 使用之前,需要设置一个监听 OnImageAvailableListener,在预览帧可用时会被回调,在回调方法中可以接收到预览帧,并实现具体的处理逻辑。

然后,获取 ImageReader 的 Surface ,在创建相机捕获会话时,添加进去作为输出Sruface。

最后,构建捕获请求时,需要将 ImageReader 的 Surface 添加进去。

        //获取 ImageReader 和 surface
        //前三个参数分别是需要的尺寸和格式,最后一个参数代表每次最多获取几帧数据,本例的2代表ImageReader中最多可以获取两帧图像流
        previewReader = ImageReader.newInstance(previewSize.getWidth(), previewSize.getHeight(), ImageFormat.JPEG, 2);
        previewReader.setOnImageAvailableListener(
                new ImageReader.OnImageAvailableListener() {
                    @Override
                    public void onImageAvailable(ImageReader reader) {
                        //获取预览帧数据
                        Image image = reader.acquireLatestImage();
                        //处理逻辑
                        if (image != null){
                            ByteBuffer buffer = image.getPlanes()[0].getBuffer();
                            byte[] data = new byte[buffer.remaining()];
                            Log.d(TAG, "data-size=" + data.length);
                            buffer.get(data);
                            image.close();
                        }
                    }
                },
                null);
        
        //获取 ImageReader 的 Surface
        final Surface readerSurface = previewReader.getSurface();
        
        //预览帧数据会同时输出到 previewSurface,readerSurface
        cameraDevice.createCaptureSession(Arrays.asList(previewSurface, readerSurface),
                    new CameraCaptureSession.StateCallback() {
                        ……
                    });
        
        //构建预览捕获请求时,添加 readerSurface
        CaptureRequest.Builder builder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
        builder.addTarget(readerSurface);

项目github地址

    原文作者:昵称真难选
    原文地址: https://www.jianshu.com/p/4879afda4f0d
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞