2015-07-05 18 views
5

Tôi sử dụng https://github.com/googlesamples/android-Camera2Basic, nhưng cố gắng sửa đổi nó theo cách mà tôi có thể truy cập vào từng khung hình trước khi được vẽ trên bản xem lướt sóng. tôi hiểu, tôi nên thêm bề mặt bổ sung (ImageReader.getSurface()), và đọc các khung từ nó trong callback này:android camera2 xử lý từng khung hình và hiển thị xem trước

private final ImageReader.OnImageAvailableListener mOnImageAvailableListener 
      = new ImageReader.OnImageAvailableListener() { 

     @Override 
     public void onImageAvailable(ImageReader reader) { 

      Log.d("Img", "onImageAvailable"); 
      mBackgroundHandler.post(new ImageSaver(reader.acquireNextImage(), mFile)); 
     } 

    }; 

Vấn đề là gọi lại này được gọi chỉ khi hình ảnh là chụp bởi người sử dụng chứ không phải trên khung eacg được gửi tới màn hình xem trước từ máy ảnh.

Dưới đây là những gì tôi cố gắng thêm:

private void createCameraPreviewSession() { 
     try { 
      SurfaceTexture texture = mTextureView.getSurfaceTexture(); 
      assert texture != null; 

      // We configure the size of default buffer to be the size of camera preview we want. 
      texture.setDefaultBufferSize(mPreviewSize.getWidth(), mPreviewSize.getHeight()); 

      // This is the output Surface we need to start preview. 
      Surface surface = new Surface(texture); 

      // We set up a CaptureRequest.Builder with the output Surface. 
      mPreviewRequestBuilder 
        = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW); 
      mPreviewRequestBuilder.addTarget(surface); 

      // Here, we create a CameraCaptureSession for camera preview. 
      mCameraDevice.createCaptureSession(Arrays.asList(surface, mImageReader.getSurface()), 
        new CameraCaptureSession.StateCallback() { 

         @Override 
         public void onConfigured(CameraCaptureSession cameraCaptureSession) { 
          // The camera is already closed 
          if (null == mCameraDevice) { 
           return; 
          } 

          // When the session is ready, we start displaying the preview. 
          mCaptureSession = cameraCaptureSession; 
          try { 
           // Auto focus should be continuous for camera preview. 
           mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE, 
             CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE); 
           // Flash is automatically enabled when necessary. 
           mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, 
             CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH); 

           // Finally, we start displaying the camera preview. 
           mPreviewRequest = mPreviewRequestBuilder.build(); 
           mCaptureSession.setRepeatingRequest(mPreviewRequest, 
             mCaptureCallback, mBackgroundHandler); 
           //mPreviewRequestBuilder.addTarget(mImageReader.getSurface()); 
          } catch (CameraAccessException e) { 
           e.printStackTrace(); 
          } 
         } 

         @Override 
         public void onConfigureFailed(CameraCaptureSession cameraCaptureSession) { 
          showToast("Failed"); 
         } 
        }, null 
      ); 

      /**TODO added for capturing aeach frame*/ 
      // This is the CaptureRequest.Builder that we use to take a picture. 
      final CaptureRequest.Builder captureBuilder = 
        mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE); 
      captureBuilder.addTarget(mImageReader.getSurface()); 

      // Use the same AE and AF modes as the preview. 
      captureBuilder.set(CaptureRequest.CONTROL_AF_MODE, 
        CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE); 
      captureBuilder.set(CaptureRequest.CONTROL_AE_MODE, 
        CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH); 

      /**end added for capture each frame*/ 


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

Trả lời

2

Thay vì tạo ra một thể hiện mới của CaptureRequest.Builder, chỉ cần thêm Surface của ImageReader với mục tiêu sản lượng của mPreviewRequestBuilder.

Các vấn đề liên quan