Gleichzeitiges Streamen von Kameras

Unter Android können Geräte das gleichzeitige Streaming von Kamerageräten unterstützen. Für So können auf einem Gerät sowohl die Front- als auch die Rückkamera eingeschaltet werden. aus. Ab Android 11: Camera2 API umfasst die folgenden Methoden den Apps aufrufen können, um festzustellen, ob die Kameras gleichzeitiges Streaming und die unterstützten Streamkonfigurationen zu erstellen.

  • getConcurrentCameraIds: Ruft die Kombinationen der derzeit verbundenen Kamerageräte ab Kennungen, die die gleichzeitige Konfiguration von Kameragerätesitzungen ermöglichen.
  • isConcurrentSessionConfigurationSupported: Prüft, ob die bereitgestellten Kamerageräte und die zugehörigen Sitzungskonfigurationen können gleichzeitig konfiguriert werden.

Eine Reihe obligatorischer Streamkombinationen, die während gleichzeitiger Ausführungen unterstützt werden müssen. sind über die Eigenschaften der Kamera einer Kamera im SCALER_MANDATORY_CONCURRENT_STREAM_COMBINATIONS Property.

Jede über getConcurrentStreamingCameraIds() beworbene Kamera muss unterstützen die folgenden garantierten Konfigurationen für gleichzeitige Streams.

Ziel 1 Ziel 2
Typ Max. Größe Typ Max. Größe Beispiele für Anwendungsfälle
YUV s1440p In-App-Video- oder Bildverarbeitung
PRIV s1440p Sucheranalyse in der App
JPEG s1440p Kein Standbild im Sucher
YUV / PRIV S720p JPEG s1440p Standardbildgebung
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) Y8 unterstützen muss das Ersetzen von YUV-Streams durch Y8 in allen garantierten Stream-Kombinationen.

s720p bezieht sich auf 720p (1280 x 720) oder die maximal unterstützte Auflösung für das bestimmtes Format, das von StreamConfigurationMap.getOutputSizes() s1440p bezieht sich auf 1440p (1920 × 1440) oder die maximal unterstützte Auflösung für das jeweilige Format, das von StreamConfigurationMap.getOutputSizes() Geräte, die Folgendes nicht umfassen: ANDROID_REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE muss mindestens einen Y16-Stream unterstützen, Dataspace::DEPTH mit sVGA während des gleichzeitigen Betriebs, wobei sVGA die kleinere Lösungen:

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

Implementierung

Um zu erlauben, dass Apps ein Gerät abfragen, um festzustellen, gleichzeitiges Streaming unterstützen, implementieren Sie ICameraProvider@2.6 HAL-Schnittstelle mit den folgenden Methoden:

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

Zertifizierungsstufe

Um zu testen, ob Ihre Implementierung dieser Funktion wie beabsichtigt funktioniert, verwenden Sie den ConcurrentCameraTest.java CTS-Test Testen Sie außerdem eine App, die mehrere Kameras öffnet und gleichzeitig ausführen.

Probleme bei der Ressourcenzuweisung

Wenn Kamera-HALs die Unterstützung für den gleichzeitigen Betrieb von Kamerageräten können Probleme bei der Ressourcenzuweisung auftreten, insbesondere für den Fall, dass genügend Ressourcen des Bildsignalprozessors (ISP) auf dem um sowohl die Front- als auch die Rückkamera (z. B. die Front- und Rückkamera) zu streamen, voll auszuschöpfen. In diesem Fall muss der Kamera-HAL für die einzelnen Kamerageräte.

Beispielszenario

Das folgende Szenario veranschaulicht dieses Problem.

Problem

Das Gerät hat die folgende Konfiguration:

  • Die Kamera-ID 0 ist eine logische Kamera mit einem Weitwinkel- und Ultraweitwinkelobjektiv Kamera, die jeweils eine Internetanbieter-Ressource benötigen.
  • 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 geöffnet ist konfiguriert, reserviert der Kamera-HAL zwei Internetanbieter sowohl Ultraweitwinkel- als auch Weitwinkelkameras nutzen.

In diesem Fall kann die Frontkamera (ID 1) keine da beide Internetanbieter verwendet werden.

Lösung

Zur Behebung dieses Problems kann das Framework beide Kamera-IDs 0 und 1 öffnen bevor Sie Sitzungen konfigurieren, um dem Kamera-HAL einen Hinweis zu geben, wie Ressourcen zuweisen, da jetzt der gleichzeitige Betrieb von Kameras erwartet wird. Dies kann jedoch dazu führen, dass die Funktionen eingeschränkt sind. So kann es z. B. passieren, dass der Zoom möglicherweise nicht Der gesamte Zoombereich wird unterstützt, weil beim Wechsel der physischen Kamera IDs möglicherweise problematisch.

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

  • Vorschreiben, dass die Kamera für den gleichzeitigen Betrieb von Kameras Framework muss Kamerageräte (@3.2::ICameraDevice::open) öffnen, bevor Konfigurieren von Sitzungen auf den Kamerageräten. Dadurch kann die Kamera Anbietern, Ressourcen entsprechend zuzuweisen.

  • Um das Problem zu beheben, dass wir nicht in der Lage sind, Zoombereich anpassen, achten Sie darauf, dass Kamera-Apps, wenn Sie Kameras gleichzeitig verwenden, verwenden die Einstellung für die ZOOM_RATIO-Steuerung zwischen 1x und MAX_DIGITAL_ZOOM statt der vollständigen ZOOM_RATIO_RANGE (dieser verhindert das interne Umschalten physischer Kameras, was möglicherweise erfordert mehr ISPs).

Problem mit testDualCameraPreview

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

Mit dem Test „testDualCameraPreview“ werden Sitzungen nur nach dem Öffnen konfiguriert alle Kameras. Sie folgt dieser Reihenfolge:

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

Sie toleriert jedoch Kameraausfälle, ERROR_MAX_CAMERAS_IN_USE [1] Drittanbieter-Apps können von diesem Verhalten abhängen.

Weil der Kamera-HAL nicht den vollständigen Satz der Kamera-IDs kennt, die gerade geöffnet werden den gleichzeitigen Betrieb vor der Sitzungskonfiguration haben, kann es schwierig sein, Hardwareressourcen zuweisen (vorausgesetzt, es gibt Wettbewerb um sie)

Um dieses Problem zu beheben, sollten Sie neben der Aufrechterhaltung der Abwärtskompatibilität gleichzeitiges Streaming unterstützen, sollten Kamera-HALs bei openCamera-Aufrufen mit ERROR_MAX_CAMERAS_IN_USE wenn sie die vollständige Streamkonfiguration für alle Kameras gleichzeitig laufen.