Zewnętrzne kamery USB

Platforma Android obsługuje kamery USB typu plug-and-play (czyli kamer internetowych) za pomocą standardowego Interfejs API Aparatu Android 2 i aparat HAL, za pomocą prostego interfejsu online. Kamery internetowe obsługują zwykle Klasa wideo USB (UVC) sterowników, a w systemie Linux Video4Linux (V4L) sterownik służy do sterowania kamerami UVC.

Dzięki obsłudze kamer internetowych urządzenia mogą być używane w niewielkich przypadkach użycia, takich jak czat wideo i kioski fotograficzne. Ta funkcja nie zastępuje typowych wewnętrznych funkcji HAL aparatu na telefonach z Androidem i nie jest przeznaczony do obsługują złożone, wymagające wysokiej wydajności zadania obejmujące wiele szybki streaming, AR oraz ręczne sterowanie dostawcą internetu, czujnikiem i obiektywem.

Proces HAL kamery USB jest częścią dostawcy zewnętrznego aparatu, nasłuchuje dostępności urządzeń USB i wylicza zewnętrzne kamery odpowiednio się zmienia. Proces ma uprawnienia i zasadę SE podobną do wbudowany proces HAL aparatu. Komunikujące się aplikacje innych firm do kamer internetowych bezpośrednio na urządzeniach USB wymagają tych samych uprawnień do korzystania z aparatu, aby uzyskać dostęp do UVC jak w przypadku każdej zwykłej aplikacji aparatu.

Przykłady i źródła

Więcej informacji o podłączaniu aparatów USB znajdziesz w opisie aparatu zewnętrznego wdrożenie referencji dostawców na stronie ExternalCameraProvider Implementacje sesji i zewnętrznego aparatu fotograficznego są uwzględnione w ExternalCameraDevice oraz ExternalCameraDeviceSession Począwszy od poziomu API 28, interfejs API klienta Java zawiera EXTERNAL na poziomie sprzętowym.

Implementacja

Implementacja musi obsługiwać android.hardware.usb.host funkcji systemu.

W przypadku urządzeń UVC musi być też włączona obsługa jądra systemu. Aby włączyć tę funkcję, dodając poniższy kod do odpowiednich plików defconfig jądra.

+CONFIG_USB_VIDEO_CLASS=y
+CONFIG_MEDIA_USB_SUPPORT=y

Aby włączyć dostawcę zewnętrznego aparatu w odpowiedniej kompilacji urządzenia, dodaje niezbędne uprawnienia SELinux, konfigurację kamery zewnętrznej oraz zewnętrznego dostawcy aparatu, 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.xml
    
  • Dodaj 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>
    
  • (Opcjonalnie) Jeśli urządzenie działa w trybie przekazywania Treble, zaktualizuj sepolicy aby cameraserver miał 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 znacznika 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

Aparat w Androidzie możesz ulepszyć, korzystając z ogólnych opcji dostosowywania lub optymalizacji pod kątem konkretnych urządzeń.

Dostosowywanie ogólne

Możesz dostosować dostawcę zewnętrznego aparatu, modyfikując wartość external_camera_config.xml. W szczególności klienci mogą dostosować następujące parametry:

  • Wykluczanie węzłów wideo wewnętrznych kamer
  • Górna granica obsługiwanego rozmiaru obrazu i liczby klatek
  • Liczba buforów w trakcie przesyłania (zacięcie w stosunku do ilości pamięci)

Oprócz tych parametrów możesz dodawać własne parametry lub tworzyć własne do własnych konfiguracji.

Optymalizacje pod kątem urządzeń

Możesz też poprawić skuteczność przez zastosowanie optymalizacji pod kątem konkretnego urządzenia.

Kopia/skalowanie z bufora oraz dekodowanie/kodowanie JPEG

Ogólne implementacje korzystają z procesora (libyuv/libjpeg), ale możesz go zastąpić kodem pod kątem urządzeń mobilnych.

Format wyjściowy HAL

W implementacjach ogólnych używane są te formaty wyjściowe:

  • YUV_420_888 – bufory filmu IMPLEMENTATION_DEFINED
  • YUV12 w przypadku wszystkich pozostałych buforów (IMPLEMENTATION_DEFINED)

Aby poprawić wydajność, zastąp formaty wyjściowe formatami dostosowanymi do konkretnego urządzenia do efektywnych formatów. Możesz też dodać obsługę dodatkowych formatów w dostosowanym formacie wdrożenie

Weryfikacja

Urządzenia z obsługą kamery zewnętrznej muszą spełniać wymagania CTS kamery. Zewnętrzny USB podczas całego testu kamera musi być podłączona do konkretnego urządzenia. w przeciwnym razie niektóre przypadki testowe zakończą się niepowodzeniem.