Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. Kopię licencji możesz uzyskać na stronie
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. -->
Platforma Android obsługuje kamery USB typu plug-and-play (czyli kamery internetowe) za pomocą standardowego interfejsu API Camera2 na Androidzie i interfejsu HAL kamery. Kamery internetowe zwykle obsługują sterowniki USB Video Class (UVC), a w systemie Linux do sterowania kamerami UVC używany jest standardowy sterownik Video4Linux (V4L).
Dzięki obsłudze kamer internetowych urządzenia mogą być używane w prostych przypadkach, takich jak czaty wideo i kioski fotograficzne. 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 przesyłanie strumieniowe w wysokiej rozdzielczości i z dużą szybkością, AR oraz ręczne sterowanie ISP, czujnikiem i obiektywem.
Proces HAL kamery USB jest częścią zewnętrznego dostawcy kamer, który nasłuchuje dostępności urządzeń USB i odpowiednio wylicza zewnętrzne urządzenia kamery. Proces ten ma uprawnienia i zasady SE podobne do procesu wbudowanego interfejsu HAL aparatu. Aplikacje innych firm do obsługi kamer internetowych, które komunikują się bezpośrednio z urządzeniami USB, wymagają tych samych uprawnień do aparatu, aby uzyskać dostęp do urządzeń UVC, co zwykłe aplikacje do obsługi aparatu.
Przykłady i źródła
Więcej informacji o wdrażaniu kamer USB znajdziesz w referencyjnej implementacji dostawcy kamer zewnętrznych na stronie ExternalCameraProvider
.
Implementacje urządzenia z zewnętrznym aparatem i sesji są zawarte w ExternalCameraDevice
i ExternalCameraDeviceSession
.
Od poziomu API 28 interfejs Java Client API zawiera EXTERNAL
poziom sprzętowy.
Implementacja
Implementacja musi obsługiwać funkcję systemu android.hardware.usb.host
.
Musi być też włączona obsługa urządzeń UVC w jądrze. Możesz to włączyć, dodając poniższy kod do odpowiednich plików jądra defconfig
.
+CONFIG_USB_VIDEO_CLASS=y
+CONFIG_MEDIA_USB_SUPPORT=y
Aby włączyć zewnętrznego dostawcę aparatu w odpowiedniej kompilacji urządzenia, co dodaje niezbędne uprawnienia SELinux, konfigurację zewnętrznego aparatu i zależność zewnętrznego dostawcy aparatu, wykonaj te czynności:
Dodaj plik konfiguracyjny kamery zewnętrznej i bibliotekę kamery zewnętrznej 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 HAL Treble urządzenia.
<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 przekazywania 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 właściwości external_camera_config.xml
(bez wierszy dotyczących praw autorskich).
<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ć aparat na Androidzie, korzystając z ogólnych opcji dostosowywania lub optymalizacji specyficznych dla urządzenia.
Ogólne dostosowania
Dostawcę zewnętrznego aparatu możesz dostosować, modyfikując plik
external_camera_config.xml
. Klienci mogą dostosowywać te parametry:
- Wykluczanie węzłów wideo kamer wewnętrznych
- Górna granica obsługiwanego rozmiaru obrazu i liczby klatek na sekundę
- Liczba buforów w trakcie przesyłania (kompromis między zacinaniem się a pamięcią)
Oprócz tych parametrów możesz dodawać własne lub tworzyć własne konfiguracje.
Optymalizacje pod kątem konkretnych urządzeń
Skuteczność możesz też zwiększyć, dodając optymalizacje pod kątem konkretnych urządzeń.
Kopiowanie/skalowanie bufora oraz dekodowanie/kodowanie JPEG
Ogólne implementacje korzystają z procesora (libyuv/libjpeg), ale możesz je zastąpić optymalizacjami dostosowanymi do konkretnego urządzenia.
Format wyjściowy HAL
Ogólne implementacje korzystają z tych formatów wyjściowych:
YUV_420_888
wideoIMPLEMENTATION_DEFINED
buforówYUV12
w przypadku wszystkich pozostałych buforówIMPLEMENTATION_DEFINED
Aby zwiększyć wydajność, możesz zastąpić formaty wyjściowe formatami wydajnymi, które są dostosowane do konkretnych urządzeń. Możesz też obsługiwać dodatkowe formaty w dostosowanej implementacji.
Weryfikacja
Urządzenia obsługujące zewnętrzne kamery muszą przejść testy CTS kamery. Zewnętrzna kamera internetowa USB musi być podłączona do konkretnego urządzenia przez cały czas trwania testu, w przeciwnym razie niektóre przypadki testowe zakończą się niepowodzeniem.