Google は、黒人コミュニティに対する人種平等の促進に取り組んでいます。取り組みを見る
このページは Cloud Translation API によって翻訳されました。
Switch to English

同時カメラストリーミング

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アプリ内ビデオまたはプレビュー付きの処理

持つデバイスMONOCHROME機能( CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES含まCameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_MONOCHROME代入するYUVは、すべての保証ストリームの組み合わせでY8でストリームをサポートしている必要があります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をサポートする必要がありますANDROID_REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLEは次の2つの解像度のうち小さい方です。

  • 指定されたフォーマットの最大出力解像度
  • 640 x 480

実装

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

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

検証

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

リソース割り当ての問題

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

シナリオ例

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

問題

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

  • カメラID 0広い、超ワイドカメラ、各テイク1 ISPリソースに支え論理カメラです。
  • カメラID 1 1つのISPリソースを撮影するカメラです。

デバイス(電話)には2つのISPがあります。カメラIDた場合は0開かれ、セッションが設定されている、それはカメラHALは、超広帯域とワイドカメラの使用の両方を先取り2つのISPを保有している可能性があります。

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

解決

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

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

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

  • ZOOM_RATIO範囲比を処理できない問題に対処するには、カメラを同時に使用する場合、カメラアプリが完全なZOOM_RATIO_RANGEではなく1xとMAX_DIGITAL_ZOOM間のZOOM_RATIO制御設定を使用することが保証されていることをZOOM_RATIOしてZOOM_RATIO_RANGE (これにより、内部の物理カメラ。これには、より多くのISPが必要になる可能性があります)。

testDualCameraPreviewの問題

上記の更新を行うと、 MultiViewTest.java#testDualCameraPreviewテストで許可されている動作に問題が発生する可能性があります。

テストtestDualCameraPreviewは、すべてのカメラを開いた後にのみセッションを構成しません。これは次の順序に従います。

for each camera  in cameraDevices :
  device = openCamera(camera)
     createCaptureSession(device);

ただし、 ERROR_MAX_CAMERAS_IN_USE [1]によるカメラオープンの失敗は許容されます。サードパーティのアプリは、この動作に依存している可能性があります。

カメラHALは、セッションを構成する前に、同時操作のために開かれているカメラIDの完全なセットを認識しないため、ハードウェアリソースを割り当てるのが難しい場合があります(それらに何らかの競合があると仮定します)。

この問題に対処するために、同時ストリーミングをサポートすることに加えて、後方互換性を維持し、カメラHALSが故障した場合openCameraで通話ERROR_MAX_CAMERAS_IN_USE 、彼らは同時に実行されているすべてのカメラのための完全なストリーム構成をサポートすることができない場合。