2017-03-28 47 views
1

私の場合を説明します。 私は、5秒ごとに画像を撮る、フラッシュなしで撮る、そして5秒後にフラッシュで撮影するアプリケーションをしようとしています。毎回これを繰り返します。だから、フラッシュなし、フラッシュなし、フラッシュなし、フラッシュ付き...無限に1つを取るでしょう。カメラ2のAPIの問題点滅のフラッシュ/フラッシュイメージなし

私のコードでは、いくつかのデバイスでこれを行うことができますが、同じコードは他のデバイスでも動作しません。すなわち:

  • BQ Aquaris X5プラス
    :フラッシュなしの画像が正しいですが、フラッシュ画像がちょうど白になります。
  • BQ Aquaris E5:フラッシュは発光しません。

どのように私が試したすべてのデバイスは、Camera2 APIのLEGACYハードウェアサポートレベルです。

これは私のコードでいくつかの重要なメソッドです(私は文字制限のためにすべてのコードを投稿できません)。私はGoogleの例から始めました:

このsetAutoFlashは上記のことを行います。

private void setAutoFlash(CaptureRequest.Builder requestBuilder) { 
     if (mFlashSupported) { 
      if(phototaken) { 
       requestBuilder.set(CaptureRequest.CONTROL_AE_MODE,CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH); 
       requestBuilder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_OFF); 
      }else{ 
       requestBuilder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_SINGLE); 
      } 
     } 
    } 

この他のデバイスとbq aquaris e5では動作しますが、bq aquaris x5 plusではフラッシュは起動しません。

private void setAutoFlash(CaptureRequest.Builder requestBuilder) { 
     if (mFlashSupported) { 
      if(phototaken) { 
       requestBuilder.set(CaptureRequest.CONTROL_AE_MODE,CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH); 
       requestBuilder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_OFF); 
      }else{ 
       requestBuilder.set(CaptureRequest.CONTROL_AE_MODE,CaptureRequest.CONTROL_AE_MODE_ON_ALWAYS_FLASH); 
       requestBuilder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_OFF); 
      } 
     } 
    } 

そして、私のcaptureStillPicture

private void captureStillPicture() { 
     try { 
      final Activity activity = getActivity(); 
      if (null == activity || null == mCameraDevice) { 
       return; 
      } 
      // 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); 
      setAutoFlash(captureBuilder); 

      // Orientation 
      int rotation = activity.getWindowManager().getDefaultDisplay().getRotation(); 
      captureBuilder.set(CaptureRequest.JPEG_ORIENTATION, getOrientation(rotation)); 

      CameraCaptureSession.CaptureCallback CaptureCallback 
        = new CameraCaptureSession.CaptureCallback() { 
       @Override 
       public void onCaptureCompleted(@NonNull CameraCaptureSession session, 
               @NonNull CaptureRequest request, 
               @NonNull TotalCaptureResult result) { 
        showToast("Saved: " + mFile); 
        Log.d(TAG, mFile.toString()); 
        unlockFocus(); 
       } 
      }; 

      mCaptureSession.stopRepeating(); 
      mCaptureSession.capture(captureBuilder.build(), CaptureCallback, null); 
      phototaken = !phototaken; 

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

それはすべてのデバイスでは動作しませんので質問は、私が間違って何をやっているのですか?どんな助けも素晴らしいでしょう。

答えて

1

フラッシュマニュアルには2つのレベルのコントロールがあり、自動露出ルーチンによって制御されます。あなたは現在、それらを一緒に混合しています。

フラッシュを手動で起動する場合は、AE_MODEをAE_MODE_OFFまたはAE_MODE_ONに設定する必要があります。いずれのフラッシュモードも使用できません。次に、FLASH_MODEは、特定の要求に対してフラッシュがトーチモードになるか、オフになるか、1回だけ実行されるかを制御します。

FLASH状態の1つに常にAE_MODEを残しているので、FLASH_MODEに行う操作は問題ではありません。特定のデバイスのバグを除いてはいけません。

他のすべての画像でフラッシュの発光を保証するには、強制フラッシュの写真にAE_MODE_ON_ALWAYS_FLASHを使用する必要があります。また、フラッシュのないフートにはAE_MODE_ONを使用する必要があります。 FLASH_MODEに触れないでください。 今、AUTO_FLASHでは、フラッシュを発光させるかどうかはデバイスに依存しますので、さまざまなデバイスや照明条件によって異なる動作が見られます。

あなたがやっていないもう一つの重要なことは、プリキャプチャーシーケンスを実行することです。これは、デバイスが正しいフラッシュパワー、フォーカス、およびホワイトバランスを決定するためにプレフラッシュを発光させるため、フラッシュピクチャには不可欠です。

事前キャプチャを実行するには、必要に応じてAE_MODEを設定し、1つの要求に対してAE_PRECAPTURE_TRIGGERをSTARTに設定します。これは、AE_STATEからPRECAPTUREに移行し、いくつかのフレーム数だけそこにとどまります。 AE_STATEがPRECAPTUREでなくなったら、実際のイメージキャプチャ要求を発行できます。これを通してAE_MODEを一貫して保つようにしてください。

サンプルアプリケーションCamera2Basicは、プリキャプチャーシーケンスを実装していますので、見てください。また、シーンがフラッシュを必要とするほど暗くない場合にはプリキャプチャをスキップする最適化がいくつかありますが、フラッシュを強制的に実行したいので、それはあなたには関係ありません。

+0

こんにちは@Eddy、あなたの答えに感謝します。しかし、それはまだ動作しません。 AE_MODEをAE_MODE_ONに設定してから、FLASH_MODEを変更します。あなたが言及しているように私は、サンプルアプリケーションCamera2Basicを使用しています、そして私は知っている限り、lockFocusメソッドでprecaptureシーケンスを実行します。写真を撮影するには、サンプルと同じようにこのメソッドを呼び出します。だから、私もprecaptureシーケンスを発射していると仮定します。 – Ivan

関連する問題