Platforma Android obsługuje kamery USB typu „podłącz i używaj” (czyli kamery internetowe) za pomocą standardowego interfejsu Camera2 API w Androidzie oraz interfejsu HAL kamery. Kamery internetowe zwykle obsługują sterowniki USB Video Class (UVC), a w systemie Linux do sterowania kamerami UVC służy standardowy sterownik Video4Linux (V4L).
Dzięki obsłudze kamer internetowych urządzenia mogą być używane w przypadkach, w których nie jest wymagana wysoka wydajność, np. do czatu wideo i kiosków fotograficznych. Ta funkcja nie zastępuje typowych wewnętrznych interfejsów HAL aparatu na telefonach z Androidem i nie jest przeznaczona do obsługi złożonych zadań wymagających dużej wydajności, takich jak strumieniowanie w wysokiej rozdzielczości i z dużą szybkością, AR oraz ręczne sterowanie procesorem ISP, czujnikiem i obiektywem.
Proces HAL kamery USB jest częścią dostawcy kamery zewnętrznej, który sprawdza dostępność urządzenia USB i odpowiednio wylicza urządzenia kamer zewnętrznych. Proces ten ma uprawnienia i zasady SE podobne do tych, które obowiązują w przypadku wbudowanego interfejsu HAL aparatu. Aplikacje do kamer internetowych innych firm, które komunikują się bezpośrednio z urządzeniami USB, wymagają tych samych uprawnień do dostępu do urządzeń UVC co zwykłe aplikacje do aparatu.
Przykłady i źródła
Więcej informacji o wdrażaniu kamer USB znajdziesz w implementacji referencyjnej dostawcy kamer zewnętrznych na stronie ExternalCameraProvider
.
Implementacje aparatu zewnętrznego i sesji są dostępne w ExternalCameraDevice
i ExternalCameraDeviceSession
.
Od poziomu API 28 interfejs API klienta Java obejmuje poziom sprzętowy EXTERNAL
.
Implementacja
Implementacja musi obsługiwać funkcję systemową android.hardware.usb.host
.
Musisz też włączyć obsługę urządzeń UVC w jądrze. Możesz to włączyć, dodając do odpowiednich plików jądra defconfig
następujące informacje.
+CONFIG_USB_VIDEO_CLASS=y
+CONFIG_MEDIA_USB_SUPPORT=y
Aby włączyć zewnętrznego dostawcę kamery w odpowiedniej kompilacji urządzenia, co spowoduje dodanie niezbędnych uprawnień SELinux, konfiguracji zewnętrznej kamery i zależności od zewnętrznego dostawcy kamery, wykonaj te czynności:
Dodaj plik konfiguracji i bibliotekę zewnętrznej kamery do folderu
device.mk
.+PRODUCT_PACKAGES += android.hardware.camera.provider-V1-external-service +PRODUCT_COPY_FILES += \ +device/manufacturerX/productY/external_camera_config.xml:$(TARGET_COPY_OUT_VENDOR)/etc/external_camera_config.xml
Dodaj nazwę zewnętrznego dostawcy kamery do pliku manifestu Treble HAL.
<hal format="aidl"> <name>android.hardware.camera.provider</name> <version>1</version> <interface> <name>ICameraProvider</name> <instance>internal/0</instance> + <instance>external/0</instance> </interface> </hal>
(Opcjonalnie) Jeśli urządzenie działa w trybie przepuszczania Treble, zaktualizuj
sepolicy
, abycameraserver
mogło uzyskać dostęp do kamery UVC.+# for external camera +allow cameraserver device:dir r_dir_perms; +allow cameraserver video_device:dir r_dir_perms; +allow cameraserver video_device:chr_file rw_file_perms;
Oto przykład external_camera_config.xml
(linii z prawami autorskimi pominięto).
<ExternalCamera> <Provider> <ignore> <!-- Internal video devices to be ignored by external camera HAL --> <id>0</id> <!-- No leading/trailing spaces --> <id>1</id> </ignore> </Provider> <!-- See ExternalCameraUtils.cpp for default values of Device configurations below --> <Device> <!-- Max JPEG buffer size in bytes--> <MaxJpegBufferSize bytes="3145728"/> <!-- 3MB (~= 1080p YUV420) --> <!-- Size of v4l2 buffer queue when streaming >= 30fps --> <!-- Larger value: more request can be cached pipeline (less janky) --> <!-- Smaller value: use less memory --> <NumVideoBuffers count="4"/> <!-- Size of v4l2 buffer queue when streaming < 30fps --> <NumStillBuffers count="2"/> <!-- List of maximum fps for various output sizes --> <!-- Any image size smaller than the size listed in Limit row will report fps (as minimum frame duration) up to the fpsBound value. --> <FpsList> <!-- width/height must be increasing, fpsBound must be decreasing--> <Limit width="640" height="480" fpsBound="30.0"/> <Limit width="1280" height="720" fpsBound="15.0"/> <Limit width="1920" height="1080" fpsBound="10.0"/> <!-- image size larger than the last entry will not be supported--> </FpsList> </Device> </ExternalCamera>
Dostosowywanie
Możesz ulepszyć działanie kamery w Androidzie, korzystając z ogólnych opcji dostosowywania lub optymalizacji dla konkretnego urządzenia.
Ustawienia ogólne
Dostawcę zewnętrznej kamery możesz dostosować, modyfikując plik external_camera_config.xml
. W szczególności klienci mogą dostosowywać te parametry:
- Wykluczanie węzłów wideo kamer wewnętrznych
- Górna granica obsługiwanego rozmiaru obrazu i liczby klatek
- Liczba buforów w trakcie przetwarzania (wybór między jankiem a pamięcią)
Oprócz tych parametrów możesz dodawać własne parametry lub tworzyć własne konfiguracje.
Optymalizacje dotyczące konkretnych urządzeń
Możesz też zwiększyć skuteczność, dodając optymalizacje dla poszczególnych urządzeń.
kopiowanie/skalowanie bufora i dekodowanie/kodowanie JPEG
Ogólne implementacje korzystają z procesora (libyuv/libjpeg), ale możesz je zastąpić optymalizacjami zależnymi od urządzenia.
Format wyjściowy HAL
W implementacjach ogólnych używane są te formaty danych wyjściowych:
YUV_420_888
dla buforów filmówIMPLEMENTATION_DEFINED
YUV12
w przypadku wszystkich pozostałychIMPLEMENTATION_DEFINED
buforów
Aby zwiększyć wydajność, możesz zastąpić formaty wyjściowe wydajnymi formatami zależnymi od urządzenia. Możesz też obsługiwać dodatkowe formaty w ramach niestandardowej implementacji.
Weryfikacja
Urządzenia z obsługą zewnętrznych kamer muszą przejść testy CTS kamery. Podczas całego testu zewnętrzna kamera internetowa USB musi być podłączona do określonego urządzenia. W przeciwnym razie niektóre przypadki testowe nie przejdą.