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: Ruft die Kombinationen der aktuell verbundenen Kamerageräte-IDs ab, die die gleichzeitige Konfiguration von Kameragerätesitzungen unterstützen.
  • isConcurrentSessionConfigurationSupported: Prüft, ob die bereitgestellten Kamerageräte und die entsprechenden 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 gleichzeitige 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 (1280 × 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. Sie umfasst die folgenden Methoden:

Eine Referenzimplementierung der ICameraProvider@2.6HAL-Schnittstelle finden Sie in der emulierten Kamera-HAL-Bibliothek 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 bei 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, 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 Ultraweitwinkelkamera unterstützt wird, die jeweils eine ISP-Ressource aufnehmen.
  • Die Kamera-ID 1 ist eine Kamera, die eine Internetanbieter-Ressource verwendet.

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 kann die Frontkamera (ID 1) keine Streams konfigurieren, da beide Internetanbieter verwendet werden.

Lösung

Um dieses Problem zu beheben, kann das Framework beide Kamera-IDs 0 und 1 öffnen, bevor es Sitzungen konfiguriert, 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.

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

  • Um das Problem zu beheben, dass nicht das gesamte Zoombereichsverhältnis berücksichtigt werden kann, müssen Kamera-Apps bei gleichzeitiger Verwendung von Kameras immer nur die ZOOM_RATIO-Steuereinstellung zwischen 1x und MAX_DIGITAL_ZOOM anstelle des vollständigen ZOOM_RATIO_RANGE verwenden. Dadurch wird das interne Umschalten physischer Kameras verhindert, für die möglicherweise mehr Internetanbieter erforderlich sind.

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 lösen, sollten Kamera-HALs nicht nur gleichzeitiges Streaming unterstützen, sondern auch die Abwärtskompatibilität aufrechterhalten, sodass openCamera-Aufrufe mit ERROR_MAX_CAMERAS_IN_USE fehlschlagen, wenn sie nicht die vollständige Streamkonfiguration für alle gleichzeitig ausgeführten Kameras unterstützen können.