Jednoczesne strumienie z kamery

Android pozwala urządzeniom obsługiwać jednoczesne strumieniowanie danych z kamer. Dla: Dzięki temu urządzenie może działać zarówno z przedniego, jak i tylnego aparatu. z powrotem. Począwszy od Androida 11: interfejs Camera2 API obejmuje następujące metody które aplikacje mogą wywołać, aby określić, czy kamery obsługują które konfiguracje są obsługiwane.

Zestaw obowiązkowych kombinacji strumieni, które muszą być obsługiwane podczas transmisji równoległych są uwzględniane w charakterystycznych cechach kamery urządzenia SCALER_MANDATORY_CONCURRENT_STREAM_COMBINATIONS usłudze.

Każde urządzenie z aparatem reklamowane przez firmę getConcurrentStreamingCameraIds() musi obsługuje poniższe gwarantowane konfiguracje w przypadku transmisji równoległych.

Cel 1 Cel 2
Typ Maksymalny rozmiar Typ Maksymalny rozmiar Przykładowe zastosowania
YUV S1440P Przetwarzanie filmów i obrazów w aplikacji
prIV S1440P Analiza wizjera w aplikacji
JPEG S1440P Brak nieruchomych zdjęć w wizjerze
YUV / PRIV S720P JPEG S1440P Standardowe obrazy nieruchome
YUV / PRIV S720P YUV / PRIV S1440P Film w aplikacji lub przetwarzanie z podglądem

Urządzenia obsługujące MONOCHROME (CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES) zawiera CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_MONOCHROME). obsługująca Y8 musi obsługiwać zastępowanie strumieni YUV przez Y8 we wszystkich gwarantowanych kombinacje strumieni.

s720p oznacza rozdzielczość 720p (1280 x 720) lub maksymalną obsługiwaną rozdzielczość określony format zwracany przez funkcję StreamConfigurationMap.getOutputSizes() s1440p oznacza rozdzielczość 1440p (1920 x 1440) lub maksymalną obsługiwaną rozdzielczość w określony format zwracany przez funkcję StreamConfigurationMap.getOutputSizes() Urządzenia, których funkcje nie obejmują: ANDROID_REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE musi obsługiwać co najmniej 1 strumień Y16, Dataspace::DEPTH z sVGA rozdzielczości podczas równoczesnego działania, gdzie sVGA jest mniejsza z dwóch wartości. w następujących rozwiązaniach:

  • maksymalna rozdzielczość wyjściowa dla danego formatu
  • 640 x 480

Implementacja

Aby umożliwić aplikacjom wysyłanie zapytań do urządzenia w celu określenia, czy kamery obsługują równoczesne strumienie, zastosuj ICameraProvider@2.6 Interfejs HAL, który obejmuje następujące metody:

Więcej informacji o implementacji interfejsu HAL ICameraProvider@2.6znajdziesz tutaj: z emulowaną biblioteką HAL aparatu EmulatedCameraProviderHWLImpl.cpp

Weryfikacja

Aby sprawdzić, czy implementacja tej funkcji działa prawidłowo, użyj ConcurrentCameraTest.java test CTS. Przetestuj też aplikację, która uruchamia wiele aparatów i działa. jednocześnie.

Problemy z przydzielaniem zasobów

Jeśli HAL kamery informuje o obsłudze równoczesnego działania aparatami, mogą wystąpić problemy z przydzielaniem zasobów, zwłaszcza jeśli dostępna jest wystarczająca ilość procesora sygnału obrazu z telefonu, aby transmitować zarówno z przedniego, jak i tylnego (lub innego) aparatu jednocześnie, ale nie w pełni wykorzystują możliwości. W takim przypadku HAL aparatu musi przydzielać ograniczone zasobów sprzętowych do każdego aparatu.

Przykładowy scenariusz

Problem ilustruje poniższy przykład.

Problem

Urządzenie ma tę konfigurację:

  • Identyfikator kamery 0 to kamera logiczna z szerokokątnym i ultraszerokokątnym które zajmują jeden zasób ISP.
  • Identyfikator kamery 1 to kamera, która pobiera zasób dostawcy internetu.

Urządzenie (telefon) ma dwóch dostawców internetu. Jeśli identyfikator kamery 0 jest otwarty, a sesja może być skonfigurowane, że HAL aparatu rezerwuje 2 dostawców przy użyciu aparatu ultraszerokokątnego i szerokokątnego.

W takim przypadku przedni aparat (o identyfikatorze 1) nie może skonfigurować żadnych ponieważ używają sieci dostawców usług internetowych.

Rozwiązanie

Aby rozwiązać ten problem, platforma może otwierać obydwa identyfikatory kamery (0 i 1) przed skonfigurowaniem sesji, aby zapewnić wskazówkę dla HAL kamery na temat tego, przydzielać zasoby (ponieważ wymaga obecnie równoczesnego działania kamer). Może to jednak prowadzić do ograniczonych możliwości. Na przykład powiększenie jest w stanie obsłużyć pełny zakres powiększenia (ponieważ przełączanie aparatu fizycznego identyfikatory mogą sprawiać problemy).

Aby wdrożyć to rozwiązanie, wprowadź te zmiany w provider@2.6::ICameraProvider::getConcurrentCameraStreamingCameraIds

  • Upoważnienie do jednoczesnego działania kamer platforma musi otworzyć urządzenia z aparatem (@3.2::ICameraDevice::open) przed konfigurując dowolne sesje na urządzeniach z kamerą. Zezwala na kamerę i odpowiednio przydzielać zasoby.

  • Aby rozwiązać problem braku obsługi współczynnika zakresu powiększenia, upewnij się, że aplikacje aparatu, gdy używasz go jednocześnie, muszą używać ustawienia ZOOM_RATIO z zakresu tylko od 1x do MAX_DIGITAL_ZOOM zamiast pełnej wartości ZOOM_RATIO_RANGE (ten uniemożliwia wewnętrzne przełączanie kamer, co może potencjalnie wymaga więcej dostawców internetu).

.

Problem z testDualCameraPreview

Wprowadzenie powyższych zmian może spowodować problem z działaniem dozwolonym za pomocą testu MultiViewTest.java#testDualCameraPreview.

Test testDualCameraPreview nie konfiguruje sesji dopiero po otwarciu wszystkich kamer. Wygląda to tak:

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

Toleruje jednak awarie otwartego aparatu ERROR_MAX_CAMERAS_IN_USE [1] Aplikacje innych firm mogą zależeć od tego działania.

Ponieważ HAL nie zna pełnego zestawu identyfikatorów otwieranych aparatów do wykonywania operacji równoczesnych przed skonfigurowaniem sesji, może przydzielać zasoby sprzętowe (zakładając, że istnieje jakaś konkurencja).

Aby rozwiązać ten problem, zachowanie zgodności wstecznej oprócz obsługi równoczesnych strumieniowania, HAL kamery powinny kończyć się niepowodzeniem openCamera wywołań ERROR_MAX_CAMERAS_IN_USE, jeśli nie obsługują konfiguracji pełnej transmisji dla we wszystkich kamerach działających jednocześnie.