Gleichzeitiges Streamen von Kameras

Android ermöglicht es Geräten, das gleichzeitige Streaming von Kameras zu unterstützen. So können beispielsweise sowohl die Front- als auch die Rückkamera eines Geräts gleichzeitig verwendet werden. Ab Android 11 enthält die Camera2 API die folgenden Methoden, die Apps aufrufen können, um zu ermitteln, ob die Kameras gleichzeitiges Streaming unterstützen und welche Streamkonfigurationen unterstützt werden.

  • getConcurrentCameraIds: Gibt die Kombinationen der derzeit verbundenen Kamerageräte-IDs zurück, die die gleichzeitige Konfiguration von Kameragerätesitzungen unterstützen.
  • isConcurrentSessionConfigurationSupported: Prüft, ob die angegebenen Kameras und die zugehörigen Sitzungskonfigurationen gleichzeitig konfiguriert werden können.

Eine Reihe von obligatorischen Streamkombinationen, die beim gleichzeitigen Streaming unterstützt werden müssen, sind in den Kameraeigenschaften eines Kamerageräts in der Property SCALER_MANDATORY_CONCURRENT_STREAM_COMBINATIONS enthalten.

Jedes über getConcurrentStreamingCameraIds() beworbene Kameragerät muss die folgenden garantierten Konfigurationen für parallele Streams unterstützen.

Ziel 1 Ziel 2
Eingeben Max. Größe Eingeben Max. Größe Anwendungsbeispiele
YUV s1440p In-App-Video- oder Bildverarbeitung
PRIV s1440p In-App-Sucheranalyse
JPEG s1440p Keine Aufnahme von Standbildern über den Sucher
YUV / PRIV s720p JPEG s1440p Standard-Standbilder
YUV / PRIV s720p YUV / PRIV s1440p In-App-Video oder Verarbeitung mit Vorschau

Geräte mit der MONOCHROME-Funktion (CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES, einschließlich CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_MONOCHROME) und Y8-Unterstützung müssen das Ersetzen von YUV-Streams durch Y8 in allen garantierten Streamkombinationen unterstützen.

s720p bezieht sich auf 720p (1.280 x 720) oder die maximal unterstützte Auflösung für das jeweilige Format, das von StreamConfigurationMap.getOutputSizes() zurückgegeben wird. s1440p bezieht sich auf 1440p (1920 × 1440) oder die maximal unterstützte Auflösung für das jeweilige Format, das von StreamConfigurationMap.getOutputSizes() zurückgegeben wird. Geräte, die ANDROID_REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE nicht unterstützen, müssen beim gleichzeitigen Betrieb mindestens einen einzelnen Y16-Stream, Dataspace::DEPTH mit sVGA-Auflösung, unterstützen. Dabei ist sVGA die kleinere der beiden folgenden Auflösungen:

  • die maximale Ausgabeauflösung für das angegebene Format
  • 640 x 480

Implementierung

Damit Apps ein Gerät abfragen können, um festzustellen, ob seine Kameras gleichzeitiges Streaming unterstützen, implementieren Sie die HAL-Schnittstelle ICameraProvider@2.6, die die folgenden Methoden umfasst:

Eine Referenzimplementierung der ICameraProvider@2.6HAL-Schnittstelle finden Sie in der emulierten HAL-Bibliothek für Kameras unter EmulatedCameraProviderHWLImpl.cpp.

Zertifizierungsstufe

Verwenden Sie den CTS-Test ConcurrentCameraTest.java, um zu prüfen, ob Ihre Implementierung dieser Funktion wie vorgesehen funktioniert. Testen Sie auch mit einer App, die mehrere Kameras öffnet und gleichzeitig verwendet.

Probleme mit der Ressourcenzuweisung

Wenn Kamera-HALs die Unterstützung für den gleichzeitigen Betrieb von Kamerageräten angeben, kann es zu Problemen bei der Ressourcenzuweisung kommen. Das gilt insbesondere, wenn auf dem Smartphone genügend ISP-Ressourcen (Image Signal Processor) vorhanden sind, um sowohl die Front- als auch die Rückkamera (oder andere Kameras) gleichzeitig zu streamen, aber nicht in voller Kapazität. In diesem Fall muss die HAL der Kamera jedem Kameragerät begrenzte Hardwareressourcen zuweisen.

