Gleichzeitiges Kamera-Streaming

Android ermöglicht Geräten das gleichzeitige Streamen von Kamerageräten. Dies ermöglicht beispielsweise, dass bei einem Gerät sowohl die Front- als auch die Rückkamera gleichzeitig arbeiten. Ab Android 11 enthält die Camera2-API die folgenden Methoden, die von Apps aufgerufen werden können, um festzustellen, ob die Kameras gleichzeitiges Streaming und die unterstützten Stream-Konfigurationen unterstützen.

  • getConcurrentStreamingCameraIds : Ruft den Satz von Kombinationen von aktuell Identifikatoren Kameravorrichtung verbunden , dass die Unterstützung der Konfiguration gleichzeitig Sitzungen Kameravorrichtung.
  • isConcurrentSessionConfigurationSupported : überprüft , ob der bereitgestellte Satz von Kameraeinrichtungen und ihren entsprechenden Sitzungskonfigurationen gleichzeitig konfiguriert werden kann.

Eine Reihe von verbindlichen Strom - Kombinationen , die während der gleichzeitigen Streaming unterstützt werden müssen , werden durch eine Kameravorrichtung der Kamera Eigenschaften in der mitgelieferten SCALER_MANDATORY_CONCURRENT_STREAM_COMBINATIONS Eigenschaft.

Jede Kameraeinrichtung durch beworbenen getConcurrentStreamingCameraIds() muß folgende Konfigurationen für garantierte gleichzeitigen Streams unterstützen.

Ziel 1 Ziel 2
Typ maximale Größe Typ maximale Größe Beispielanwendungsfälle
YUV s1440p In-App-Video- oder Bildverarbeitung
PRIV s1440p In-App-Sucheranalyse
JPEG s1440p Keine Standbildaufnahme im 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 Fähigkeit ( CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES umfasst CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_MONOCHROME ) Y8 Unterstützung muss YUV in allen garantierten Strom Kombinationen Ströme mit Y8 unterstützen ersetzen.

s720p bezieht sich auf 720p (1280 x 720) oder die maximal unterstützte Auflösung für das bestimmte Format von zurück StreamConfigurationMap.getOutputSizes() . s1440p bezieht sich auf 1440p (1920 x 1440) oder die maximal unterstützte Auflösung für das bestimmte Format von zurück StreamConfigurationMap.getOutputSizes() . Geräte , deren Funktionen nicht enthalten ANDROID_REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE mindestens einen einzelnen Y16 Strom unterstützen muss, Dataspace::DEPTH mit SVGA - Auflösung, während der gleichzeitigen Betrieb, wo SVGA die kleinere der beiden folgenden Auflösungen:

  • maximale Ausgabeauflösung für das angegebene Format
  • 640 x 480

Implementierung

Damit Anwendungen ein Gerät abzufragen , um zu bestimmen , ob seine Kameras gleichzeitig Streaming unterstützen, implementieren die ICameraProvider@2.6 HAL - Schnittstelle, die die folgenden Methoden beinhalten:

Für eine Referenzimplementierung der ICameraProvider@2.6 HAL - Schnittstelle finden Sie in der emulierten Kamera HAL Bibliothek bei EmulatedCameraProviderHWLImpl.cpp .

Validierung

Um Test , dass Ihre Implementierung dieser Funktion funktioniert wie vorgesehen, verwenden Sie den ConcurrentCameraTest.java CTS - Test. Testen Sie auch mit einer App, die mehrere Kameras öffnet und sie gleichzeitig bedient.

Probleme bei der Ressourcenzuweisung

