Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
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 Androida obsługuje kamery USB typu plug-and-play (czyli kamery internetowe) za pomocą standardowego interfejsu Android Camera2 API i interfejsu HAL aparatu. 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 zastosowaniach, takich jak czat wideo czy kioski fotograficzne. Ta funkcja nie zastępuje typowych wewnętrznych warstw 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 czy ręczne sterowanie procesorem ISP, czujnikiem lub obiektywem.
Proces HAL kamery USB jest częścią dostawcy kamery zewnętrznej, który nasłuchuje dostępności urządzenia USB i odpowiednio wylicza zewnętrzne urządzenia kamer. Proces ma uprawnienia i zasady SE podobne do wbudowanego procesu HAL aparatu. Aplikacje innych firm do obsługi kamer internetowych, które komunikują się bezpośrednio z urządzeniami USB, wymagają takich samych uprawnień dostępu do aparatu, aby uzyskać dostęp do urządzeń UVC, jak każda zwykła aplikacja do obsługi aparatu.
Przykłady i źródła
Więcej informacji o implementowaniu kamer USB znajdziesz w referencyjnej implementacji dostawcy kamery zewnętrznej na stronie ExternalCameraProvider.
Implementacje urządzenia i sesji kamery zewnętrznej są zawarte 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.
Musi być też włączona obsługa urządzeń UVC przez jądro. Możesz to włączyć, dodając te informacje do odpowiednich plików defconfig jądra.
+CONFIG_USB_VIDEO_CLASS=y
+CONFIG_MEDIA_USB_SUPPORT=y
Aby włączyć dostawcę kamery zewnętrznej w odpowiedniej kompilacji urządzenia, co spowoduje dodanie niezbędnych uprawnień SELinux, konfiguracji kamery zewnętrznej i zależności dostawcy kamery zewnętrznej, wykonaj te czynności:
Dodaj plik konfiguracji kamery zewnętrznej i bibliotekę kamery zewnętrznej do
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.xmlDodaj nazwę dostawcy kamery zewnętrznej do pliku manifestu Treble HAL 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>Powiąż instancję dostawcy aparatu AIDL
external/0zhal_camera_servicew plikusepolicy/service_contextsurządzenia. Więcej informacji znajdziesz w artykule SEPolicy dla AIDL HAL.android.hardware.camera.provider.ICameraProvider/external/0 u:object_r:hal_camera_service:s0(Opcjonalnie) Jeśli urządzenie działa w trybie przekazywania Treble, zaktualizuj
sepolicy, abycameraservermogł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 pliku external_camera_config.xml (pominięto wiersze dotyczące 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 pod kątem konkretnego urządzenia.
Dostosowania ogólne
Możesz dostosować dostawcę kamery zewnętrznej, modyfikując plik external_camera_config.xml. Klienci mogą dostosować te parametry:
- Z wyjątkiem węzłów wideo kamer wewnętrznych
- Obsługiwany rozmiar obrazu i górna granica liczby klatek
- 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 parametry lub tworzyć własne konfiguracje.
Optymalizacje pod kątem konkretnych urządzeń
Możesz też zwiększyć skuteczność, dodając optymalizacje pod kątem konkretnych urządzeń.
Kopiowanie/skalowanie bufora i dekodowanie/kodowanie JPEG
Implementacje ogólne używają procesora (libyuv/libjpeg), ale możesz je zastąpić optymalizacjami pod kątem konkretnego urządzenia.
Format wyjściowy HAL
Ogólne implementacje używają tych formatów wyjściowych:
YUV_420_888buforów dla filmuIMPLEMENTATION_DEFINEDYUV12w przypadku wszystkich pozostałych buforówIMPLEMENTATION_DEFINED
Aby zwiększyć wydajność, możesz zastąpić formaty wyjściowe wydajnymi formatami dostosowanymi do konkretnych urządzeń. Możesz też obsługiwać dodatkowe formaty w niestandardowej implementacji.
Walidacja
Urządzenia z obsługą aparatu zewnętrznego muszą przejść testy CTS aparatu. Zewnętrzna kamera internetowa USB musi być podłączona do określonego urządzenia przez cały czas trwania testu, w przeciwnym razie niektóre elementy testowania nie zostaną zaliczone.