2015-07-05 13 views
5

Io uso il https://github.com/googlesamples/android-Camera2Basic, ma provo a modificarlo in modo da ottenere l'accesso a ciascun fotogramma prima che venga disegnato sulla vista superficiale. Compresi, devo aggiungere ulteriore piano (ImageReader.getSurface()), e leggere il telaio da esso in questo callback:android camera2 elabora ogni fotogramma e ne visualizza l'anteprima

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)); 
     } 

    }; 

Il problema è questo callback viene chiamato solo quando l'immagine è la cattura da parte dell'utente e non su EchG Frame che viene inviato all'anteprima dello schermo dalla fotocamera.

Ecco quello che ho provato ad aggiungere:

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(); 
     } 
    } 

risposta

2

Invece di creare una nuova istanza di CaptureRequest.Builder, basta aggiungere la superficie del ImageReader al bersaglio uscita del mPreviewRequestBuilder.

Problemi correlati