コンカレントカメラストリーミング

Androidを使用すると、デバイスはカメラデバイスの同時ストリーミングをサポートできます。たとえば、これにより、デバイスで前面カメラと背面カメラの両方を同時に動作させることができます。 Android 11以降、Camera2 APIには、カメラが同時ストリーミングをサポートしているかどうか、およびサポートされているストリーム構成を判断するためにアプリが呼び出すことができる次のメソッドが含まれています。

  • getConcurrentStreamingCameraIds :カメラデバイスセッションの同時構成をサポートする、現在接続されているカメラデバイス識別子の組み合わせのセットを取得します。
  • 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アプリ内動画またはプレビュー付きの処理

Y8をサポートするMONOCHROME機能( CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIESにはCameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_MONOCHROME #REQUEST_AVAILABLE_CAPABILITIES_MONOCHROMEが含まれます)を備えたデバイスは、保証されたすべてのストリームの組み合わせで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は次の2つの解像度のうち小さい方です。

  • 指定された形式の最大出力解像度
  • 640 x 480

実装

アプリがデバイスにクエリを実行して、そのカメラが同時ストリーミングをサポートしているかどうかを判断できるようにするには、 ICameraProvider@2.6インターフェイスを実装します。これには次のメソッドが含まれます。

ICameraProvider@2.6 HALインターフェイスのリファレンス実装については、 EmulatedCameraProviderHWLImpl.cppでエミュレートされたカメラHALライブラリを参照してください。

検証

この機能の実装が意図したとおりに機能することをテストするには、 ConcurrentCameraTest.javaテストを使用します。また、複数のカメラを開いて同時に操作するアプリを使用してテストします。

リソース割り当ての問題

カメラHALがカメラデバイスの同時操作のサポートをアドバタイズする場合、特にフロントカメラとバックカメラ(または他の)カメラの両方を同時にストリーミングするのに十分なイメージシグナルプロセッサ(ISP)リソースが電話にある場合、リソース割り当ての問題が発生する可能性があります。 、しかし彼らの全能力にではありません。この場合、カメラHALは、限られたハードウェアリソースを各カメラデバイスに割り当てる必要があります。

シナリオ例

次のシナリオは、この問題を示しています。

問題

デバイスの構成は次のとおりです。

  • Camera ID 0は、ワイドカメラとウルトラワイドカメラに支えられた論理カメラであり、それぞれが1つのISPリソースを使用します。
  • カメラ1は、1つのISPリソースを使用するカメラです。

デバイス(電話)には2つのISPがあります。カメラ0が開かれ、セッションが構成されている場合、カメラHALが2つのISPを予約して、超ワイドカメラとワイドカメラの両方の使用を予測している可能性があります。

その場合、両方のISPが使用されているため、フロントカメラ(ID 1 )はストリームを構成できません。

解決

この問題に対処するために、フレームワークは、セッションを構成する前にカメラID 01の両方を開いて、リソースの割り当て方法に関するヒントをカメラHALに提供できます(カメラの同時操作を想定しているため)。ただし、これにより機能が制限される可能性があります。たとえば、ズームでズーム範囲の全比率を処理できない場合があります(物理的なカメラIDの切り替えに問題がある可能性があるため)。

このソリューションを実装するには、 provider@2.6::ICameraProvider::getConcurrentCameraStreamingCameraIdsに次の更新を行います。

  • カメラの同時操作のために、カメラフレームワークは、カメラデバイスでセッションを構成する前に、カメラデバイス( @3.2::ICameraDevice::open )を開く必要があることを義務付けます。これにより、カメラプロバイダーはそれに応じてリソースを割り当てることができます。

  • フルズーム範囲比を処理できないという問題に対処するには、カメラを同時に使用する場合、カメラアプリが完全なZOOM_RATIO_RANGEではなく1xとMAX_DIGITAL_ZOOMの間のZOOM_RATIO制御設定を使用することが保証されていることを確認してください(これにより、内部の物理カメラ。これには、より多くの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_USEopenCamera呼び出しを失敗させる必要があります。