android-camera2相機開發【5】-獲取、處理預覽幀數據

camera2 api 中使用 ImageReader 類間接獲取預覽幀數據。java

ImageReader 使用以前,須要設置一個監聽 OnImageAvailableListener,在預覽幀可用時會被回調,在回調方法中能夠接收到預覽幀,並實現具體的處理邏輯。android

而後,獲取 ImageReader 的 Surface ,在建立相機捕獲會話時,添加進去做爲輸出Sruface。git

最後,構建捕獲請求時,須要將 ImageReader 的 Surface 添加進去。github

//獲取 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地址api

相關文章
相關標籤/搜索