Jednoczesne strumienie z kamery

Android umożliwia urządzeniom jednoczesne przesyłanie strumieniowe z urządzeń do rejestrowania obrazu. Dzięki temu na urządzeniu mogą działać jednocześnie oba aparaty – przedni i tylny. Od Androida 11 interfejs Camera2 API zawiera te metody, które aplikacje mogą wywoływać, aby określić, czy kamery obsługują jednoczesny streaming, oraz obsługiwane konfiguracje strumienia.

  • getConcurrentCameraIds: Zwraca zestaw kombinacji identyfikatorów połączonych urządzeń kamery, które umożliwiają jednoczesną konfigurację sesji urządzenia kamery.
  • isConcurrentSessionConfigurationSupported: sprawdza, czy podany zestaw urządzeń z kamerą i odpowiednie konfiguracje sesji można skonfigurować jednocześnie.

Zestaw obowiązkowych kombinacji strumieni, które muszą być obsługiwane podczas jednoczesnego przesyłania strumieniowego, jest uwzględniany w charakterystyce kamery urządzenia w usługach SCALER_MANDATORY_CONCURRENT_STREAM_COMBINATIONS.

Każda kamera reklamowana za pomocą getConcurrentStreamingCameraIds() musi obsługiwać te gwarantowane konfiguracje dla jednoczesnych transmisji.

Cel 1 Cel 2
Typ Maksymalny rozmiar Typ Maksymalny rozmiar Przykładowe przypadki użycia
YUV S1440P Przetwarzanie filmów lub obrazów w aplikacji
prIV S1440P Analiza wizjera w aplikacji
JPEG s1440p Brak przechwytywania obrazu w widoku.
YUV / PRIV s720p JPEG s1440p Standardowe obrazy nieruchome
YUV / PRIV s720p YUV / PRIV s1440p Film w aplikacji lub przetwarzanie z podglądem

Urządzenia z funkcją MONOCHROME (CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES, obejmuje CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_MONOCHROME) obsługujące Y8 muszą obsługiwać zastępowanie strumieni YUV strumieniami Y8 we wszystkich gwarantowanych kombinacjach strumieni.

s720p oznacza 720p (1280 x 720) lub maksymalną obsługiwaną rozdzielczość dla danego formatu zwracanego przez StreamConfigurationMap.getOutputSizes(). s1440p oznacza rozdzielczość 1440p (1920 x 1440) lub maksymalną obsługiwaną rozdzielczość dla danego formatu zwracanego przez StreamConfigurationMap.getOutputSizes(). Urządzenia, których możliwości nie obejmują: ANDROID_REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE muszą obsługiwać co najmniej 1 strumień Y16 o rozdzielczości Dataspace::DEPTH w formacie sVGA podczas jednoczesnej pracy, gdzie sVGA jest mniejszą z tych 2 rozdzielczości:

  • 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 jego aparaty obsługują jednoczesną transmisję strumieniową, zaimplementuj interfejs HAL o nazwie ICameraProvider@2.6, który zawiera te metody:

Implementację referencyjną interfejsu ICameraProvider@2.6HAL znajdziesz w bibliotece emulowanej biblioteki HAL aparatu pod adresem EmulatedCameraProviderHWLImpl.cpp.

Weryfikacja

Aby sprawdzić, czy ta funkcja działa prawidłowo, użyj testu CTS ConcurrentCameraTest.java. Przetestuj też aplikację, która uruchamia wiele kamer i obsługuje je równocześnie.

Problemy z przydziałem zasobów

Jeśli HAL kamery informuje o obsłudze równoczesnego działania aparatów, mogą wystąpić problemy z przydzielaniem zasobów, zwłaszcza wtedy, gdy telefon ma wystarczającą liczbę zasobów procesora sygnału obrazu (ISP), aby przesyłać obraz z przedniej i tylnej kamery (lub innych) jednocześnie, ale nie do pełnej pojemności. W takim przypadku interfejs HAL aparatu musi przydzielić ograniczone zasoby sprzętowe do każdego urządzenia.

Przykładowy scenariusz

Ten scenariusz obrazuje ten problem.

Problem

Urządzenie ma taką konfigurację:

  • Identyfikator aparatu 0 to aparat logiczny obsługiwany przez aparat szerokokątny i ultraszerokokątny, z których każdy zajmuje 1 zasób dostawcy usług internetowych.
  • Identyfikator kamery 1 to kamera, która pobiera zasób dostawcy internetu.

Urządzenie (telefon) ma 2 dostawców usług internetowych. Jeśli identyfikator kamery 0 jest otwarty, a sesja jest skonfigurowana, możliwe, że interfejs HAL kamery zarezerwuje 2 ISP, przewidując użycie zarówno ultraszerokokątnego, jak i szerokokątnego aparatu.

W takim przypadku przednia kamera (identyfikator 1) nie może skonfigurować żadnych strumieni, ponieważ oba dostawcy usług internetowych są używane.

Rozwiązanie

Aby rozwiązać ten problem, framework może otworzyć oba identyfikatory kamery 01 przed skonfigurowaniem sesji, aby przekazać HAL kamery wskazówkę dotyczącą alokacji zasobów (ponieważ teraz oczekuje ona jednoczesnego działania kamer). Może to jednak prowadzić do ograniczonych możliwości, np. gdy powiększenie jest w stanie nie być w stanie obsłużyć pełnego zakresu powiększenia (ponieważ przełączenie fizycznych identyfikatorów kamery może stanowić problem).

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

  • Aby umożliwić jednoczesną obsługę kamer, framework kamery musi otworzyć urządzenia z kamerami (@3.2::ICameraDevice::open) przed skonfigurowaniem sesji na urządzeniach z kamerami. Dzięki temu dostawcy kamer mogą odpowiednio przydzielić zasoby.

  • Aby rozwiązać problem z brakiem obsługi pełnego zakresu powiększenia, upewnij się, że aplikacje aparatu, gdy używają kamer jednocześnie, korzystają z ustawienia ZOOM_RATIO tylko w zakresie od 1x do MAX_DIGITAL_ZOOM, a nie z pełnego zakresu ZOOM_RATIO_RANGE (zapobiegnie to przełączaniu się aparatów w ramach wewnętrznych, co może wymagać większej liczby dostawców usług internetowych).

Problem z testDualCameraPreview

Wprowadzając te zmiany, możesz spowodować problem z zachowaniem dozwolonym przez test MultiViewTest.java#testDualCameraPreview.

Test testDualCameraPreview nie konfiguruje sesji dopiero po otwarciu wszystkich kamer. W tym celu wykonaj te czynności:

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

Toleruje jednak awarie otwartych aparatu w ERROR_MAX_CAMERAS_IN_USE [1]. Aplikacje innych firm mogą być zależne od tego zachowania.

Przed skonfigurowaniem sesji HAL aparatu nie będzie znać pełnego zestawu identyfikatorów kamer otwartych do jednoczesnego działania, więc może mieć trudności z przydzielaniem zasobów sprzętowych (zakładając, że są one w jakimś stopniu wykorzystywane).

Aby rozwiązać ten problem, zachować zgodność wsteczną i obsługiwać jednoczesne przesyłanie strumieniowe, komponenty HAL aparatu powinny odrzucać wywołania openCamera z argumentem ERROR_MAX_CAMERAS_IN_USE, jeśli nie mogą obsługiwać pełnej konfiguracji strumienia dla wszystkich aparatów działających jednocześnie.