Beispielszenario

Das folgende Szenario veranschaulicht dieses Problem.

Problem

Das Gerät hat die folgende Konfiguration:

  • Die Kamera-ID 0 ist eine logische Kamera, die von einer Weitwinkel- und einer Ultraweitwinkelkamera unterstützt wird, die jeweils eine ISP-Ressource belegen.
  • Die Kamera-ID 1 ist eine Kamera, die eine ISP-Ressource belegt.

Das Gerät (Smartphone) hat zwei Internetanbieter. Wenn die Kamera-ID 0 geöffnet und eine Sitzung konfiguriert wird, reserviert die HAL der Kamera möglicherweise zwei ISPs, um sowohl die Verwendung der Ultraweitwinkel- als auch der Weitwinkelkamera zu ermöglichen.

In diesem Fall können für die Frontkamera (ID 1) keine Streams konfiguriert werden, da beide Internetanbieter verwendet werden.

Lösung

Um dieses Problem zu beheben, kann das Framework beide Kamera-IDs 0 und 1 öffnen, bevor Sitzungen konfiguriert werden, um der Kamera-HAL einen Hinweis zur Ressourcenzuweisung zu geben, da jetzt ein gleichzeitiger Betrieb der Kameras erwartet wird. Dies kann jedoch zu eingeschränkten Funktionen führen. Beispielsweise kann der Zoom möglicherweise nicht den gesamten Zoombereich abdecken, da das Wechseln der physischen Kamera-IDs problematisch sein kann.

Nehmen Sie die folgenden Änderungen an provider@2.6::ICameraProvider::getConcurrentCameraStreamingCameraIds vor, um diese Lösung zu implementieren.

  • Für den gleichzeitigen Betrieb von Kameras muss das Kamera-Framework Kamerageräte (@3.2::ICameraDevice::open) öffnen, bevor Sitzungen auf den Kamerageräten konfiguriert werden. So können Kameraanbieter die Ressourcen entsprechend zuweisen.

  • Um das Problem zu beheben, dass der volle Zoombereich nicht unterstützt wird, müssen Kamera-Apps, die gleichzeitig mehrere Kameras verwenden, die ZOOM_RATIO-Steuerungseinstellung zwischen 1x und MAX_DIGITAL_ZOOM statt der gesamten ZOOM_RATIO_RANGE verwenden. Dadurch wird verhindert, dass die physischen Kameras intern umgeschaltet werden, was möglicherweise mehr ISPs erfordert.

Problem mit testDualCameraPreview

Wenn Sie die oben genannten Änderungen vornehmen, kann dies zu einem Problem mit einem vom MultiViewTest.java#testDualCameraPreview-Test zulässigen Verhalten führen.

Im Test testDualCameraPreview werden Sitzungen nicht erst konfiguriert, nachdem alle Kameras geöffnet wurden. Es folgt dieser Abfolge:

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

Fehler beim Öffnen der Kamera werden bei ERROR_MAX_CAMERAS_IN_USE [1] jedoch toleriert. Apps von Drittanbietern sind möglicherweise von diesem Verhalten abhängig.

Da die HAL der Kamera vor der Konfiguration von Sitzungen nicht die vollständige Liste der Kamera-IDs kennt, die für den gleichzeitigen Betrieb geöffnet werden, kann es schwierig sein, Hardwareressourcen zuzuweisen, wenn es um dieselben Ressourcen konkurriert.

Um dieses Problem zu beheben, sollten Kamera-HALs openCamera-Aufrufe mit ERROR_MAX_CAMERAS_IN_USE fehlschlagen, wenn sie die vollständige Streamkonfiguration für alle gleichzeitig laufenden Kameras nicht unterstützen, um die Abwärtskompatibilität zu wahren und gleichzeitig das gleichzeitige Streaming zu unterstützen.