Wenn Kamera-HALs Unterstützung für den gleichzeitigen Betrieb von Kamerageräten anbieten, können Probleme bei der Ressourcenzuweisung auftreten, insbesondere wenn genügend Bildsignalprozessor-(ISP)-Ressourcen auf dem Telefon vorhanden sind, um gleichzeitig Vorder- und Rückseite (oder andere) Kameras zu streamen , aber nicht in vollem Umfang. 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 folgende Konfiguration:

  • Kamera - ID 0 ist eine logische Kamera unterstützt von einer breiten und ultrabreiten Kamera, das jeweils für ihren Bereich einer ISP - Ressource.
  • Kamera - ID 1 ist eine Kamera , die eine ISP - Ressource erfolgt.

Das Gerät (Telefon) hat zwei ISPs. Wenn die Kamera - ID 0 geöffnet wird und eine Sitzung konfiguriert ist, dann ist es möglich , dass die Kamera HAL Reserven zwei ISPs sowohl ultra antizipieren und breite Kamera verwenden.

Wenn das der Fall ist, die Frontkamera (ID 1 kann) konfiguriert keine Ströme , da beide ISPs im Einsatz sind.

Lösung

Um dieses Problem zu lösen, kann der Rahmen öffnet beid Kamera - IDs 0 und 1 vor Sitzungen , um einen Hinweis auf die Kamera HAL über die Konfiguration der Verteilung von Ressourcen (weil es jetzt gleichzeitigen Betrieb von Kameras erwartet). Dies kann jedoch zu eingeschränkten Funktionen führen, z. B. kann der Zoom möglicherweise nicht das volle Zoombereichsverhältnis verarbeiten (weil das Wechseln der physischen Kamera-IDs problematisch sein könnte).

Um diese Lösung zu implementieren, die folgenden Änderungen zu provider@2.6::ICameraProvider::getConcurrentCameraStreamingCameraIds .

  • Mandat , dass für den gleichzeitigen Betrieb von Kameras, muss die Kamera Rahmen Kamera Geräte öffnen ( @3.2::ICameraDevice::open ) , bevor alle Sitzungen auf die Kamera - Geräte konfigurieren. Dies ermöglicht es Kameraanbietern, Ressourcen entsprechend zuzuweisen.

  • Um das Problem der nicht in der Lage zu Adresse, die den vollen Zoombereich Verhältnis zu handhaben , stellen sicher , dass die Kamera - Anwendungen, wenn Kameras gleichzeitig verwenden, garantiert das verwenden ZOOM_RATIO Steuereinstellung zwischen nur 1x und MAX_DIGITAL_ZOOM anstelle der kompletten ZOOM_RATIO_RANGE (Dies verhindert das Schalten von physische Kameras intern, was möglicherweise mehr ISPs erfordert).

Problem mit testDualCameraPreview

Wenn Sie die Updates über machen, kann es ein Problem mit einem Verhalten durch das erlaubt erstellen MultiViewTest.java#testDualCameraPreview Test.

Der Test testDualCameraPreview nicht configure Sitzungen nur nach Ausschöpfung aller Kameras zu öffnen. Es folgt diese Reihenfolge:

for each camera  in cameraDevices :
  device = openCamera(camera)
     createCaptureSession(device);

Es ist jedoch toleriert Kamera offen Ausfälle mit ERROR_MAX_CAMERAS_IN_USE [1] . Apps von Drittanbietern können von diesem Verhalten abhängen.

Da die Kamera-HAL nicht den vollständigen Satz von Kamera-IDs kennt, die für den gleichzeitigen Betrieb geöffnet werden, bevor Sitzungen konfiguriert werden, kann es schwierig sein, Hardware-Ressourcen zuzuweisen (vorausgesetzt, es gibt eine gewisse Konkurrenz dafür).

Um dieses Problem zu lösen, die Aufrechterhaltung der Abwärtskompatibilität zusätzlich zu unterstützen gleichzeitigen Streaming, Kamera HALs ausfallen sollte openCamera Anrufe mit ERROR_MAX_CAMERAS_IN_USE , wenn sie nicht den vollen Stromkonfiguration für alle Kameras gleichzeitig laufen unterstützen.