Gleichzeitiges Kamerastreaming

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. gleichzeitig. Ab Android 11: Camera2 API umfasst folgende 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 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.

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

Ziel 1 Ziel 2
Eingeben Max. Größe Eingeben Max. Größe Beispiele für Anwendungsfälle
YUV s1440p In-App-Video- oder Bildverarbeitung
PRIV s1440p In-App-Sucheranalyse
JPEG s1440p Kein Standbild 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, 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 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, gleichzeitig 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 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 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

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 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.

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. 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.

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

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. Drittanbieter-Apps können von diesem Verhalten abhängen.

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 die Ressourcen konkurriert.

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.