短視訊系統,獲取camera的的影像並儲存

zhibo系統開發發表於2021-10-12

短視訊系統,獲取camera的的影像並儲存實現的相關程式碼

要想儲存camera中的影像就要用到ImageReader

ImageReader中有surface,將這個surface設定到

CaptureRequest和CameraCaptureSession中。

ImageReader的建立

 public static @NonNull ImageReader newInstance(
            @IntRange(from = 1) int width,
            @IntRange(from = 1) int height,
            @Format             int format,
            @IntRange(from = 1) int maxImages)


建立imagerader我們需要的引數

width:我們要讀取圖片的寬

height  我們要讀取圖片的高

format 我們要讀取圖片的格式 ,特別要注意不支援ImageFormat.NV21。我們可以從原始碼中看到

  protected ImageReader(int width, int height, int format, int maxImages, long usage) {
       
         .......
        if (format == ImageFormat.NV21) {
            throw new IllegalArgumentException(
                    "NV21 format is not supported");
        }
    .......
}

maxImages 表示我們最多可以同時從ImageRader中獲取多少張圖片。獲取的越多,需要的buffer也就越多。所以這裡要注意。

我們知道camera可以支援很多解析度,那麼我們就從camera當中,找到我們支援的寬高

所以就有了下面的程式碼

從camera中獲取寬高的方法

CameraCharacteristics characteristics = cameraManager.getCameraCharacteristics(backCameraId);
            StreamConfigurationMap map = characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
            Size largest = Collections.max(Arrays.asList(map.getOutputSizes(ImageFormat.YUV_420_888)), new CompareSizesByArea());

建立ImageRader

 mImageReader = ImageReader.newInstance(largest.getWidth(), largest.getHeight(),
                    ImageFormat.YUV_420_888, 2);
            width = largest.getWidth();
            height = largest.getHeight();

獲取到寬高後我們建立ImageRader設定到CameraCaptureSession

 OutputConfiguration outputConfiguration = new OutputConfiguration(binding.surfaceView.getHolder().getSurface());
            OutputConfiguration imageReaderOutputConfiguration = new OutputConfiguration(mImageReader.getSurface());
            List<OutputConfiguration> outputs = new ArrayList<>();
            outputs.add(outputConfiguration);
            outputs.add(imageReaderOutputConfiguration);
            SessionConfiguration sessionConfiguration
                    = new SessionConfiguration(SessionConfiguration.SESSION_REGULAR,
                    outputs,
                    mExecutorService,
                    new CameraCaptureSession.StateCallback() {
                        @Override
                        public void onConfigured(@NonNull CameraCaptureSession session) {
                            
                        }
 
                        @Override
                        public void onConfigureFailed(@NonNull CameraCaptureSession session) {
 
                        }
                    }
            );
 
            mCamera.createCaptureSession(sessionConfiguration);


 我們將ImageReader設定到CaptureRequest


    private void record() {
        try {
            Log.e("CameraActivity", "record");
            i = 0;
            File file = new File(savePicPath);
            DirUtil.deleteDir(file);
            final CaptureRequest.Builder builder
                    = mCamera.createCaptureRequest(CameraDevice.TEMPLATE_RECORD);
            builder.addTarget(binding.surfaceView.getHolder().getSurface());
            builder.addTarget(mImageReader.getSurface());
            OutputConfiguration outputConfiguration = new OutputConfiguration(binding.surfaceView.getHolder().getSurface());
            OutputConfiguration imageReaderOutputConfiguration = new OutputConfiguration(mImageReader.getSurface());
            List<OutputConfiguration> outputs = new ArrayList<>();
            outputs.add(outputConfiguration);
            outputs.add(imageReaderOutputConfiguration);
            SessionConfiguration sessionConfiguration
                    = new SessionConfiguration(SessionConfiguration.SESSION_REGULAR,
                    outputs,
                    mExecutorService,
                    new CameraCaptureSession.StateCallback() {
                        @Override
                        public void onConfigured(@NonNull CameraCaptureSession session) {
 
                        }
 
                        @Override
                        public void onConfigureFailed(@NonNull CameraCaptureSession session) {
 
                        }
                    }
            );
 
            mCamera.createCaptureSession(sessionConfiguration);
 
        } catch (Exception e) {
 
        }
 
    }


以上就是短視訊系統,獲取camera的的影像並儲存實現的相關程式碼, 更多內容歡迎關注之後的文章


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69978258/viewspace-2795528/,如需轉載,請註明出處,否則將追究法律責任。

相關文章