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.6
HAL-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 undMAX_DIGITAL_ZOOM
statt der vollständigenZOOM_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.