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地址

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章