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 w aplikacji za pomocą wizjera
JPEG s1440p Brak przechwytywania obrazu w widoku.
YUV / PRIV s720p JPEG s1440p Standardowe obrazowanie statyczne
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 konkretnego 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 implementacja tej funkcji działa zgodnie z zamierzeniami, użyj testu CTS: ConcurrentCameraTest.java. Przeprowadź też testy za pomocą aplikacji, która otwiera kilka kamer i działa z nimi jednocześnie.

Problemy z przydziałem zasobów

Jeśli interfejsy HAL aparatu reklamują obsługę jednoczesnej pracy urządzeń, mogą napotkać problemy z przydziałem zasobów, zwłaszcza gdy na telefonie jest wystarczająco dużo zasobów procesora sygnału obrazu (ISP) do jednoczesnego przesyłania strumieniowego z obu kamer (przedniej i tylnej lub innych), ale nie do ich 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 1 zasób ISP.

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 on jednoczesnego działania kamer). Może to jednak ograniczać możliwości. Na przykład zoom może nie obsługiwać pełnego zakresu powiększenia (ponieważ przełączanie identyfikatorów kamery może być problematyczne).

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 tylko po otwarciu wszystkich kamer. W ramach tej procedury należy wykonać te czynności:

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

Jednak ERROR_MAX_CAMERAS_IN_USE [1] toleruje błędy otwierania aparatu. 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.