0

我正在使用Camera2 api显示相机的预览画面。我也想实现一个ImageReader来处理图像。我有一个开始预览功能。当我打电话给它时,预览只是黑色。如果我从Arrays.asList()中删除“mimageReader.getSurface()”,我可以看到相机预览。如何显示相机预览并使用ImageReader?Camera2 api with Preview

private void startPreview() 
    { 
     List<Surface> outputSurfaces = new ArrayList<>(); 
     List surfaces = new ArrayList<>(); 

     SurfaceTexture surfaceTexture = textureView.getSurfaceTexture(); 
     surfaceTexture.setDefaultBufferSize(mPreviewSize.getWidth(), mPreviewSize.getHeight()); 
     Surface previewSurface = new Surface(surfaceTexture); 

     try { 
      mCaptureRequestBuilder = _cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW); 




      mCaptureRequestBuilder.addTarget(previewSurface); 

      _cameraDevice.createCaptureSession(Arrays.asList(previewSurface,mimageReader.getSurface()), 
        new CameraCaptureSession.StateCallback() { 
         @Override 
         public void onConfigured(CameraCaptureSession session) { 
          Log.d("", "onConfigured: startPreview"); 

          try { 
           session.setRepeatingRequest(mCaptureRequestBuilder.build(),null,mthreadhandler); 
          } catch (CameraAccessException e) { 
           e.printStackTrace(); 
          } 
         } 

         @Override 
         public void onConfigureFailed(CameraCaptureSession session) { 
          Log.d("", "onConfigureFailed: startPreview"); 

         } 
        }, null); 
     } catch (CameraAccessException e) { 
      e.printStackTrace(); 
     } 
    } 

回答

0

你必须创建的ImageReader的新实例,设置其onImageAvailableListener(你可以在这里处理预览帧),并将其添加到PreviewRequestBuilder。例如:

mImageReader = ImageReader.newInstance(
       mPreviewSize.getWidth(), mPreviewSize.getHeight(), ImageFormat.YUV_420_888, 2); 

mImageReader.setOnImageAvailableListener(mOnGetPreviewListener, mBackgroundHandler); 

mPreviewRequestBuilder.addTarget(mImageReader.getSurface());