Android では、デバイスによるカメラデバイスの同時ストリーミングがサポートされています。これによりたとえば、デバイスは前面カメラと背面カメラの両方を同時に動作させることができます。Android 11 以降、Camera2 API には次のメソッドが含まれています。これらのメソッドを呼び出して、カメラが同時ストリーミングをサポートしているかどうかと、サポートされているストリーム構成を判断できます。
getConcurrentCameraIds
: 現在接続されているカメラデバイス識別子の組み合わせのセットを取得します。これらの識別子の組み合わせは、カメラデバイス セッションの同時構成をサポートします。isConcurrentSessionConfigurationSupported
: 提供されているカメラデバイスのセットとそれらに対応するセッション構成を同時に構成できるかどうかを確認します。
同時ストリーミング中にサポートする必要がある必須ストリームの組み合わせのセットは、カメラデバイスのカメラ特性を通じて SCALER_MANDATORY_CONCURRENT_STREAM_COMBINATIONS
プロパティに含める必要があります。
getConcurrentStreamingCameraIds()
を通じてアドバタイズされる各カメラデバイスは、同時実行ストリーム用に、次に示す保証された構成をサポートしている必要があります。
ターゲット 1 | ターゲット 2 | |||
---|---|---|---|---|
タイプ | 最大サイズ | タイプ | 最大サイズ | ユースケースの例 |
YUV | s1440p | アプリ内動画または画像処理 | ||
PRIV | s1440p | アプリ内ビューファインダーの分析 | ||
JPEG | s1440p | ビューファインダーに画像キャプチャがない | ||
YUV / PRIV | s720p | JPEG | s1440p | 標準の静止画 |
YUV / PRIV | s720p | YUV / PRIV | s1440p | アプリ内動画またはプレビューを使用した動画処理 |
MONOCHROME
機能(CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_MONOCHROME
を含む CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES
)を備え、Y8 をサポートするデバイスは、保証されたすべてのストリームの組み合わせにおける YUV ストリームの Y8 ストリームでの置き換えをサポートする必要があります。
s720p
は、720p(1280 x 720)、または StreamConfigurationMap.getOutputSizes()
によって返される特定の形式でサポートされている最大解像度です。s1440p
は 1440p(1920 x 1440)、または StreamConfigurationMap.getOutputSizes()
によって返される特定の形式でサポートされている最大解像度です。機能に ANDROID_REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE
がないデバイスは、同時動作中に少なくとも 1 つの Y16 ストリーム Dataspace::DEPTH
を sVGA 解像度でサポートする必要があります(ここで、sVGA は次の 2 つの解像度のうち小さい方です)。
- 特定の形式の最大出力解像度
- 640 x 480
実装
アプリがデバイスにクエリを実行して、カメラが同時ストリーミングをサポートしているかどうかを判断できるようにするには、次のメソッドを含む ICameraProvider@2.6
HAL インターフェースを実装します。
ICameraProvider@2.6
HAL インターフェースのリファレンス実装については、EmulatedCameraProviderHWLImpl.cpp
のエミュレートされたカメラ HAL ライブラリをご覧ください。
検証
この機能の実装が意図したとおりに機能することを確認するには、ConcurrentCameraTest.java
CTS テストを使用します。また、複数のカメラを起動し、カメラを同時に実行するアプリを使用してテストします。
リソースの割り当てに関する問題
カメラ HAL がカメラデバイスの同時動作のサポートをアドバタイズしている場合、特に前面カメラと背面カメラ(または他のカメラ)の同時ストリーミングをサポートするのに十分な画像信号処理装置(ISP)リソースがスマートフォンにあるが最大容量を占有していない場合、リソース割り当ての問題が発生する可能性があります。この場合、カメラ HAL で各ハードウェア デバイスに限られたハードウェア リソースを割り当てる必要があります。
シナリオの例
次のシナリオは、この問題を示しています。
問題
デバイスは次のように構成されています。
- カメラ ID
0
は、広角カメラと超広角カメラで構成された論理カメラで、それぞれが 1 つの ISP リソースを使用します。 - カメラ ID
1
は、1 つの ISP リソースを使用するカメラです。
デバイス(スマートフォン)には 2 つの ISP があります。カメラ ID 0
を開いてセッションを構成すると、カメラ HAL は、超広角カメラと広角カメラが同時に使用される状況に対応するために、2 つの ISP を予約することがあります。
この場合、両方の ISP が使用中であるため、前面カメラ(ID 1
)はストリームを構成することができません。
解決策
この問題に対処するには、セッションを構成する前にフレームワークでカメラ ID 0
および 1
の両方を開き、カメラ HAL にリソースの割り当て方法に関するヒントを提供します(ここでは同時動作を想定しているため)。ただし、これにより機能が制限されることがあります。たとえば、ズームで全ズーム範囲比を処理できない場合があります(物理カメラ ID を切り替えると問題が発生する可能性があるため)。
この解決策を実装するには、provider@2.6::ICameraProvider::getConcurrentCameraStreamingCameraIds
を次にようにアップデートします。
カメラの同時動作を行うには、カメラデバイスでセッションを構成する前に、カメラ フレームワークで最初にカメラデバイス(
@3.2::ICameraDevice::open
)を開く必要があります。カメラ プロバイダはそれに応じてリソースを割り当てることができます。全ズーム範囲比を処理できない問題を解決するには、カメラアプリを同時に使用するときに、カメラアプリが
ZOOM_RATIO
制御を完全なZOOM_RATIO_RANGE
ではなく 1x とMAX_DIGITAL_ZOOM
にのみ設定できることを確認してください(これにより、物理カメラを内部で切り替える際に ISP を追加する必要性を減らします)。
testDualCameraPreview に関する問題
上記のアップデートを行うと、MultiViewTest.java#testDualCameraPreview
テストで許可された動作の問題が発生する可能性があります。
テスト testDualCameraPreview
では、すべてのカメラが開いた後でのみセッションが構成されます。次の順序に従います。
for each camera in cameraDevices :
device = openCamera(camera)
createCaptureSession(device);
ただし、ERROR_MAX_CAMERAS_IN_USE [1]
によってカメラが開かないことは許容されます。サードパーティ アプリは、この動作に依存している場合があります。
カメラ HAL は、セッションを構成する前に同時動作のために開いているカメラ ID のセットを完全に認識できないため、ハードウェア リソースを割り当てるのが難しくなる場合があります(ハードウェア リソース間になんらかの競合があると想定)。
この問題に対処するには、同時ストリーミングのサポートに加えて、カメラ HAL は下位互換性を維持し、すべてのカメラが同時に実行される完全なストリーム構成をサポートできない場合に、ERROR_MAX_CAMERAS_IN_USE
で openCamera
呼び出しを失敗させる必要があります。