2017-10-12 23 views
0

カメラ2のApiでバースト画像キャプチャを実装しましたが、6fpsで撮影すると問題は発生しません。問題が発生するのは、プレビューがロックされている理由です、私はここで、私はcamera2basic(https://github.com/googlesamples/android-Camera2Basic)にこれで少し実験と私を見つけ画像のキャプチャ中にプレビューがロックされました

private void captuteStillImage() { 
    try { 
     count = 0; 
     CaptureRequest.Builder captureBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE); 

     int rotation = getWindowManager().getDefaultDisplay().getRotation(); 
     captureBuilder.set(CaptureRequest.JPEG_ORIENTATION, ORIENTATIONS.get(rotation)); 

     CameraCaptureSession.CaptureCallback captureCallback = new CameraCaptureSession.CaptureCallback() { 
      @Override 
      public void onCaptureCompleted(@NonNull CameraCaptureSession session, @NonNull CaptureRequest request, @NonNull TotalCaptureResult result) { 
       super.onCaptureCompleted(session, request, result); 
       //unlockFocus(); 
       count++; 
       Log.e("count",count+""); 
       runOnUiThread(new Runnable() { 
       @Override 
       public void run() { 
        tv_count.setText(count+""); 

       } 
      }); 

       if (count >= MAX_CAPTURE) { 
        unlockFocus(); 
       } 
       Log.e("Image Capture", "Successfully"); 
      } 
     }; 

     // mCameraCaptureSession.capture(captureBuilder.build(), captureCallback, null); 

     List<CaptureRequest> captureList = new ArrayList<CaptureRequest>(); 
     captureBuilder.addTarget(mImageReader.getSurface()); 
     for (int i = 0; i < MAX_CAPTURE; i++) { 
      captureList.add(captureBuilder.build()); 
     } 
     //mCameraCaptureSession.stopRepeating(); 
     mCameraCaptureSession.captureBurst(captureList, captureCallback, null); 
    } catch (CameraAccessException e) { 
     e.printStackTrace(); 
    } 
} 

答えて

1

例CAMERA2グーグル、次の午前私はまだキャプチャバーストがある、私はプレビューが常に有効たい、そのプレビューロックを削除したいです画像を取得して保存する直前にunlockを呼び出した場合、プレビューをもっと早く得ることができます。また、captureCallbackのunLockFocusへの元の呼び出しを削除しました。

/** 
    * This a callback object for the {@link ImageReader}. "onImageAvailable" will be called when a 
    * still image is ready to be saved. 
    */ 
    private final ImageReader.OnImageAvailableListener mOnImageAvailableListener 
      = new ImageReader.OnImageAvailableListener() { 

     @Override 
     public void onImageAvailable(ImageReader reader) { 
      Log.d(TAG,"onImageAvailable"); 

      //Get the image 
      Image cameraImage = reader.acquireNextImage(); 

      //Now unlock the focus so the UI does not look locked - note that this is a much earlier point than in the 
      //original Camera2Basic example from google as the original place was causing the preview to lock during any 
      //image manipulation and saving. 
      unlockFocus(); 

      //Save the image file in the background - note check you have permissions granted by user or this will cause an exception. 
      mBackgroundHandler.post(new ImageSaver(getActivity().getApplicationContext(), cameraImage, outputPicFile); 

     } 

    }; 

しかし、Camera2Basicは、多くのコールバックを持っていると私はあなたがアクティビティまたはフラグメントは、一時停止や再開、そしてあなたのアプリは、他の非同期コールバックを持っている場合は特にされたシナリオでテストを開始するとき、それは非常に簡単であることがわかりました予期せぬ動作やクラッシュの原因となる競合状態に陥る可能性があります。

あなただけの写真を撮るとき、プレビュー速く返すカメラの簡単な例をしたい場合は、基本的なFotoApparatの例も見て価値があるかもしれません:

+0

私ができます新しい画像がキャプチャされるとクローズされるので、読者から取得する画像ファイルを保存しないでください。私は6枚の画像バーストをキャプチャしています。それを試してみました。イメージを配列に保存しようとしていましたが、キャプチャが終了したら、1つ1つを保存しようとしましたが、Imageが既に閉じられているためにクラッシュします。@Mick –

関連する問題