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.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ę 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 0
i 1
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 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 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.