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