Android pozwala urządzeniom obsługiwać jednoczesne strumieniowanie danych z kamer. Dla: Dzięki temu urządzenie może działać zarówno z przedniego, jak i tylnego aparatu. z powrotem. 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
: Pobiera zestaw kombinacji obecnie podłączonych urządzeń z aparatem identyfikatory, które obsługują jednoczesne konfigurowanie sesji kamery w urządzeniu.isConcurrentSessionConfigurationSupported
: Sprawdza, czy podany zestaw aparatów i odpowiadające im urządzenia .
Zestaw obowiązkowych kombinacji strumieni, które muszą być obsługiwane podczas transmisji równoległych
są uwzględniane w charakterystycznych cechach kamery urządzenia
SCALER_MANDATORY_CONCURRENT_STREAM_COMBINATIONS
usłudze.
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 zastosowania |
YUV | S1440P | Przetwarzanie filmów lub obrazów w aplikacji | ||
prIV | S1440P | Analiza wizjera w aplikacji | ||
JPEG | s1440p | Brak nieruchomych zdjęć w wizjerze | ||
YUV / PRIV | S720P | JPEG | s1440p | Standardowe obrazy nieruchome |
YUV / PRIV | s720p | YUV / PRIV | S1440P | Film w aplikacji lub przetwarzanie z podglądem |
Urządzenia obsługujące MONOCHROME
(CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES
)
zawiera
CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_MONOCHROME
).
obsługująca Y8 musi obsługiwać zastępowanie strumieni YUV przez Y8 we wszystkich gwarantowanych
kombinacje strumieni.
s720p
oznacza rozdzielczość 720p (1280 x 720) lub maksymalną obsługiwaną rozdzielczość
określony format zwracany przez funkcję
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 funkcje nie obejmują:
ANDROID_REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE
musi obsługiwać co najmniej 1 strumień Y16, Dataspace::DEPTH
z sVGA
rozdzielczości podczas równoczesnego działania, gdzie sVGA jest mniejsza z dwóch wartości.
w następujących rozwiązaniach:
- 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:
Więcej informacji o implementacji interfejsu HAL ICameraProvider@2.6
znajdziesz tutaj:
z emulowaną biblioteką HAL aparatu
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 przydzielaniem 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 HAL aparatu musi przydzielać ograniczone zasobów sprzętowych do każdego aparatu.
Przykładowy scenariusz
Ten scenariusz obrazuje ten problem.
Problem
Urządzenie ma taką konfigurację:
- Identyfikator kamery
0
to kamera logiczna z szerokokątnym i ultraszerokokątnym które zajmują jeden zasób ISP. - Identyfikator kamery
1
to kamera, która pobiera zasób dostawcy internetu.
Urządzenie (telefon) ma dwóch dostawców internetu. Jeśli identyfikator kamery 0
jest otwarty, a sesja
może być skonfigurowane, że HAL aparatu rezerwuje 2 dostawców
przy użyciu aparatu ultraszerokokątnego i szerokokątnego.
W takim przypadku przedni aparat (o identyfikatorze 1
) nie może skonfigurować żadnych
ponieważ używają sieci dostawców usług internetowych.
Rozwiązanie
Aby rozwiązać ten problem, platforma może otwierać obydwa identyfikatory kamery (0
i 1
)
przed skonfigurowaniem sesji, aby zapewnić wskazówkę dla HAL kamery na temat tego,
przydzielać zasoby (ponieważ wymaga obecnie równoczesnego działania kamer).
Może to jednak prowadzić do ograniczonych możliwości. Na przykład powiększenie
jest w stanie obsłużyć pełny zakres powiększenia (ponieważ przełączanie aparatu fizycznego
identyfikatory mogą sprawiać problemy).
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 kamerą (
@3.2::ICameraDevice::open
) przed skonfigurowaniem sesji na urządzeniach z kamerą. 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ą aparatów jednocześnie, używają ustawień
ZOOM_RATIO
tylko w zakresie od 1x doMAX_DIGITAL_ZOOM
, a nie pełnego zakresuZOOM_RATIO_RANGE
(zapobiega to przełączaniu się aparatów w ramach aparatu fizycznego, 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 otwartego aparatu
ERROR_MAX_CAMERAS_IN_USE [1]
Aplikacje innych firm mogą zależeć od tego działania.
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.