Android umożliwia urządzeniom obsługę równoczesnego przesyłania strumieniowego z kamer. Na przykład umożliwia to jednoczesne korzystanie z przedniego i tylnego aparatu. Od Androida 11 interfejs Camera2 API zawiera te metody, które aplikacje mogą wywoływać, aby określić, czy kamery obsługują jednoczesne przesyłanie strumieniowe, oraz obsługiwane konfiguracje strumieni.
getConcurrentCameraIds
: pobiera zestaw kombinacji identyfikatorów aktualnie podłączonych urządzeń z kamerą, które obsługują jednoczesne konfigurowanie sesji urządzenia z kamerą.isConcurrentSessionConfigurationSupported
: sprawdza, czy podany zestaw urządzeń z kamerą i odpowiadające im 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ędniony w charakterystyce kamery urządzenia w właściwości SCALER_MANDATORY_CONCURRENT_STREAM_COMBINATIONS
.
Każde urządzenie z kamerą reklamowane za pomocą getConcurrentStreamingCameraIds()
musi obsługiwać te gwarantowane konfiguracje strumieni równoległych:
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 możliwości robienia zdjęć w wizjerze | ||
YUV / PRIV | s720p | JPEG | s1440p | Standardowe zdjęcia |
YUV / PRIV | s720p | YUV / PRIV | s1440p | Film w aplikacji lub przetwarzanie z podglądem |
Urządzenia z funkcją MONOCHROME
(CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES
, w tym CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_MONOCHROME
) obsługujące Y8 muszą umożliwiać zastępowanie strumieni YUV strumieniami Y8 we wszystkich gwarantowanych kombinacjach strumieni.
s720p
oznacza rozdzielczość 720p (1280 x 720) lub maksymalną rozdzielczość obsługiwaną w przypadku formatu zwracanego przez StreamConfigurationMap.getOutputSizes()
.
s1440p
oznacza rozdzielczość 1440p (1920 x 1440) lub maksymalną rozdzielczość obsługiwaną w przypadku 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 Dataspace::DEPTH
o rozdzielczości sVGA podczas jednoczesnej pracy. Rozdzielczość sVGA to mniejsza z 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 sprawdzenia, czy jego aparaty obsługują jednoczesne przesyłanie strumieniowe, zaimplementuj interfejs HAL ICameraProvider@2.6
, który zawiera te metody:
Przykładową implementację ICameraProvider@2.6
interfejsu HAL znajdziesz w bibliotece emulowanego HAL-u aparatu na stronie EmulatedCameraProviderHWLImpl.cpp
.
Weryfikacja
Aby sprawdzić, czy wdrożenie tej funkcji działa zgodnie z zamierzeniami, użyj testu ConcurrentCameraTest.java
CTS. Sprawdź też, czy aplikacja, która otwiera wiele kamer i obsługuje je jednocześnie, działa prawidłowo.
Problemy z przydziałem zasobów
Jeśli interfejsy HAL aparatu deklarują obsługę jednoczesnego działania urządzeń z aparatem, mogą wystąpić problemy z przydzielaniem zasobów, zwłaszcza w przypadku, gdy na telefonie jest wystarczająco dużo zasobów procesora sygnału obrazu (ISP), aby przesyłać strumieniowo obraz z przedniego i tylnego (lub innych) aparatów jednocześnie, ale nie z pełną wydajnością. W takim przypadku HAL kamery musi przydzielić ograniczone zasoby sprzętowe do każdego urządzenia kamery.
Przykładowy scenariusz
Ten problem ilustruje poniższy scenariusz.
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 korzysta z 1 zasobu ISP. - Identyfikator aparatu
1
to aparat, który korzysta z 1 zasobu ISP.
Urządzenie (telefon) ma 2 ISP. Jeśli otwarto identyfikator kamery 0
i skonfigurowano sesję, może się zdarzyć, że HAL kamery zarezerwuje 2 procesory ISP, przewidując użycie zarówno kamery ultraszerokokątnej, jak i szerokokątnej.
W takim przypadku przedni aparat (identyfikator 1
) nie może skonfigurować żadnych strumieni, ponieważ oba procesory ISP są używane.
Rozwiązanie
Aby rozwiązać ten problem, platforma może otworzyć identyfikatory kamer 0
i 1
przed skonfigurowaniem sesji, aby przekazać do HAL kamery wskazówkę dotyczącą sposobu
przydzielania zasobów (ponieważ oczekuje teraz jednoczesnego działania kamer).
Może to jednak prowadzić do ograniczenia możliwości, np. zoom może nie być w stanie obsłużyć pełnego zakresu powiększenia (ponieważ przełączanie fizycznych identyfikatorów kamery może być problematyczne).
Aby wdrożyć to rozwiązanie, wprowadź te zmiany w provider@2.6::ICameraProvider::getConcurrentCameraStreamingCameraIds
.
Wymagaj, aby w przypadku jednoczesnego działania kamer platforma kamery otwierała urządzenia kamery (
@3.2::ICameraDevice::open
) przed skonfigurowaniem na nich jakichkolwiek sesji. Dzięki temu dostawcy kamer mogą odpowiednio przydzielać zasoby.Aby rozwiązać problem z obsługą pełnego zakresu powiększenia, zadbaj o to, aby aplikacje aparatu podczas jednoczesnego korzystania z kamer używały ustawienia sterowania
ZOOM_RATIO
tylko w zakresie od 1x doMAX_DIGITAL_ZOOM
, a nie w pełnym zakresieZOOM_RATIO_RANGE
(zapobiega to wewnętrznemu przełączaniu kamer fizycznych, które może wymagać większej liczby procesorów obrazu).
Problem z testDualCameraPreview
Wprowadzenie powyższych zmian może spowodować problem z zachowaniem dozwolonym przez test MultiViewTest.java#testDualCameraPreview
.
Test testDualCameraPreview
nie konfiguruje sesji dopiero po otwarciu wszystkich kamer. Przebiega ona w tej kolejności:
for each camera in cameraDevices :
device = openCamera(camera)
createCaptureSession(device);
Toleruje jednak błędy otwierania aparatu z kodem ERROR_MAX_CAMERAS_IN_USE [1]
. Aplikacje innych firm mogą zależeć od tego działania.
Ponieważ przed skonfigurowaniem sesji HAL aparatu nie będzie znać pełnego zestawu identyfikatorów otwieranych kamer do jednoczesnej pracy, może mieć trudności z przydzieleniem zasobów sprzętowych (zakładając, że istnieje między nimi konkurencja).
Aby rozwiązać ten problem, oprócz zachowania zgodności wstecznej i obsługi jednoczesnego przesyłania strumieniowego komponenty HAL kamery powinny zwracać błąd w przypadku wywołań openCamera
z kodem ERROR_MAX_CAMERAS_IN_USE
, jeśli nie obsługują pełnej konfiguracji strumienia dla wszystkich kamer działających jednocześnie.