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. Począwszy od Androida 11: interfejs Camera2 API obejmuje następujące metody które aplikacje mogą wywołać, aby określić, czy kamery obsługują które konfiguracje są obsługiwane.
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żde urządzenie z aparatem reklamowane przez firmę getConcurrentStreamingCameraIds()
musi
obsługuje poniższe gwarantowane konfiguracje w przypadku transmisji równoległych.
Cel 1 | Cel 2 | |||
---|---|---|---|---|
Typ | Maksymalny rozmiar | Typ | Maksymalny rozmiar | Przykładowe zastosowania |
YUV | S1440P | Przetwarzanie filmów i 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ść w
określony format zwracany przez funkcję
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
kamery obsługują równoczesne strumienie, zastosuj
ICameraProvider@2.6
Interfejs HAL, który obejmuje następujące 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 prawidłowo, użyj
ConcurrentCameraTest.java
test CTS. Przetestuj też aplikację, która uruchamia wiele aparatów i działa.
jednocześnie.
Problemy z przydzielaniem zasobów
Jeśli HAL kamery informuje o obsłudze równoczesnego działania aparatami, mogą wystąpić problemy z przydzielaniem zasobów, zwłaszcza jeśli dostępna jest wystarczająca ilość procesora sygnału obrazu z telefonu, aby transmitować zarówno z przedniego, jak i tylnego (lub innego) aparatu jednocześnie, ale nie w pełni wykorzystują możliwości. W takim przypadku HAL aparatu musi przydzielać ograniczone zasobów sprzętowych do każdego aparatu.
Przykładowy scenariusz
Problem ilustruje poniższy przykład.
Problem
Urządzenie ma tę 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
provider@2.6::ICameraProvider::getConcurrentCameraStreamingCameraIds
Upoważnienie do jednoczesnego działania kamer platforma musi otworzyć urządzenia z aparatem (
@3.2::ICameraDevice::open
) przed konfigurując dowolne sesje na urządzeniach z kamerą. Zezwala na kamerę i odpowiednio przydzielać zasoby.Aby rozwiązać problem braku obsługi współczynnika zakresu powiększenia, upewnij się, że aplikacje aparatu, gdy używasz go jednocześnie, muszą używać ustawienia
ZOOM_RATIO
z zakresu tylko od 1x doMAX_DIGITAL_ZOOM
zamiast pełnej wartościZOOM_RATIO_RANGE
(ten uniemożliwia wewnętrzne przełączanie kamer, co może potencjalnie wymaga więcej dostawców internetu).
Problem z testDualCameraPreview
Wprowadzenie powyższych zmian może spowodować problem z działaniem dozwolonym
za pomocą testu MultiViewTest.java#testDualCameraPreview
.
Test testDualCameraPreview
nie konfiguruje sesji dopiero po otwarciu
wszystkich kamer. Wygląda to tak:
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.
Ponieważ HAL nie zna pełnego zestawu identyfikatorów otwieranych aparatów do wykonywania operacji równoczesnych przed skonfigurowaniem sesji, może przydzielać zasoby sprzętowe (zakładając, że istnieje jakaś konkurencja).
Aby rozwiązać ten problem, zachowanie zgodności wstecznej oprócz
obsługi równoczesnych strumieniowania, HAL kamery powinny kończyć się niepowodzeniem openCamera
wywołań
ERROR_MAX_CAMERAS_IN_USE
, jeśli nie obsługują konfiguracji pełnej transmisji dla
we wszystkich kamerach działających jednocześnie.