Android ermöglicht es Geräten, das gleichzeitige Streaming von Kameras zu unterstützen. So können beispielsweise sowohl die Front- als auch die Rückkamera eines Geräts gleichzeitig verwendet werden. Ab Android 11 enthält die Camera2 API die folgenden Methoden, die Apps aufrufen können, um zu ermitteln, ob die Kameras gleichzeitiges Streaming unterstützen und welche Streamkonfigurationen unterstützt werden.
getConcurrentCameraIds
: Gibt die Kombinationen der derzeit verbundenen Kamerageräte-IDs zurück, die die gleichzeitige Konfiguration von Kameragerätesitzungen unterstützen.isConcurrentSessionConfigurationSupported
: Prüft, ob die angegebenen Kameras und die zugehörigen Sitzungskonfigurationen gleichzeitig konfiguriert werden können.
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.
Jedes über getConcurrentStreamingCameraIds()
beworbene Kameragerät muss die folgenden garantierten Konfigurationen für parallele Streams unterstützen.
Ziel 1 | Ziel 2 | |||
---|---|---|---|---|
Eingeben | Max. Größe | Eingeben | Max. Größe | Anwendungsbeispiele |
YUV | s1440p | In-App-Video- oder Bildverarbeitung | ||
PRIV | s1440p | In-App-Sucheranalyse | ||
JPEG | s1440p | Keine Aufnahme von Standbildern über den 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 (1.280 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 × 1440) oder die maximal unterstützte Auflösung für das jeweilige Format, das von StreamConfigurationMap.getOutputSizes()
zurückgegeben wird.
Geräte, die ANDROID_REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE
nicht unterstützen, müssen beim gleichzeitigen Betrieb mindestens einen einzelnen Y16-Stream, Dataspace::DEPTH
mit sVGA-Auflösung, unterstützen. Dabei ist sVGA die kleinere der beiden folgenden Auflösungen:
- die 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 HAL-Schnittstelle ICameraProvider@2.6
, die die folgenden Methoden umfasst:
Eine Referenzimplementierung der ICameraProvider@2.6
HAL-Schnittstelle finden Sie in der emulierten HAL-Bibliothek für Kameras unter EmulatedCameraProviderHWLImpl.cpp
.
Zertifizierungsstufe
Verwenden Sie den CTS-Test ConcurrentCameraTest.java
, um zu prüfen, ob Ihre Implementierung dieser Funktion wie vorgesehen funktioniert. Testen Sie auch mit einer App, die mehrere Kameras öffnet und gleichzeitig verwendet.
Probleme mit der Ressourcenzuweisung
Wenn Kamera-HALs die Unterstützung für den gleichzeitigen Betrieb von Kamerageräten angeben, 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 Front- als auch die Rückkamera (oder andere Kameras) gleichzeitig zu streamen, aber nicht in voller Kapazität. 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 ISP-Ressource belegt.
Das Gerät (Smartphone) hat zwei Internetanbieter. Wenn die Kamera-ID 0
geöffnet und eine Sitzung konfiguriert wird, reserviert die HAL der Kamera möglicherweise zwei ISPs, um sowohl die Verwendung der Ultraweitwinkel- als auch der Weitwinkelkamera zu ermöglichen.
In diesem Fall können für die Frontkamera (ID 1
) keine Streams konfiguriert werden, 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 zu eingeschränkten Funktionen führen. Beispielsweise kann der Zoom möglicherweise nicht den gesamten Zoombereich abdecken, da das Wechseln der physischen Kamera-IDs problematisch sein kann.
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. So können Kameraanbieter die Ressourcen entsprechend zuweisen.Um das Problem zu beheben, dass der volle Zoombereich nicht unterstützt wird, müssen Kamera-Apps, die gleichzeitig mehrere Kameras verwenden, die
ZOOM_RATIO
-Steuerungseinstellung zwischen 1x undMAX_DIGITAL_ZOOM
statt der gesamtenZOOM_RATIO_RANGE
verwenden. Dadurch wird verhindert, dass die physischen Kameras intern umgeschaltet werden, was möglicherweise mehr ISPs erfordert.
Problem mit testDualCameraPreview
Wenn Sie die oben genannten Änderungen vornehmen, kann dies zu einem Problem mit einem vom MultiViewTest.java#testDualCameraPreview
-Test zulässigen Verhalten führen.
Im Test testDualCameraPreview
werden Sitzungen nicht erst konfiguriert, nachdem alle Kameras geöffnet wurden. Es folgt dieser Abfolge:
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. Apps von Drittanbietern sind möglicherweise von diesem Verhalten abhängig.
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 dieselben Ressourcen konkurriert.
Um dieses Problem zu beheben, sollten Kamera-HALs openCamera
-Aufrufe mit ERROR_MAX_CAMERAS_IN_USE
fehlschlagen, wenn sie die vollständige Streamkonfiguration für alle gleichzeitig laufenden Kameras nicht unterstützen, um die Abwärtskompatibilität zu wahren und gleichzeitig das gleichzeitige Streaming zu unterstützen.