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.6
HAL 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 0
i 1
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 doMAX_DIGITAL_ZOOM
, a nie z pełnego zakresuZOOM_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.