Android umożliwia urządzeniom jednoczesne przesyłanie strumieniowe z urządzeń z kamerą. 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ądzeń 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ą usługi 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 przez wizjer | ||
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 możliwością MONOCHROME
(CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES
, obejmuje 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 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 to mniejsza 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ą jednoczesny przesyłanie strumieniowe, zaimplementuj interfejs HALICameraProvider@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 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ę jednoczesnego działania 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 usługi ISP, przewidując użycie zarówno kamery ultraszerokokątnej, jak i szerokokątnej.
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 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ć jednoczesne działanie kamer, należy w ramach frameworku kamer (
@3.2::ICameraDevice::open
) otworzyć urządzenia z kamerą przed skonfigurowaniem sesji na tych urządzeniach. Dzięki temu dostawcy kamer mogą odpowiednio przydzielić zasoby.Aby rozwiązać problem z brakiem możliwości obsługi pełnego zakresu powiększenia, upewnij się, że aplikacje aparatu, gdy używają aparatów jednocześnie, korzystają z ustawienia
ZOOM_RATIO
tylko w zakresie od 1x doMAX_DIGITAL_ZOOM
, a nie z pełnego zakresuZOOM_RATIO_RANGE
(zapobiega to przełączaniu się między fizycznymi kamerami wewnętrznie, 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 tym celu wykonaj 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.
Ponieważ HAL aparatu nie zna pełnego zestawu identyfikatorów kamer otwartych do jednoczesnego działania przed skonfigurowaniem sesji, 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.