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 0
と1
の両方を開いて、リソースの割り当て方法に関するヒントをカメラ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_USE
でopenCamera
呼び出しを失敗させる必要があります。