Gleichzeitiges Kamera-Streaming

Mit Android können Geräte das gleichzeitige Streaming von Kamerageräten unterstützen. Dies ermöglicht beispielsweise, dass bei einem Gerät sowohl die vordere als auch die hintere Kamera gleichzeitig arbeiten. Ab Android 11 umfasst die Camera2-API die folgenden Methoden, die Apps aufrufen können, um festzustellen, ob die Kameras gleichzeitiges Streaming unterstützen und welche Stream-Konfigurationen unterstützt werden.

  • getConcurrentCameraIds : Ruft den Satz von Kombinationen aktuell verbundener Kamerageräte-IDs ab, die die gleichzeitige Konfiguration von Kameragerätesitzungen unterstützen.
  • isConcurrentSessionConfigurationSupported : Überprüft, ob der bereitgestellte Satz von Kamerageräten und ihre entsprechenden Sitzungskonfigurationen gleichzeitig konfiguriert werden können.

Eine Reihe obligatorischer Stream-Kombinationen, 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 über getConcurrentStreamingCameraIds() angekündigte Kameragerät muss die folgenden garantierten Konfigurationen für gleichzeitige Streams unterstützen.

Ziel 1 Ziel 2
Typ maximale Größe Typ maximale Größe Beispielanwendungsfälle
YUV s1440p In-App-Video- oder Bildverarbeitung
PRIV s1440p In-App-Sucheranalyse
JPEG s1440p Keine Standbildaufnahme im 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 enthält CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_MONOCHROME ), die Y8 unterstützen, müssen das Ersetzen von YUV-Streams durch Y8 in allen garantierten Stream-Kombinationen unterstützen.

s720p bezieht sich auf 720p (1280 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 x 1440) oder die maximal unterstützte Auflösung für das jeweilige Format, das von StreamConfigurationMap.getOutputSizes() zurückgegeben wird. Geräte, deren Funktionen ANDROID_REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE nicht umfassen, müssen während des gleichzeitigen Betriebs mindestens einen einzelnen Y16-Stream, Dataspace::DEPTH , mit sVGA-Auflösung unterstützen, wobei sVGA die kleinere der beiden folgenden Auflösungen ist:

  • 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 ICameraProvider@2.6 HAL-Schnittstelle, die die folgenden Methoden umfasst:

Eine Referenzimplementierung der ICameraProvider@2.6 HAL-Schnittstelle finden Sie in der emulierten Kamera-HAL-Bibliothek unter EmulatedCameraProviderHWLImpl.cpp .

Validierung

Um zu testen, ob Ihre Implementierung dieser Funktion wie vorgesehen funktioniert, verwenden Sie den CTS-Test ConcurrentCameraTest.java . Testen Sie außerdem die Verwendung einer App, die mehrere Kameras öffnet und gleichzeitig bedient.

Probleme bei der Ressourcenzuweisung

Wenn Kamera-HALs Unterstützung für den gleichzeitigen Betrieb von Kamerageräten anbieten, kann es zu Problemen bei der Ressourcenzuweisung kommen, insbesondere wenn auf dem Telefon genügend ISP-Ressourcen (Bildsignalprozessor) vorhanden sind, um sowohl die vordere als auch die hintere (oder andere) Kamera gleichzeitig zu streamen , aber nicht in voller Kapazität. In diesem Fall muss der Kamera-HAL jedem Kameragerät begrenzte Hardwareressourcen zuweisen.

Beispielszenario

Das folgende Szenario veranschaulicht dieses Problem.

Problem

Das Gerät hat die folgende Konfiguration:

  • Kamera-ID 0 ist eine logische Kamera, die von einer Wide- und Ultra-Wide-Kamera unterstützt wird, die jeweils eine ISP-Ressource beanspruchen.
  • Kamera-ID 1 ist eine Kamera, die eine ISP-Ressource beansprucht.

Das Gerät (Telefon) verfügt über zwei ISPs. Wenn die Kamera-ID 0 geöffnet und eine Sitzung konfiguriert ist, ist es möglich, dass die Kamera-HAL zwei ISPs reserviert, die sowohl die Verwendung von Ultrawide- als auch Wide-Kameras vorsehen.

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

Lösung

Um dieses Problem zu lösen, kann das Framework beide Kamera-IDs 0 und 1 öffnen, bevor Sitzungen konfiguriert werden, um der Kamera-HAL einen Hinweis zur Zuweisung von Ressourcen zu geben (da nun der gleichzeitige Betrieb von Kameras erwartet wird). Dies kann jedoch zu eingeschränkten Funktionen führen, z. B. kann der Zoom möglicherweise nicht das gesamte Zoombereichsverhältnis verarbeiten (da der Wechsel der physischen Kamera-IDs problematisch sein könnte).

Um diese Lösung zu implementieren, nehmen Sie die folgenden Aktualisierungen an provider@2.6::ICameraProvider::getConcurrentCameraStreamingCameraIds vor.

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

  • Um das Problem zu beheben, dass nicht das gesamte Zoombereichsverhältnis verarbeitet werden kann, stellen Sie sicher, dass Kamera-Apps bei gleichzeitiger Verwendung von Kameras garantiert die ZOOM_RATIO Steuerungseinstellung zwischen 1x und MAX_DIGITAL_ZOOM anstelle des vollständigen ZOOM_RATIO_RANGE verwenden (dies verhindert das Umschalten von). physische Kameras intern, was möglicherweise mehr ISPs erfordert).

Problem mit testDualCameraPreview

Wenn Sie die oben genannten Aktualisierungen vornehmen, kann es zu einem Problem mit einem vom MultiViewTest.java#testDualCameraPreview -Test zugelassenen Verhalten kommen.

Der Test testDualCameraPreview konfiguriert Sitzungen nicht erst nach dem Öffnen aller Kameras. Es folgt diese Reihenfolge:

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

Es toleriert jedoch Fehler beim Öffnen der Kamera mit ERROR_MAX_CAMERAS_IN_USE [1] . Apps von Drittanbietern könnten von diesem Verhalten abhängig sein.

Da der Kamera-HAL vor der Konfiguration von Sitzungen nicht den vollständigen Satz von Kamera-IDs kennt, die für den gleichzeitigen Betrieb geöffnet sind, kann es für ihn schwierig sein, Hardwareressourcen zuzuweisen (vorausgesetzt, es gibt Konkurrenz für sie).

Um dieses Problem zu lösen und neben der Unterstützung gleichzeitigen Streamings auch die Abwärtskompatibilität aufrechtzuerhalten, sollten Kamera-HALs openCamera Aufrufe mit ERROR_MAX_CAMERAS_IN_USE fehlschlagen, wenn sie nicht die vollständige Stream-Konfiguration für alle gleichzeitig laufenden Kameras unterstützen können.