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 undMAX_DIGITAL_ZOOM
anstelle des vollständigenZOOM_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.