Gleichzeitiges Kamerastreaming

Android ermöglicht es Geräten, das gleichzeitige Streamen von Kamerageräten zu unterstützen. So kann ein Gerät beispielsweise gleichzeitig die Front- und Rückkamera verwenden. Ab Android 11 enthält die Camera2 API die folgenden Methoden, die Apps aufrufen können, um festzustellen, ob die Kameras gleichzeitiges Streaming unterstützen und welche Streamkonfigurationen unterstützt werden.

  • getConcurrentCameraIds: Ruft die Kombinationen der aktuell verbundenen Kamera-Geräte-IDs ab, die die gleichzeitige Konfiguration von Kamera-Gerätesitzungen unterstützen.
  • isConcurrentSessionConfigurationSupported: Prüft, ob die bereitgestellten Kameras und die entsprechenden Sitzungskonfigurationen gleichzeitig konfiguriert werden können.

Eine Reihe obligatorischer Streamkombinationen, die beim gleichzeitigen Streaming unterstützt werden müssen, sind über die Kameraeigenschaften eines Kamerageräts in der Eigenschaft SCALER_MANDATORY_CONCURRENT_STREAM_COMBINATIONS enthalten.

Jedes Kameragerät, das über getConcurrentStreamingCameraIds() beworben wird, muss die folgenden garantierten Konfigurationen für gleichzeitige Streams unterstützen.

Ziel 1 Ziel 2
Eingeben Maximale Größe Eingeben Maximale Größe Beispiele für Anwendungsfälle
YUV s1440p In-App-Video- oder Bildverarbeitung
PRIV s1440p Analyse des In‑App-Suchers
JPEG s1440p Keine Aufnahme von Standbildern über den Sucher
YUV / PRIV s720p JPEG s1440p Standard-Standbildaufnahmen
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), die Y8 unterstützen, müssen YUV-Streams in allen garantierten Streamkombinationen durch Y8 ersetzen können.

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 maximale unterstützte Auflösung für das jeweilige Format, das von StreamConfigurationMap.getOutputSizes() zurückgegeben wird. Geräte, deren Funktionen nicht ANDROID_REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE umfassen, müssen bei gleichzeitigem Betrieb mindestens einen einzelnen Y16-Stream Dataspace::DEPTH mit sVGA-Auflösung unterstützen, wobei sVGA die kleinere der beiden folgenden Auflösungen ist:

  • Maximale Ausgaberesolution für das angegebene Format
  • 640 × 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.6-HAL-Schnittstelle finden Sie in der emulierten Kamera-HAL-Bibliothek unter EmulatedCameraProviderHWLImpl.cpp.

Zertifizierungsstufe

Um zu testen, ob Ihre Implementierung dieser Funktion wie vorgesehen funktioniert, verwenden Sie den ConcurrentCameraTest.java-CTS-Test. Testen Sie auch mit einer App, die mehrere Kameras öffnet und gleichzeitig verwendet.

Probleme mit Ressourcenzuweisungen

Wenn Kamera-HALs die gleichzeitige Ausführung von Kamerageräten unterstützen, 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 Vorder- als auch die Rückkamera (oder andere Kameras) gleichzeitig zu streamen, aber nicht mit voller Kapazität. In diesem Fall muss die Kamera-HAL 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 benötigt.

Das Gerät (Smartphone) hat zwei Internetanbieter. Wenn die Kamera-ID 0 geöffnet und eine Sitzung konfiguriert ist, kann es sein, dass die Kamera-HAL zwei ISPs reserviert, da sowohl die Ultraweitwinkel- als auch die Weitwinkelkamera verwendet werden sollen.

In diesem Fall kann die Frontkamera (ID 1) keine Streams konfigurieren, da beide ISPs verwendet werden.

Lösung

Um dieses Problem zu beheben, kann das Framework sowohl die Kamera-IDs 0 als auch 1 öffnen, bevor Sitzungen konfiguriert werden. So wird der Kamera-HAL ein Hinweis gegeben, wie Ressourcen zugewiesen werden sollen, da jetzt ein gleichzeitiger Betrieb von Kameras erwartet wird. Dies kann jedoch zu Einschränkungen führen. So kann es beispielsweise sein, dass der Zoom nicht den gesamten Zoombereich abdecken kann, da das Umschalten der physischen Kamera-IDs problematisch sein kann.

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

  • 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 Ressourcen entsprechend zuweisen.

  • Um das Problem zu beheben, dass das vollständige Zoomverhältnis nicht verarbeitet werden kann, muss sichergestellt werden, dass Kamera-Apps bei gleichzeitiger Verwendung von Kameras garantiert die ZOOM_RATIO-Steuerungseinstellung nur zwischen 1-fach und MAX_DIGITAL_ZOOM anstelle des vollständigen ZOOM_RATIO_RANGE verwenden. Dadurch wird das interne Umschalten physischer Kameras verhindert, was möglicherweise mehr ISPs erfordert.

Problem mit testDualCameraPreview

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

Beim Test testDualCameraPreview werden Sitzungen nicht erst nach dem Öffnen aller Kameras konfiguriert. Die Reihenfolge ist wie folgt:

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

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

Da die Kamera-HAL die vollständige Gruppe der Kamera-IDs, die für den gleichzeitigen Betrieb geöffnet werden, erst nach der Konfiguration von Sitzungen kennt, kann es schwierig sein, Hardwareressourcen zuzuweisen (vorausgesetzt, es gibt einen Wettbewerb um sie).

Um dieses Problem zu beheben, sollten Kamera-HALs neben der Abwärtskompatibilität und der Unterstützung von gleichzeitigem Streaming openCamera-Aufrufe mit ERROR_MAX_CAMERAS_IN_USE fehlschlagen lassen, wenn sie die vollständige Streamkonfiguration für alle gleichzeitig ausgeführten Kameras nicht unterstützen können.